summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Gerblick <daniel.gerblick@gmail.com>2022-07-17 19:00:12 -0400
committerDaniel Gerblick <daniel.gerblick@gmail.com>2022-07-17 19:00:12 -0400
commitdc1f34c5fad7c4067808cfcff4d1fde74331de4c (patch)
tree1074d4290c116f8e9a572b8554f42a0c57af15b6 /src
parentafeb040684017dfb27ca3cb3823e41dd95310af1 (diff)
added PID and address-based options for focuswindow, as well as updated `hyprctl clients` to be consistent with logs and `hyprctl activewindow`
Diffstat (limited to 'src')
-rw-r--r--src/debug/HyprCtl.cpp4
-rw-r--r--src/managers/KeybindManager.cpp51
-rw-r--r--src/managers/KeybindManager.hpp9
3 files changed, 50 insertions, 14 deletions
diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp
index d4f0ae40..402df762 100644
--- a/src/debug/HyprCtl.cpp
+++ b/src/debug/HyprCtl.cpp
@@ -86,7 +86,7 @@ R"#({
"title": "%s",
"pid": %i
},)#",
- &w,
+ w.get(),
(int)w->m_vRealPosition.vec().x, (int)w->m_vRealPosition.vec().y,
(int)w->m_vRealSize.vec().x, (int)w->m_vRealSize.vec().y,
w->m_iWorkspaceID, (w->m_iWorkspaceID == -1 ? "" : g_pCompositor->getWorkspaceByID(w->m_iWorkspaceID) ? g_pCompositor->getWorkspaceByID(w->m_iWorkspaceID)->m_szName.c_str() : std::string("Invalid workspace " + std::to_string(w->m_iWorkspaceID)).c_str()),
@@ -107,7 +107,7 @@ R"#({
for (auto& w : g_pCompositor->m_vWindows) {
if (w->m_bIsMapped) {
result += getFormat("Window %x -> %s:\n\tat: %i,%i\n\tsize: %i,%i\n\tworkspace: %i (%s)\n\tfloating: %i\n\tmonitor: %i\n\tclass: %s\n\ttitle: %s\n\tpid: %i\n\n",
- &w, w->m_szTitle.c_str(), (int)w->m_vRealPosition.vec().x, (int)w->m_vRealPosition.vec().y, (int)w->m_vRealSize.vec().x, (int)w->m_vRealSize.vec().y, w->m_iWorkspaceID, (w->m_iWorkspaceID == -1 ? "" : g_pCompositor->getWorkspaceByID(w->m_iWorkspaceID) ? g_pCompositor->getWorkspaceByID(w->m_iWorkspaceID)->m_szName.c_str() : std::string("Invalid workspace " + std::to_string(w->m_iWorkspaceID)).c_str()), (int)w->m_bIsFloating, w->m_iMonitorID, g_pXWaylandManager->getAppIDClass(w.get()).c_str(), g_pXWaylandManager->getTitle(w.get()).c_str(), w->getPID());
+ w.get(), w->m_szTitle.c_str(), (int)w->m_vRealPosition.vec().x, (int)w->m_vRealPosition.vec().y, (int)w->m_vRealSize.vec().x, (int)w->m_vRealSize.vec().y, w->m_iWorkspaceID, (w->m_iWorkspaceID == -1 ? "" : g_pCompositor->getWorkspaceByID(w->m_iWorkspaceID) ? g_pCompositor->getWorkspaceByID(w->m_iWorkspaceID)->m_szName.c_str() : std::string("Invalid workspace " + std::to_string(w->m_iWorkspaceID)).c_str()), (int)w->m_bIsFloating, w->m_iMonitorID, g_pXWaylandManager->getAppIDClass(w.get()).c_str(), g_pXWaylandManager->getTitle(w.get()).c_str(), w->getPID());
}
}
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index 86fb2275..67e331b8 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -1063,28 +1063,57 @@ void CKeybindManager::circleNext(std::string arg) {
}
void CKeybindManager::focusWindow(std::string regexp) {
- bool titleRegex = false;
+ eFocusWindowMode mode = MODE_CLASS_REGEX;
+
std::regex regexCheck(regexp);
+ std::string matchCheck;
if (regexp.find("title:") == 0) {
- titleRegex = true;
+ mode = MODE_TITLE_REGEX;
regexCheck = std::regex(regexp.substr(6));
}
+ else if (regexp.find("address:") == 0) {
+ mode = MODE_ADDRESS;
+ matchCheck = regexp.substr(8);
+ }
+ else if (regexp.find("pid:") == 0) {
+ mode = MODE_PID;
+ matchCheck = regexp.substr(4);
+ }
for (auto& w : g_pCompositor->m_vWindows) {
if (!w->m_bIsMapped || w->m_bHidden)
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;
+ switch (mode) {
+ case MODE_CLASS_REGEX: {
+ const auto windowClass = g_pXWaylandManager->getAppIDClass(w.get());
+ if (!std::regex_search(g_pXWaylandManager->getAppIDClass(w.get()), regexCheck))
+ continue;
+ break;
+ }
+ case MODE_TITLE_REGEX: {
+ const auto windowTitle = g_pXWaylandManager->getTitle(w.get());
+ if (!std::regex_search(windowTitle, regexCheck))
+ continue;
+ break;
+ }
+ case MODE_ADDRESS: {
+ std::string addr = getFormat("0x%x", w.get());
+ if (matchCheck != addr)
+ continue;
+ break;
+ }
+ case MODE_PID: {
+ std::string pid = getFormat("%d", w->getPID());
+ if (matchCheck != pid)
+ continue;
+ break;
+ }
+ default:
+ break;
}
+
Debug::log(LOG, "Focusing to window name: %s", w->m_szTitle.c_str());
changeworkspace("[internal]" + std::to_string(w->m_iWorkspaceID));
diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp
index 08a1cba3..3aece7be 100644
--- a/src/managers/KeybindManager.hpp
+++ b/src/managers/KeybindManager.hpp
@@ -66,6 +66,13 @@ private:
static void setSubmap(std::string);
friend class CCompositor;
+
+ enum eFocusWindowMode {
+ MODE_CLASS_REGEX = 0,
+ MODE_TITLE_REGEX,
+ MODE_ADDRESS,
+ MODE_PID
+ };
};
-inline std::unique_ptr<CKeybindManager> g_pKeybindManager; \ No newline at end of file
+inline std::unique_ptr<CKeybindManager> g_pKeybindManager;