From 6f3fb8c3f2061743f7f4b3c58bd00063949e51ea Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Mon, 20 Aug 2018 15:24:39 -0500 Subject: [PATCH] user32: Move rawinput functions to rawinput.c. Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/user32/Makefile.in | 1 + dlls/user32/input.c | 251 ----------------------------------- dlls/user32/rawinput.c | 282 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 283 insertions(+), 251 deletions(-) create mode 100644 dlls/user32/rawinput.c diff --git a/dlls/user32/Makefile.in b/dlls/user32/Makefile.in index 931a715763c..81cde065b8f 100644 --- a/dlls/user32/Makefile.in +++ b/dlls/user32/Makefile.in @@ -36,6 +36,7 @@ C_SRCS = \ nonclient.c \ painting.c \ property.c \ + rawinput.c \ resource.c \ scroll.c \ spy.c \ diff --git a/dlls/user32/input.c b/dlls/user32/input.c index 1925998d90b..ab9b70faea0 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -498,257 +498,6 @@ BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO plii) } -/****************************************************************** -* GetRawInputDeviceList (USER32.@) -*/ -UINT WINAPI GetRawInputDeviceList(RAWINPUTDEVICELIST *devices, UINT *device_count, UINT size) -{ - TRACE("devices %p, device_count %p, size %u.\n", devices, device_count, size); - - if (size != sizeof(*devices)) - { - SetLastError(ERROR_INVALID_PARAMETER); - return ~0U; - } - - if (!device_count) - { - SetLastError(ERROR_NOACCESS); - return ~0U; - } - - if (!devices) - { - *device_count = 2; - return 0; - } - - if (*device_count < 2) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - *device_count = 2; - return ~0U; - } - - devices[0].hDevice = WINE_MOUSE_HANDLE; - devices[0].dwType = RIM_TYPEMOUSE; - devices[1].hDevice = WINE_KEYBOARD_HANDLE; - devices[1].dwType = RIM_TYPEKEYBOARD; - - return 2; -} - - -/****************************************************************** -* RegisterRawInputDevices (USER32.@) -*/ -BOOL WINAPI DECLSPEC_HOTPATCH RegisterRawInputDevices(RAWINPUTDEVICE *devices, UINT device_count, UINT size) -{ - struct rawinput_device *d; - BOOL ret; - UINT i; - - TRACE("devices %p, device_count %u, size %u.\n", devices, device_count, size); - - if (size != sizeof(*devices)) - { - WARN("Invalid structure size %u.\n", size); - return FALSE; - } - - if (!(d = HeapAlloc( GetProcessHeap(), 0, device_count * sizeof(*d) ))) return FALSE; - - for (i = 0; i < device_count; ++i) - { - TRACE("device %u: page %#x, usage %#x, flags %#x, target %p.\n", - i, devices[i].usUsagePage, devices[i].usUsage, - devices[i].dwFlags, devices[i].hwndTarget); - if (devices[i].dwFlags & ~RIDEV_REMOVE) - FIXME("Unhandled flags %#x for device %u.\n", devices[i].dwFlags, i); - - d[i].usage_page = devices[i].usUsagePage; - d[i].usage = devices[i].usUsage; - d[i].flags = devices[i].dwFlags; - d[i].target = wine_server_user_handle( devices[i].hwndTarget ); - } - - SERVER_START_REQ( update_rawinput_devices ) - { - wine_server_add_data( req, d, device_count * sizeof(*d) ); - ret = !wine_server_call( req ); - } - SERVER_END_REQ; - - HeapFree( GetProcessHeap(), 0, d ); - - return ret; -} - - -/****************************************************************** -* GetRawInputData (USER32.@) -*/ -UINT WINAPI GetRawInputData(HRAWINPUT rawinput, UINT command, void *data, UINT *data_size, UINT header_size) -{ - RAWINPUT *ri = (RAWINPUT *)rawinput; - UINT s; - - TRACE("rawinput %p, command %#x, data %p, data_size %p, header_size %u.\n", - rawinput, command, data, data_size, header_size); - - if (header_size != sizeof(RAWINPUTHEADER)) - { - WARN("Invalid structure size %u.\n", header_size); - return ~0U; - } - - switch (command) - { - case RID_INPUT: - s = ri->header.dwSize; - break; - case RID_HEADER: - s = sizeof(RAWINPUTHEADER); - break; - default: - return ~0U; - } - - if (!data) - { - *data_size = s; - return 0; - } - - if (*data_size < s) return ~0U; - memcpy(data, ri, s); - return s; -} - - -/****************************************************************** -* GetRawInputBuffer (USER32.@) -*/ -UINT WINAPI DECLSPEC_HOTPATCH GetRawInputBuffer(PRAWINPUT pData, PUINT pcbSize, UINT cbSizeHeader) -{ - FIXME("(pData=%p, pcbSize=%p, cbSizeHeader=%d) stub!\n", pData, pcbSize, cbSizeHeader); - - return 0; -} - - -/****************************************************************** -* GetRawInputDeviceInfoA (USER32.@) -*/ -UINT WINAPI GetRawInputDeviceInfoA(HANDLE device, UINT command, void *data, UINT *data_size) -{ - UINT ret; - - TRACE("device %p, command %u, data %p, data_size %p.\n", device, command, data, data_size); - - ret = GetRawInputDeviceInfoW(device, command, data, data_size); - if (command == RIDI_DEVICENAME && ret && ret != ~0U) - ret = WideCharToMultiByte(CP_ACP, 0, data, -1, data, *data_size, NULL, NULL); - - return ret; -} - - -/****************************************************************** -* GetRawInputDeviceInfoW (USER32.@) -*/ -UINT WINAPI GetRawInputDeviceInfoW(HANDLE device, UINT command, void *data, UINT *data_size) -{ - /* FIXME: Most of this is made up. */ - static const WCHAR keyboard_name[] = {'\\','\\','?','\\','W','I','N','E','_','K','E','Y','B','O','A','R','D',0}; - static const WCHAR mouse_name[] = {'\\','\\','?','\\','W','I','N','E','_','M','O','U','S','E',0}; - static const RID_DEVICE_INFO_KEYBOARD keyboard_info = {0, 0, 1, 12, 3, 101}; - static const RID_DEVICE_INFO_MOUSE mouse_info = {1, 5, 0, FALSE}; - const WCHAR *name = NULL; - RID_DEVICE_INFO *info; - UINT s; - - TRACE("device %p, command %u, data %p, data_size %p.\n", device, command, data, data_size); - - if (!data_size || (device != WINE_MOUSE_HANDLE && device != WINE_KEYBOARD_HANDLE)) return ~0U; - - switch (command) - { - case RIDI_DEVICENAME: - if (device == WINE_MOUSE_HANDLE) - { - s = sizeof(mouse_name); - name = mouse_name; - } - else - { - s = sizeof(keyboard_name); - name = keyboard_name; - } - break; - case RIDI_DEVICEINFO: - s = sizeof(*info); - break; - default: - return ~0U; - } - - if (!data) - { - *data_size = s; - return 0; - } - - if (*data_size < s) - { - *data_size = s; - return ~0U; - } - - if (command == RIDI_DEVICENAME) - { - memcpy(data, name, s); - return s; - } - - info = data; - info->cbSize = sizeof(*info); - if (device == WINE_MOUSE_HANDLE) - { - info->dwType = RIM_TYPEMOUSE; - info->u.mouse = mouse_info; - } - else - { - info->dwType = RIM_TYPEKEYBOARD; - info->u.keyboard = keyboard_info; - } - return s; -} - - -/****************************************************************** -* GetRegisteredRawInputDevices (USER32.@) -*/ -UINT WINAPI DECLSPEC_HOTPATCH GetRegisteredRawInputDevices(PRAWINPUTDEVICE pRawInputDevices, PUINT puiNumDevices, UINT cbSize) -{ - FIXME("(pRawInputDevices=%p, puiNumDevices=%p, cbSize=%d) stub!\n", pRawInputDevices, puiNumDevices, cbSize); - - return 0; -} - - -/****************************************************************** -* DefRawInputProc (USER32.@) -*/ -LRESULT WINAPI DefRawInputProc(PRAWINPUT *paRawInput, INT nInput, UINT cbSizeHeader) -{ - FIXME("(paRawInput=%p, nInput=%d, cbSizeHeader=%d) stub!\n", *paRawInput, nInput, cbSizeHeader); - - return 0; -} - - /********************************************************************** * AttachThreadInput (USER32.@) * diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c new file mode 100644 index 00000000000..5ce42f6a228 --- /dev/null +++ b/dlls/user32/rawinput.c @@ -0,0 +1,282 @@ +/* + * Raw Input + * + * Copyright 2012 Henri Verbeet + * Copyright 2018 Zebediah Figura for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include + +#define NONAMELESSUNION +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winnls.h" +#include "winuser.h" +#include "wine/debug.h" +#include "wine/server.h" + +#include "user_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(rawinput); + +/*********************************************************************** + * GetRawInputDeviceList (USER32.@) + */ +UINT WINAPI GetRawInputDeviceList(RAWINPUTDEVICELIST *devices, UINT *device_count, UINT size) +{ + TRACE("devices %p, device_count %p, size %u.\n", devices, device_count, size); + + if (size != sizeof(*devices)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return ~0U; + } + + if (!device_count) + { + SetLastError(ERROR_NOACCESS); + return ~0U; + } + + if (!devices) + { + *device_count = 2; + return 0; + } + + if (*device_count < 2) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + *device_count = 2; + return ~0U; + } + + devices[0].hDevice = WINE_MOUSE_HANDLE; + devices[0].dwType = RIM_TYPEMOUSE; + devices[1].hDevice = WINE_KEYBOARD_HANDLE; + devices[1].dwType = RIM_TYPEKEYBOARD; + + return 2; +} + +/*********************************************************************** + * RegisterRawInputDevices (USER32.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH RegisterRawInputDevices(RAWINPUTDEVICE *devices, UINT device_count, UINT size) +{ + struct rawinput_device *d; + BOOL ret; + UINT i; + + TRACE("devices %p, device_count %u, size %u.\n", devices, device_count, size); + + if (size != sizeof(*devices)) + { + WARN("Invalid structure size %u.\n", size); + return FALSE; + } + + if (!(d = HeapAlloc( GetProcessHeap(), 0, device_count * sizeof(*d) ))) return FALSE; + + for (i = 0; i < device_count; ++i) + { + TRACE("device %u: page %#x, usage %#x, flags %#x, target %p.\n", + i, devices[i].usUsagePage, devices[i].usUsage, + devices[i].dwFlags, devices[i].hwndTarget); + if (devices[i].dwFlags & ~RIDEV_REMOVE) + FIXME("Unhandled flags %#x for device %u.\n", devices[i].dwFlags, i); + + d[i].usage_page = devices[i].usUsagePage; + d[i].usage = devices[i].usUsage; + d[i].flags = devices[i].dwFlags; + d[i].target = wine_server_user_handle( devices[i].hwndTarget ); + } + + SERVER_START_REQ( update_rawinput_devices ) + { + wine_server_add_data( req, d, device_count * sizeof(*d) ); + ret = !wine_server_call( req ); + } + SERVER_END_REQ; + + HeapFree( GetProcessHeap(), 0, d ); + + return ret; +} + +/*********************************************************************** + * GetRawInputData (USER32.@) + */ +UINT WINAPI GetRawInputData(HRAWINPUT rawinput, UINT command, void *data, UINT *data_size, UINT header_size) +{ + RAWINPUT *ri = (RAWINPUT *)rawinput; + UINT s; + + TRACE("rawinput %p, command %#x, data %p, data_size %p, header_size %u.\n", + rawinput, command, data, data_size, header_size); + + if (header_size != sizeof(RAWINPUTHEADER)) + { + WARN("Invalid structure size %u.\n", header_size); + return ~0U; + } + + switch (command) + { + case RID_INPUT: + s = ri->header.dwSize; + break; + case RID_HEADER: + s = sizeof(RAWINPUTHEADER); + break; + default: + return ~0U; + } + + if (!data) + { + *data_size = s; + return 0; + } + + if (*data_size < s) return ~0U; + memcpy(data, ri, s); + return s; +} + +/*********************************************************************** + * GetRawInputBuffer (USER32.@) + */ +UINT WINAPI DECLSPEC_HOTPATCH GetRawInputBuffer(RAWINPUT *data, UINT *data_size, UINT header_size) +{ + FIXME("data %p, data_size %p, header_size %u stub!\n", data, data_size, header_size); + + return 0; +} + +/*********************************************************************** + * GetRawInputDeviceInfoA (USER32.@) + */ +UINT WINAPI GetRawInputDeviceInfoA(HANDLE device, UINT command, void *data, UINT *data_size) +{ + UINT ret; + + TRACE("device %p, command %u, data %p, data_size %p.\n", + device, command, data, data_size); + + ret = GetRawInputDeviceInfoW(device, command, data, data_size); + if (command == RIDI_DEVICENAME && ret && ret != ~0U) + ret = WideCharToMultiByte(CP_ACP, 0, data, -1, data, *data_size, NULL, NULL); + + return ret; +} + +/*********************************************************************** + * GetRawInputDeviceInfoW (USER32.@) + */ +UINT WINAPI GetRawInputDeviceInfoW(HANDLE device, UINT command, void *data, UINT *data_size) +{ + /* FIXME: Most of this is made up. */ + static const WCHAR keyboard_name[] = {'\\','\\','?','\\','W','I','N','E','_','K','E','Y','B','O','A','R','D',0}; + static const WCHAR mouse_name[] = {'\\','\\','?','\\','W','I','N','E','_','M','O','U','S','E',0}; + static const RID_DEVICE_INFO_KEYBOARD keyboard_info = {0, 0, 1, 12, 3, 101}; + static const RID_DEVICE_INFO_MOUSE mouse_info = {1, 5, 0, FALSE}; + const WCHAR *name = NULL; + RID_DEVICE_INFO *info; + UINT s; + + TRACE("device %p, command %u, data %p, data_size %p.\n", + device, command, data, data_size); + + if (!data_size || (device != WINE_MOUSE_HANDLE && device != WINE_KEYBOARD_HANDLE)) return ~0U; + + switch (command) + { + case RIDI_DEVICENAME: + if (device == WINE_MOUSE_HANDLE) + { + s = sizeof(mouse_name); + name = mouse_name; + } + else + { + s = sizeof(keyboard_name); + name = keyboard_name; + } + break; + case RIDI_DEVICEINFO: + s = sizeof(*info); + break; + default: + return ~0U; + } + + if (!data) + { + *data_size = s; + return 0; + } + + if (*data_size < s) + { + *data_size = s; + return ~0U; + } + + if (command == RIDI_DEVICENAME) + { + memcpy(data, name, s); + return s; + } + + info = data; + info->cbSize = sizeof(*info); + if (device == WINE_MOUSE_HANDLE) + { + info->dwType = RIM_TYPEMOUSE; + info->u.mouse = mouse_info; + } + else + { + info->dwType = RIM_TYPEKEYBOARD; + info->u.keyboard = keyboard_info; + } + return s; +} + +/*********************************************************************** + * GetRegisteredRawInputDevices (USER32.@) + */ +UINT WINAPI DECLSPEC_HOTPATCH GetRegisteredRawInputDevices(RAWINPUTDEVICE *devices, UINT *device_count, UINT size) +{ + FIXME("devices %p, device_count %p, size %u stub!\n", devices, device_count, size); + + return 0; +} + + +/*********************************************************************** + * DefRawInputProc (USER32.@) + */ +LRESULT WINAPI DefRawInputProc(RAWINPUT **data, INT data_count, UINT header_size) +{ + FIXME("data %p, data_count %d, header_size %u stub!\n", data, data_count, header_size); + + return 0; +}