summaryrefslogtreecommitdiffstats
path: root/win8
diff options
context:
space:
mode:
authorgab@chromium.org <gab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-29 23:38:49 +0000
committergab@chromium.org <gab@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-29 23:38:49 +0000
commite211e506b23f49f2665273ba7a12e98ca0a3ce87 (patch)
tree478793b378b3aa0d5b199663aa43ca0fdac1e623 /win8
parent22ebaca6d627c17ebefce7527f5661c1fe2e4bd2 (diff)
downloadchromium_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.cc40
-rw-r--r--win8/metro_driver/chrome_app_view_ash.h5
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_;