diff --git a/src/Window.hpp b/src/Window.hpp index 0ee164dc..b4f6e59b 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -21,6 +21,7 @@ struct SWindowAdditionalConfigData { int rounding = -1; // -1 means no bool forceNoBlur = false; bool forceOpaque = false; + bool forceAllowsInput = false; }; class CWindow { diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 9d8a1110..460d024f 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -742,6 +742,7 @@ void CConfigManager::handleWindowRule(const std::string& command, const std::str && RULE != "noblur" && RULE != "center" && RULE != "opaque" + && RULE != "forceinput" && RULE != "fullscreen" && RULE.find("animation") != 0 && RULE.find("rounding") != 0 diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 63028c91..93ad18e5 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -159,6 +159,8 @@ void Events::listener_mapWindow(void* owner, void* data) { requestsFullscreen = true; } else if (r.szRule == "opaque") { PWINDOW->m_sAdditionalConfigData.forceOpaque = true; + } else if (r.szRule == "forceinput") { + PWINDOW->m_sAdditionalConfigData.forceAllowsInput = true; } else if (r.szRule.find("rounding") == 0) { try { PWINDOW->m_sAdditionalConfigData.rounding = std::stoi(r.szRule.substr(r.szRule.find_first_of(' ') + 1)); @@ -271,6 +273,12 @@ void Events::listener_mapWindow(void* owner, void* data) { const auto PFOCUSEDWINDOWPREV = g_pCompositor->m_pLastWindow; + if (PWINDOW->m_sAdditionalConfigData.forceAllowsInput) { + PWINDOW->m_bNoFocus = false; + PWINDOW->m_bNoInitialFocus = false; + PWINDOW->m_bX11ShouldntFocus = false; + } + if (!PWINDOW->m_bNoFocus && !PWINDOW->m_bNoInitialFocus && PWINDOW->m_iX11Type != 2) { g_pCompositor->focusWindow(PWINDOW); PWINDOW->m_fActiveInactiveAlpha.setValueAndWarp(*PACTIVEALPHA);