Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Unified Diff: win8/metro_driver/metro_driver_win7.cc

Issue 282953003: Support input events in Chrome ASH on Windows 7. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed presubmit warnings Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « win8/metro_driver/display_properties.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: win8/metro_driver/metro_driver_win7.cc
diff --git a/win8/metro_driver/metro_driver_win7.cc b/win8/metro_driver/metro_driver_win7.cc
index fedba658ac3afb6a19b6dde0ee3baa009d5b25fa..ace0d940e6baff899ceeb50e8d63a043e5d93f10 100644
--- a/win8/metro_driver/metro_driver_win7.cc
+++ b/win8/metro_driver/metro_driver_win7.cc
@@ -6,10 +6,14 @@
#include <corewindow.h>
#include "base/logging.h"
+#include "ui/gfx/geometry/safe_integer_conversions.h"
+#include "ui/gfx/win/msg_util.h"
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
int g_window_count = 0;
+extern float GetModernUIScale();
+
LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
WPARAM wparam, LPARAM lparam) {
PAINTSTRUCT ps;
@@ -22,10 +26,6 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
hdc = ::BeginPaint(hwnd, &ps);
::EndPaint(hwnd, &ps);
break;
- case WM_LBUTTONUP:
- // TODO(cpu): Remove this test code.
- ::InvalidateRect(hwnd, NULL, TRUE);
- break;
case WM_CLOSE:
::DestroyWindow(hwnd);
break;
@@ -34,6 +34,9 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
if (!g_window_count)
::PostQuitMessage(0);
break;
+ // Always allow Chrome to set the cursor.
+ case WM_SETCURSOR:
+ return 1;
default:
return ::DefWindowProc(hwnd, message, wparam, lparam);
}
@@ -114,6 +117,321 @@ typedef winfoundtn::ITypedEventHandler<
winui::Core::CoreDispatcher*,
winui::Core::AcceleratorKeyEventArgs*> AcceleratorKeyEventHandler;
+// This interface is implemented by classes which handle mouse and keyboard
+// input.
+class InputHandler {
+ public:
+ InputHandler() {}
+ virtual ~InputHandler() {}
+
+ virtual bool HandleKeyboardMessage(const MSG& msg) = 0;
+ virtual bool HandleMouseMessage(const MSG& msg) = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(InputHandler);
+};
+
+// This class implements the winrt interfaces corresponding to mouse input.
+class MouseEvent : public mswr::RuntimeClass<
+ winui::Core::IPointerEventArgs,
+ winui::Input::IPointerPoint,
+ winui::Input::IPointerPointProperties,
+ windevs::Input::IPointerDevice> {
+ public:
+ MouseEvent(const MSG& msg)
+ : msg_(msg) {
+ }
+
+ // IPointerEventArgs implementation.
+ virtual HRESULT STDMETHODCALLTYPE get_CurrentPoint(
+ winui::Input::IPointerPoint** point) {
+ return QueryInterface(winui::Input::IID_IPointerPoint,
+ reinterpret_cast<void**>(point));
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_KeyModifiers(
+ winsys::VirtualKeyModifiers* modifiers) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE GetIntermediatePoints(
+ winfoundtn::Collections::IVector<winui::Input::PointerPoint*>** points) {
+ return E_NOTIMPL;
+ }
+
+ // IPointerPoint implementation.
+ virtual HRESULT STDMETHODCALLTYPE get_PointerDevice(
+ windevs::Input::IPointerDevice** pointer_device) {
+ return QueryInterface(windevs::Input::IID_IPointerDevice,
+ reinterpret_cast<void**>(pointer_device));
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_Position(winfoundtn::Point* position) {
+ static float scale = GetModernUIScale();
+ // Scale down the points here as they are scaled up on the other side.
+ position->X = gfx::ToRoundedInt(CR_GET_X_LPARAM(msg_.lParam) / scale);
+ position->Y = gfx::ToRoundedInt(CR_GET_Y_LPARAM(msg_.lParam) / scale);
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_PointerId(uint32* pointer_id) {
+ // TODO(ananta)
+ // Implement this properly.
+ *pointer_id = 1;
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_Timestamp(uint64* timestamp) {
+ *timestamp = msg_.time;
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_Properties(
+ winui::Input::IPointerPointProperties** properties) {
+ return QueryInterface(winui::Input::IID_IPointerPointProperties,
+ reinterpret_cast<void**>(properties));
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_RawPosition(
+ winfoundtn::Point* position) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_FrameId(uint32* frame_id) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsInContact(boolean* in_contact) {
+ return E_NOTIMPL;
+ }
+
+ // IPointerPointProperties implementation.
+ virtual HRESULT STDMETHODCALLTYPE get_PointerUpdateKind(
+ winui::Input::PointerUpdateKind* update_kind) {
+ // TODO(ananta)
+ // There is no WM_POINTERUPDATE equivalent on Windows 7. Look into
+ // equivalents.
+ if (msg_.message == WM_LBUTTONDOWN) {
+ *update_kind = winui::Input::PointerUpdateKind_LeftButtonPressed;
+ } else if (msg_.message == WM_RBUTTONDOWN) {
+ *update_kind = winui::Input::PointerUpdateKind_RightButtonPressed;
+ } else if (msg_.message == WM_MBUTTONDOWN) {
+ *update_kind = winui::Input::PointerUpdateKind_MiddleButtonPressed;
+ } else if (msg_.message == WM_LBUTTONUP) {
+ *update_kind = winui::Input::PointerUpdateKind_LeftButtonReleased;
+ } else if (msg_.message == WM_RBUTTONUP) {
+ *update_kind = winui::Input::PointerUpdateKind_RightButtonReleased;
+ } else if (msg_.message == WM_MBUTTONUP) {
+ *update_kind = winui::Input::PointerUpdateKind_MiddleButtonReleased;
+ }
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsLeftButtonPressed(
+ boolean* left_button_pressed) {
+ *left_button_pressed = msg_.wParam & MK_LBUTTON ? true : false;
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsRightButtonPressed(
+ boolean* right_button_pressed) {
+ *right_button_pressed = msg_.wParam & MK_RBUTTON ? true : false;
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsMiddleButtonPressed(
+ boolean* middle_button_pressed) {
+ *middle_button_pressed = msg_.wParam & MK_MBUTTON ? true : false;
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsHorizontalMouseWheel(
+ boolean* is_horizontal_mouse_wheel) {
+ *is_horizontal_mouse_wheel =
+ (msg_.message == WM_MOUSEHWHEEL) ? true : false;
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_MouseWheelDelta(int* delta) {
+ if (msg_.message == WM_MOUSEWHEEL || msg_.message == WM_MOUSEHWHEEL) {
+ *delta = GET_WHEEL_DELTA_WPARAM(msg_.wParam);
+ return S_OK;
+ } else {
+ return S_FALSE;
+ }
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_Pressure(float* pressure) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsInverted(boolean* inverted) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsEraser(boolean* is_eraser) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_Orientation(float* orientation) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_XTilt(float* x_tilt) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_YTilt(float* y_tilt) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_Twist(float* twist) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_ContactRect(winfoundtn::Rect* rect) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_ContactRectRaw(winfoundtn::Rect* rect) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_TouchConfidence(boolean* confidence) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsPrimary(boolean* is_primary) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsInRange(boolean* is_in_range) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsCanceled(boolean* is_canceled) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsBarrelButtonPressed(
+ boolean* is_barrel_button_pressed) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsXButton1Pressed(
+ boolean* is_xbutton1_pressed) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsXButton2Pressed(
+ boolean* is_xbutton2_pressed) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE HasUsage(uint32 usage_page,
+ uint32 usage_id,
+ boolean* has_usage) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE GetUsageValue(uint32 usage_page,
+ uint32 usage_id,
+ int32* usage_value) {
+ return E_NOTIMPL;
+ }
+
+ // IPointerDevice implementation.
+ virtual HRESULT STDMETHODCALLTYPE get_PointerDeviceType(
+ windevs::Input::PointerDeviceType* device_type) {
+ if (msg_.message == WM_TOUCH) {
+ *device_type = windevs::Input::PointerDeviceType_Touch;
+ } else {
+ *device_type = windevs::Input::PointerDeviceType_Mouse;
+ }
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_IsIntegrated(boolean* is_integrated) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_MaxContacts(uint32* contacts) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_PhysicalDeviceRect(
+ winfoundtn::Rect* rect) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_ScreenRect(winfoundtn::Rect* rect) {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_SupportedUsages(
+ winfoundtn::Collections::IVectorView<
+ windevs::Input::PointerDeviceUsage>** usages) {
+ return E_NOTIMPL;
+ }
+
+ private:
+ MSG msg_;
+
+ DISALLOW_COPY_AND_ASSIGN(MouseEvent);
+};
+
+// This class implements the winrt interfaces needed to support keyboard
+// character and system character messages.
+class KeyEvent : public mswr::RuntimeClass<
+ winui::Core::IKeyEventArgs,
+ winui::Core::ICharacterReceivedEventArgs,
+ winui::Core::IAcceleratorKeyEventArgs> {
+ public:
+ KeyEvent(const MSG& msg)
+ : msg_(msg) {}
+
+ // IKeyEventArgs implementation.
+ virtual HRESULT STDMETHODCALLTYPE get_VirtualKey(
+ winsys::VirtualKey* virtual_key) {
+ *virtual_key = static_cast<winsys::VirtualKey>(msg_.wParam);
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE get_KeyStatus(
+ winui::Core::CorePhysicalKeyStatus* key_status) {
+ // As per msdn documentation for the keyboard messages.
+ key_status->RepeatCount = msg_.lParam & 0x0000FFFF;
+ key_status->ScanCode = (msg_.lParam >> 16) & 0x00FF;
+ key_status->IsExtendedKey = (msg_.lParam & (1 << 24));
+ key_status->IsMenuKeyDown = (msg_.lParam & (1 << 29));
+ key_status->WasKeyDown = (msg_.lParam & (1 << 30));
+ key_status->IsKeyReleased = (msg_.lParam & (1 << 31));
+ return S_OK;
+ }
+
+ // ICharacterReceivedEventArgs implementation.
+ virtual HRESULT STDMETHODCALLTYPE get_KeyCode(uint32* key_code) {
+ *key_code = msg_.wParam;
+ return S_OK;
+ }
+
+ // IAcceleratorKeyEventArgs implementation.
+ virtual HRESULT STDMETHODCALLTYPE get_EventType(
+ winui::Core::CoreAcceleratorKeyEventType* event_type) {
+ if (msg_.message == WM_SYSKEYDOWN) {
+ *event_type = winui::Core::CoreAcceleratorKeyEventType_SystemKeyDown;
+ } else if (msg_.message == WM_SYSKEYUP) {
+ *event_type = winui::Core::CoreAcceleratorKeyEventType_SystemKeyUp;
+ } else if (msg_.message == WM_SYSCHAR) {
+ *event_type = winui::Core::CoreAcceleratorKeyEventType_SystemCharacter;
+ }
+ return S_OK;
+ }
+
+ private:
+ MSG msg_;
+};
+
// The following classes are the emulation of the WinRT system as exposed
// to metro applications. There is one application (ICoreApplication) which
// contains a series of Views (ICoreApplicationView) each one of them
@@ -137,11 +455,15 @@ typedef winfoundtn::ITypedEventHandler<
// v V
// ICoreDispatcher <==> real HWND
//
-class CoreDispacherEmulation :
+class CoreDispatcherEmulation :
public mswr::RuntimeClass<
winui::Core::ICoreDispatcher,
winui::Core::ICoreAcceleratorKeys> {
public:
+ CoreDispatcherEmulation(InputHandler* input_handler)
+ : input_handler_(input_handler),
+ accelerator_key_event_handler_(NULL) {}
+
// ICoreDispatcher implementation:
virtual HRESULT STDMETHODCALLTYPE get_HasThreadAccess(boolean* value) {
return S_OK;
@@ -156,6 +478,7 @@ class CoreDispacherEmulation :
MSG msg = {0};
while((::GetMessage(&msg, NULL, 0, 0) != 0) && g_window_count > 0) {
+ ProcessInputMessage(msg);
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
@@ -181,24 +504,68 @@ class CoreDispacherEmulation :
virtual HRESULT STDMETHODCALLTYPE add_AcceleratorKeyActivated(
AcceleratorKeyEventHandler* handler,
EventRegistrationToken *pCookie) {
- // TODO(cpu): implement this.
+ accelerator_key_event_handler_ = handler;
+ accelerator_key_event_handler_->AddRef();
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE remove_AcceleratorKeyActivated(
EventRegistrationToken cookie) {
+ accelerator_key_event_handler_->Release();
+ accelerator_key_event_handler_ = NULL;
return S_OK;
}
+ private:
+ bool ProcessInputMessage(const MSG& msg) {
+ // Poor man's way of dispatching input events.
+ bool ret = false;
+ if (input_handler_) {
+ if ((msg.message >= WM_KEYFIRST) && (msg.message <= WM_KEYLAST)) {
+ if ((msg.message == WM_SYSKEYDOWN) || (msg.message == WM_SYSKEYUP) ||
+ msg.message == WM_SYSCHAR) {
+ ret = HandleSystemKeys(msg);
+ } else {
+ ret = input_handler_->HandleKeyboardMessage(msg);
+ }
+ } else if ((msg.message >= WM_MOUSEFIRST) &&
+ (msg.message <= WM_MOUSELAST)) {
+ ret = input_handler_->HandleMouseMessage(msg);
+ }
+ }
+ return ret;
+ }
+
+ bool HandleSystemKeys(const MSG& msg) {
+ mswr::ComPtr<winui::Core::IAcceleratorKeyEventArgs> event_args;
+ event_args = mswr::Make<KeyEvent>(msg);
+ accelerator_key_event_handler_->Invoke(this, event_args.Get());
+ return true;
+ }
+
+ InputHandler* input_handler_;
+ AcceleratorKeyEventHandler* accelerator_key_event_handler_;
};
class CoreWindowEmulation
: public mswr::RuntimeClass<
mswr::RuntimeClassFlags<mswr::WinRtClassicComMix>,
- winui::Core::ICoreWindow, ICoreWindowInterop> {
+ winui::Core::ICoreWindow, ICoreWindowInterop>,
+ public InputHandler {
public:
- CoreWindowEmulation() : core_hwnd_(NULL) {
- dispatcher_ = mswr::Make<CoreDispacherEmulation>();
+ CoreWindowEmulation()
+ : core_hwnd_(NULL),
+ mouse_moved_handler_(NULL),
+ mouse_capture_lost_handler_(NULL),
+ mouse_pressed_handler_(NULL),
+ mouse_released_handler_(NULL),
+ mouse_entered_handler_(NULL),
+ mouse_exited_handler_(NULL),
+ mouse_wheel_changed_handler_(NULL),
+ key_down_handler_(NULL),
+ key_up_handler_(NULL),
+ character_received_handler_(NULL) {
+ dispatcher_ = mswr::Make<CoreDispatcherEmulation>(this);
core_hwnd_ = CreateMetroTopLevelWindow();
}
@@ -330,12 +697,15 @@ class CoreWindowEmulation
virtual HRESULT STDMETHODCALLTYPE add_CharacterReceived(
CharEventHandler* handler,
EventRegistrationToken* pCookie) {
- // TODO(cpu) : implement this.
+ character_received_handler_ = handler;
+ character_received_handler_->AddRef();
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE remove_CharacterReceived(
EventRegistrationToken cookie) {
+ character_received_handler_->Release();
+ character_received_handler_ = NULL;
return S_OK;
}
@@ -364,93 +734,114 @@ class CoreWindowEmulation
virtual HRESULT STDMETHODCALLTYPE add_KeyDown(
KeyEventHandler* handler,
EventRegistrationToken* pCookie) {
- // TODO(cpu): implement this.
+ key_down_handler_ = handler;
+ key_down_handler_->AddRef();
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE remove_KeyDown(
EventRegistrationToken cookie) {
+ key_down_handler_->Release();
+ key_down_handler_ = NULL;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE add_KeyUp(
KeyEventHandler* handler,
EventRegistrationToken* pCookie) {
- // TODO(cpu): implement this.
+ key_up_handler_ = handler;
+ key_up_handler_->AddRef();
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE remove_KeyUp(
EventRegistrationToken cookie) {
+ key_up_handler_->Release();
+ key_up_handler_ = NULL;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE add_PointerCaptureLost(
PointerEventHandler* handler,
EventRegistrationToken* cookie) {
+ mouse_capture_lost_handler_ = handler;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE remove_PointerCaptureLost(
EventRegistrationToken cookie) {
+ mouse_capture_lost_handler_ = NULL;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE add_PointerEntered(
PointerEventHandler* handler,
EventRegistrationToken* cookie) {
+ mouse_entered_handler_ = handler;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE remove_PointerEntered(
EventRegistrationToken cookie) {
+ mouse_entered_handler_ = NULL;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE add_PointerExited(
PointerEventHandler* handler,
EventRegistrationToken* cookie) {
+ mouse_exited_handler_ = handler;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE remove_PointerExited(
EventRegistrationToken cookie) {
+ mouse_exited_handler_ = NULL;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE add_PointerMoved(
PointerEventHandler* handler,
EventRegistrationToken* cookie) {
- // TODO(cpu) : implement this.
+ mouse_moved_handler_ = handler;
+ mouse_moved_handler_->AddRef();
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE remove_PointerMoved(
EventRegistrationToken cookie) {
+ mouse_moved_handler_->Release();
+ mouse_moved_handler_ = NULL;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE add_PointerPressed(
PointerEventHandler* handler,
EventRegistrationToken* cookie) {
- // TODO(cpu): implement this.
+ mouse_pressed_handler_ = handler;
+ mouse_pressed_handler_->AddRef();
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE remove_PointerPressed(
EventRegistrationToken cookie) {
+ mouse_pressed_handler_->Release();
+ mouse_pressed_handler_ = NULL;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE add_PointerReleased(
PointerEventHandler* handler,
EventRegistrationToken* cookie) {
- // TODO(cpu): implement this.
+ mouse_released_handler_ = handler;
+ mouse_released_handler_->AddRef();
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE remove_PointerReleased(
EventRegistrationToken cookie) {
+ mouse_released_handler_->Release();
+ mouse_released_handler_ = NULL;
return S_OK;
}
@@ -468,11 +859,15 @@ class CoreWindowEmulation
virtual HRESULT STDMETHODCALLTYPE add_PointerWheelChanged(
PointerEventHandler* handler,
EventRegistrationToken* cookie) {
+ mouse_wheel_changed_handler_ = handler;
+ mouse_wheel_changed_handler_->AddRef();
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE remove_PointerWheelChanged(
EventRegistrationToken cookie) {
+ mouse_wheel_changed_handler_->Release();
+ mouse_wheel_changed_handler_ = NULL;
return S_OK;
}
@@ -512,7 +907,86 @@ class CoreWindowEmulation
return S_OK;
}
+ // InputHandler
+ virtual bool HandleKeyboardMessage(const MSG& msg) OVERRIDE {
+ switch (msg.message) {
+ case WM_KEYDOWN:
+ case WM_KEYUP: {
+ mswr::ComPtr<winui::Core::IKeyEventArgs> event_args;
+ event_args = mswr::Make<KeyEvent>(msg);
+ KeyEventHandler* handler = NULL;
+ if (msg.message == WM_KEYDOWN) {
+ handler = key_down_handler_;
+ } else {
+ handler = key_up_handler_;
+ }
+ handler->Invoke(this, event_args.Get());
+ break;
+ }
+
+ case WM_CHAR:
+ case WM_DEADCHAR:
+ case WM_UNICHAR: {
+ mswr::ComPtr<winui::Core::ICharacterReceivedEventArgs> event_args;
+ event_args = mswr::Make<KeyEvent>(msg);
+ character_received_handler_->Invoke(this, event_args.Get());
+ break;
+ }
+
+ default:
+ return false;
+ }
+ return true;
+ }
+
+ virtual bool HandleMouseMessage(const MSG& msg) OVERRIDE {
+ PointerEventHandler* handler = NULL;
+ mswr::ComPtr<winui::Core::IPointerEventArgs> event_args;
+ event_args = mswr::Make<MouseEvent>(msg);
+ switch (msg.message) {
+ case WM_MOUSEMOVE: {
+ handler = mouse_moved_handler_;
+ break;
+ }
+ case WM_LBUTTONDOWN: {
+ case WM_RBUTTONDOWN:
+ case WM_MBUTTONDOWN:
+ handler = mouse_pressed_handler_;
+ break;
+ }
+
+ case WM_LBUTTONUP: {
+ case WM_RBUTTONUP:
+ case WM_MBUTTONUP:
+ handler = mouse_released_handler_;
+ break;
+ }
+
+ case WM_MOUSEWHEEL: {
+ case WM_MOUSEHWHEEL:
+ handler = mouse_wheel_changed_handler_;
+ break;
+ }
+
+ default:
+ return false;
+ }
+ DCHECK(handler);
+ handler->Invoke(this, event_args.Get());
+ return true;
+ }
+
private:
+ PointerEventHandler* mouse_moved_handler_;
+ PointerEventHandler* mouse_capture_lost_handler_;
+ PointerEventHandler* mouse_pressed_handler_;
+ PointerEventHandler* mouse_released_handler_;
+ PointerEventHandler* mouse_entered_handler_;
+ PointerEventHandler* mouse_exited_handler_;
+ PointerEventHandler* mouse_wheel_changed_handler_;
+ KeyEventHandler* key_down_handler_;
+ KeyEventHandler* key_up_handler_;
+ CharEventHandler* character_received_handler_;
HWND core_hwnd_;
mswr::ComPtr<winui::Core::ICoreDispatcher> dispatcher_;
};
« no previous file with comments | « win8/metro_driver/display_properties.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698