summaryrefslogtreecommitdiff
path: root/src/managers/KeybindManager.cpp
diff options
context:
space:
mode:
authorvirchau13 <virchau13@hexular.net>2024-01-15 23:30:46 +0800
committerGitHub <noreply@github.com>2024-01-15 16:30:46 +0100
commit3c964a9fdc220250a85b1c498e5b6fad9390272f (patch)
tree7bd1b78108c75497244e53c6d8df674866cf4f39 /src/managers/KeybindManager.cpp
parentf14c5ea5c56858260c1133d8003fc5961ace373d (diff)
keybinds: Add dispatcher for xmonad/qtile-style workspace switching (#4439)
* feat: implement xmonad/qtile-style workspace switching Implements the focusWorkspaceOnCurrentMonitor dispatcher and function, which implements XMonad/Qtile-style workspace switching. When called, focusWorkspaceOnCurrentMonitor will: 1. Send the requested workspace to the current monitor, 2. If the workspace was previously active on a different monitor, replace it with the workspace that was previously active on the current monitor, 3. Focus the workspace on the current monitor. * fix: address PR comments
Diffstat (limited to 'src/managers/KeybindManager.cpp')
-rw-r--r--src/managers/KeybindManager.cpp159
1 files changed, 101 insertions, 58 deletions
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index 6a7366e3..1fc8a679 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -19,64 +19,65 @@
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;
- m_mDispatchers["workspace"] = changeworkspace;
- m_mDispatchers["renameworkspace"] = renameWorkspace;
- m_mDispatchers["fullscreen"] = fullscreenActive;
- m_mDispatchers["fakefullscreen"] = fakeFullscreenActive;
- m_mDispatchers["movetoworkspace"] = moveActiveToWorkspace;
- m_mDispatchers["movetoworkspacesilent"] = moveActiveToWorkspaceSilent;
- m_mDispatchers["pseudo"] = toggleActivePseudo;
- m_mDispatchers["movefocus"] = moveFocusTo;
- m_mDispatchers["movewindow"] = moveActiveTo;
- m_mDispatchers["swapwindow"] = swapActive;
- m_mDispatchers["centerwindow"] = centerWindow;
- m_mDispatchers["togglegroup"] = toggleGroup;
- m_mDispatchers["changegroupactive"] = changeGroupActive;
- m_mDispatchers["movegroupwindow"] = moveGroupWindow;
- m_mDispatchers["togglesplit"] = toggleSplit;
- m_mDispatchers["splitratio"] = alterSplitRatio;
- m_mDispatchers["focusmonitor"] = focusMonitor;
- m_mDispatchers["movecursortocorner"] = moveCursorToCorner;
- m_mDispatchers["movecursor"] = moveCursor;
- m_mDispatchers["workspaceopt"] = workspaceOpt;
- m_mDispatchers["exit"] = exitHyprland;
- m_mDispatchers["movecurrentworkspacetomonitor"] = moveCurrentWorkspaceToMonitor;
- m_mDispatchers["moveworkspacetomonitor"] = moveWorkspaceToMonitor;
- m_mDispatchers["togglespecialworkspace"] = toggleSpecialWorkspace;
- m_mDispatchers["forcerendererreload"] = forceRendererReload;
- m_mDispatchers["resizeactive"] = resizeActive;
- m_mDispatchers["moveactive"] = moveActive;
- m_mDispatchers["cyclenext"] = circleNext;
- m_mDispatchers["focuswindowbyclass"] = focusWindow;
- m_mDispatchers["focuswindow"] = focusWindow;
- m_mDispatchers["submap"] = setSubmap;
- m_mDispatchers["pass"] = pass;
- m_mDispatchers["layoutmsg"] = layoutmsg;
- m_mDispatchers["toggleopaque"] = toggleOpaque;
- m_mDispatchers["dpms"] = dpms;
- m_mDispatchers["movewindowpixel"] = moveWindow;
- m_mDispatchers["resizewindowpixel"] = resizeWindow;
- m_mDispatchers["swapnext"] = swapnext;
- m_mDispatchers["swapactiveworkspaces"] = swapActiveWorkspaces;
- m_mDispatchers["pin"] = pinActive;
- m_mDispatchers["mouse"] = mouse;
- m_mDispatchers["bringactivetotop"] = bringActiveToTop;
- m_mDispatchers["alterzorder"] = alterZOrder;
- m_mDispatchers["focusurgentorlast"] = focusUrgentOrLast;
- m_mDispatchers["focuscurrentorlast"] = focusCurrentOrLast;
- m_mDispatchers["lockgroups"] = lockGroups;
- m_mDispatchers["lockactivegroup"] = lockActiveGroup;
- m_mDispatchers["moveintogroup"] = moveIntoGroup;
- m_mDispatchers["moveoutofgroup"] = moveOutOfGroup;
- m_mDispatchers["movewindoworgroup"] = moveWindowOrGroup;
- m_mDispatchers["setignoregrouplock"] = setIgnoreGroupLock;
- m_mDispatchers["denywindowfromgroup"] = denyWindowFromGroup;
- m_mDispatchers["global"] = global;
+ m_mDispatchers["exec"] = spawn;
+ m_mDispatchers["execr"] = spawnRaw;
+ m_mDispatchers["killactive"] = killActive;
+ m_mDispatchers["closewindow"] = kill;
+ m_mDispatchers["togglefloating"] = toggleActiveFloating;
+ m_mDispatchers["workspace"] = changeworkspace;
+ m_mDispatchers["renameworkspace"] = renameWorkspace;
+ m_mDispatchers["fullscreen"] = fullscreenActive;
+ m_mDispatchers["fakefullscreen"] = fakeFullscreenActive;
+ m_mDispatchers["movetoworkspace"] = moveActiveToWorkspace;
+ m_mDispatchers["movetoworkspacesilent"] = moveActiveToWorkspaceSilent;
+ m_mDispatchers["pseudo"] = toggleActivePseudo;
+ m_mDispatchers["movefocus"] = moveFocusTo;
+ m_mDispatchers["movewindow"] = moveActiveTo;
+ m_mDispatchers["swapwindow"] = swapActive;
+ m_mDispatchers["centerwindow"] = centerWindow;
+ m_mDispatchers["togglegroup"] = toggleGroup;
+ m_mDispatchers["changegroupactive"] = changeGroupActive;
+ m_mDispatchers["movegroupwindow"] = moveGroupWindow;
+ m_mDispatchers["togglesplit"] = toggleSplit;
+ m_mDispatchers["splitratio"] = alterSplitRatio;
+ m_mDispatchers["focusmonitor"] = focusMonitor;
+ m_mDispatchers["movecursortocorner"] = moveCursorToCorner;
+ m_mDispatchers["movecursor"] = moveCursor;
+ m_mDispatchers["workspaceopt"] = workspaceOpt;
+ m_mDispatchers["exit"] = exitHyprland;
+ m_mDispatchers["movecurrentworkspacetomonitor"] = moveCurrentWorkspaceToMonitor;
+ m_mDispatchers["focusworkspaceoncurrentmonitor"] = focusWorkspaceOnCurrentMonitor;
+ m_mDispatchers["moveworkspacetomonitor"] = moveWorkspaceToMonitor;
+ m_mDispatchers["togglespecialworkspace"] = toggleSpecialWorkspace;
+ m_mDispatchers["forcerendererreload"] = forceRendererReload;
+ m_mDispatchers["resizeactive"] = resizeActive;
+ m_mDispatchers["moveactive"] = moveActive;
+ m_mDispatchers["cyclenext"] = circleNext;
+ m_mDispatchers["focuswindowbyclass"] = focusWindow;
+ m_mDispatchers["focuswindow"] = focusWindow;
+ m_mDispatchers["submap"] = setSubmap;
+ m_mDispatchers["pass"] = pass;
+ m_mDispatchers["layoutmsg"] = layoutmsg;
+ m_mDispatchers["toggleopaque"] = toggleOpaque;
+ m_mDispatchers["dpms"] = dpms;
+ m_mDispatchers["movewindowpixel"] = moveWindow;
+ m_mDispatchers["resizewindowpixel"] = resizeWindow;
+ m_mDispatchers["swapnext"] = swapnext;
+ m_mDispatchers["swapactiveworkspaces"] = swapActiveWorkspaces;
+ m_mDispatchers["pin"] = pinActive;
+ m_mDispatchers["mouse"] = mouse;
+ m_mDispatchers["bringactivetotop"] = bringActiveToTop;
+ m_mDispatchers["alterzorder"] = alterZOrder;
+ m_mDispatchers["focusurgentorlast"] = focusUrgentOrLast;
+ m_mDispatchers["focuscurrentorlast"] = focusCurrentOrLast;
+ m_mDispatchers["lockgroups"] = lockGroups;
+ m_mDispatchers["lockactivegroup"] = lockActiveGroup;
+ m_mDispatchers["moveintogroup"] = moveIntoGroup;
+ m_mDispatchers["moveoutofgroup"] = moveOutOfGroup;
+ m_mDispatchers["movewindoworgroup"] = moveWindowOrGroup;
+ m_mDispatchers["setignoregrouplock"] = setIgnoreGroupLock;
+ m_mDispatchers["denywindowfromgroup"] = denyWindowFromGroup;
+ m_mDispatchers["global"] = global;
m_tScrollTimer.reset();
@@ -1504,6 +1505,48 @@ void CKeybindManager::moveWorkspaceToMonitor(std::string args) {
g_pCompositor->moveWorkspaceToMonitor(PWORKSPACE, PMONITOR);
}
+void CKeybindManager::focusWorkspaceOnCurrentMonitor(std::string args) {
+ std::string workspaceName;
+ const int WORKSPACEID = getWorkspaceIDFromString(args, workspaceName);
+
+ if (WORKSPACEID == WORKSPACE_INVALID) {
+ Debug::log(ERR, "focusWorkspaceOnCurrentMonitor invalid workspace!");
+ return;
+ }
+
+ const auto PCURRMONITOR = g_pCompositor->getMonitorFromCursor();
+
+ if (!PCURRMONITOR) {
+ Debug::log(ERR, "focusWorkspaceOnCurrentMonitor monitor doesn't exist!");
+ return;
+ }
+
+ auto PWORKSPACE = g_pCompositor->getWorkspaceByID(WORKSPACEID);
+
+ if (!PWORKSPACE) {
+ PWORKSPACE = g_pCompositor->createNewWorkspace(WORKSPACEID, PCURRMONITOR->ID);
+ // we can skip the moving, since it's already on the current monitor
+ changeworkspace(PWORKSPACE->getConfigName());
+ return;
+ }
+
+ if (PWORKSPACE->m_iMonitorID != PCURRMONITOR->ID) {
+ const auto POLDMONITOR = g_pCompositor->getMonitorFromID(PWORKSPACE->m_iMonitorID);
+ if (!POLDMONITOR) { // wat
+ Debug::log(ERR, "focusWorkspaceOnCurrentMonitor old monitor doesn't exist!");
+ return;
+ }
+ if (POLDMONITOR->activeWorkspace == WORKSPACEID) {
+ g_pCompositor->swapActiveWorkspaces(POLDMONITOR, PCURRMONITOR);
+ return;
+ } else {
+ g_pCompositor->moveWorkspaceToMonitor(PWORKSPACE, PCURRMONITOR, true);
+ }
+ }
+
+ changeworkspace(PWORKSPACE->getConfigName());
+}
+
void CKeybindManager::toggleSpecialWorkspace(std::string args) {
static auto* const PFOLLOWMOUSE = &g_pConfigManager->getConfigValuePtr("input:follow_mouse")->intValue;