From 481ac54f67a1ab0b5c8544b907d1491599cd118a Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Sun, 5 Apr 2020 22:02:51 +0100 Subject: [PATCH] event: reparent: handle reparenting from one frame to another Basically, don't ignore the reparent notify if the window is already a client window. We already unmark it from its previous frame, so this commit make sure it gets marked with its new frame. Related: #299 Signed-off-by: Yuxuan Shui --- src/event.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/event.c b/src/event.c index 07c2a21..46340d6 100644 --- a/src/event.c +++ b/src/event.c @@ -349,15 +349,13 @@ static inline void ev_reparent_notify(session_t *ps, xcb_reparent_notify_event_t ps->c, ev->window, XCB_CW_EVENT_MASK, (const uint32_t[]){determine_evmask(ps, ev->window, WIN_EVMODE_UNKNOWN)}); - // Check if the window is an undetected client window - // Firstly, check if it's a known client window - if (!w_top) { - // If not, look for its frame window - auto w_real_top = find_managed_window_or_parent(ps, ev->parent); - // If found, and the client window has not been determined, or its - // frame may not have a correct client, continue - if (w_real_top && (!w_real_top->client_win || - w_real_top->client_win == w_real_top->base.id)) { + // Mark the window as the client window of its parent. + auto w_real_top = find_managed_window_or_parent(ps, ev->parent); + // If found, and the client window has not been determined, or its + // frame may not have a correct client, continue + if (w_real_top) { + if (!w_real_top->client_win || + w_real_top->client_win == w_real_top->base.id) { // If it has WM_STATE, mark it the client window if (wid_has_prop(ps, ev->window, ps->atoms->aWM_STATE)) { w_real_top->wmwin = false; @@ -372,6 +370,11 @@ static inline void ev_reparent_notify(session_t *ps, xcb_reparent_notify_event_t determine_evmask(ps, ev->window, WIN_EVMODE_UNKNOWN) | XCB_EVENT_MASK_PROPERTY_CHANGE}); } + } else { + log_warn("Window %#010x reparented to a window that " + "already has a client window, the parent is " + "%#010x (%s)", + ev->window, w_real_top->base.id, w_real_top->name); } } }