From e69bc5b87042b27e4f29601346ddbcac364d38cf Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Sun, 21 Apr 2024 17:19:59 +0300 Subject: [PATCH] config: Expand on window matching (#5518) * Expand on window matching * Requested changes --- src/Compositor.cpp | 27 +++++++++++++++++++++++++-- src/managers/KeybindManager.hpp | 5 ++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 157a70d6..824d7335 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -2410,13 +2410,24 @@ void CCompositor::scheduleFrameForMonitor(CMonitor* pMonitor) { } CWindow* CCompositor::getWindowByRegex(const std::string& regexp) { + if (regexp.starts_with("active")) + return m_pLastWindow; + eFocusWindowMode mode = MODE_CLASS_REGEX; std::regex regexCheck(regexp); std::string matchCheck; - if (regexp.starts_with("title:")) { + if (regexp.starts_with("class:")) { + regexCheck = std::regex(regexp.substr(6)); + } else if (regexp.starts_with("initialclass:")) { + mode = MODE_INITIAL_CLASS_REGEX; + regexCheck = std::regex(regexp.substr(13)); + } else if (regexp.starts_with("title:")) { mode = MODE_TITLE_REGEX; regexCheck = std::regex(regexp.substr(6)); + } else if (regexp.starts_with("initialtitle:")) { + mode = MODE_INITIAL_TITLE_REGEX; + regexCheck = std::regex(regexp.substr(13)); } else if (regexp.starts_with("address:")) { mode = MODE_ADDRESS; matchCheck = regexp.substr(8); @@ -2447,7 +2458,13 @@ CWindow* CCompositor::getWindowByRegex(const std::string& regexp) { switch (mode) { case MODE_CLASS_REGEX: { const auto windowClass = g_pXWaylandManager->getAppIDClass(w.get()); - if (!std::regex_search(g_pXWaylandManager->getAppIDClass(w.get()), regexCheck)) + if (!std::regex_search(windowClass, regexCheck)) + continue; + break; + } + case MODE_INITIAL_CLASS_REGEX: { + const auto initialWindowClass = w->m_szInitialClass; + if (!std::regex_search(initialWindowClass, regexCheck)) continue; break; } @@ -2457,6 +2474,12 @@ CWindow* CCompositor::getWindowByRegex(const std::string& regexp) { continue; break; } + case MODE_INITIAL_TITLE_REGEX: { + const auto initialWindowTitle = w->m_szInitialTitle; + if (!std::regex_search(initialWindowTitle, regexCheck)) + continue; + break; + } case MODE_ADDRESS: { std::string addr = std::format("0x{:x}", (uintptr_t)w.get()); if (matchCheck != addr) diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp index aec9e02d..450960f5 100644 --- a/src/managers/KeybindManager.hpp +++ b/src/managers/KeybindManager.hpp @@ -32,9 +32,12 @@ struct SKeybind { enum eFocusWindowMode { MODE_CLASS_REGEX = 0, + MODE_INITIAL_CLASS_REGEX, MODE_TITLE_REGEX, + MODE_INITIAL_TITLE_REGEX, MODE_ADDRESS, - MODE_PID + MODE_PID, + MODE_ACTIVE_WINDOW }; struct SPressedKeyWithMods {