From d94fe3d063a910cab64fbdc132f6aa168a52e14d Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sat, 10 Sep 2022 13:11:02 +0200 Subject: added window pinning --- src/managers/KeybindManager.cpp | 27 +++++++++++++++++++++++++++ src/managers/KeybindManager.hpp | 1 + src/managers/XWaylandManager.cpp | 3 ++- src/managers/input/InputManager.cpp | 2 +- 4 files changed, 31 insertions(+), 2 deletions(-) (limited to 'src/managers') 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) { -- cgit v1.2.3