From c343dfc00a4b29f21d1ade4846490907ed948196 Mon Sep 17 00:00:00 2001 From: lkn Date: Tue, 23 Jun 2026 23:44:45 +0200 Subject: [PATCH] text cursor: resolve WINGs target for fake_leader dialogs Motion events in dialogs (fake_leader frame_bufs with low IDs) were not resolving the WINGs child view, so WME_ENTER was never sent to the text field. Now look up the WINGs panel via client_leader. --- src/backend/wayland/wl_pointer_motion.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/backend/wayland/wl_pointer_motion.c b/src/backend/wayland/wl_pointer_motion.c index e04021b..0bd1a83 100644 --- a/src/backend/wayland/wl_pointer_motion.c +++ b/src/backend/wayland/wl_pointer_motion.c @@ -9,6 +9,7 @@ #include #include #include "../../screen.h" +#include "../../window.h" #include "wl_types.h" #include @@ -94,10 +95,21 @@ handle_pointer_motion(struct wl_listener *listener, void *data) /* Resolve WINGs child view (slider, etc.) at pointer for * motion routing during drag operations. */ struct W_View *mtarget = NULL; + WNativeWindow wings_hit = 0; if (fb && fb->id >= 0x20000000) { + wings_hit = fb->id; + } else if (fb) { + WObjDescriptor *_d = wm_backend->context_find(fb->id, WM_CTX_CLIENT_WIN); + if (_d && _d->parent_type == WCLASS_WINDOW) { + WWindow *_w = (WWindow *)_d->parent; + if (_w->client_leader >= 0x20000000) + wings_hit = _w->client_leader; + } + } + if (wings_hit) { extern W_View *W_GetViewForWindow(unsigned long id); extern struct W_View *W_FindViewAtPoint(struct W_View *parent, int x, int y); - W_View *toplevel = W_GetViewForWindow((unsigned long)fb->id); + W_View *toplevel = W_GetViewForWindow((unsigned long)wings_hit); if (toplevel) { mtarget = W_FindViewAtPoint(toplevel, wev.u.motion.x, wev.u.motion.y);