From: navi <navi@vlhl.dev> --- dlls/mouhid.sys/main.c | 3 +++ dlls/winex11.drv/mouse.c | 14 ++++++++------ server/queue.c | 36 +++++++++++++----------------------- 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/dlls/mouhid.sys/main.c b/dlls/mouhid.sys/main.c index 23642c53554..0ed4d5c0344 100644 --- a/dlls/mouhid.sys/main.c +++ b/dlls/mouhid.sys/main.c @@ -148,6 +148,8 @@ static void add_contact( struct device *impl, struct list *old_contacts, ULONG i info->pointerId = contact->id; info->pointerFlags = flags; info->ptPixelLocation = contact->pos; + if (msg == WM_POINTERDOWN) + NtUserMessageCall(0, WM_POINTERENTER, 0, 0, &pointer, NtUserInjectPointer, FALSE); NtUserMessageCall(0, msg, 0, 0, &pointer, NtUserInjectPointer, FALSE); list_add_tail( &impl->contacts, &contact->entry ); @@ -170,6 +172,7 @@ static void release_contacts( struct list *contacts ) info->ptPixelLocation = contact->pos; NtUserMessageCall(0, WM_POINTERUP, 0, 0, &pointer, NtUserInjectPointer, FALSE); + NtUserMessageCall(0, WM_POINTERLEAVE, 0, 0, &pointer, NtUserInjectPointer, FALSE); list_remove( &contact->entry ); free( contact ); diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c index 346a851fead..62cbc983931 100644 --- a/dlls/winex11.drv/mouse.c +++ b/dlls/winex11.drv/mouse.c @@ -1680,7 +1680,6 @@ static BOOL X11DRV_TouchEvent( HWND hwnd, XGenericEventCookie *xev ) XIDeviceEvent *event = xev->data; POINT pt = { event->event_x, event->event_y }, root = { event->root_x, event->root_y }; POINT pos; - UINT msg; pt = map_event_coords( hwnd, event->event, event->root, root, pt ); pos.x = pt.x * 65535 / (virtual.right - virtual.left); @@ -1693,22 +1692,25 @@ static BOOL X11DRV_TouchEvent( HWND hwnd, XGenericEventCookie *xev ) switch (event->evtype) { case XI_TouchBegin: - msg = WM_POINTERDOWN; info->pointerFlags |= POINTER_FLAG_NEW; TRACE("XI_TouchBegin detail %u pos %dx%d, flags %#x\n", event->detail, pos.x, pos.y, info->pointerFlags); + + NtUserMessageCall( hwnd, WM_POINTERENTER, 0, 0, &pointer_info, NtUserInjectPointer, FALSE ); + NtUserMessageCall( hwnd, WM_POINTERDOWN, 0, 0, &pointer_info, NtUserInjectPointer, FALSE ); break; case XI_TouchEnd: - msg = WM_POINTERUP; TRACE("XI_TouchEnd detail %u pos %dx%d, flags %#x\n", event->detail, pos.x, pos.y, info->pointerFlags); + + NtUserMessageCall( hwnd, WM_POINTERUP, 0, 0, &pointer_info, NtUserInjectPointer, FALSE ); + NtUserMessageCall( hwnd, WM_POINTERLEAVE, 0, 0, &pointer_info, NtUserInjectPointer, FALSE ); break; case XI_TouchUpdate: - msg = WM_POINTERUPDATE; TRACE("XI_TouchUpdate detail %u pos %dx%d, flags %#x\n", event->detail, pos.x, pos.y, info->pointerFlags); + + NtUserMessageCall( hwnd, WM_POINTERUPDATE, 0, 0, &pointer_info, NtUserInjectPointer, FALSE ); break; } - NtUserMessageCall( hwnd, msg, 0, 0, &pointer_info, NtUserInjectPointer, FALSE ); - return TRUE; } diff --git a/server/queue.c b/server/queue.c index 26e8f301f79..928f78ba5c1 100644 --- a/server/queue.c +++ b/server/queue.c @@ -2477,20 +2477,15 @@ static void pointer_message_timeout( void *private ) static void queue_pointer_message( UINT message, struct pointer *pointer, int repeated ) { - static const unsigned int messages[][2] = - { - {WM_POINTERUPDATE, 0}, - {WM_POINTERENTER, WM_POINTERDOWN}, - {WM_POINTERUP, WM_POINTERLEAVE}, - }; struct hw_msg_source source = { IMDT_UNAVAILABLE, IMDT_TOUCH }; struct desktop *desktop = pointer->desktop; desktop_shm_t *desktop_shm = desktop->shared; POINTER_INFO *info = &pointer->info.pointerInfo; + struct hardware_msg_data *msg_data; timeout_t time = get_tick_count(); user_handle_t win = pointer->win; struct rectangle top_rect; - unsigned int i, wparam; + unsigned int wparam; struct message *msg; int x, y; @@ -2503,23 +2498,18 @@ static void queue_pointer_message( UINT message, struct pointer *pointer, int re info->frameId = pointer_frame++; wparam = MAKELONG(info->pointerId, info->pointerFlags); - for (i = 0; i < 2 && messages[message - WM_POINTERUPDATE][i]; i++) - { - struct hardware_msg_data *msg_data; + if (!(msg = alloc_hardware_message( 0, source, time, sizeof(pointer->info) ))) return; - if (!(msg = alloc_hardware_message( 0, source, time, sizeof(*info) ))) return; - - msg->win = get_user_full_handle( win ); - msg->msg = messages[message - WM_POINTERUPDATE][i]; - msg->wparam = wparam; - msg->lparam = MAKELONG(x, y); - msg->x = desktop_shm->cursor.x; - msg->y = desktop_shm->cursor.y; - msg_data = msg->data; - mem_append( msg_data + 1, info, sizeof(*info) ); + msg->win = get_user_full_handle( win ); + msg->msg = message; + msg->wparam = wparam; + msg->lparam = MAKELONG(x, y); + msg->x = desktop_shm->cursor.x; + msg->y = desktop_shm->cursor.y; + msg_data = msg->data; + mem_append( msg_data + 1, &pointer->info, sizeof(pointer->info) ); - queue_hardware_message( desktop, msg, 1 ); - } + queue_hardware_message( desktop, msg, 1 ); if (!repeated && pointer->primary && (msg = alloc_hardware_message( 0xff515700, source, time, 0 ))) { @@ -2538,7 +2528,7 @@ static void queue_pointer_message( UINT message, struct pointer *pointer, int re queue_hardware_message( desktop, msg, 0 ); } - if (message != WM_POINTERUP) + if (message != WM_POINTERLEAVE) { pointer->timeout = add_timeout_user( -160000, pointer_message_timeout, pointer ); info->pointerFlags &= ~POINTER_FLAG_NEW; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11693