server: Move rawinput message conversion from win32u.
Appending the entire RAWMOUSE / RAWKEYBOARD / RAWHID + report structs after the hardware message data, instead of using a custom intermediate structure.
This commit is contained in:
parent
9a0e244d51
commit
2eb8950392
7 changed files with 183 additions and 205 deletions
|
@ -1915,7 +1915,6 @@ static LRESULT CALLBACK rawinputbuffer_wndproc(HWND hwnd, UINT msg, WPARAM wpara
|
|||
|
||||
size = sizeof(buffer);
|
||||
memset( buffer, 0, sizeof(buffer) );
|
||||
todo_wine_if(is_wow64 && iteration == 1)
|
||||
ok_ret( 3, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER)) );
|
||||
ok_eq( sizeof(buffer), size, UINT, "%u" );
|
||||
|
||||
|
@ -1958,9 +1957,8 @@ static LRESULT CALLBACK rawinputbuffer_wndproc(HWND hwnd, UINT msg, WPARAM wpara
|
|||
* it needs one more byte to return success */
|
||||
size = sizeof(rawinput) + 1;
|
||||
memset( buffer, 0, sizeof(buffer) );
|
||||
todo_wine_if(is_wow64)
|
||||
ok_ret( 1, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) );
|
||||
if (is_wow64) todo_wine ok_eq( 5, rawbuffer64->data.keyboard.MakeCode, WPARAM, "%Iu" );
|
||||
if (is_wow64) ok_eq( 5, rawbuffer64->data.keyboard.MakeCode, WPARAM, "%Iu" );
|
||||
else ok_eq( 5, rawbuffer->data.keyboard.MakeCode, WPARAM, "%Iu" );
|
||||
|
||||
/* peek the messages now, they should still arrive in the correct order */
|
||||
|
@ -2013,7 +2011,6 @@ static LRESULT CALLBACK rawinputbuffer_wndproc(HWND hwnd, UINT msg, WPARAM wpara
|
|||
SetLastError( 0xdeadbeef );
|
||||
size = sizeof(rawinput);
|
||||
ok_ret( rawinput_size, GetRawInputData( handle, RID_INPUT, &rawinput, &size, sizeof(RAWINPUTHEADER) ) );
|
||||
todo_wine_if(is_wow64)
|
||||
ok_eq( 6, rawinput.data.keyboard.MakeCode, UINT, "%u" );
|
||||
|
||||
SetLastError( 0xdeadbeef );
|
||||
|
@ -2027,7 +2024,6 @@ static LRESULT CALLBACK rawinputbuffer_wndproc(HWND hwnd, UINT msg, WPARAM wpara
|
|||
{
|
||||
todo_wine
|
||||
ok_ret( rawinput_size, GetRawInputData( handle, RID_INPUT, &rawinput, &size, sizeof(RAWINPUTHEADER64) ) );
|
||||
todo_wine
|
||||
ok_eq( 6, rawinput.data.keyboard.MakeCode, UINT, "%u" );
|
||||
todo_wine
|
||||
ok_ret( 0xdeadbeef, GetLastError() );
|
||||
|
@ -2184,7 +2180,6 @@ static void test_GetRawInputBuffer(void)
|
|||
|
||||
size = 0;
|
||||
ok_ret( 0, GetRawInputBuffer( NULL, &size, sizeof(RAWINPUTHEADER) ) );
|
||||
todo_wine
|
||||
ok_eq( rawinput_size, size, UINT, "%u" );
|
||||
|
||||
size = sizeof(buffer);
|
||||
|
@ -2226,9 +2221,7 @@ static void test_GetRawInputBuffer(void)
|
|||
/* rawinput buffer survives registered device changes */
|
||||
|
||||
size = rawinput_size + 1;
|
||||
todo_wine
|
||||
ok_ret( 1, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) );
|
||||
todo_wine
|
||||
ok_eq( rawinput_size + 1, size, UINT, "%u" );
|
||||
|
||||
raw_devices[0].usUsagePage = HID_USAGE_PAGE_GENERIC;
|
||||
|
@ -2244,9 +2237,7 @@ static void test_GetRawInputBuffer(void)
|
|||
ok_ret( 1, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) );
|
||||
ok_eq( rawinput_size + 1, size, UINT, "%u" );
|
||||
size = sizeof(buffer);
|
||||
todo_wine
|
||||
ok_ret( 0, GetRawInputBuffer( rawbuffer, &size, sizeof(RAWINPUTHEADER) ) );
|
||||
todo_wine
|
||||
ok_eq( 0, size, UINT, "%u" );
|
||||
|
||||
raw_devices[0].dwFlags = RIDEV_REMOVE;
|
||||
|
|
|
@ -73,125 +73,40 @@ static struct rawinput_thread_data *get_rawinput_thread_data(void)
|
|||
return data;
|
||||
}
|
||||
|
||||
static bool rawinput_from_hardware_message( RAWINPUT *rawinput, const struct hardware_msg_data *msg_data )
|
||||
static BOOL rawinput_from_hardware_message( RAWINPUT *rawinput, const struct hardware_msg_data *msg_data )
|
||||
{
|
||||
SIZE_T size;
|
||||
SIZE_T size = msg_data->size - sizeof(*msg_data);
|
||||
if (sizeof(RAWINPUTHEADER) + size > rawinput->header.dwSize) return FALSE;
|
||||
|
||||
rawinput->header.dwType = msg_data->rawinput.type;
|
||||
rawinput->header.dwSize = sizeof(RAWINPUTHEADER) + size;
|
||||
rawinput->header.hDevice = UlongToHandle( msg_data->rawinput.device );
|
||||
rawinput->header.wParam = msg_data->rawinput.wparam;
|
||||
|
||||
rawinput->header.dwType = msg_data->rawinput.type;
|
||||
if (msg_data->rawinput.type == RIM_TYPEMOUSE)
|
||||
{
|
||||
static const unsigned int button_flags[] =
|
||||
{
|
||||
0, /* MOUSEEVENTF_MOVE */
|
||||
RI_MOUSE_LEFT_BUTTON_DOWN, /* MOUSEEVENTF_LEFTDOWN */
|
||||
RI_MOUSE_LEFT_BUTTON_UP, /* MOUSEEVENTF_LEFTUP */
|
||||
RI_MOUSE_RIGHT_BUTTON_DOWN, /* MOUSEEVENTF_RIGHTDOWN */
|
||||
RI_MOUSE_RIGHT_BUTTON_UP, /* MOUSEEVENTF_RIGHTUP */
|
||||
RI_MOUSE_MIDDLE_BUTTON_DOWN, /* MOUSEEVENTF_MIDDLEDOWN */
|
||||
RI_MOUSE_MIDDLE_BUTTON_UP, /* MOUSEEVENTF_MIDDLEUP */
|
||||
};
|
||||
unsigned int i;
|
||||
|
||||
rawinput->header.dwSize = FIELD_OFFSET(RAWINPUT, data) + sizeof(RAWMOUSE);
|
||||
rawinput->header.hDevice = WINE_MOUSE_HANDLE;
|
||||
rawinput->header.wParam = 0;
|
||||
|
||||
rawinput->data.mouse.usFlags = MOUSE_MOVE_RELATIVE;
|
||||
rawinput->data.mouse.usButtonFlags = 0;
|
||||
rawinput->data.mouse.usButtonData = 0;
|
||||
for (i = 1; i < ARRAY_SIZE(button_flags); ++i)
|
||||
{
|
||||
if (msg_data->flags & (1 << i))
|
||||
rawinput->data.mouse.usButtonFlags |= button_flags[i];
|
||||
}
|
||||
if (msg_data->flags & MOUSEEVENTF_WHEEL)
|
||||
{
|
||||
rawinput->data.mouse.usButtonFlags |= RI_MOUSE_WHEEL;
|
||||
rawinput->data.mouse.usButtonData = msg_data->rawinput.mouse.data;
|
||||
}
|
||||
if (msg_data->flags & MOUSEEVENTF_HWHEEL)
|
||||
{
|
||||
rawinput->data.mouse.usButtonFlags |= RI_MOUSE_HORIZONTAL_WHEEL;
|
||||
rawinput->data.mouse.usButtonData = msg_data->rawinput.mouse.data;
|
||||
}
|
||||
if (msg_data->flags & MOUSEEVENTF_XDOWN)
|
||||
{
|
||||
if (msg_data->rawinput.mouse.data == XBUTTON1)
|
||||
rawinput->data.mouse.usButtonFlags |= RI_MOUSE_BUTTON_4_DOWN;
|
||||
else if (msg_data->rawinput.mouse.data == XBUTTON2)
|
||||
rawinput->data.mouse.usButtonFlags |= RI_MOUSE_BUTTON_5_DOWN;
|
||||
}
|
||||
if (msg_data->flags & MOUSEEVENTF_XUP)
|
||||
{
|
||||
if (msg_data->rawinput.mouse.data == XBUTTON1)
|
||||
rawinput->data.mouse.usButtonFlags |= RI_MOUSE_BUTTON_4_UP;
|
||||
else if (msg_data->rawinput.mouse.data == XBUTTON2)
|
||||
rawinput->data.mouse.usButtonFlags |= RI_MOUSE_BUTTON_5_UP;
|
||||
}
|
||||
|
||||
rawinput->data.mouse.ulRawButtons = 0;
|
||||
rawinput->data.mouse.lLastX = msg_data->rawinput.mouse.x;
|
||||
rawinput->data.mouse.lLastY = msg_data->rawinput.mouse.y;
|
||||
rawinput->data.mouse.ulExtraInformation = msg_data->info;
|
||||
if (size != sizeof(RAWMOUSE)) return FALSE;
|
||||
rawinput->data.mouse = *(RAWMOUSE *)(msg_data + 1);
|
||||
}
|
||||
else if (msg_data->rawinput.type == RIM_TYPEKEYBOARD)
|
||||
{
|
||||
rawinput->header.dwSize = FIELD_OFFSET(RAWINPUT, data) + sizeof(RAWKEYBOARD);
|
||||
rawinput->header.hDevice = WINE_KEYBOARD_HANDLE;
|
||||
rawinput->header.wParam = 0;
|
||||
|
||||
rawinput->data.keyboard.MakeCode = msg_data->rawinput.kbd.scan;
|
||||
rawinput->data.keyboard.Flags = (msg_data->flags & KEYEVENTF_KEYUP) ? RI_KEY_BREAK : RI_KEY_MAKE;
|
||||
if (msg_data->flags & KEYEVENTF_EXTENDEDKEY)
|
||||
rawinput->data.keyboard.Flags |= RI_KEY_E0;
|
||||
rawinput->data.keyboard.Reserved = 0;
|
||||
|
||||
switch (msg_data->rawinput.kbd.vkey)
|
||||
{
|
||||
case VK_LSHIFT:
|
||||
case VK_RSHIFT:
|
||||
rawinput->data.keyboard.VKey = VK_SHIFT;
|
||||
rawinput->data.keyboard.Flags &= ~RI_KEY_E0;
|
||||
break;
|
||||
|
||||
case VK_LCONTROL:
|
||||
case VK_RCONTROL:
|
||||
rawinput->data.keyboard.VKey = VK_CONTROL;
|
||||
break;
|
||||
|
||||
case VK_LMENU:
|
||||
case VK_RMENU:
|
||||
rawinput->data.keyboard.VKey = VK_MENU;
|
||||
break;
|
||||
|
||||
default:
|
||||
rawinput->data.keyboard.VKey = msg_data->rawinput.kbd.vkey;
|
||||
break;
|
||||
}
|
||||
|
||||
rawinput->data.keyboard.Message = msg_data->rawinput.kbd.message;
|
||||
rawinput->data.keyboard.ExtraInformation = msg_data->info;
|
||||
if (size != sizeof(RAWKEYBOARD)) return FALSE;
|
||||
rawinput->data.keyboard = *(RAWKEYBOARD *)(msg_data + 1);
|
||||
}
|
||||
else if (msg_data->rawinput.type == RIM_TYPEHID)
|
||||
{
|
||||
size = msg_data->size - sizeof(*msg_data);
|
||||
if (size > rawinput->header.dwSize - sizeof(*rawinput)) return false;
|
||||
|
||||
rawinput->header.dwSize = FIELD_OFFSET( RAWINPUT, data.hid.bRawData ) + size;
|
||||
rawinput->header.hDevice = ULongToHandle( msg_data->rawinput.hid.device );
|
||||
rawinput->header.wParam = 0;
|
||||
|
||||
rawinput->data.hid.dwCount = msg_data->rawinput.hid.count;
|
||||
rawinput->data.hid.dwSizeHid = msg_data->rawinput.hid.length;
|
||||
memcpy( rawinput->data.hid.bRawData, msg_data + 1, size );
|
||||
RAWHID *hid = (RAWHID *)(msg_data + 1);
|
||||
if (size < offsetof(RAWHID, bRawData[0])) return FALSE;
|
||||
if (size != offsetof(RAWHID, bRawData[hid->dwCount * hid->dwSizeHid])) return FALSE;
|
||||
memcpy( &rawinput->data.hid, msg_data + 1, size );
|
||||
}
|
||||
else
|
||||
{
|
||||
FIXME( "Unhandled rawinput type %#x.\n", msg_data->rawinput.type );
|
||||
return false;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return true;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
struct device
|
||||
|
@ -621,10 +536,10 @@ UINT WINAPI NtUserGetRawInputBuffer( RAWINPUT *data, UINT *data_size, UINT heade
|
|||
int i;
|
||||
|
||||
if (NtCurrentTeb()->WowTebOffset)
|
||||
rawinput_size = sizeof(RAWINPUT64);
|
||||
rawinput_size = sizeof(RAWINPUTHEADER64);
|
||||
else
|
||||
rawinput_size = sizeof(RAWINPUT);
|
||||
overhead = rawinput_size - sizeof(RAWINPUT);
|
||||
rawinput_size = sizeof(RAWINPUTHEADER);
|
||||
overhead = rawinput_size - sizeof(RAWINPUTHEADER);
|
||||
|
||||
if (header_size != sizeof(RAWINPUTHEADER))
|
||||
{
|
||||
|
|
|
@ -263,32 +263,12 @@ struct hw_msg_source
|
|||
unsigned int origin;
|
||||
};
|
||||
|
||||
union rawinput
|
||||
struct rawinput
|
||||
{
|
||||
int type;
|
||||
struct
|
||||
{
|
||||
int type;
|
||||
unsigned int message;
|
||||
unsigned short vkey;
|
||||
unsigned short scan;
|
||||
} kbd;
|
||||
struct
|
||||
{
|
||||
int type;
|
||||
int x;
|
||||
int y;
|
||||
unsigned int data;
|
||||
} mouse;
|
||||
struct
|
||||
{
|
||||
int type;
|
||||
unsigned int device;
|
||||
unsigned int wparam;
|
||||
unsigned int usage;
|
||||
unsigned int count;
|
||||
unsigned int length;
|
||||
} hid;
|
||||
int type;
|
||||
unsigned int device;
|
||||
unsigned int wparam;
|
||||
unsigned int usage;
|
||||
};
|
||||
|
||||
struct hardware_msg_data
|
||||
|
@ -299,7 +279,7 @@ struct hardware_msg_data
|
|||
unsigned int hw_id;
|
||||
unsigned int flags;
|
||||
struct hw_msg_source source;
|
||||
union rawinput rawinput;
|
||||
struct rawinput rawinput;
|
||||
};
|
||||
|
||||
struct callback_msg_data
|
||||
|
@ -6512,7 +6492,7 @@ union generic_reply
|
|||
|
||||
/* ### protocol_version begin ### */
|
||||
|
||||
#define SERVER_PROTOCOL_VERSION 791
|
||||
#define SERVER_PROTOCOL_VERSION 792
|
||||
|
||||
/* ### protocol_version end ### */
|
||||
|
||||
|
|
|
@ -279,32 +279,12 @@ struct hw_msg_source
|
|||
unsigned int origin; /* source origin (IMO_* values) */
|
||||
};
|
||||
|
||||
union rawinput
|
||||
struct rawinput
|
||||
{
|
||||
int type;
|
||||
struct
|
||||
{
|
||||
int type; /* RIM_TYPEKEYBOARD */
|
||||
unsigned int message; /* message generated by this rawinput event */
|
||||
unsigned short vkey; /* virtual key code */
|
||||
unsigned short scan; /* scan code */
|
||||
} kbd;
|
||||
struct
|
||||
{
|
||||
int type; /* RIM_TYPEMOUSE */
|
||||
int x; /* x coordinate */
|
||||
int y; /* y coordinate */
|
||||
unsigned int data; /* mouse data */
|
||||
} mouse;
|
||||
struct
|
||||
{
|
||||
int type; /* RIM_TYPEHID */
|
||||
unsigned int device; /* rawinput device index */
|
||||
unsigned int wparam; /* rawinput message wparam */
|
||||
unsigned int usage; /* HID device usage */
|
||||
unsigned int count; /* HID report count */
|
||||
unsigned int length; /* HID report length */
|
||||
} hid;
|
||||
int type; /* rawinput data type (RIM_* values) */
|
||||
unsigned int device; /* rawinput device pseudo-handle */
|
||||
unsigned int wparam; /* wparam of the WM_INPUT* message */
|
||||
unsigned int usage; /* HID device usage */
|
||||
};
|
||||
|
||||
struct hardware_msg_data
|
||||
|
@ -315,7 +295,7 @@ struct hardware_msg_data
|
|||
unsigned int hw_id; /* unique id */
|
||||
unsigned int flags; /* hook flags */
|
||||
struct hw_msg_source source; /* message source */
|
||||
union rawinput rawinput; /* rawinput message data */
|
||||
struct rawinput rawinput; /* rawinput message data */
|
||||
};
|
||||
|
||||
struct callback_msg_data
|
||||
|
|
180
server/queue.c
180
server/queue.c
|
@ -1782,6 +1782,116 @@ static struct thread *get_foreground_thread( struct desktop *desktop, user_handl
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* user32 reserves 1 & 2 for winemouse and winekeyboard,
|
||||
* keep this in sync with user_private.h */
|
||||
#define WINE_MOUSE_HANDLE 1
|
||||
#define WINE_KEYBOARD_HANDLE 2
|
||||
|
||||
static void rawmouse_init( struct rawinput *header, RAWMOUSE *rawmouse, int x, int y, unsigned int flags,
|
||||
unsigned int buttons, lparam_t info )
|
||||
{
|
||||
static const unsigned int button_flags[] =
|
||||
{
|
||||
0, /* MOUSEEVENTF_MOVE */
|
||||
RI_MOUSE_LEFT_BUTTON_DOWN, /* MOUSEEVENTF_LEFTDOWN */
|
||||
RI_MOUSE_LEFT_BUTTON_UP, /* MOUSEEVENTF_LEFTUP */
|
||||
RI_MOUSE_RIGHT_BUTTON_DOWN, /* MOUSEEVENTF_RIGHTDOWN */
|
||||
RI_MOUSE_RIGHT_BUTTON_UP, /* MOUSEEVENTF_RIGHTUP */
|
||||
RI_MOUSE_MIDDLE_BUTTON_DOWN, /* MOUSEEVENTF_MIDDLEDOWN */
|
||||
RI_MOUSE_MIDDLE_BUTTON_UP, /* MOUSEEVENTF_MIDDLEUP */
|
||||
};
|
||||
unsigned int i;
|
||||
|
||||
header->type = RIM_TYPEMOUSE;
|
||||
header->device = WINE_MOUSE_HANDLE;
|
||||
header->wparam = 0;
|
||||
header->usage = MAKELONG(HID_USAGE_GENERIC_MOUSE, HID_USAGE_PAGE_GENERIC);
|
||||
|
||||
rawmouse->usFlags = MOUSE_MOVE_RELATIVE;
|
||||
rawmouse->usButtonFlags = 0;
|
||||
rawmouse->usButtonData = 0;
|
||||
for (i = 1; i < ARRAY_SIZE(button_flags); ++i)
|
||||
{
|
||||
if (flags & (1 << i)) rawmouse->usButtonFlags |= button_flags[i];
|
||||
}
|
||||
if (flags & MOUSEEVENTF_WHEEL)
|
||||
{
|
||||
rawmouse->usButtonFlags |= RI_MOUSE_WHEEL;
|
||||
rawmouse->usButtonData = buttons;
|
||||
}
|
||||
if (flags & MOUSEEVENTF_HWHEEL)
|
||||
{
|
||||
rawmouse->usButtonFlags |= RI_MOUSE_HORIZONTAL_WHEEL;
|
||||
rawmouse->usButtonData = buttons;
|
||||
}
|
||||
if (flags & MOUSEEVENTF_XDOWN)
|
||||
{
|
||||
if (buttons == XBUTTON1) rawmouse->usButtonFlags |= RI_MOUSE_BUTTON_4_DOWN;
|
||||
if (buttons == XBUTTON2) rawmouse->usButtonFlags |= RI_MOUSE_BUTTON_5_DOWN;
|
||||
}
|
||||
if (flags & MOUSEEVENTF_XUP)
|
||||
{
|
||||
if (buttons == XBUTTON1) rawmouse->usButtonFlags |= RI_MOUSE_BUTTON_4_UP;
|
||||
if (buttons == XBUTTON2) rawmouse->usButtonFlags |= RI_MOUSE_BUTTON_5_UP;
|
||||
}
|
||||
|
||||
rawmouse->ulRawButtons = 0;
|
||||
rawmouse->lLastX = x;
|
||||
rawmouse->lLastY = y;
|
||||
rawmouse->ulExtraInformation = info;
|
||||
}
|
||||
|
||||
static void rawkeyboard_init( struct rawinput *rawinput, RAWKEYBOARD *keyboard, unsigned short scan, unsigned short vkey,
|
||||
unsigned int flags, unsigned int message, lparam_t info )
|
||||
{
|
||||
rawinput->type = RIM_TYPEKEYBOARD;
|
||||
rawinput->device = WINE_KEYBOARD_HANDLE;
|
||||
rawinput->wparam = 0;
|
||||
rawinput->usage = MAKELONG(HID_USAGE_GENERIC_KEYBOARD, HID_USAGE_PAGE_GENERIC);
|
||||
|
||||
keyboard->MakeCode = scan;
|
||||
keyboard->Flags = (flags & KEYEVENTF_KEYUP) ? RI_KEY_BREAK : RI_KEY_MAKE;
|
||||
if (flags & KEYEVENTF_EXTENDEDKEY) keyboard->Flags |= RI_KEY_E0;
|
||||
keyboard->Reserved = 0;
|
||||
|
||||
switch (vkey)
|
||||
{
|
||||
case VK_LSHIFT:
|
||||
case VK_RSHIFT:
|
||||
keyboard->VKey = VK_SHIFT;
|
||||
keyboard->Flags &= ~RI_KEY_E0;
|
||||
break;
|
||||
|
||||
case VK_LCONTROL:
|
||||
case VK_RCONTROL:
|
||||
keyboard->VKey = VK_CONTROL;
|
||||
break;
|
||||
|
||||
case VK_LMENU:
|
||||
case VK_RMENU:
|
||||
keyboard->VKey = VK_MENU;
|
||||
break;
|
||||
|
||||
default:
|
||||
keyboard->VKey = vkey;
|
||||
break;
|
||||
}
|
||||
|
||||
keyboard->Message = message;
|
||||
keyboard->ExtraInformation = info;
|
||||
}
|
||||
|
||||
static void rawhid_init( struct rawinput *rawinput, RAWHID *hid, const hw_input_t *input )
|
||||
{
|
||||
rawinput->type = RIM_TYPEHID;
|
||||
rawinput->device = input->hw.hid.device;
|
||||
rawinput->wparam = input->hw.wparam;
|
||||
rawinput->usage = input->hw.hid.usage;
|
||||
|
||||
hid->dwCount = input->hw.hid.count;
|
||||
hid->dwSizeHid = input->hw.hid.length;
|
||||
}
|
||||
|
||||
struct rawinput_message
|
||||
{
|
||||
struct thread *foreground;
|
||||
|
@ -1789,30 +1899,48 @@ struct rawinput_message
|
|||
struct hw_msg_source source;
|
||||
unsigned int time;
|
||||
unsigned int message;
|
||||
lparam_t info;
|
||||
unsigned int flags;
|
||||
union rawinput rawinput;
|
||||
const void *hid_report;
|
||||
struct rawinput rawinput;
|
||||
union
|
||||
{
|
||||
RAWKEYBOARD keyboard;
|
||||
RAWMOUSE mouse;
|
||||
RAWHID hid;
|
||||
} data;
|
||||
const void *hid_report;
|
||||
};
|
||||
|
||||
/* check if process is supposed to receive a WM_INPUT message and eventually queue it */
|
||||
static int queue_rawinput_message( struct process* process, void *arg )
|
||||
{
|
||||
const struct rawinput_message* raw_msg = arg;
|
||||
const struct rawinput_message *raw_msg = arg;
|
||||
const struct rawinput_device *device = NULL;
|
||||
struct desktop *target_desktop = NULL, *desktop = NULL;
|
||||
struct thread *target_thread = NULL, *foreground = NULL;
|
||||
struct hardware_msg_data *msg_data;
|
||||
struct message *msg;
|
||||
data_size_t report_size;
|
||||
data_size_t report_size = 0, data_size = 0;
|
||||
int wparam = RIM_INPUT;
|
||||
lparam_t info = 0;
|
||||
|
||||
if (raw_msg->rawinput.type == RIM_TYPEMOUSE)
|
||||
{
|
||||
device = process->rawinput_mouse;
|
||||
data_size = sizeof(raw_msg->data.mouse);
|
||||
info = raw_msg->data.mouse.ulExtraInformation;
|
||||
}
|
||||
else if (raw_msg->rawinput.type == RIM_TYPEKEYBOARD)
|
||||
{
|
||||
device = process->rawinput_kbd;
|
||||
data_size = sizeof(raw_msg->data.keyboard);
|
||||
info = raw_msg->data.keyboard.ExtraInformation;
|
||||
}
|
||||
else
|
||||
device = find_rawinput_device( process, raw_msg->rawinput.hid.usage );
|
||||
{
|
||||
device = find_rawinput_device( process, raw_msg->rawinput.usage );
|
||||
data_size = offsetof(RAWHID, bRawData[0]);
|
||||
report_size = raw_msg->data.hid.dwCount * raw_msg->data.hid.dwSizeHid;
|
||||
}
|
||||
if (!device) return 0;
|
||||
|
||||
if (raw_msg->message == WM_INPUT_DEVICE_CHANGE && !(device->flags & RIDEV_DEVNOTIFY)) return 0;
|
||||
|
@ -1832,10 +1960,7 @@ static int queue_rawinput_message( struct process* process, void *arg )
|
|||
wparam = RIM_INPUTSINK;
|
||||
}
|
||||
|
||||
if (raw_msg->rawinput.type != RIM_TYPEHID || !raw_msg->hid_report) report_size = 0;
|
||||
else report_size = raw_msg->rawinput.hid.count * raw_msg->rawinput.hid.length;
|
||||
|
||||
if (!(msg = alloc_hardware_message( raw_msg->info, raw_msg->source, raw_msg->time, report_size ))) goto done;
|
||||
if (!(msg = alloc_hardware_message( info, raw_msg->source, raw_msg->time, data_size + report_size ))) goto done;
|
||||
msg->win = device->target;
|
||||
msg->msg = raw_msg->message;
|
||||
msg->wparam = wparam;
|
||||
|
@ -1844,12 +1969,13 @@ static int queue_rawinput_message( struct process* process, void *arg )
|
|||
msg_data = msg->data;
|
||||
msg_data->flags = raw_msg->flags;
|
||||
msg_data->rawinput = raw_msg->rawinput;
|
||||
if (report_size) memcpy( msg_data + 1, raw_msg->hid_report, report_size );
|
||||
memcpy( msg_data + 1, &raw_msg->data, data_size );
|
||||
if (report_size) memcpy( (char *)(msg_data + 1) + data_size, raw_msg->hid_report, report_size );
|
||||
|
||||
if (raw_msg->message == WM_INPUT_DEVICE_CHANGE && raw_msg->rawinput.type == RIM_TYPEHID)
|
||||
{
|
||||
msg->wparam = raw_msg->rawinput.hid.wparam;
|
||||
msg->lparam = raw_msg->rawinput.hid.device;
|
||||
msg->wparam = raw_msg->rawinput.wparam;
|
||||
msg->lparam = raw_msg->rawinput.device;
|
||||
}
|
||||
|
||||
queue_hardware_message( desktop, msg, 1 );
|
||||
|
@ -1927,13 +2053,9 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons
|
|||
raw_msg.source = source;
|
||||
raw_msg.time = time;
|
||||
raw_msg.message = WM_INPUT;
|
||||
|
||||
raw_msg.info = input->mouse.info;
|
||||
raw_msg.flags = flags;
|
||||
raw_msg.rawinput.type = RIM_TYPEMOUSE;
|
||||
raw_msg.rawinput.mouse.x = x - desktop->cursor.x;
|
||||
raw_msg.rawinput.mouse.y = y - desktop->cursor.y;
|
||||
raw_msg.rawinput.mouse.data = input->mouse.data;
|
||||
raw_msg.flags = flags;
|
||||
rawmouse_init( &raw_msg.rawinput, &raw_msg.data.mouse, x - desktop->cursor.x, y - desktop->cursor.y,
|
||||
raw_msg.flags, input->mouse.data, input->mouse.info );
|
||||
|
||||
enum_processes( queue_rawinput_message, &raw_msg );
|
||||
release_object( foreground );
|
||||
|
@ -2063,13 +2185,9 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c
|
|||
raw_msg.source = source;
|
||||
raw_msg.time = time;
|
||||
raw_msg.message = WM_INPUT;
|
||||
|
||||
raw_msg.info = input->kbd.info;
|
||||
raw_msg.flags = input->kbd.flags;
|
||||
raw_msg.rawinput.type = RIM_TYPEKEYBOARD;
|
||||
raw_msg.rawinput.kbd.message = message_code;
|
||||
raw_msg.rawinput.kbd.vkey = vkey;
|
||||
raw_msg.rawinput.kbd.scan = input->kbd.scan;
|
||||
raw_msg.flags = input->kbd.flags;
|
||||
rawkeyboard_init( &raw_msg.rawinput, &raw_msg.data.keyboard, input->kbd.scan, vkey,
|
||||
raw_msg.flags, message_code, input->kbd.info );
|
||||
|
||||
enum_processes( queue_rawinput_message, &raw_msg );
|
||||
release_object( foreground );
|
||||
|
@ -2134,13 +2252,7 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_
|
|||
set_error( STATUS_INVALID_PARAMETER );
|
||||
return;
|
||||
}
|
||||
|
||||
raw_msg.rawinput.hid.type = RIM_TYPEHID;
|
||||
raw_msg.rawinput.hid.device = input->hw.hid.device;
|
||||
raw_msg.rawinput.hid.wparam = input->hw.wparam;
|
||||
raw_msg.rawinput.hid.usage = input->hw.hid.usage;
|
||||
raw_msg.rawinput.hid.count = input->hw.hid.count;
|
||||
raw_msg.rawinput.hid.length = input->hw.hid.length;
|
||||
rawhid_init( &raw_msg.rawinput, &raw_msg.data.hid, input );
|
||||
|
||||
enum_processes( queue_rawinput_message, &raw_msg );
|
||||
return;
|
||||
|
|
|
@ -716,7 +716,7 @@ C_ASSERT( sizeof(ioctl_code_t) == 4 );
|
|||
C_ASSERT( sizeof(irp_params_t) == 32 );
|
||||
C_ASSERT( sizeof(lparam_t) == 8 );
|
||||
C_ASSERT( sizeof(mem_size_t) == 8 );
|
||||
C_ASSERT( sizeof(message_data_t) == 56 );
|
||||
C_ASSERT( sizeof(message_data_t) == 48 );
|
||||
C_ASSERT( sizeof(mod_handle_t) == 8 );
|
||||
C_ASSERT( sizeof(obj_handle_t) == 4 );
|
||||
C_ASSERT( sizeof(pe_image_info_t) == 88 );
|
||||
|
|
|
@ -57,7 +57,7 @@ my %formats =
|
|||
"context_t" => [ 1720, 8 ],
|
||||
"cursor_pos_t" => [ 24, 8 ],
|
||||
"debug_event_t" => [ 160, 8 ],
|
||||
"message_data_t" => [ 56, 8 ],
|
||||
"message_data_t" => [ 48, 8 ],
|
||||
"pe_image_info_t" => [ 88, 8 ],
|
||||
"property_data_t" => [ 16, 8 ],
|
||||
"select_op_t" => [ 264, 8 ],
|
||||
|
|
Loading…
Add table
Reference in a new issue