summaryrefslogtreecommitdiff
path: root/src/managers
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-09-10 13:11:02 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-09-10 13:11:02 +0200
commitd94fe3d063a910cab64fbdc132f6aa168a52e14d (patch)
treeb0451f11357fbc74d1f456ee0737f4d24b110924 /src/managers
parentf663fa209ce72571bd4c551a19757ccd58b3fb7f (diff)
added window pinning
Diffstat (limited to 'src/managers')
-rw-r--r--src/managers/KeybindManager.cpp27
-rw-r--r--src/managers/KeybindManager.hpp1
-rw-r--r--src/managers/XWaylandManager.cpp3
-rw-r--r--src/managers/input/InputManager.cpp2
4 files changed, 31 insertions, 2 deletions
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index d5b6014a..821b0588 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -42,6 +42,7 @@ CKeybindManager::CKeybindManager() {
m_mDispatchers["resizewindowpixel"] = resizeWindow;
m_mDispatchers["swapnext"] = swapnext;
m_mDispatchers["swapactiveworkspaces"] = swapActiveWorkspaces;
+ m_mDispatchers["pin"] = pinActive;
m_tScrollTimer.reset();
}
@@ -613,6 +614,13 @@ void CKeybindManager::changeworkspace(std::string args) {
if (!g_pCompositor->isWorkspaceVisible(workspaceToChangeTo)) {
const auto OLDWORKSPACEID = PMONITOR->activeWorkspace;
+ // fix pinned windows
+ for (auto& w : g_pCompositor->m_vWindows) {
+ if (w->m_iWorkspaceID == PMONITOR->activeWorkspace && w->m_bPinned) {
+ w->m_iWorkspaceID = workspaceToChangeTo;
+ }
+ }
+
// change it
if (workspaceToChangeTo != SPECIAL_WORKSPACE_ID)
PMONITOR->activeWorkspace = workspaceToChangeTo;
@@ -700,6 +708,13 @@ void CKeybindManager::changeworkspace(std::string args) {
PMONITOR->specialWorkspaceOpen = false;
+ // fix pinned windows
+ for (auto& w : g_pCompositor->m_vWindows) {
+ if (w->m_iWorkspaceID == PMONITOR->activeWorkspace && w->m_bPinned) {
+ w->m_iWorkspaceID = workspaceToChangeTo;
+ }
+ }
+
if (workspaceToChangeTo != SPECIAL_WORKSPACE_ID)
PMONITOR->activeWorkspace = workspaceToChangeTo;
else
@@ -1534,3 +1549,15 @@ void CKeybindManager::swapActiveWorkspaces(std::string args) {
g_pCompositor->swapActiveWorkspaces(PMON1, PMON2);
}
+
+void CKeybindManager::pinActive(std::string args) {
+ if (!g_pCompositor->windowValidMapped(g_pCompositor->m_pLastWindow) || !g_pCompositor->m_pLastWindow->m_bIsFloating)
+ return;
+
+ g_pCompositor->m_pLastWindow->m_bPinned = !g_pCompositor->m_pLastWindow->m_bPinned;
+ g_pCompositor->m_pLastWindow->m_iWorkspaceID = g_pCompositor->getMonitorFromID(g_pCompositor->m_pLastWindow->m_iMonitorID)->activeWorkspace;
+
+ const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(g_pCompositor->m_pLastWindow->m_iWorkspaceID);
+
+ PWORKSPACE->m_pLastFocusedWindow = g_pCompositor->vectorToWindowTiled(g_pInputManager->getMouseCoordsInternal());
+}
diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp
index 2431d2f9..d7233c79 100644
--- a/src/managers/KeybindManager.hpp
+++ b/src/managers/KeybindManager.hpp
@@ -113,6 +113,7 @@ private:
static void dpms(std::string);
static void swapnext(std::string);
static void swapActiveWorkspaces(std::string);
+ static void pinActive(std::string);
friend class CCompositor;
friend class CInputManager;
diff --git a/src/managers/XWaylandManager.cpp b/src/managers/XWaylandManager.cpp
index 26a6fae4..a8952af0 100644
--- a/src/managers/XWaylandManager.cpp
+++ b/src/managers/XWaylandManager.cpp
@@ -63,7 +63,8 @@ void CHyprXWaylandManager::activateWindow(CWindow* pWindow, bool activate) {
g_pCompositor->m_pLastFocus = getWindowSurface(pWindow);
g_pCompositor->m_pLastWindow = pWindow;
- g_pCompositor->getWorkspaceByID(pWindow->m_iWorkspaceID)->m_pLastFocusedWindow = pWindow;
+ if (!pWindow->m_bPinned)
+ g_pCompositor->getWorkspaceByID(pWindow->m_iWorkspaceID)->m_pLastFocusedWindow = pWindow;
}
void CHyprXWaylandManager::getGeometryForWindow(CWindow* pWindow, wlr_box* pbox) {
diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp
index 7e4bfadd..2e1d2869 100644
--- a/src/managers/input/InputManager.cpp
+++ b/src/managers/input/InputManager.cpp
@@ -156,7 +156,7 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) {
// only check floating because tiled cant be over fullscreen
for (auto w = g_pCompositor->m_vWindows.rbegin(); w != g_pCompositor->m_vWindows.rend(); w++) {
wlr_box box = {(*w)->m_vRealPosition.vec().x, (*w)->m_vRealPosition.vec().y, (*w)->m_vRealSize.vec().x, (*w)->m_vRealSize.vec().y};
- if ((((*w)->m_bIsFloating && (*w)->m_bIsMapped && (*w)->m_bCreatedOverFullscreen) || ((*w)->m_iWorkspaceID == SPECIAL_WORKSPACE_ID && PMONITOR->specialWorkspaceOpen)) && wlr_box_contains_point(&box, mouseCoords.x, mouseCoords.y) && g_pCompositor->isWorkspaceVisible((*w)->m_iWorkspaceID) && !(*w)->m_bHidden) {
+ if ((((*w)->m_bIsFloating && (*w)->m_bIsMapped && ((*w)->m_bCreatedOverFullscreen || (*w)->m_bPinned)) || ((*w)->m_iWorkspaceID == SPECIAL_WORKSPACE_ID && PMONITOR->specialWorkspaceOpen)) && wlr_box_contains_point(&box, mouseCoords.x, mouseCoords.y) && g_pCompositor->isWorkspaceVisible((*w)->m_iWorkspaceID) && !(*w)->m_bHidden) {
pFoundWindow = (*w).get();
if (!pFoundWindow->m_bIsX11) {