From 6e16627cbcb5d4712195c97e106f2198076c8aff Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sun, 19 Feb 2023 13:59:39 +0000 Subject: [PATCH] Added execr --- src/managers/KeybindManager.cpp | 33 +++++++----- src/managers/KeybindManager.hpp | 92 +++++++++++++++++---------------- 2 files changed, 67 insertions(+), 58 deletions(-) diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 1965c935..ef988c32 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -15,6 +15,7 @@ CKeybindManager::CKeybindManager() { // initialize all dispatchers m_mDispatchers["exec"] = spawn; + m_mDispatchers["execr"] = spawnRaw; m_mDispatchers["killactive"] = killActive; m_mDispatchers["closewindow"] = kill; m_mDispatchers["togglefloating"] = toggleActiveFloating; @@ -530,6 +531,20 @@ void CKeybindManager::spawn(std::string args) { else args = "WAYLAND_DISPLAY=" + std::string(g_pCompositor->m_szWLDisplaySocket) + " " + args; + const uint64_t PROC = spawnRaw(args); + + if (!RULES.empty()) { + const auto RULESLIST = CVarList(RULES, 0, ';'); + + for (auto& r : RULESLIST) { + g_pConfigManager->addExecRule({r, (unsigned long)PROC}); + } + + Debug::log(LOG, "Applied %i rule arguments for exec.", RULESLIST.size()); + } +} + +uint64_t CKeybindManager::spawnRaw(std::string args) { Debug::log(LOG, "Executing %s", args.c_str()); int socket[2]; @@ -543,7 +558,7 @@ void CKeybindManager::spawn(std::string args) { close(socket[0]); close(socket[1]); Debug::log(LOG, "Fail to create the first fork"); - return; + return 0; } if (child == 0) { // run in child @@ -575,20 +590,12 @@ void CKeybindManager::spawn(std::string args) { waitpid(child, NULL, 0); if (child < 0) { Debug::log(LOG, "Fail to create the second fork"); - return; + return 0; } Debug::log(LOG, "Process Created with pid %d", grandchild); - if (!RULES.empty()) { - const auto RULESLIST = CVarList(RULES, 0, ';'); - - for (auto& r : RULESLIST) { - g_pConfigManager->addExecRule({r, (unsigned long)grandchild}); - } - - Debug::log(LOG, "Applied %i rule arguments for exec.", RULESLIST.size()); - } + return grandchild; } void CKeybindManager::killActive(std::string args) { @@ -1158,8 +1165,8 @@ void CKeybindManager::focusUrgentOrLast(std::string args) { } void CKeybindManager::focusCurrentOrLast(std::string args) { - const auto PWINDOWPREV = g_pCompositor->m_pLastWindow ? (g_pCompositor->m_vWindowFocusHistory.size() < 2 ? nullptr : g_pCompositor->m_vWindowFocusHistory[1]) : - (g_pCompositor->m_vWindowFocusHistory.empty() ? nullptr : g_pCompositor->m_vWindowFocusHistory[0]); + const auto PWINDOWPREV = g_pCompositor->m_pLastWindow ? (g_pCompositor->m_vWindowFocusHistory.size() < 2 ? nullptr : g_pCompositor->m_vWindowFocusHistory[1]) : + (g_pCompositor->m_vWindowFocusHistory.empty() ? nullptr : g_pCompositor->m_vWindowFocusHistory[0]); if (!PWINDOWPREV) return; diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp index 1c910873..6e31ccd9 100644 --- a/src/managers/KeybindManager.hpp +++ b/src/managers/KeybindManager.hpp @@ -25,7 +25,8 @@ struct SKeybind { bool shadowed = false; }; -enum eFocusWindowMode { +enum eFocusWindowMode +{ MODE_CLASS_REGEX = 0, MODE_TITLE_REGEX, MODE_ADDRESS, @@ -87,50 +88,51 @@ class CKeybindManager { bool ensureMouseBindState(); // -------------- Dispatchers -------------- // - static void killActive(std::string); - static void kill(std::string); - static void spawn(std::string); - static void toggleActiveFloating(std::string); - static void toggleActivePseudo(std::string); - static void changeworkspace(std::string); - static void fullscreenActive(std::string); - static void fakeFullscreenActive(std::string); - static void moveActiveToWorkspace(std::string); - static void moveActiveToWorkspaceSilent(std::string); - static void moveFocusTo(std::string); - static void focusUrgentOrLast(std::string); - static void focusCurrentOrLast(std::string); - static void centerWindow(std::string); - static void moveActiveTo(std::string); - static void toggleGroup(std::string); - static void changeGroupActive(std::string); - static void alterSplitRatio(std::string); - static void focusMonitor(std::string); - static void toggleSplit(std::string); - static void moveCursorToCorner(std::string); - static void workspaceOpt(std::string); - static void renameWorkspace(std::string); - static void exitHyprland(std::string); - static void moveCurrentWorkspaceToMonitor(std::string); - static void moveWorkspaceToMonitor(std::string); - static void toggleSpecialWorkspace(std::string); - static void forceRendererReload(std::string); - static void resizeActive(std::string); - static void moveActive(std::string); - static void moveWindow(std::string); - static void resizeWindow(std::string); - static void circleNext(std::string); - static void focusWindow(std::string); - static void setSubmap(std::string); - static void pass(std::string); - static void layoutmsg(std::string); - static void toggleOpaque(std::string); - static void dpms(std::string); - static void swapnext(std::string); - static void swapActiveWorkspaces(std::string); - static void pinActive(std::string); - static void mouse(std::string); - static void bringActiveToTop(std::string); + static void killActive(std::string); + static void kill(std::string); + static void spawn(std::string); + static uint64_t spawnRaw(std::string); + static void toggleActiveFloating(std::string); + static void toggleActivePseudo(std::string); + static void changeworkspace(std::string); + static void fullscreenActive(std::string); + static void fakeFullscreenActive(std::string); + static void moveActiveToWorkspace(std::string); + static void moveActiveToWorkspaceSilent(std::string); + static void moveFocusTo(std::string); + static void focusUrgentOrLast(std::string); + static void focusCurrentOrLast(std::string); + static void centerWindow(std::string); + static void moveActiveTo(std::string); + static void toggleGroup(std::string); + static void changeGroupActive(std::string); + static void alterSplitRatio(std::string); + static void focusMonitor(std::string); + static void toggleSplit(std::string); + static void moveCursorToCorner(std::string); + static void workspaceOpt(std::string); + static void renameWorkspace(std::string); + static void exitHyprland(std::string); + static void moveCurrentWorkspaceToMonitor(std::string); + static void moveWorkspaceToMonitor(std::string); + static void toggleSpecialWorkspace(std::string); + static void forceRendererReload(std::string); + static void resizeActive(std::string); + static void moveActive(std::string); + static void moveWindow(std::string); + static void resizeWindow(std::string); + static void circleNext(std::string); + static void focusWindow(std::string); + static void setSubmap(std::string); + static void pass(std::string); + static void layoutmsg(std::string); + static void toggleOpaque(std::string); + static void dpms(std::string); + static void swapnext(std::string); + static void swapActiveWorkspaces(std::string); + static void pinActive(std::string); + static void mouse(std::string); + static void bringActiveToTop(std::string); friend class CCompositor; friend class CInputManager;