aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorvaxerski <[email protected]>2024-01-19 16:45:34 +0100
committervaxerski <[email protected]>2024-01-19 16:45:34 +0100
commit17339e0ae9ad01dcfdede76e8dfaf516a8cbb924 (patch)
tree70b46f5cebf550f48bf79e8b29470404e0d545c6
parent5eeec8860e2dc8ff80dda26243778b5ecc923ca2 (diff)
downloadHyprland-17339e0ae9ad01dcfdede76e8dfaf516a8cbb924.tar.gz
Hyprland-17339e0ae9ad01dcfdede76e8dfaf516a8cbb924.zip
input: track exclusive LSes
ref #4465
-rw-r--r--src/Compositor.cpp5
-rw-r--r--src/events/Layers.cpp8
-rw-r--r--src/managers/input/InputManager.hpp29
3 files changed, 29 insertions, 13 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index c6ac224a..085590b9 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -948,6 +948,11 @@ void CCompositor::focusWindow(CWindow* pWindow, wlr_surface* pSurface) {
return;
}
+ if (!g_pInputManager->m_dExclusiveLSes.empty()) {
+ Debug::log(LOG, "Refusing a keyboard focus to a window because of an exclusive ls");
+ return;
+ }
+
g_pLayoutManager->getCurrentLayout()->bringWindowToTop(pWindow);
if (!pWindow || !windowValidMapped(pWindow)) {
diff --git a/src/events/Layers.cpp b/src/events/Layers.cpp
index d6e21d9d..9ef9b025 100644
--- a/src/events/Layers.cpp
+++ b/src/events/Layers.cpp
@@ -142,6 +142,9 @@ void Events::listener_mapLayerSurface(void* owner, void* data) {
wlr_surface_send_enter(layersurface->layerSurface->surface, layersurface->layerSurface->output);
+ if (layersurface->layerSurface->current.keyboard_interactive == ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE)
+ g_pInputManager->m_dExclusiveLSes.push_back(layersurface);
+
const bool GRABSFOCUS = layersurface->layerSurface->current.keyboard_interactive != ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_NONE &&
// don't focus if constrained
(!g_pCompositor->m_sSeat.mouse || !g_pCompositor->m_sSeat.mouse->currentConstraint);
@@ -183,6 +186,11 @@ void Events::listener_unmapLayerSurface(void* owner, void* data) {
g_pEventManager->postEvent(SHyprIPCEvent{"closelayer", std::string(layersurface->layerSurface->_namespace ? layersurface->layerSurface->_namespace : "")});
EMIT_HOOK_EVENT("closeLayer", layersurface);
+ std::erase(g_pInputManager->m_dExclusiveLSes, layersurface);
+
+ if (!g_pInputManager->m_dExclusiveLSes.empty())
+ g_pCompositor->focusSurface(g_pInputManager->m_dExclusiveLSes[0]->layerSurface->surface);
+
if (!g_pCompositor->getMonitorFromID(layersurface->monitorID) || g_pCompositor->m_bUnsafeState) {
Debug::log(WARN, "Layersurface unmapping on invalid monitor (removed?) ignoring.");
diff --git a/src/managers/input/InputManager.hpp b/src/managers/input/InputManager.hpp
index eec45eff..e32e27f8 100644
--- a/src/managers/input/InputManager.hpp
+++ b/src/managers/input/InputManager.hpp
@@ -142,25 +142,28 @@ class CInputManager {
// Switches
std::list<SSwitchDevice> m_lSwitches;
- void newTabletTool(wlr_input_device*);
- void newTabletPad(wlr_input_device*);
- void focusTablet(STablet*, wlr_tablet_tool*, bool motion = false);
- void newIdleInhibitor(wlr_idle_inhibitor_v1*);
- void recheckIdleInhibitorStatus();
+ // Exclusive layer surfaces
+ std::deque<SLayerSurface*> m_dExclusiveLSes;
- void onSwipeBegin(wlr_pointer_swipe_begin_event*);
- void onSwipeEnd(wlr_pointer_swipe_end_event*);
- void onSwipeUpdate(wlr_pointer_swipe_update_event*);
+ void newTabletTool(wlr_input_device*);
+ void newTabletPad(wlr_input_device*);
+ void focusTablet(STablet*, wlr_tablet_tool*, bool motion = false);
+ void newIdleInhibitor(wlr_idle_inhibitor_v1*);
+ void recheckIdleInhibitorStatus();
- SSwipeGesture m_sActiveSwipe;
+ void onSwipeBegin(wlr_pointer_swipe_begin_event*);
+ void onSwipeEnd(wlr_pointer_swipe_end_event*);
+ void onSwipeUpdate(wlr_pointer_swipe_update_event*);
- SKeyboard* m_pActiveKeyboard = nullptr;
+ SSwipeGesture m_sActiveSwipe;
- CTimer m_tmrLastCursorMovement;
+ SKeyboard* m_pActiveKeyboard = nullptr;
- CInputMethodRelay m_sIMERelay;
+ CTimer m_tmrLastCursorMovement;
- void updateKeyboardsLeds(wlr_input_device* pKeyboard);
+ CInputMethodRelay m_sIMERelay;
+
+ void updateKeyboardsLeds(wlr_input_device* pKeyboard);
// for shared mods
uint32_t accumulateModsFromAllKBs();