diff --git a/src/KeybindManager.cpp b/src/KeybindManager.cpp index 443c639..6ba09dc 100644 --- a/src/KeybindManager.cpp +++ b/src/KeybindManager.cpp @@ -1,6 +1,7 @@ #include "KeybindManager.hpp" #include "utilities/Util.hpp" #include "events/events.hpp" +#include "windowManager.hpp" #include #include @@ -157,11 +158,15 @@ void KeybindManager::changeworkspace(std::string arg) { if (ID != -1) { Debug::log(LOG, "Changing the current workspace to " + std::to_string(ID)); - g_pWindowManager->changeWorkspaceByID(ID); } } +void KeybindManager::changetolastworkspace(std::string arg) { + Debug::log(LOG, "Changing the current workspace to the last workspace"); + g_pWindowManager->changeToLastWorkspace(); +} + void KeybindManager::toggleActiveWindowFullscreen(std::string unusedArg) { g_pWindowManager->toggleWindowFullscrenn(g_pWindowManager->LastWindow); } @@ -206,4 +211,4 @@ void KeybindManager::toggleActiveWindowFloating(std::string unusedArg) { g_pWindowManager->setAllFloatingWindowsTop(); } -} \ No newline at end of file +} diff --git a/src/KeybindManager.hpp b/src/KeybindManager.hpp index eb0948a..08834c0 100644 --- a/src/KeybindManager.hpp +++ b/src/KeybindManager.hpp @@ -23,7 +23,8 @@ namespace KeybindManager { void movewindow(std::string args); void movefocus(std::string args); void changeworkspace(std::string args); + void changetolastworkspace(std::string args); void toggleActiveWindowFullscreen(std::string args); void toggleActiveWindowFloating(std::string args); void movetoworkspace(std::string args); -}; \ No newline at end of file +}; diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 43700b4..6094bc2 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -119,6 +119,7 @@ void handleBind(const std::string& command, const std::string& value) { if (HANDLER == "movefocus") dispatcher = KeybindManager::movefocus; if (HANDLER == "movetoworkspace") dispatcher = KeybindManager::movetoworkspace; if (HANDLER == "workspace") dispatcher = KeybindManager::changeworkspace; + if (HANDLER == "lastworkspace") dispatcher = KeybindManager::changetolastworkspace; if (HANDLER == "togglefloating") dispatcher = KeybindManager::toggleActiveWindowFloating; if (dispatcher && KEY != 0) @@ -543,4 +544,4 @@ std::vector ConfigManager::getMatchingRules(xcb_window_t w) { } return returns; -} \ No newline at end of file +} diff --git a/src/windowManager.cpp b/src/windowManager.cpp index 479b0ec..4cb64fd 100644 --- a/src/windowManager.cpp +++ b/src/windowManager.cpp @@ -1617,6 +1617,7 @@ void CWindowManager::changeWorkspaceByID(int ID) { // save old workspace for anim auto OLDWORKSPACE = activeWorkspaces[MONITOR->ID]; + lastActiveWorkspaceID = OLDWORKSPACE; for (auto& workspace : workspaces) { if (workspace.getID() == ID) { @@ -1669,6 +1670,10 @@ void CWindowManager::changeWorkspaceByID(int ID) { // no need for the new dirty, it's empty } +void CWindowManager::changeToLastWorkspace() { + changeWorkspaceByID(lastActiveWorkspaceID); +} + void CWindowManager::focusOnWorkspace(const int& work) { const auto PWORKSPACE = getWorkspaceByID(work); const auto PMONITOR = getMonitorFromWorkspace(work); diff --git a/src/windowManager.hpp b/src/windowManager.hpp index 3398b1b..4fd7fa4 100644 --- a/src/windowManager.hpp +++ b/src/windowManager.hpp @@ -47,6 +47,7 @@ public: std::deque workspaces; std::deque activeWorkspaces; + int lastActiveWorkspaceID = 1; // Pipes SIPCPipe m_sIPCBarPipeIn = {ISDEBUG ? "/tmp/hypr/hyprbarind" : "/tmp/hypr/hyprbarin", 0}; @@ -90,6 +91,7 @@ public: void recalcAllDocks(); void changeWorkspaceByID(int); + void changeToLastWorkspace(); void setAllWorkspaceWindowsDirtyByID(int); int getHighestWorkspaceID(); CWorkspace* getWorkspaceByID(int);