/kivy/input/providers/wm_common.py
https://github.com/akshayaurora/kivy · Python · 162 lines · 133 code · 22 blank · 7 comment · 9 complexity · 5cea9e12a86c5b92ce94076ac309affb MD5 · raw file
- '''
- Common definitions for a Windows provider
- =========================================
- This file provides common definitions for constants used by WM_Touch / WM_Pen.
- '''
- import os
- WM_MOUSEFIRST = 512
- WM_MOUSEMOVE = 512
- WM_LBUTTONDOWN = 513
- WM_LBUTTONUP = 514
- WM_LBUTTONDBLCLK = 515
- WM_RBUTTONDOWN = 516
- WM_RBUTTONUP = 517
- WM_RBUTTONDBLCLK = 518
- WM_MBUTTONDOWN = 519
- WM_MBUTTONUP = 520
- WM_MBUTTONDBLCLK = 521
- WM_MOUSEWHEEL = 522
- WM_MOUSELAST = 522
- WM_DPICHANGED = 736
- WM_GETDPISCALEDSIZE = 740
- WM_NCCALCSIZE = 131
- WM_TOUCH = 576
- TOUCHEVENTF_MOVE = 1
- TOUCHEVENTF_DOWN = 2
- TOUCHEVENTF_UP = 4
- PEN_OR_TOUCH_SIGNATURE = 0xFF515700
- PEN_OR_TOUCH_MASK = 0xFFFFFF00
- PEN_EVENT_TOUCH_MASK = 0x80
- SM_CYCAPTION = 4
- WM_TABLET_QUERYSYSTEMGESTURE = 0x000002CC
- TABLET_DISABLE_PRESSANDHOLD = 0x00000001
- TABLET_DISABLE_PENTAPFEEDBACK = 0x00000008
- TABLET_DISABLE_PENBARRELFEEDBACK = 0x00000010
- TABLET_DISABLE_TOUCHUIFORCEON = 0x00000100
- TABLET_DISABLE_TOUCHUIFORCEOFF = 0x00000200
- TABLET_DISABLE_TOUCHSWITCH = 0x00008000
- TABLET_DISABLE_FLICKS = 0x00010000
- TABLET_ENABLE_FLICKSONCONTEXT = 0x00020000
- TABLET_ENABLE_FLICKLEARNINGMODE = 0x00040000
- TABLET_DISABLE_SMOOTHSCROLLING = 0x00080000
- TABLET_DISABLE_FLICKFALLBACKKEYS = 0x00100000
- GWL_WNDPROC = -4
- QUERYSYSTEMGESTURE_WNDPROC = (
- TABLET_DISABLE_PRESSANDHOLD |
- TABLET_DISABLE_PENTAPFEEDBACK |
- TABLET_DISABLE_PENBARRELFEEDBACK |
- TABLET_DISABLE_SMOOTHSCROLLING |
- TABLET_DISABLE_FLICKFALLBACKKEYS |
- TABLET_DISABLE_TOUCHSWITCH |
- TABLET_DISABLE_FLICKS)
- if 'KIVY_DOC' not in os.environ:
- from ctypes.wintypes import (ULONG, HANDLE, DWORD, LONG, UINT,
- WPARAM, LPARAM, BOOL, HWND, POINT,
- RECT as RECT_BASE)
- from ctypes import (windll, WINFUNCTYPE, POINTER,
- c_int, c_longlong, c_void_p, Structure,
- sizeof, byref, cast)
- class RECT(RECT_BASE):
- x = property(lambda self: self.left)
- y = property(lambda self: self.top)
- w = property(lambda self: self.right - self.left)
- h = property(lambda self: self.bottom - self.top)
- # check availability of RegisterTouchWindow
- if not hasattr(windll.user32, 'RegisterTouchWindow'):
- raise Exception('Unsupported Window version')
- LRESULT = LPARAM
- WNDPROC = WINFUNCTYPE(LRESULT, HWND, UINT, WPARAM, LPARAM)
- class TOUCHINPUT(Structure):
- _fields_ = [
- ('x', LONG),
- ('y', LONG),
- ('pSource', HANDLE),
- ('id', DWORD),
- ('flags', DWORD),
- ('mask', DWORD),
- ('time', DWORD),
- ('extraInfo', POINTER(ULONG)),
- ('size_x', DWORD),
- ('size_y', DWORD)]
- def size(self):
- return (self.size_x, self.size_y)
- def screen_x(self):
- return self.x / 100.0
- def screen_y(self):
- return self.y / 100.0
- def _event_type(self):
- if self.flags & TOUCHEVENTF_MOVE:
- return 'update'
- if self.flags & TOUCHEVENTF_DOWN:
- return 'begin'
- if self.flags & TOUCHEVENTF_UP:
- return 'end'
- event_type = property(_event_type)
- def SetWindowLong_WndProc_wrapper_generator(func):
- def _closure(hWnd, wndProc):
- oldAddr = func(hWnd, GWL_WNDPROC, cast(wndProc, c_void_p).value)
- return cast(c_void_p(oldAddr), WNDPROC)
- return _closure
- try:
- LONG_PTR = c_longlong
- windll.user32.SetWindowLongPtrW.restype = LONG_PTR
- windll.user32.SetWindowLongPtrW.argtypes = [HWND, c_int, LONG_PTR]
- SetWindowLong_WndProc_wrapper = \
- SetWindowLong_WndProc_wrapper_generator(
- windll.user32.SetWindowLongPtrW)
- except AttributeError:
- windll.user32.SetWindowLongW.restype = LONG
- windll.user32.SetWindowLongW.argtypes = [HWND, c_int, LONG]
- SetWindowLong_WndProc_wrapper = \
- SetWindowLong_WndProc_wrapper_generator(
- windll.user32.SetWindowLongW)
- windll.user32.GetMessageExtraInfo.restype = LPARAM
- windll.user32.GetMessageExtraInfo.argtypes = []
- windll.user32.GetClientRect.restype = BOOL
- windll.user32.GetClientRect.argtypes = [HANDLE, POINTER(RECT_BASE)]
- windll.user32.GetWindowRect.restype = BOOL
- windll.user32.GetWindowRect.argtypes = [HANDLE, POINTER(RECT_BASE)]
- windll.user32.CallWindowProcW.restype = LRESULT
- windll.user32.CallWindowProcW.argtypes = [WNDPROC, HWND, UINT, WPARAM,
- LPARAM]
- windll.user32.GetActiveWindow.restype = HWND
- windll.user32.GetActiveWindow.argtypes = []
- windll.user32.RegisterTouchWindow.restype = BOOL
- windll.user32.RegisterTouchWindow.argtypes = [HWND, ULONG]
- windll.user32.UnregisterTouchWindow.restype = BOOL
- windll.user32.UnregisterTouchWindow.argtypes = [HWND]
- windll.user32.GetTouchInputInfo.restype = BOOL
- windll.user32.GetTouchInputInfo.argtypes = [HANDLE, UINT,
- POINTER(TOUCHINPUT), c_int]
- windll.user32.GetSystemMetrics.restype = c_int
- windll.user32.GetSystemMetrics.argtypes = [c_int]
- windll.user32.ClientToScreen.restype = BOOL
- windll.user32.ClientToScreen.argtypes = [HWND, POINTER(POINT)]
- try:
- windll.user32.GetDpiForWindow.restype = UINT
- windll.user32.GetDpiForWindow.argtypes = [HWND]
- except AttributeError:
- pass