forked from mirrors/gecko-dev
		
	 d862bc91dd
			
		
	
	
		d862bc91dd
		
	
	
	
	
		
			
			MozReview-Commit-ID: 4d13pyUsTG3 --HG-- extra : rebase_source : a4a104897584aedcc9e07367d910727124e12e88
		
			
				
	
	
		
			171 lines
		
	
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
	
		
			7.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #ifndef WinPointerEvents_h__
 | |
| #define WinPointerEvents_h__
 | |
| 
 | |
| #include "mozilla/MouseEvents.h"
 | |
| #include "nsWindowBase.h"
 | |
| 
 | |
| // Define PointerEvent related macros and structures when building code on
 | |
| // Windows version before Win8.
 | |
| #if WINVER < 0x0602
 | |
| 
 | |
| // These definitions are copied from WinUser.h. Some of them are not used but
 | |
| // keep them here for future usage.
 | |
| #define WM_NCPOINTERUPDATE              0x0241
 | |
| #define WM_NCPOINTERDOWN                0x0242
 | |
| #define WM_NCPOINTERUP                  0x0243
 | |
| #define WM_POINTERUPDATE                0x0245
 | |
| #define WM_POINTERDOWN                  0x0246
 | |
| #define WM_POINTERUP                    0x0247
 | |
| #define WM_POINTERENTER                 0x0249
 | |
| #define WM_POINTERLEAVE                 0x024A
 | |
| #define WM_POINTERACTIVATE              0x024B
 | |
| #define WM_POINTERCAPTURECHANGED        0x024C
 | |
| #define WM_TOUCHHITTESTING              0x024D
 | |
| #define WM_POINTERWHEEL                 0x024E
 | |
| #define WM_POINTERHWHEEL                0x024F
 | |
| #define DM_POINTERHITTEST               0x0250
 | |
| 
 | |
| typedef UINT32 PEN_FLAGS;
 | |
| #define PEN_FLAG_NONE                   0x00000000 // Default
 | |
| #define PEN_FLAG_BARREL                 0x00000001 // The barrel button is pressed
 | |
| #define PEN_FLAG_INVERTED               0x00000002 // The pen is inverted
 | |
| #define PEN_FLAG_ERASER                 0x00000004 // The eraser button is pressed
 | |
| 
 | |
| typedef UINT32 PEN_MASK;
 | |
| #define PEN_MASK_NONE                   0x00000000 // Default - none of the optional fields are valid
 | |
| #define PEN_MASK_PRESSURE               0x00000001 // The pressure field is valid
 | |
| #define PEN_MASK_ROTATION               0x00000002 // The rotation field is valid
 | |
| #define PEN_MASK_TILT_X                 0x00000004 // The tiltX field is valid
 | |
| #define PEN_MASK_TILT_Y                 0x00000008 // The tiltY field is valid
 | |
| 
 | |
| typedef struct tagPOINTER_PEN_INFO {
 | |
|     POINTER_INFO    pointerInfo;
 | |
|     PEN_FLAGS       penFlags;
 | |
|     PEN_MASK        penMask;
 | |
|     UINT32          pressure;
 | |
|     UINT32          rotation;
 | |
|     INT32           tiltX;
 | |
|     INT32           tiltY;
 | |
| } POINTER_PEN_INFO;
 | |
| 
 | |
| /*
 | |
|  * Flags that appear in pointer input message parameters
 | |
|  */
 | |
| #define POINTER_MESSAGE_FLAG_NEW                0x00000001 // New pointer
 | |
| #define POINTER_MESSAGE_FLAG_INRANGE            0x00000002 // Pointer has not departed
 | |
| #define POINTER_MESSAGE_FLAG_INCONTACT          0x00000004 // Pointer is in contact
 | |
| #define POINTER_MESSAGE_FLAG_FIRSTBUTTON        0x00000010 // Primary action
 | |
| #define POINTER_MESSAGE_FLAG_SECONDBUTTON       0x00000020 // Secondary action
 | |
| #define POINTER_MESSAGE_FLAG_THIRDBUTTON        0x00000040 // Third button
 | |
| #define POINTER_MESSAGE_FLAG_FOURTHBUTTON       0x00000080 // Fourth button
 | |
| #define POINTER_MESSAGE_FLAG_FIFTHBUTTON        0x00000100 // Fifth button
 | |
| #define POINTER_MESSAGE_FLAG_PRIMARY            0x00002000 // Pointer is primary
 | |
| #define POINTER_MESSAGE_FLAG_CONFIDENCE         0x00004000 // Pointer is considered unlikely to be accidental
 | |
| #define POINTER_MESSAGE_FLAG_CANCELED           0x00008000 // Pointer is departing in an abnormal manner
 | |
| 
 | |
| /*
 | |
|  * Macros to retrieve information from pointer input message parameters
 | |
|  */
 | |
| #define GET_POINTERID_WPARAM(wParam)                (LOWORD(wParam))
 | |
| #define IS_POINTER_FLAG_SET_WPARAM(wParam, flag)    (((DWORD)HIWORD(wParam) & (flag)) == (flag))
 | |
| #define IS_POINTER_NEW_WPARAM(wParam)               IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_NEW)
 | |
| #define IS_POINTER_INRANGE_WPARAM(wParam)           IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_INRANGE)
 | |
| #define IS_POINTER_INCONTACT_WPARAM(wParam)         IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_INCONTACT)
 | |
