From d4ae1a546faf0fd72a860e9698c4e1091ef9f9e6 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sun, 25 Jan 2026 07:55:37 +0100 Subject: [PATCH] [client,common] add FREERDP_TOUCH_CANCEL * Add flag FREERDP_TOUCH_CANCEL * Add function freerdp_handle_touch_cancel --- client/common/client.c | 38 ++++++++++++++++++++++++++++++++++++++ include/freerdp/client.h | 1 + 2 files changed, 39 insertions(+) diff --git a/client/common/client.c b/client/common/client.c index 947a1a9bc..07b3324b8 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -1993,6 +1993,42 @@ static BOOL freerdp_handle_touch_motion(rdpClientContext* cctx, const FreeRDP_To #endif } +static BOOL freerdp_handle_touch_cancel(rdpClientContext* cctx, const FreeRDP_TouchContact* contact) +{ + WINPR_ASSERT(cctx); + WINPR_ASSERT(contact); + +#if defined(CHANNEL_RDPEI_CLIENT) + RdpeiClientContext* rdpei = cctx->rdpei; + + if (!rdpei) + return freerdp_handle_touch_to_mouse(cctx, false, contact); + + int contactId = 0; + + if (rdpei->TouchRawEvent) + { + const UINT32 flags = RDPINPUT_CONTACT_FLAG_UPDATE | RDPINPUT_CONTACT_FLAG_CANCELED; + const UINT32 contactFlags = ((contact->flags & FREERDP_TOUCH_HAS_PRESSURE) != 0) + ? CONTACT_DATA_PRESSURE_PRESENT + : 0; + rdpei->TouchRawEvent(rdpei, contact->id, contact->x, contact->y, &contactId, flags, + contactFlags, contact->pressure); + } + else + { + WINPR_ASSERT(rdpei->TouchUpdate); + rdpei->TouchEnd(rdpei, contact->id, contact->x, contact->y, &contactId); + } + + return TRUE; +#else + WLog_WARN(TAG, "Touch event detected but RDPEI support not compiled in. Recompile with " + "-DCHANNEL_RDPEI_CLIENT=ON"); + return freerdp_handle_touch_to_mouse(cctx, false, contact); +#endif +} + static BOOL freerdp_client_touch_update(rdpClientContext* cctx, UINT32 flags, INT32 touchId, UINT32 pressure, INT32 x, INT32 y, FreeRDP_TouchContact* pcontact) @@ -2047,6 +2083,8 @@ BOOL freerdp_client_handle_touch(rdpClientContext* cctx, UINT32 flags, INT32 fin return freerdp_handle_touch_up(cctx, &contact); case FREERDP_TOUCH_MOTION: return freerdp_handle_touch_motion(cctx, &contact); + case FREERDP_TOUCH_CANCEL: + return freerdp_handle_touch_cancel(cctx, &contact); default: WLog_WARN(TAG, "Unhandled FreeRDPTouchEventType %" PRIu32 ", ignoring", flags); return FALSE; diff --git a/include/freerdp/client.h b/include/freerdp/client.h index 74d73eb12..ca8908c79 100644 --- a/include/freerdp/client.h +++ b/include/freerdp/client.h @@ -264,6 +264,7 @@ extern "C" FREERDP_TOUCH_DOWN = 0x01, FREERDP_TOUCH_UP = 0x02, FREERDP_TOUCH_MOTION = 0x04, + FREERDP_TOUCH_CANCEL = 0x08, /** @since version 3.22.0 */ FREERDP_TOUCH_HAS_PRESSURE = 0x100 } FreeRDPTouchEventType;