Skip to content

Commit

Permalink
input: track exclusive LSes
Browse files Browse the repository at this point in the history
ref #4465
  • Loading branch information
vaxerski committed Jan 19, 2024
1 parent 5eeec88 commit 17339e0
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 13 deletions.
5 changes: 5 additions & 0 deletions src/Compositor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
8 changes: 8 additions & 0 deletions src/events/Layers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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.");

Expand Down
29 changes: 16 additions & 13 deletions src/managers/input/InputManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down

0 comments on commit 17339e0

Please sign in to comment.