From 2566d818848b58b114071f199ffe944609376270 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Sun, 16 Jun 2024 12:38:09 +0200 Subject: [PATCH] xwayland: fixup unfocus atom conditions ref #6468 --- src/xwayland/XSurface.cpp | 2 +- src/xwayland/XWM.cpp | 25 +++++++++++++++++-------- src/xwayland/XWM.hpp | 2 +- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/xwayland/XSurface.cpp b/src/xwayland/XSurface.cpp index 07cac832..5d25e0e8 100644 --- a/src/xwayland/XSurface.cpp +++ b/src/xwayland/XSurface.cpp @@ -179,7 +179,7 @@ void CXWaylandSurface::configure(const CBox& box) { void CXWaylandSurface::activate(bool activate) { if (overrideRedirect && !activate) return; - g_pXWayland->pWM->activateSurface(self.lock()); + g_pXWayland->pWM->activateSurface(self.lock(), activate); } void CXWaylandSurface::setFullscreen(bool fs) { diff --git a/src/xwayland/XWM.cpp b/src/xwayland/XWM.cpp index 247af4b7..719adcb9 100644 --- a/src/xwayland/XWM.cpp +++ b/src/xwayland/XWM.cpp @@ -394,11 +394,16 @@ void CXWM::focusWindow(SP surf) { if (surf == focusedSurface) return; - auto oldSurf = focusedSurface.lock(); focusedSurface = surf; - if (oldSurf) - sendState(oldSurf); + // send state to all surfaces, sometimes we might lose some + // that could still stick with the focused atom + for (auto& s : mappedSurfaces) { + if (!s) + continue; + + sendState(s.lock()); + } if (!surf) { xcb_set_input_focus_checked(connection, XCB_INPUT_FOCUS_POINTER_ROOT, XCB_NONE, XCB_CURRENT_TIME); @@ -868,13 +873,17 @@ void CXWM::createWMWindow() { xcb_set_selection_owner(connection, wmWindow, HYPRATOMS["_NET_WM_CM_S0"], XCB_CURRENT_TIME); } -void CXWM::activateSurface(SP surf) { - if (surf == focusedSurface || (surf && surf->overrideRedirect)) +void CXWM::activateSurface(SP surf, bool activate) { + if ((surf == focusedSurface && activate) || (surf && surf->overrideRedirect)) return; - setActiveWindow(surf ? surf->xID : (uint32_t)XCB_WINDOW_NONE); - - focusWindow(surf); + if (!activate || !surf) { + setActiveWindow((uint32_t)XCB_WINDOW_NONE); + focusWindow(nullptr); + } else { + setActiveWindow(surf ? surf->xID : (uint32_t)XCB_WINDOW_NONE); + focusWindow(surf); + } xcb_flush(connection); } diff --git a/src/xwayland/XWM.hpp b/src/xwayland/XWM.hpp index 7f68454c..6456c71b 100644 --- a/src/xwayland/XWM.hpp +++ b/src/xwayland/XWM.hpp @@ -79,7 +79,7 @@ class CXWM { void setActiveWindow(xcb_window_t window); void sendState(SP surf); void focusWindow(SP surf); - void activateSurface(SP surf); + void activateSurface(SP surf, bool activate); bool isWMWindow(xcb_window_t w); void sendWMMessage(SP surf, xcb_client_message_data_t* data, uint32_t mask);