From 2225dca57665059102cd0225b8843a1d90a4f076 Mon Sep 17 00:00:00 2001 From: Dakes Date: Fri, 1 Jul 2022 16:24:37 +0200 Subject: [PATCH] Add focusWindow dispatcher. Takes titles & classes Removed focusWindowByClass function, replaced with focusWindow. Either takes a class matching regex, or a title matching one, beginning with "title:" Kept the focuswindowbyclass dispatcher identifier to stay backwards compatible with existing configs. --- src/managers/KeybindManager.cpp | 26 +++++++++++++++++++------- src/managers/KeybindManager.hpp | 2 +- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index f5554f57..cb091c9f 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -30,7 +30,8 @@ CKeybindManager::CKeybindManager() { m_mDispatchers["resizeactive"] = resizeActive; m_mDispatchers["moveactive"] = moveActive; m_mDispatchers["cyclenext"] = circleNext; - m_mDispatchers["focuswindowbyclass"] = focusWindowByClass; + m_mDispatchers["focuswindowbyclass"] = focusWindow; + m_mDispatchers["focuswindow"] = focusWindow; m_mDispatchers["submap"] = setSubmap; } @@ -1017,17 +1018,28 @@ void CKeybindManager::circleNext(std::string) { wlr_cursor_warp(g_pCompositor->m_sWLRCursor, nullptr, MIDPOINT.x, MIDPOINT.y); } -void CKeybindManager::focusWindowByClass(std::string clazz) { - std::regex classCheck(clazz); +void CKeybindManager::focusWindow(std::string regexp) { + bool titleRegex = false; + std::regex regexCheck(regexp); + if (regexp.find("title:") == 0) { + titleRegex = true; + regexCheck = std::regex(regexp.substr(6)); + } for (auto& w : g_pCompositor->m_vWindows) { if (!w->m_bIsMapped || w->m_bHidden) continue; - const auto windowClass = g_pXWaylandManager->getAppIDClass(w.get()); - - if (!std::regex_search(windowClass, classCheck)) - continue; + if (titleRegex) { + const auto windowTitle = g_pXWaylandManager->getTitle(w.get()); + if (!std::regex_search(windowTitle, regexCheck)) + continue; + } + else { + const auto windowClass = g_pXWaylandManager->getAppIDClass(w.get()); + if (!std::regex_search(windowClass, regexCheck)) + continue; + } Debug::log(LOG, "Focusing to window name: %s", w->m_szTitle.c_str()); diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp index 117a5ec4..31498677 100644 --- a/src/managers/KeybindManager.hpp +++ b/src/managers/KeybindManager.hpp @@ -61,7 +61,7 @@ private: static void resizeActive(std::string); static void moveActive(std::string); static void circleNext(std::string); - static void focusWindowByClass(std::string); + static void focusWindow(std::string); static void setSubmap(std::string); friend class CCompositor;