15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windowsx.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/win_util.h" 12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion_win.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h" 15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/win/dpi.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From MSDN: "Mouse" events are flagged with 0xFF515700 if they come 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from a touch or stylus device. In Vista or later, they are also flagged 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with 0x80 if they come from touch. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MOUSEEVENTF_FROMTOUCH (0xFF515700 | 0x80) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the native mouse key state from the native event message type. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetNativeMouseKey(const base::NativeEvent& native_event) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (native_event.message) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_LBUTTONDBLCLK: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_LBUTTONDOWN: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_LBUTTONUP: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCLBUTTONDBLCLK: 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCLBUTTONDOWN: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCLBUTTONUP: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MK_LBUTTON; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_MBUTTONDBLCLK: 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_MBUTTONDOWN: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_MBUTTONUP: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCMBUTTONDBLCLK: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCMBUTTONDOWN: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCMBUTTONUP: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MK_MBUTTON; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_RBUTTONDBLCLK: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_RBUTTONDOWN: 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_RBUTTONUP: 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCRBUTTONDBLCLK: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCRBUTTONDOWN: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCRBUTTONUP: 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MK_RBUTTON; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCXBUTTONDBLCLK: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCXBUTTONDOWN: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCXBUTTONUP: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_XBUTTONDBLCLK: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_XBUTTONDOWN: 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_XBUTTONUP: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MK_XBUTTON1; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsButtonDown(const base::NativeEvent& native_event) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ((MK_LBUTTON | MK_MBUTTON | MK_RBUTTON | MK_XBUTTON1 | MK_XBUTTON2) & 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event.wParam) != 0; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsClientMouseEvent(const base::NativeEvent& native_event) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_event.message == WM_MOUSELEAVE || 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event.message == WM_MOUSEHOVER || 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (native_event.message >= WM_MOUSEFIRST && 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event.message <= WM_MOUSELAST); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsNonClientMouseEvent(const base::NativeEvent& native_event) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_event.message == WM_NCMOUSELEAVE || 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event.message == WM_NCMOUSEHOVER || 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (native_event.message >= WM_NCMOUSEMOVE && 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event.message <= WM_NCXBUTTONDBLCLK); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool IsMouseEvent(const base::NativeEvent& native_event) { 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return IsClientMouseEvent(native_event) || 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IsNonClientMouseEvent(native_event); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsMouseWheelEvent(const base::NativeEvent& native_event) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_event.message == WM_MOUSEWHEEL || 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event.message == WM_MOUSEHWHEEL; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsKeyEvent(const base::NativeEvent& native_event) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_event.message == WM_KEYDOWN || 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event.message == WM_SYSKEYDOWN || 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event.message == WM_CHAR || 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event.message == WM_KEYUP || 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event.message == WM_SYSKEYUP; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool IsScrollEvent(const base::NativeEvent& native_event) { 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return native_event.message == WM_VSCROLL || 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) native_event.message == WM_HSCROLL; 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a mask corresponding to the set of pressed modifier keys. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks the current global state and the state sent by client mouse messages. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int KeyStateFlagsFromNative(const base::NativeEvent& native_event) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags = 0; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= base::win::IsAltPressed() ? EF_ALT_DOWN : EF_NONE; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= base::win::IsShiftPressed() ? EF_SHIFT_DOWN : EF_NONE; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= base::win::IsCtrlPressed() ? EF_CONTROL_DOWN : EF_NONE; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check key messages for the extended key flag. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsKeyEvent(native_event)) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= (HIWORD(native_event.lParam) & KF_EXTENDED) ? EF_EXTENDED : 0; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Most client mouse messages include key state information. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsClientMouseEvent(native_event)) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int win_flags = GET_KEYSTATE_WPARAM(native_event.wParam); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= (win_flags & MK_SHIFT) ? EF_SHIFT_DOWN : 0; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= (win_flags & MK_CONTROL) ? EF_CONTROL_DOWN : 0; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return flags; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a mask corresponding to the set of pressed mouse buttons. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This includes the button of the given message, even if it is being released. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseStateFlagsFromNative(const base::NativeEvent& native_event) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int win_flags = GetNativeMouseKey(native_event); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Client mouse messages provide key states in their WPARAMs. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsClientMouseEvent(native_event)) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) win_flags |= GET_KEYSTATE_WPARAM(native_event.wParam); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags = 0; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= (win_flags & MK_LBUTTON) ? EF_LEFT_MOUSE_BUTTON : 0; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= (win_flags & MK_MBUTTON) ? EF_MIDDLE_MOUSE_BUTTON : 0; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= (win_flags & MK_RBUTTON) ? EF_RIGHT_MOUSE_BUTTON : 0; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= IsNonClientMouseEvent(native_event) ? EF_IS_NON_CLIENT : 0; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return flags; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UpdateDeviceList() { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EventType EventTypeFromNative(const base::NativeEvent& native_event) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (native_event.message) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_KEYDOWN: 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_SYSKEYDOWN: 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_CHAR: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_KEY_PRESSED; 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The WM_DEADCHAR message is posted to the window with the keyboard focus 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // when a WM_KEYUP message is translated. This happens for special keyboard 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // sequences. 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case WM_DEADCHAR: 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_KEYUP: 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_SYSKEYUP: 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_KEY_RELEASED; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_LBUTTONDBLCLK: 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_LBUTTONDOWN: 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_MBUTTONDBLCLK: 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_MBUTTONDOWN: 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCLBUTTONDBLCLK: 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCLBUTTONDOWN: 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCMBUTTONDBLCLK: 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCMBUTTONDOWN: 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCRBUTTONDBLCLK: 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCRBUTTONDOWN: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCXBUTTONDBLCLK: 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCXBUTTONDOWN: 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_RBUTTONDBLCLK: 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_RBUTTONDOWN: 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_XBUTTONDBLCLK: 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_XBUTTONDOWN: 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSE_PRESSED; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_LBUTTONUP: 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_MBUTTONUP: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCLBUTTONUP: 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCMBUTTONUP: 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCRBUTTONUP: 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCXBUTTONUP: 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_RBUTTONUP: 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_XBUTTONUP: 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSE_RELEASED; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_MOUSEMOVE: 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsButtonDown(native_event) ? ET_MOUSE_DRAGGED : ET_MOUSE_MOVED; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCMOUSEMOVE: 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSE_MOVED; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_MOUSEWHEEL: 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_MOUSEHWHEEL: 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSEWHEEL; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_MOUSELEAVE: 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WM_NCMOUSELEAVE: 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_MOUSE_EXITED; 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_VSCROLL: 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WM_HSCROLL: 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ET_SCROLL; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can't NOTREACHED() here, since this function can be called for any 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ET_UNKNOWN; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int EventFlagsFromNative(const base::NativeEvent& native_event) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags = KeyStateFlagsFromNative(native_event); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsMouseEvent(native_event)) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags |= MouseStateFlagsFromNative(native_event); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return flags; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta EventTimeFromNative(const base::NativeEvent& native_event) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::TimeDelta::FromMilliseconds(native_event.time); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point EventLocationFromNative(const base::NativeEvent& native_event) { 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) POINT native_point; 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if ((native_event.message == WM_MOUSELEAVE || 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) native_event.message == WM_NCMOUSELEAVE) || 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IsScrollEvent(native_event)) { 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // These events have no coordinates. For sanity with rest of events grab 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // coordinates from the OS. 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ::GetCursorPos(&native_point); 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (IsClientMouseEvent(native_event) && 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !IsMouseWheelEvent(native_event)) { 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note: Wheel events are considered client, but their position is in screen 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // coordinates. 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Client message. The position is contained in the LPARAM. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Point(native_event.lParam); 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(IsNonClientMouseEvent(native_event) || 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IsMouseWheelEvent(native_event) || IsScrollEvent(native_event)); 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Non-client message. The position is contained in a POINTS structure in 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // LPARAM, and is in screen coordinates so we have to convert to client. 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) native_point.x = GET_X_LPARAM(native_event.lParam); 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) native_point.y = GET_Y_LPARAM(native_event.lParam); 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScreenToClient(native_event.hwnd, &native_point); 2430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return gfx::Point(native_point); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point EventSystemLocationFromNative( 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::NativeEvent& native_event) { 24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) POINT global_point = { static_cast<short>(LOWORD(native_event.lParam)), 24903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) static_cast<short>(HIWORD(native_event.lParam)) }; 25003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ClientToScreen(native_event.hwnd, &global_point); 25103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return gfx::Point(global_point); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyboardCode KeyboardCodeFromNative(const base::NativeEvent& native_event) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return KeyboardCodeForWindowsKeyCode(native_event.wParam); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char* CodeFromNative(const base::NativeEvent& native_event) { 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const uint16 scan_code = GetScanCodeFromLParam(native_event.lParam); 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return CodeForWindowsScanCode(scan_code); 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)uint32 PlatformKeycodeFromNative(const base::NativeEvent& native_event) { 264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return static_cast<uint32>(native_event.wParam); 265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool IsCharFromNative(const base::NativeEvent& native_event) { 2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return native_event.message == WM_CHAR; 2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetChangedMouseButtonFlagsFromNative( 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::NativeEvent& native_event) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (GetNativeMouseKey(native_event)) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MK_LBUTTON: 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return EF_LEFT_MOUSE_BUTTON; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MK_MBUTTON: 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return EF_MIDDLE_MOUSE_BUTTON; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MK_RBUTTON: 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return EF_RIGHT_MOUSE_BUTTON; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: add support for MK_XBUTTON1. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Vector2d GetMouseWheelOffset(const base::NativeEvent& native_event) { 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(native_event.message == WM_MOUSEWHEEL || 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) native_event.message == WM_MOUSEHWHEEL); 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (native_event.message == WM_MOUSEWHEEL) 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return gfx::Vector2d(0, GET_WHEEL_DELTA_WPARAM(native_event.wParam)); 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return gfx::Vector2d(GET_WHEEL_DELTA_WPARAM(native_event.wParam), 0); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubase::NativeEvent CopyNativeEvent(const base::NativeEvent& event) { 2965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return event; 2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid ReleaseCopiedNativeEvent(const base::NativeEvent& event) { 3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void IncrementTouchIdRefCount(const base::NativeEvent& event) { 3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NOTIMPLEMENTED(); 3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void ClearTouchIdIfReleased(const base::NativeEvent& xev) { 307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NOTIMPLEMENTED(); 308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetTouchId(const base::NativeEvent& xev) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)float GetTouchRadiusX(const base::NativeEvent& native_event) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1.0; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)float GetTouchRadiusY(const base::NativeEvent& native_event) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1.0; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)float GetTouchAngle(const base::NativeEvent& native_event) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0.0; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)float GetTouchForce(const base::NativeEvent& native_event) { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0.0; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetScrollOffsets(const base::NativeEvent& native_event, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float* x_offset, 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* y_offset, 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* x_offset_ordinal, 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* y_offset_ordinal, 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* finger_count) { 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(ananta) 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Support retrieving the scroll offsets from the scroll event. 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (native_event.message == WM_VSCROLL || native_event.message == WM_HSCROLL) 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetFlingData(const base::NativeEvent& native_event, 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float* vx, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float* vy, 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* vx_ordinal, 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* vy_ordinal, 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_cancel) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not supported in Windows. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetModifiersFromACCEL(const ACCEL& accel) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int modifiers = EF_NONE; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (accel.fVirt & FSHIFT) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modifiers |= EF_SHIFT_DOWN; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (accel.fVirt & FCONTROL) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modifiers |= EF_CONTROL_DOWN; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (accel.fVirt & FALT) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modifiers |= EF_ALT_DOWN; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return modifiers; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetModifiersFromKeyState() { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int modifiers = EF_NONE; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::win::IsShiftPressed()) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modifiers |= EF_SHIFT_DOWN; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::win::IsCtrlPressed()) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modifiers |= EF_CONTROL_DOWN; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::win::IsAltPressed()) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modifiers |= EF_ALT_DOWN; 378424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (base::win::IsAltGrPressed()) 379424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) modifiers |= EF_ALTGR_DOWN; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return modifiers; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows emulates mouse messages for touch events. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsMouseEventFromTouch(UINT message) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (message >= WM_MOUSEFIRST) && (message <= WM_MOUSELAST) && 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOUSEEVENTF_FROMTOUCH; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Conversion scan_code and LParam each other. 391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// uint16 scan_code: 392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// ui/events/keycodes/dom4/keycode_converter_data.h 393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// 0 - 15bits: represetns the scan code. 394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// 28 - 30 bits (0xE000): represents whether this is an extended key or not. 395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// 396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// LPARAM lParam: 397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644984.aspx 398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// 16 - 23bits: represetns the scan code. 399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// 24bit (0x0100): represents whether this is an extended key or not. 400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)uint16 GetScanCodeFromLParam(LPARAM l_param) { 401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint16 scan_code = ((l_param >> 16) & 0x00FF); 402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (l_param & (1 << 24)) 403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scan_code |= 0xE000; 404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return scan_code; 405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)LPARAM GetLParamFromScanCode(uint16 scan_code) { 408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LPARAM l_param = static_cast<LPARAM>(scan_code & 0x00FF) << 16; 409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if ((scan_code & 0xE000) == 0xE000) 410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) l_param |= (1 << 24); 411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return l_param; 412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 415