diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-04-01 23:11:09 +0200 |
|---|---|---|
| committer | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-04-01 23:11:09 +0200 |
| commit | cd62eb56249d9db6b3bb33aacdd578c8c162e3ae (patch) | |
| tree | 8e6db697e9e4b6919f5eaef1aa9f0a3299491890 /src/Compositor.cpp | |
| parent | a64943fd12a65fb265e5aed49a0da315947cf31a (diff) | |
Fixed XWayland (GTK/?) popups focus
Diffstat (limited to 'src/Compositor.cpp')
| -rw-r--r-- | src/Compositor.cpp | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp index b2947025..99bb5713 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -289,6 +289,34 @@ CWindow* CCompositor::vectorToWindowIdeal(const Vector2D& pos) { return nullptr; } +CWindow* CCompositor::vectorToWindowIdealExcludeWithSurface(const Vector2D& pos, CWindow* pWindow, wlr_surface** ppSurface) { + const auto PMONITOR = getMonitorFromVector(pos); + // first loop over floating cuz they're above + // TODO: make an actual Z-system + for (auto& w : m_lWindows) { + wlr_box box = {w.m_vRealPosition.x, w.m_vRealPosition.y, w.m_vRealSize.x, w.m_vRealSize.y}; + if (&w != pWindow && w.m_bIsFloating && w.m_bIsMapped && wlr_box_contains_point(&box, m_sWLRCursor->x, m_sWLRCursor->y) && isWorkspaceVisible(w.m_iWorkspaceID)) { + double sx, sy; + if (ppSurface) + *ppSurface = wlr_surface_surface_at(g_pXWaylandManager->getWindowSurface(&w), pos.x - w.m_vRealPosition.x, pos.y - w.m_vRealPosition.y, &sx, &sy); + + return &w; + } + } + + for (auto& w : m_lWindows) { + wlr_box box = {w.m_vPosition.x, w.m_vPosition.y, w.m_vSize.x, w.m_vSize.y}; + if (&w != pWindow && !w.m_bIsFloating && w.m_bIsMapped && wlr_box_contains_point(&box, pos.x, pos.y) && w.m_iWorkspaceID == PMONITOR->activeWorkspace){ + double sx, sy; + if (ppSurface) + *ppSurface = wlr_surface_surface_at(g_pXWaylandManager->getWindowSurface(&w), pos.x - w.m_vRealPosition.x, pos.y - w.m_vRealPosition.y, &sx, &sy); + return &w; + } + } + + return nullptr; +} + CWindow* CCompositor::windowFromCursor() { const auto PMONITOR = getMonitorFromCursor(); @@ -342,16 +370,17 @@ void CCompositor::focusWindow(CWindow* pWindow) { } void CCompositor::focusSurface(wlr_surface* pSurface) { - if (m_sSeat.seat->keyboard_state.focused_surface == pSurface) + if (m_pLastFocus == pSurface) return; // Don't focus when already focused on this. if (!pSurface) return; // Unfocus last surface if should - const auto PWINDOWATCURSOR = vectorToWindowIdeal(g_pInputManager->getMouseCoordsInternal()); - if (m_pLastFocus && !(PWINDOWATCURSOR && g_pXWaylandManager->getWindowSurface(PWINDOWATCURSOR) == m_pLastFocus)) + if (m_pLastFocus && !wlr_surface_is_xwayland_surface(pSurface)) { g_pXWaylandManager->activateSurface(m_pLastFocus, false); + Debug::log(LOG, "Last focus %x deactivated", m_pLastFocus); + } const auto KEYBOARD = wlr_seat_get_keyboard(m_sSeat.seat); @@ -365,9 +394,9 @@ void CCompositor::focusSurface(wlr_surface* pSurface) { g_pXWaylandManager->activateSurface(pSurface, true); if (const auto PWINDOW = getWindowFromSurface(pSurface); PWINDOW) - Debug::log(LOG, "Set keyboard focus to surface %x, with window name: %s", pSurface, PWINDOW->m_szTitle.c_str()); + Debug::log(LOG, "Set keyboard focus to surface %x, with window name: %s (%dx%d)", pSurface, PWINDOW->m_szTitle.c_str(), pSurface->current.width, pSurface->current.height); else - Debug::log(LOG, "Set keyboard focus to surface %x", pSurface); + Debug::log(LOG, "Set keyboard focus to surface %x (%dx%d)", pSurface, pSurface->current.width, pSurface->current.height); } bool CCompositor::windowValidMapped(CWindow* pWindow) { |
