1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef WinPointerEvents_h__ 7 #define WinPointerEvents_h__ 8 9 #include "mozilla/MouseEvents.h" 10 #include "nsWindowBase.h" 11 12 // Define PointerEvent related macros and structures when building code on 13 // Windows version before Win8. 14 #if WINVER < 0x0602 15 16 // These definitions are copied from WinUser.h. Some of them are not used but 17 // keep them here for future usage. 18 # define WM_NCPOINTERUPDATE 0x0241 19 # define WM_NCPOINTERDOWN 0x0242 20 # define WM_NCPOINTERUP 0x0243 21 # define WM_POINTERUPDATE 0x0245 22 # define WM_POINTERDOWN 0x0246 23 # define WM_POINTERUP 0x0247 24 # define WM_POINTERENTER 0x0249 25 # define WM_POINTERLEAVE 0x024A 26 # define WM_POINTERACTIVATE 0x024B 27 # define WM_POINTERCAPTURECHANGED 0x024C 28 # define WM_TOUCHHITTESTING 0x024D 29 # define WM_POINTERWHEEL 0x024E 30 # define WM_POINTERHWHEEL 0x024F 31 # define DM_POINTERHITTEST 0x0250 32 33 typedef UINT32 PEN_FLAGS; 34 # define PEN_FLAG_NONE 0x00000000 // Default 35 # define PEN_FLAG_BARREL 0x00000001 // The barrel button is pressed 36 # define PEN_FLAG_INVERTED 0x00000002 // The pen is inverted 37 # define PEN_FLAG_ERASER 0x00000004 // The eraser button is pressed 38 39 typedef UINT32 PEN_MASK; 40 # define PEN_MASK_NONE \ 41 0x00000000 // Default - none of the optional fields are valid 42 # define PEN_MASK_PRESSURE 0x00000001 // The pressure field is valid 43 # define PEN_MASK_ROTATION 0x00000002 // The rotation field is valid 44 # define PEN_MASK_TILT_X 0x00000004 // The tiltX field is valid 45 # define PEN_MASK_TILT_Y 0x00000008 // The tiltY field is valid 46 47 typedef struct tagPOINTER_PEN_INFO { 48 POINTER_INFO pointerInfo; 49 PEN_FLAGS penFlags; 50 PEN_MASK penMask; 51 UINT32 pressure; 52 UINT32 rotation; 53 INT32 tiltX; 54 INT32 tiltY; 55 } POINTER_PEN_INFO; 56 57 /* 58 * Flags that appear in pointer input message parameters 59 */ 60 # define POINTER_MESSAGE_FLAG_NEW 0x00000001 // New pointer 61 # define POINTER_MESSAGE_FLAG_INRANGE 0x00000002 // Pointer has not departed 62 # define POINTER_MESSAGE_FLAG_INCONTACT 0x00000004 // Pointer is in contact 63 # define POINTER_MESSAGE_FLAG_FIRSTBUTTON 0x00000010 // Primary action 64 # define POINTER_MESSAGE_FLAG_SECONDBUTTON 0x00000020 // Secondary action 65 # define POINTER_MESSAGE_FLAG_THIRDBUTTON 0x00000040 // Third button 66 # define POINTER_MESSAGE_FLAG_FOURTHBUTTON 0x00000080 // Fourth button 67 # define POINTER_MESSAGE_FLAG_FIFTHBUTTON 0x00000100 // Fifth button 68 # define POINTER_MESSAGE_FLAG_PRIMARY 0x00002000 // Pointer is primary 69 # define POINTER_MESSAGE_FLAG_CONFIDENCE \ 70 0x00004000 // Pointer is considered unlikely to be accidental 71 # define POINTER_MESSAGE_FLAG_CANCELED \ 72 0x00008000 // Pointer is departing in an abnormal manner 73 74 /* 75 * Macros to retrieve information from pointer input message parameters 76 */ 77 # define GET_POINTERID_WPARAM(wParam) (LOWORD(wParam)) 78 # define IS_POINTER_FLAG_SET_WPARAM(wParam, flag) \ 79 (((DWORD)HIWORD(wParam) & (flag)) == (flag)) 80 # define IS_POINTER_NEW_WPARAM(wParam) \ 81 IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_NEW) 82 # define IS_POINTER_INRANGE_WPARAM(wParam) \ 83 IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_INRANGE) 84 # define IS_POINTER_INCONTACT_WPARAM(wParam) \ 85 IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_INCONTACT) 86 # define IS_POINTER_FIRSTBUTTON_WPARAM(wParam) \ 87 IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_FIRSTBUTTON) 88 # define IS_POINTER_SECONDBUTTON_WPARAM(wParam) \ 89 IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_SECONDBUTTON) 90 # define IS_POINTER_THIRDBUTTON_WPARAM(wParam) \ 91 IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_THIRDBUTTON) 92 # define IS_POINTER_FOURTHBUTTON_WPARAM(wParam) \ 93 IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_FOURTHBUTTON) 94 # define IS_POINTER_FIFTHBUTTON_WPARAM(wParam) \ 95 IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_FIFTHBUTTON) 96 # define IS_POINTER_PRIMARY_WPARAM(wParam) \ 97 IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_PRIMARY) 98 # define HAS_POINTER_CONFIDENCE_WPARAM(wParam) \ 99 IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_CONFIDENCE) 100 # define IS_POINTER_CANCELED_WPARAM(wParam) \ 101 IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_CANCELED) 102 103 /* 104 * WM_POINTERACTIVATE return codes 105 */ 106 # define PA_ACTIVATE MA_ACTIVATE 107 # define PA_NOACTIVATE MA_NOACTIVATE 108 109 #endif // WINVER < 0x0602 110 111 /****************************************************************************** 112 * WinPointerInfo 113 * 114 * This is a helper class to handle WM_POINTER*. It only supports Win8 or later. 115 * 116 ******************************************************************************/ 117 class WinPointerInfo final : public mozilla::WidgetPointerHelper { 118 public: WinPointerInfo()119 WinPointerInfo() : WidgetPointerHelper(), mPressure(0), mButtons(0) {} 120 WinPointerInfo(uint32_t aPointerId,uint32_t aTiltX,uint32_t aTiltY,float aPressure,int16_t aButtons)121 WinPointerInfo(uint32_t aPointerId, uint32_t aTiltX, uint32_t aTiltY, 122 float aPressure, int16_t aButtons) 123 : WidgetPointerHelper(aPointerId, aTiltX, aTiltY), 124 mPressure(aPressure), 125 mButtons(aButtons) {} 126 127 float mPressure; 128 int16_t mButtons; 129 }; 130 131 class WinPointerEvents final { 132 public: 133 explicit WinPointerEvents(); 134 135 public: 136 bool ShouldHandleWinPointerMessages(UINT aMsg, WPARAM aWParam); 137 GetPointerId(WPARAM aWParam)138 uint32_t GetPointerId(WPARAM aWParam) { 139 return GET_POINTERID_WPARAM(aWParam); 140 } 141 bool GetPointerType(uint32_t aPointerId, POINTER_INPUT_TYPE* aPointerType); 142 POINTER_INPUT_TYPE GetPointerType(uint32_t aPointerId); 143 bool GetPointerInfo(uint32_t aPointerId, POINTER_INFO* aPointerInfo); 144 bool GetPointerPenInfo(uint32_t aPointerId, POINTER_PEN_INFO* aPenInfo); 145 bool ShouldEnableInkCollector(); 146 bool ShouldRollupOnPointerEvent(UINT aMsg, WPARAM aWParam); 147 bool ShouldFirePointerEventByWinPointerMessages(); 148 WinPointerInfo* GetCachedPointerInfo(UINT aMsg, WPARAM aWParam); 149 void ConvertAndCachePointerInfo(UINT aMsg, WPARAM aWParam); 150 void ConvertAndCachePointerInfo(WPARAM aWParam, WinPointerInfo* aInfo); 151 152 private: 153 // Function prototypes 154 typedef BOOL(WINAPI* GetPointerTypePtr)(uint32_t aPointerId, 155 POINTER_INPUT_TYPE* aPointerType); 156 typedef BOOL(WINAPI* GetPointerInfoPtr)(uint32_t aPointerId, 157 POINTER_INFO* aPointerInfo); 158 typedef BOOL(WINAPI* GetPointerPenInfoPtr)(uint32_t aPointerId, 159 POINTER_PEN_INFO* aPenInfo); 160 161 void InitLibrary(); 162 163 static HMODULE sLibraryHandle; 164 static const wchar_t kPointerLibraryName[]; 165 // Static function pointers 166 static GetPointerTypePtr getPointerType; 167 static GetPointerInfoPtr getPointerInfo; 168 static GetPointerPenInfoPtr getPointerPenInfo; 169 WinPointerInfo mPenPointerDownInfo; 170 WinPointerInfo mPenPointerUpInfo; 171 WinPointerInfo mPenPointerUpdateInfo; 172 }; 173 174 #endif // #ifndef WinPointerEvents_h__ 175