diff options
author | gab@chromium.org <gab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-29 23:38:49 +0000 |
---|---|---|
committer | gab@chromium.org <gab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-29 23:38:49 +0000 |
commit | e211e506b23f49f2665273ba7a12e98ca0a3ce87 (patch) | |
tree | 478793b378b3aa0d5b199663aa43ca0fdac1e623 /win8 | |
parent | 22ebaca6d627c17ebefce7527f5661c1fe2e4bd2 (diff) | |
download | chromium_src-e211e506b23f49f2665273ba7a12e98ca0a3ce87.zip chromium_src-e211e506b23f49f2665273ba7a12e98ca0a3ce87.tar.gz chromium_src-e211e506b23f49f2665273ba7a12e98ca0a3ce87.tar.bz2 |
Metro mouse move events do not contain mouse-button information save the state between mouse pressed/released events and pass it down to MouseEvent through flags.
MouseEvent now automatically converts a ET_MOUSE_MOVED event into an ET_MOUSE_DRAGGED event if the flags show that any mouse button is down (mimicking drag behavior of EventTypeFromNative() used for native events).
NOTE: From experimentation, it seems like Metro only sends a PointerPressed event for the first button pressed and the last button released in a sequence of mouse events.
For example, a sequence of LEFT_DOWN, RIGHT_DOWN, LEFT_UP, RIGHT_UP results only in PointerPressed(LEFT)/PointerReleased(RIGHT) events.
Thus, we cannot accumulate mouse down events and know each button that is down, nor can we wait for a matching mouse up event to cancel that state.
TBR=cdn
BUG=151718
TEST=Can now drag windows in Metro Ash.
Review URL: https://chromiumcodereview.appspot.com/11411155
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@170292 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'win8')
-rw-r--r-- | win8/metro_driver/chrome_app_view_ash.cc | 40 | ||||
-rw-r--r-- | win8/metro_driver/chrome_app_view_ash.h | 5 |
2 files changed, 32 insertions, 13 deletions
diff --git a/win8/metro_driver/chrome_app_view_ash.cc b/win8/metro_driver/chrome_app_view_ash.cc index 5733ce1..7a76c36 100644 --- a/win8/metro_driver/chrome_app_view_ash.cc +++ b/win8/metro_driver/chrome_app_view_ash.cc @@ -19,7 +19,6 @@ #include "ipc/ipc_channel.h" #include "ipc/ipc_channel_proxy.h" #include "ipc/ipc_sender.h" -#include "ui/base/events/event_constants.h" #include "ui/metro_viewer/metro_viewer_messages.h" #include "win8/metro_driver/metro_driver.h" #include "win8/metro_driver/winrt_utils.h" @@ -200,7 +199,7 @@ uint32 GetKeyboardEventFlags() { } // namespace ChromeAppViewAsh::ChromeAppViewAsh() - : ui_channel_(nullptr) { + : mouse_down_flags_(ui::EF_NONE), ui_channel_(nullptr) { globals.previous_state = winapp::Activation::ApplicationExecutionState_NotRunning; } @@ -343,7 +342,8 @@ ChromeAppViewAsh::Uninitialize() { return S_OK; } -HRESULT ChromeAppViewAsh::OnActivate(winapp::Core::ICoreApplicationView*, +HRESULT ChromeAppViewAsh::OnActivate( + winapp::Core::ICoreApplicationView*, winapp::Activation::IActivatedEventArgs* args) { DVLOG(1) << __FUNCTION__; @@ -366,7 +366,7 @@ HRESULT ChromeAppViewAsh::OnActivate(winapp::Core::ICoreApplicationView*, } HRESULT ChromeAppViewAsh::OnPointerMoved(winui::Core::ICoreWindow* sender, - winui::Core::IPointerEventArgs* args) { + winui::Core::IPointerEventArgs* args) { PointerInfoHandler pointer; HRESULT hr = pointer.Init(args); if (FAILED(hr)) @@ -375,31 +375,42 @@ HRESULT ChromeAppViewAsh::OnPointerMoved(winui::Core::ICoreWindow* sender, ui_channel_->Send(new MetroViewerHostMsg_MouseMoved(pointer.x(), pointer.y(), - 0)); + mouse_down_flags_)); return S_OK; } -HRESULT ChromeAppViewAsh::OnPointerPressed(winui::Core::ICoreWindow* sender, +// NOTE: From experimentation, it seems like Metro only sends a PointerPressed +// event for the first button pressed and the last button released in a sequence +// of mouse events. +// For example, a sequence of LEFT_DOWN, RIGHT_DOWN, LEFT_UP, RIGHT_UP results +// only in PointerPressed(LEFT)/PointerReleased(RIGHT) events. +HRESULT ChromeAppViewAsh::OnPointerPressed( + winui::Core::ICoreWindow* sender, winui::Core::IPointerEventArgs* args) { PointerInfoHandler pointer; HRESULT hr = pointer.Init(args); if (FAILED(hr)) return hr; DCHECK(pointer.IsMouse()); + + mouse_down_flags_ = pointer.flags(); ui_channel_->Send(new MetroViewerHostMsg_MouseButton(pointer.x(), pointer.y(), 0, ui::ET_MOUSE_PRESSED, - pointer.flags())); + mouse_down_flags_)); return S_OK; } -HRESULT ChromeAppViewAsh::OnPointerReleased(winui::Core::ICoreWindow* sender, +HRESULT ChromeAppViewAsh::OnPointerReleased( + winui::Core::ICoreWindow* sender, winui::Core::IPointerEventArgs* args) { PointerInfoHandler pointer; HRESULT hr = pointer.Init(args); if (FAILED(hr)) return hr; DCHECK(pointer.IsMouse()); + + mouse_down_flags_ = ui::EF_NONE; ui_channel_->Send(new MetroViewerHostMsg_MouseButton(pointer.x(), pointer.y(), 0, ui::ET_MOUSE_RELEASED, @@ -407,7 +418,8 @@ HRESULT ChromeAppViewAsh::OnPointerReleased(winui::Core::ICoreWindow* sender, return S_OK; } -HRESULT ChromeAppViewAsh::OnWheel(winui::Core::ICoreWindow* sender, +HRESULT ChromeAppViewAsh::OnWheel( + winui::Core::ICoreWindow* sender, winui::Core::IPointerEventArgs* args) { PointerInfoHandler pointer; HRESULT hr = pointer.Init(args); @@ -421,8 +433,9 @@ HRESULT ChromeAppViewAsh::OnWheel(winui::Core::ICoreWindow* sender, return S_OK; } -HRESULT ChromeAppViewAsh::OnKeyDown(winui::Core::ICoreWindow* sender, - winui::Core::IKeyEventArgs* args) { +HRESULT ChromeAppViewAsh::OnKeyDown( + winui::Core::ICoreWindow* sender, + winui::Core::IKeyEventArgs* args) { winsys::VirtualKey virtual_key; HRESULT hr = args->get_VirtualKey(&virtual_key); if (FAILED(hr)) @@ -439,8 +452,9 @@ HRESULT ChromeAppViewAsh::OnKeyDown(winui::Core::ICoreWindow* sender, return S_OK; } -HRESULT ChromeAppViewAsh::OnKeyUp(winui::Core::ICoreWindow* sender, - winui::Core::IKeyEventArgs* args) { +HRESULT ChromeAppViewAsh::OnKeyUp( + winui::Core::ICoreWindow* sender, + winui::Core::IKeyEventArgs* args) { winsys::VirtualKey virtual_key; HRESULT hr = args->get_VirtualKey(&virtual_key); if (FAILED(hr)) diff --git a/win8/metro_driver/chrome_app_view_ash.h b/win8/metro_driver/chrome_app_view_ash.h index 1906297..7191473 100644 --- a/win8/metro_driver/chrome_app_view_ash.h +++ b/win8/metro_driver/chrome_app_view_ash.h @@ -11,6 +11,7 @@ #include <windows.ui.viewmanagement.h> #include "base/memory/scoped_ptr.h" +#include "ui/base/events/event_constants.h" #include "win8/metro_driver/direct3d_helper.h" namespace IPC { @@ -71,6 +72,10 @@ class ChromeAppViewAsh EventRegistrationToken character_received_token_; EventRegistrationToken visibility_changed_token_; + // Keep state about which button is currently down, if any, as PointerMoved + // events do not contain that state, but Ash's MouseEvents need it. + ui::EventFlags mouse_down_flags_; + metro_driver::Direct3DHelper direct3d_helper_; IPC::ChannelProxy* ui_channel_; |