From e81156708c8846f03d8100b231eb81784429daf2 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Wed, 16 Sep 2026 15:30:37 -0700 Subject: [PATCH] fix key repeat --- include/Mw/LowLevel/Wayland.h | 5 +++-- src/backend/wayland/interfaces.c | 6 +++--- src/backend/wayland/wayland.c | 6 +----- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/include/Mw/LowLevel/Wayland.h b/include/Mw/LowLevel/Wayland.h index e3b9ff9..5c91ebf 100644 --- a/include/Mw/LowLevel/Wayland.h +++ b/include/Mw/LowLevel/Wayland.h @@ -433,8 +433,6 @@ struct _MwLLWayland { MwBool dispatching_resize; - MwBool is_toplevel_menu; - struct _MwLLWaylandShmBuffer framebuffer; struct _MwLLWaylandShmBuffer backbuffer; struct _MwLLWaylandShmBuffer cursor; @@ -491,6 +489,9 @@ void MwLLWaylandClipboardRead(wl_clipboard_device_context_t* ctx, int clipboard_ /* Flush Wayland events */ void MwLLWaylandFlush(MwLL handle); +/* recursively dispatch the key event to focused widgets. */ +void MwLLRecursiveKeyDispatch(MwLL self, int* k, MwBool down); + /* Standard procedure before event callbacks in Wayland */ #define WAYLAND_EVENT_OP_START(self) diff --git a/src/backend/wayland/interfaces.c b/src/backend/wayland/interfaces.c index 3378d0d..5f4d6ff 100644 --- a/src/backend/wayland/interfaces.c +++ b/src/backend/wayland/interfaces.c @@ -1000,7 +1000,7 @@ static void keyboard_leave(void* data, WAYLAND_EVENT_OP_END(self); }; -static void key_dispatch(MwLL self, int* k, MwBool down) { +void MwLLRecursiveKeyDispatch(MwLL self, int* k, MwBool down) { if(self->common.user) { MwWidget w = self->common.user; int i, n; @@ -1019,7 +1019,7 @@ static void key_dispatch(MwLL self, int* k, MwBool down) { MwLLDispatch(child, key_released, k); } - key_dispatch(child, k, down); + MwLLRecursiveKeyDispatch(child, k, down); } } } @@ -1141,7 +1141,7 @@ static void keyboard_key(void* data, } else { self->wayland.holding_key = MwFALSE; } - key_dispatch(self, &key, state == WL_KEYBOARD_KEY_STATE_PRESSED); + MwLLRecursiveKeyDispatch(self, &key, state == WL_KEYBOARD_KEY_STATE_PRESSED); self->wayland.start_time = MwTimeGetTick(); self->wayland.next_elapsed = self->wayland.keyboard_delay; } diff --git a/src/backend/wayland/wayland.c b/src/backend/wayland/wayland.c index ff8fb49..c854453 100644 --- a/src/backend/wayland/wayland.c +++ b/src/backend/wayland/wayland.c @@ -1376,11 +1376,7 @@ static int MwLLPendingImpl(MwLL handle) { if(handle->wayland.holding_key) { float elapsed = ((float)(handle->wayland.end_time - (float)handle->wayland.start_time)); if(elapsed >= handle->wayland.next_elapsed) { - MwLL topmost_parent = handle; - while(topmost_parent->wayland.parent) { - MwLLDispatch(topmost_parent, key, &handle->wayland.last_pressed_key); - topmost_parent = topmost_parent->wayland.parent; - } + MwLLRecursiveKeyDispatch(handle, &handle->wayland.last_pressed_key, MwTRUE); handle->wayland.next_elapsed = elapsed + handle->wayland.keyboard_rate; } }