summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexander <51529891+Truenya@users.noreply.github.com>2025-01-11 19:05:53 +0300
committerGitHub <noreply@github.com>2025-01-11 16:05:53 +0000
commit15dc024a398d35957ccfb50ddade5f456a1646b5 (patch)
treedcc4644a49bcf8f3ae8d390526dffcf8b2dfd783 /src
parent3b85690aa6d9c14bb926692e25cc4480b85200ab (diff)
keybinds: fix previous_per_monitor logic (#9010)
Co-authored-by: Крылов Александр <aleksandr.krylov@hyperus.team>
Diffstat (limited to 'src')
-rw-r--r--src/desktop/Workspace.cpp10
-rw-r--r--src/desktop/Workspace.hpp22
-rw-r--r--src/helpers/MiscFunctions.cpp2
-rw-r--r--src/helpers/Monitor.cpp24
-rw-r--r--src/helpers/Monitor.hpp13
-rw-r--r--src/managers/KeybindManager.cpp33
6 files changed, 62 insertions, 42 deletions
diff --git a/src/desktop/Workspace.cpp b/src/desktop/Workspace.cpp
index 376288ed..07c1a435 100644
--- a/src/desktop/Workspace.cpp
+++ b/src/desktop/Workspace.cpp
@@ -52,10 +52,7 @@ void CWorkspace::init(PHLWORKSPACE self) {
EMIT_HOOK_EVENT("createWorkspace", this);
}
-SWorkspaceIDName CWorkspace::getPrevWorkspaceIDName(bool perMonitor) const {
- if (perMonitor)
- return m_sPrevWorkspacePerMonitor;
-
+SWorkspaceIDName CWorkspace::getPrevWorkspaceIDName() const {
return m_sPrevWorkspace;
}
@@ -216,10 +213,7 @@ void CWorkspace::rememberPrevWorkspace(const PHLWORKSPACE& prev) {
m_sPrevWorkspace.id = prev->m_iID;
m_sPrevWorkspace.name = prev->m_szName;
- if (prev->m_pMonitor == m_pMonitor) {
- m_sPrevWorkspacePerMonitor.id = prev->m_iID;
- m_sPrevWorkspacePerMonitor.name = prev->m_szName;
- }
+ prev->m_pMonitor->addPrevWorkspaceID(prev->m_iID);
}
std::string CWorkspace::getConfigName() {
diff --git a/src/desktop/Workspace.hpp b/src/desktop/Workspace.hpp
index f86dd656..e9859d4f 100644
--- a/src/desktop/Workspace.hpp
+++ b/src/desktop/Workspace.hpp
@@ -24,17 +24,14 @@ class CWorkspace {
// Workspaces ID-based have IDs > 0
// and workspaces name-based have IDs starting with -1337
- WORKSPACEID m_iID = WORKSPACE_INVALID;
- std::string m_szName = "";
- PHLMONITORREF m_pMonitor;
- // Previous workspace ID and name is stored during a workspace change, allowing travel
- // to the previous workspace.
- SWorkspaceIDName m_sPrevWorkspace, m_sPrevWorkspacePerMonitor;
+ WORKSPACEID m_iID = WORKSPACE_INVALID;
+ std::string m_szName = "";
+ PHLMONITORREF m_pMonitor;
- bool m_bHasFullscreenWindow = false;
- eFullscreenMode m_efFullscreenMode = FSMODE_NONE;
+ bool m_bHasFullscreenWindow = false;
+ eFullscreenMode m_efFullscreenMode = FSMODE_NONE;
- wl_array m_wlrCoordinateArr;
+ wl_array m_wlrCoordinateArr;
// for animations
PHLANIMVAR<Vector2D> m_vRenderOffset;
@@ -72,7 +69,7 @@ class CWorkspace {
std::string getConfigName();
bool matchesStaticSelector(const std::string& selector);
void markInert();
- SWorkspaceIDName getPrevWorkspaceIDName(bool perMonitor) const;
+ SWorkspaceIDName getPrevWorkspaceIDName() const;
void updateWindowDecos();
void updateWindowData();
int getWindows(std::optional<bool> onlyTiled = {}, std::optional<bool> onlyVisible = {});
@@ -88,7 +85,10 @@ class CWorkspace {
void updateWindows();
private:
- void init(PHLWORKSPACE self);
+ void init(PHLWORKSPACE self);
+ // Previous workspace ID and name is stored during a workspace change, allowing travel
+ // to the previous workspace.
+ SWorkspaceIDName m_sPrevWorkspace;
SP<HOOK_CALLBACK_FN> m_pFocusedWindowHook;
bool m_bInert = true;
diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp
index 08a1106a..0fa73e45 100644
--- a/src/helpers/MiscFunctions.cpp
+++ b/src/helpers/MiscFunctions.cpp
@@ -258,7 +258,7 @@ SWorkspaceIDName getWorkspaceIDNameFromString(const std::string& in) {
if (!valid(PWORKSPACE))
return {WORKSPACE_INVALID};
- const auto PLASTWORKSPACE = g_pCompositor->getWorkspaceByID(PWORKSPACE->m_sPrevWorkspace.id);
+ const auto PLASTWORKSPACE = g_pCompositor->getWorkspaceByID(PWORKSPACE->getPrevWorkspaceIDName().id);
if (!PLASTWORKSPACE)
return {WORKSPACE_INVALID};
diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp
index e833e661..cf62bc54 100644
--- a/src/helpers/Monitor.cpp
+++ b/src/helpers/Monitor.cpp
@@ -1,5 +1,6 @@
#include "Monitor.hpp"
#include "MiscFunctions.hpp"
+#include "macros.hpp"
#include "math/Math.hpp"
#include "sync/SyncReleaser.hpp"
#include "../Compositor.hpp"
@@ -1169,6 +1170,29 @@ void CMonitor::moveTo(const Vector2D& pos) {
vecPosition = pos;
}
+SWorkspaceIDName CMonitor::getPrevWorkspaceIDName(const WORKSPACEID id) {
+ while (!prevWorkSpaces.empty()) {
+ const int PREVID = prevWorkSpaces.top();
+ prevWorkSpaces.pop();
+ if (PREVID == id) // skip same workspace
+ continue;
+
+ // recheck if previous workspace's was moved to another monitor
+ const auto ws = g_pCompositor->getWorkspaceByID(PREVID);
+ if (ws && ws->monitorID() == ID)
+ return {.id = PREVID, .name = ws->m_szName};
+ }
+
+ return {.id = WORKSPACE_INVALID};
+}
+
+void CMonitor::addPrevWorkspaceID(const WORKSPACEID id) {
+ if (!prevWorkSpaces.empty() && prevWorkSpaces.top() == id)
+ return;
+
+ prevWorkSpaces.emplace(id);
+}
+
Vector2D CMonitor::middle() {
return vecPosition + vecSize / 2.f;
}
diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp
index b075df81..8085c460 100644
--- a/src/helpers/Monitor.hpp
+++ b/src/helpers/Monitor.hpp
@@ -1,7 +1,9 @@
#pragma once
#include "../defines.hpp"
+#include <stack>
#include <vector>
+#include "SharedDefs.hpp"
#include "WLClasses.hpp"
#include <vector>
#include <array>
@@ -196,11 +198,16 @@ class CMonitor {
return vecPosition == rhs.vecPosition && vecSize == rhs.vecSize && szName == rhs.szName;
}
+ // workspace previous per monitor functionality
+ SWorkspaceIDName getPrevWorkspaceIDName(const WORKSPACEID id);
+ void addPrevWorkspaceID(const WORKSPACEID id);
+
private:
- void setupDefaultWS(const SMonitorRule&);
- WORKSPACEID findAvailableDefaultWS();
+ void setupDefaultWS(const SMonitorRule&);
+ WORKSPACEID findAvailableDefaultWS();
- bool doneScheduled = false;
+ bool doneScheduled = false;
+ std::stack<WORKSPACEID> prevWorkSpaces;
struct {
CHyprSignalListener frame;
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index 4cd97913..720d27f6 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -1176,27 +1176,24 @@ SDispatchResult CKeybindManager::toggleActivePseudo(std::string args) {
return {};
}
-static SWorkspaceIDName getWorkspaceToChangeFromArgs(std::string args, PHLWORKSPACE PCURRENTWORKSPACE) {
+static SWorkspaceIDName getWorkspaceToChangeFromArgs(std::string args, PHLWORKSPACE PCURRENTWORKSPACE, PHLMONITORREF PMONITOR) {
if (!args.starts_with("previous")) {
return getWorkspaceIDNameFromString(args);
}
const bool PER_MON = args.contains("_per_monitor");
- const SWorkspaceIDName PPREVWS = PCURRENTWORKSPACE->getPrevWorkspaceIDName(PER_MON);
+ const SWorkspaceIDName PPREVWS = PER_MON ? PMONITOR->getPrevWorkspaceIDName(PCURRENTWORKSPACE->m_iID) : PCURRENTWORKSPACE->getPrevWorkspaceIDName();
// Do nothing if there's no previous workspace, otherwise switch to it.
- if (PPREVWS.id == -1) {
+ if (PPREVWS.id == -1 || PPREVWS.id == PCURRENTWORKSPACE->m_iID) {
Debug::log(LOG, "No previous workspace to change to");
- return {WORKSPACE_NOT_CHANGED, ""};
+ return {.id = WORKSPACE_NOT_CHANGED};
}
- const auto ID = PCURRENTWORKSPACE->m_iID;
if (const auto PWORKSPACETOCHANGETO = g_pCompositor->getWorkspaceByID(PPREVWS.id); PWORKSPACETOCHANGETO) {
- if (PER_MON && PCURRENTWORKSPACE->m_pMonitor != PWORKSPACETOCHANGETO->m_pMonitor)
- return {WORKSPACE_NOT_CHANGED, ""};
- return {ID, PWORKSPACETOCHANGETO->m_szName};
+ return {.id = PWORKSPACETOCHANGETO->m_iID, .name = PWORKSPACETOCHANGETO->m_szName};
}
- return {ID, PPREVWS.name.empty() ? std::to_string(PPREVWS.id) : PPREVWS.name};
+ return {.id = PPREVWS.id, .name = PPREVWS.name.empty() ? std::to_string(PPREVWS.id) : PPREVWS.name};
}
SDispatchResult CKeybindManager::changeworkspace(std::string args) {
@@ -1214,7 +1211,7 @@ SDispatchResult CKeybindManager::changeworkspace(std::string args) {
const auto PCURRENTWORKSPACE = PMONITOR->activeWorkspace;
const bool EXPLICITPREVIOUS = args.contains("previous");
- const auto& [workspaceToChangeTo, workspaceName] = getWorkspaceToChangeFromArgs(args, PCURRENTWORKSPACE);
+ const auto& [workspaceToChangeTo, workspaceName] = getWorkspaceToChangeFromArgs(args, PCURRENTWORKSPACE, PMONITOR);
if (workspaceToChangeTo == WORKSPACE_INVALID) {
Debug::log(ERR, "Error in changeworkspace, invalid value");
return {.success = false, .error = "Error in changeworkspace, invalid value"};
@@ -1223,19 +1220,19 @@ SDispatchResult CKeybindManager::changeworkspace(std::string args) {
if (workspaceToChangeTo == WORKSPACE_NOT_CHANGED)
return {};
- const auto PREVWS = PCURRENTWORKSPACE->getPrevWorkspaceIDName(args.contains("_per_monitor"));
+ const SWorkspaceIDName PPREVWS = args.contains("_per_monitor") ? PMONITOR->getPrevWorkspaceIDName(PCURRENTWORKSPACE->m_iID) : PCURRENTWORKSPACE->getPrevWorkspaceIDName();
- const bool BISWORKSPACECURRENT = workspaceToChangeTo == PCURRENTWORKSPACE->m_iID;
- if (BISWORKSPACECURRENT && (!(*PBACKANDFORTH || EXPLICITPREVIOUS) || PREVWS.id == -1))
+ const bool BISWORKSPACECURRENT = workspaceToChangeTo == PCURRENTWORKSPACE->m_iID;
+ if (BISWORKSPACECURRENT && (!(*PBACKANDFORTH || EXPLICITPREVIOUS) || PPREVWS.id == -1))
return {.success = false, .error = "Previous workspace doesn't exist"};
g_pInputManager->unconstrainMouse();
g_pInputManager->m_bEmptyFocusCursorSet = false;
- auto pWorkspaceToChangeTo = g_pCompositor->getWorkspaceByID(BISWORKSPACECURRENT ? PREVWS.id : workspaceToChangeTo);
+ auto pWorkspaceToChangeTo = g_pCompositor->getWorkspaceByID(BISWORKSPACECURRENT ? PPREVWS.id : workspaceToChangeTo);
if (!pWorkspaceToChangeTo)
pWorkspaceToChangeTo =
- g_pCompositor->createNewWorkspace(BISWORKSPACECURRENT ? PREVWS.id : workspaceToChangeTo, PMONITOR->ID, BISWORKSPACECURRENT ? PREVWS.name : workspaceName);
+ g_pCompositor->createNewWorkspace(BISWORKSPACECURRENT ? PPREVWS.id : workspaceToChangeTo, PMONITOR->ID, BISWORKSPACECURRENT ? PPREVWS.name : workspaceName);
if (!BISWORKSPACECURRENT && pWorkspaceToChangeTo->m_bIsSpecialWorkspace) {
PMONITOR->setSpecialWorkspace(pWorkspaceToChangeTo);
@@ -1407,9 +1404,7 @@ SDispatchResult CKeybindManager::moveActiveToWorkspace(std::string args) {
}
SDispatchResult CKeybindManager::moveActiveToWorkspaceSilent(std::string args) {
- PHLWINDOW PWINDOW = nullptr;
-
- const auto ORIGINALARGS = args;
+ PHLWINDOW PWINDOW = nullptr;
if (args.contains(',')) {
PWINDOW = g_pCompositor->getWindowByRegex(args.substr(args.find_last_of(',') + 1));
@@ -2033,7 +2028,7 @@ SDispatchResult CKeybindManager::focusWorkspaceOnCurrentMonitor(std::string args
}
static auto PBACKANDFORTH = CConfigValue<Hyprlang::INT>("binds:workspace_back_and_forth");
- const auto PREVWS = pWorkspace->getPrevWorkspaceIDName(false);
+ const auto PREVWS = pWorkspace->getPrevWorkspaceIDName();
if (*PBACKANDFORTH && PCURRMONITOR->activeWorkspaceID() == workspaceID && PREVWS.id != -1) {
// Workspace to focus is previous workspace