From 67877d5e7cdcf62be23930ce4518c352e1f85266 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Tue, 11 Feb 2025 13:05:07 +0100 Subject: [PATCH] [client,x11] update MappingNotify handling --- client/X11/xf_client.c | 2 ++ client/X11/xf_event.c | 23 +++++++++++++++++++---- client/X11/xf_keyboard.c | 33 +++++++++++++++------------------ client/X11/xf_keyboard.h | 2 ++ 4 files changed, 38 insertions(+), 22 deletions(-) diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index 580391cfe..6b8fe06ad 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -1204,6 +1204,8 @@ static BOOL xf_pre_connect(freerdp* instance) { if (!xf_keyboard_init(xfc)) return FALSE; + if (!xf_keyboard_action_script_init(xfc)) + return FALSE; if (!xf_detect_monitors(xfc, &maxWidth, &maxHeight)) return FALSE; } diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index 3b9f06b2d..58acdab8c 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -196,6 +196,8 @@ BOOL xf_event_action_script_init(xfContext* xfc) { WINPR_ASSERT(xfc); + xf_event_action_script_free(xfc); + xfc->xevents = ArrayList_New(TRUE); if (!xfc->xevents) @@ -723,10 +725,23 @@ static BOOL xf_event_MappingNotify(xfContext* xfc, const XMappingEvent* event, B { WINPR_UNUSED(app); - if (event->request == MappingModifier) - return xf_keyboard_update_modifier_map(xfc); - - return TRUE; + switch (event->request) + { + case MappingModifier: + return xf_keyboard_update_modifier_map(xfc); + case MappingKeyboard: + WLog_VRB(TAG, "[%d] MappingKeyboard", event->request); + return xf_keyboard_init(xfc); + case MappingPointer: + WLog_VRB(TAG, "[%d] MappingPointer", event->request); + return TRUE; + default: + WLog_WARN(TAG, + "[%d] Unsupported MappingNotify::request, must be one " + "of[MappingModifier(%d), MappingKeyboard(%d), MappingPointer(%d)]", + event->request, MappingModifier, MappingKeyboard, MappingPointer); + return FALSE; + } } static BOOL xf_event_ClientMessage(xfContext* xfc, const XClientMessageEvent* event, BOOL app) diff --git a/client/X11/xf_keyboard.c b/client/X11/xf_keyboard.c index 435e86ab3..3e59c246c 100644 --- a/client/X11/xf_keyboard.c +++ b/client/X11/xf_keyboard.c @@ -115,10 +115,23 @@ static BOOL xf_action_script_append(xfContext* xfc, const char* buffer, size_t s return ArrayList_Append(xfc->keyCombinations, buffer); } -static BOOL xf_keyboard_action_script_init(xfContext* xfc) +static void xf_keyboard_action_script_free(xfContext* xfc) +{ + xf_event_action_script_free(xfc); + + if (xfc->keyCombinations) + { + ArrayList_Free(xfc->keyCombinations); + xfc->keyCombinations = NULL; + xfc->actionScriptExists = FALSE; + } +} + +BOOL xf_keyboard_action_script_init(xfContext* xfc) { WINPR_ASSERT(xfc); + xf_keyboard_action_script_free(xfc); xfc->keyCombinations = ArrayList_New(TRUE); if (!xfc->keyCombinations) @@ -135,18 +148,6 @@ static BOOL xf_keyboard_action_script_init(xfContext* xfc) return xf_event_action_script_init(xfc); } -static void xf_keyboard_action_script_free(xfContext* xfc) -{ - xf_event_action_script_free(xfc); - - if (xfc->keyCombinations) - { - ArrayList_Free(xfc->keyCombinations); - xfc->keyCombinations = NULL; - xfc->actionScriptExists = FALSE; - } -} - BOOL xf_keyboard_init(xfContext* xfc) { rdpSettings* settings = NULL; @@ -163,11 +164,7 @@ BOOL xf_keyboard_init(xfContext* xfc) if (!freerdp_settings_set_uint32(settings, FreeRDP_KeyboardLayout, xfc->KeyboardLayout)) return FALSE; - if (!xf_keyboard_update_modifier_map(xfc)) - return FALSE; - - xf_keyboard_action_script_init(xfc); - return TRUE; + return xf_keyboard_update_modifier_map(xfc); } void xf_keyboard_free(xfContext* xfc) diff --git a/client/X11/xf_keyboard.h b/client/X11/xf_keyboard.h index 3e91c2263..687bfa229 100644 --- a/client/X11/xf_keyboard.h +++ b/client/X11/xf_keyboard.h @@ -28,6 +28,8 @@ BOOL xf_keyboard_init(xfContext* xfc); void xf_keyboard_free(xfContext* xfc); +BOOL xf_keyboard_action_script_init(xfContext* xfc); + void xf_keyboard_key_press(xfContext* xfc, const XKeyEvent* event, KeySym keysym); void xf_keyboard_key_release(xfContext* xfc, const XKeyEvent* event, KeySym keysym);