aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2022-08-28 12:29:19 +0200
committerGitHub <noreply@github.com>2022-08-28 12:29:19 +0200
commitc0cd02883fae103126bbe858da7224c7ce04fc3f (patch)
treed0b8c09e8ef14c276784449616e82d3363592ebb
parentc82d7d3d87c2dc77ce942b1cc450734baca3da14 (diff)
parentd9adb0fd6b89c5ac96a726b2eeafaf5d8d7798bc (diff)
Merge pull request #1982 from Lperlind/staging/raw_windows_input
Add much of Win32's Raw Input API
-rw-r--r--core/sys/windows/user32.odin151
1 files changed, 151 insertions, 0 deletions
diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin
index 4b3d3e68e..d5ad9c378 100644
--- a/core/sys/windows/user32.odin
+++ b/core/sys/windows/user32.odin
@@ -190,6 +190,14 @@ foreign user32 {
SetWindowTextW :: proc(hWnd: HWND, lpString: LPCWSTR) -> BOOL ---
CallWindowProcW :: proc(lpPrevWndFunc: WNDPROC, hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT ---
EnableWindow :: proc(hWnd: HWND, bEnable: BOOL) -> BOOL ---
+
+ DefRawInputProc :: proc(paRawInput: ^PRAWINPUT, nInput: INT, cbSizeHeader: UINT) -> LRESULT ---
+ GetRawInputBuffer :: proc(pRawInput: PRAWINPUT, pcbSize: PUINT, cbSizeHeader: UINT) -> UINT ---
+ GetRawInputData :: proc(hRawInput: HRAWINPUT, uiCommand: UINT, pData: LPVOID, pcbSize: PUINT, cbSizeHeader: UINT) -> UINT ---
+ GetRawInputDeviceInfoW :: proc(hDevice: HANDLE, uiCommand: UINT, pData: LPVOID, pcbSize: PUINT) -> UINT ---
+ GetRawInputDeviceList :: proc(pRawInputDeviceList: PRAWINPUTDEVICELIST, puiNumDevices: PUINT, cbSize: UINT) -> UINT ---
+ GetRegisteredRawInputDevices :: proc(pRawInputDevices: PRAWINPUTDEVICE, puiNumDevices: PUINT, cbSize: UINT) -> UINT ---
+ RegisterRawInputDevices :: proc(pRawInputDevices: PCRAWINPUTDEVICE, uiNumDevices: UINT, cbSize: UINT) -> BOOL ---
}
CreateWindowW :: #force_inline proc "stdcall" (
@@ -277,3 +285,146 @@ DPI_AWARENESS_CONTEXT_SYSTEM_AWARE :: DPI_AWARENESS_CONTEXT(~uintptr(1))
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE :: DPI_AWARENESS_CONTEXT(~uintptr(2)) // -3
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 :: DPI_AWARENESS_CONTEXT(~uintptr(3)) // -4
DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED :: DPI_AWARENESS_CONTEXT(~uintptr(4)) // -5
+
+RAWINPUTHEADER :: struct {
+ dwType: DWORD,
+ dwSize: DWORD,
+ hDevice: HANDLE,
+ wParam: WPARAM,
+}
+
+RAWHID :: struct {
+ dwSizeHid: DWORD,
+ dwCount: DWORD,
+ bRawData: [1]BYTE,
+}
+
+RAWMOUSE :: struct {
+ usFlags: USHORT,
+ DUMMYUNIONNAME: struct #raw_union {
+ ulButtons: ULONG,
+ DUMMYSTRUCTNAME: struct {
+ usButtonFlags: USHORT,
+ usButtonData: USHORT,
+ },
+ },
+ ulRawButtons: ULONG,
+ lLastX: LONG,
+ lLastY: LONG,
+ ulExtraInformation: ULONG,
+}
+
+RAWKEYBOARD :: struct {
+ MakeCode: USHORT,
+ Flags: USHORT,
+ Rserved: USHORT,
+ VKey: USHORT,
+ Message: UINT,
+ ExtraInformation: ULONG,
+}
+
+RAWINPUT :: struct {
+ header: RAWINPUTHEADER,
+ data: struct #raw_union {
+ mouse: RAWMOUSE,
+ keyboard: RAWKEYBOARD,
+ hid: RAWHID,
+ },
+}
+
+PRAWINPUT :: ^RAWINPUT
+HRAWINPUT :: distinct LPARAM
+
+RAWINPUTDEVICE :: struct {
+ usUsagePage: USHORT,
+ usUsage: USHORT,
+ dwFlags: DWORD,
+ hwndTarget: HWND,
+}
+
+PRAWINPUTDEVICE :: ^RAWINPUTDEVICE
+PCRAWINPUTDEVICE :: PRAWINPUTDEVICE
+
+RAWINPUTDEVICELIST :: struct {
+ hDevice: HANDLE,
+ dwType: DWORD,
+}
+
+PRAWINPUTDEVICELIST :: ^RAWINPUTDEVICELIST
+
+RID_DEVICE_INFO_HID :: struct {
+ dwVendorId: DWORD,
+ dwProductId: DWORD,
+ dwVersionNumber: DWORD,
+ usUsagePage: USHORT,
+ usUsage: USHORT,
+}
+
+RID_DEVICE_INFO_KEYBOARD :: struct {
+ dwType: DWORD,
+ dwSubType: DWORD,
+ dwKeyboardMode: DWORD,
+ dwNumberOfFunctionKeys: DWORD,
+ dwNumberOfIndicators: DWORD,
+ dwNumberOfKeysTotal: DWORD,
+}
+
+RID_DEVICE_INFO_MOUSE :: struct {
+ dwId: DWORD,
+ dwNumberOfButtons: DWORD,
+ dwSampleRate: DWORD,
+ fHasHorizontalWheel: BOOL,
+}
+
+RID_DEVICE_INFO :: struct {
+ cbSize: DWORD,
+ dwType: DWORD,
+ DUMMYUNIONNAME: struct #raw_union {
+ mouse: RID_DEVICE_INFO_MOUSE,
+ keyboard: RID_DEVICE_INFO_KEYBOARD,
+ hid: RID_DEVICE_INFO_HID,
+ },
+}
+
+RIDEV_REMOVE :: 0x00000001
+RIDEV_EXCLUDE :: 0x00000010
+RIDEV_PAGEONLY :: 0x00000020
+RIDEV_NOLEGACY :: 0x00000030
+RIDEV_INPUTSINK :: 0x00000100
+RIDEV_CAPTUREMOUSE :: 0x00000200
+RIDEV_NOHOTKEYS :: 0x00000200
+RIDEV_APPKEYS :: 0x00000400
+RIDEV_EXINPUTSINK :: 0x00001000
+RIDEV_DEVNOTIFY :: 0x00002000
+
+RID_HEADER :: 0x10000005
+RID_INPUT :: 0x10000003
+
+RIM_TYPEMOUSE :: 0
+RIM_TYPEKEYBOARD :: 1
+RIM_TYPEHID :: 2
+
+MOUSE_MOVE_RELATIVE :: 0x00
+MOUSE_MOVE_ABSOLUTE :: 0x01
+MOUSE_VIRTUAL_DESKTOP :: 0x02
+MOUSE_ATTRIUBTTES_CHANGED :: 0x04
+MOUSE_MOVE_NOCOALESCE :: 0x08
+
+RI_MOUSE_BUTTON_1_DOWN :: 0x0001
+RI_MOUSE_LEFT_BUTTON_DOWNS :: RI_MOUSE_BUTTON_1_DOWN
+RI_MOUSE_BUTTON_1_UP :: 0x0002
+RI_MOUSE_LEFT_BUTTON_UP :: RI_MOUSE_BUTTON_1_UP
+RI_MOUSE_BUTTON_2_DOWN :: 0x0004
+RI_MOUSE_RIGHT_BUTTON_DOWN :: RI_MOUSE_BUTTON_2_DOWN
+RI_MOUSE_BUTTON_2_UP :: 0x0008
+RI_MOUSE_RIGHT_BUTTON_UP :: RI_MOUSE_BUTTON_2_UP
+RI_MOUSE_BUTTON_3_DOWN :: 0x0010
+RI_MOUSE_MIDDLE_BUTTON_DOWN :: RI_MOUSE_BUTTON_3_DOWN
+RI_MOUSE_BUTTON_3_UP :: 0x0020
+RI_MOUSE_MIDDLE_BUTTON_UP :: RI_MOUSE_BUTTON_3_UP
+RI_MOUSE_BUTTON_4_DOWN :: 0x0040
+RI_MOUSE_BUTTON_4_UP :: 0x0080
+RI_MOUSE_BUTTON_5_DOWN :: 0x0100
+RI_MOUSE_BUTTON_5_UP :: 0x0200
+RI_MOUSE_WHEEL :: 0x0400
+RI_MOUSE_HWHEEL :: 0x0800