diff --git a/src/desktop/LayerSurface.cpp b/src/desktop/LayerSurface.cpp index 83b0992f2..2252adca4 100644 --- a/src/desktop/LayerSurface.cpp +++ b/src/desktop/LayerSurface.cpp @@ -212,8 +212,11 @@ void CLayerSurface::onUnmap() { return; // refocus if needed - if (WASLASTFOCUS) + // vvvvvvvvvvvvv if there is a last focus and the last focus is not keyboard focusable, fallback to window + if (WASLASTFOCUS || (g_pCompositor->m_pLastFocus && !g_pCompositor->m_pLastFocus->hlSurface->keyboardFocusable())) g_pInputManager->refocusLastWindow(PMONITOR); + else if (g_pCompositor->m_pLastFocus) + g_pSeatManager->setKeyboardFocus(g_pCompositor->m_pLastFocus.lock()); CBox geomFixed = {geometry.x + PMONITOR->vecPosition.x, geometry.y + PMONITOR->vecPosition.y, geometry.width, geometry.height}; g_pHyprRenderer->damageBox(&geomFixed); diff --git a/src/desktop/WLSurface.cpp b/src/desktop/WLSurface.cpp index 909241451..e1348a90b 100644 --- a/src/desktop/WLSurface.cpp +++ b/src/desktop/WLSurface.cpp @@ -1,6 +1,7 @@ #include "WLSurface.hpp" #include "../Compositor.hpp" #include "../protocols/core/Compositor.hpp" +#include "../protocols/LayerShell.hpp" void CWLSurface::assign(SP pSurface) { m_pResource = pSurface; @@ -222,3 +223,11 @@ SP CWLSurface::fromResource(SP pSurface) { return nullptr; return pSurface->hlSurface.lock(); } + +bool CWLSurface::keyboardFocusable() const { + if (m_pWindowOwner || m_pPopupOwner || m_pSubsurfaceOwner) + return true; + if (m_pLayerOwner) + return m_pLayerOwner->layerSurface->current.interactivity != ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_NONE; + return false; +} diff --git a/src/desktop/WLSurface.hpp b/src/desktop/WLSurface.hpp index bb476e0f1..a962b882c 100644 --- a/src/desktop/WLSurface.hpp +++ b/src/desktop/WLSurface.hpp @@ -39,6 +39,7 @@ class CWLSurface { Vector2D getViewporterCorrectedSize() const; CRegion computeDamage() const; // logical coordinates. May be wrong if the surface is unassigned bool visible(); + bool keyboardFocusable() const; // getters for owners. PHLWINDOW getWindow() const;