| #define IS_POINTER_FIRSTBUTTON_WPARAM(wParam)       IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_FIRSTBUTTON)
 | |
| #define IS_POINTER_SECONDBUTTON_WPARAM(wParam)      IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_SECONDBUTTON)
 | |
| #define IS_POINTER_THIRDBUTTON_WPARAM(wParam)       IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_THIRDBUTTON)
 | |
| #define IS_POINTER_FOURTHBUTTON_WPARAM(wParam)      IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_FOURTHBUTTON)
 | |
| #define IS_POINTER_FIFTHBUTTON_WPARAM(wParam)       IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_FIFTHBUTTON)
 | |
| #define IS_POINTER_PRIMARY_WPARAM(wParam)           IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_PRIMARY)
 | |
| #define HAS_POINTER_CONFIDENCE_WPARAM(wParam)       IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_CONFIDENCE)
 | |
| #define IS_POINTER_CANCELED_WPARAM(wParam)          IS_POINTER_FLAG_SET_WPARAM(wParam, POINTER_MESSAGE_FLAG_CANCELED)
 | |
| 
 | |
| /*
 | |
|  * WM_POINTERACTIVATE return codes
 | |
|  */
 | |
| #define PA_ACTIVATE                     MA_ACTIVATE
 | |
| #define PA_NOACTIVATE                   MA_NOACTIVATE
 | |
| 
 | |
| #endif // WINVER < 0x0602
 | |
| 
 | |
| /******************************************************************************
 | |
|  * WinPointerInfo
 | |
|  *
 | |
|  * This is a helper class to handle WM_POINTER*. It only supports Win8 or later.
 | |
|  *
 | |
|  ******************************************************************************/
 | |
| class WinPointerInfo final : public mozilla::WidgetPointerHelper
 | |
| {
 | |
| public:
 | |
|   WinPointerInfo()
 | |
|     : WidgetPointerHelper()
 | |
|     , mPressure(0)
 | |
|     , mButtons(0)
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   WinPointerInfo(uint32_t aPointerId, uint32_t aTiltX, uint32_t aTiltY,
 | |
|                  float aPressure, int16_t aButtons)
 | |
|     : WidgetPointerHelper(aPointerId, aTiltX, aTiltY)
 | |
|     , mPressure(aPressure)
 | |
|     , mButtons(aButtons)
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   float mPressure;
 | |
|   int16_t mButtons;
 | |
| };
 | |
| 
 | |
| class WinPointerEvents final
 | |
| {
 | |
| public:
 | |
|   explicit WinPointerEvents();
 | |
| 
 | |
| public:
 | |
|   bool ShouldHandleWinPointerMessages(UINT aMsg, WPARAM aWParam);
 | |
| 
 | |
|   uint32_t GetPointerId(WPARAM aWParam)
 | |
|   {
 | |
|     return GET_POINTERID_WPARAM(aWParam);
 | |
|   }
 | |
|   bool GetPointerType(uint32_t aPointerId, POINTER_INPUT_TYPE *aPointerType);
 | |
|   POINTER_INPUT_TYPE GetPointerType(uint32_t aPointerId);
 | |
|   bool GetPointerInfo(uint32_t aPointerId, POINTER_INFO *aPointerInfo);
 | |
|   bool GetPointerPenInfo(uint32_t aPointerId, POINTER_PEN_INFO *aPenInfo);
 | |
|   bool ShouldEnableInkCollector();
 | |
|   bool ShouldRollupOnPointerEvent(UINT aMsg, WPARAM aWParam);
 | |
|   bool ShouldFirePointerEventByWinPointerMessages();
 | |
|   WinPointerInfo* GetCachedPointerInfo(UINT aMsg, WPARAM aWParam);
 | |
|   void ConvertAndCachePointerInfo(UINT aMsg, WPARAM aWParam);
 | |
|   void ConvertAndCachePointerInfo(WPARAM aWParam, WinPointerInfo* aInfo);
 | |
| 
 | |
| private:
 | |
|   // Function prototypes
 | |
|   typedef BOOL (WINAPI* GetPointerTypePtr)(uint32_t aPointerId,
 | |
|                                            POINTER_INPUT_TYPE *aPointerType);
 | |
|   typedef BOOL (WINAPI* GetPointerInfoPtr)(uint32_t aPointerId,
 | |
|                                            POINTER_INFO *aPointerInfo);
 | |
|   typedef BOOL (WINAPI* GetPointerPenInfoPtr)(uint32_t aPointerId,
 | |
|                                               POINTER_PEN_INFO *aPenInfo);
 | |
| 
 | |
|   void InitLibrary();
 | |
| 
 | |
|   static HMODULE sLibraryHandle;
 | |
|   static const wchar_t kPointerLibraryName[];
 | |
|   static bool sPointerEventEnabled;
 | |
|   static bool sFirePointerEventsByWinPointerMessages;
 | |
|   // Static function pointers
 | |
|   static GetPointerTypePtr getPointerType;
 | |
|   static GetPointerInfoPtr getPointerInfo;
 | |
|   static GetPointerPenInfoPtr getPointerPenInfo;
 | |
|   WinPointerInfo mPenPointerDownInfo;
 | |
|   WinPointerInfo mPenPointerUpInfo;
 | |
|   WinPointerInfo mPenPointerUpdateInfo;
 | |
| };
 | |
| 
 | |
| #endif // #ifndef WinPointerEvents_h__
 |