From 5f8e4068e51480791dbccbe48e86910e9b3cc881 Mon Sep 17 00:00:00 2001 From: dranull <150595692+dranull@users.noreply.github.com> Date: Fri, 29 Dec 2023 23:38:12 +0000 Subject: [PATCH] groupbar: Middle click on groupbar to close tab (#4297) * Prevent window swapping when the head is removed * Bring floating windows to top when selected * Allow clicks on gropubar in fullscreen 1 * Close window on groupbar with middle click --- src/layout/IHyprLayout.cpp | 6 ++--- src/managers/input/InputManager.cpp | 2 +- .../decorations/CHyprGroupBarDecoration.cpp | 24 +++++++++++++++---- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index 76f1e796690..6a03ac80108 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -36,15 +36,15 @@ void IHyprLayout::onWindowRemoved(CWindow* pWindow) { const auto WINDOWISVISIBLE = pWindow->getGroupCurrent() == pWindow; if (WINDOWISVISIBLE) - PWINDOWPREV->setGroupCurrent(PWINDOWPREV); + PWINDOWPREV->setGroupCurrent(pWindow->m_sGroupData.head ? pWindow->m_sGroupData.pNextWindow : PWINDOWPREV); PWINDOWPREV->m_sGroupData.pNextWindow = pWindow->m_sGroupData.pNextWindow; pWindow->m_sGroupData.pNextWindow = nullptr; if (pWindow->m_sGroupData.head) { - std::swap(PWINDOWPREV->m_sGroupData.head, pWindow->m_sGroupData.head); - std::swap(PWINDOWPREV->m_sGroupData.locked, pWindow->m_sGroupData.locked); + std::swap(PWINDOWPREV->m_sGroupData.pNextWindow->m_sGroupData.head, pWindow->m_sGroupData.head); + std::swap(PWINDOWPREV->m_sGroupData.pNextWindow->m_sGroupData.locked, pWindow->m_sGroupData.locked); } if (pWindow == m_pLastTiledWindow) diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 9aae3e446c9..78058a8ab6d 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -601,7 +601,7 @@ void CInputManager::processMouseDownNormal(wlr_pointer_button_event* e) { const auto mouseCoords = g_pInputManager->getMouseCoordsInternal(); const auto w = g_pCompositor->vectorToWindowIdeal(mouseCoords); - if (w && !w->m_bIsFullscreen && !m_bLastFocusOnLS && w->checkInputOnDecos(INPUT_TYPE_BUTTON, mouseCoords, e)) + if (w && !m_bLastFocusOnLS && w->checkInputOnDecos(INPUT_TYPE_BUTTON, mouseCoords, e)) return; // clicking on border triggers resize diff --git a/src/render/decorations/CHyprGroupBarDecoration.cpp b/src/render/decorations/CHyprGroupBarDecoration.cpp index 9c78593522b..cbd7a73fdb9 100644 --- a/src/render/decorations/CHyprGroupBarDecoration.cpp +++ b/src/render/decorations/CHyprGroupBarDecoration.cpp @@ -386,12 +386,28 @@ bool CHyprGroupBarDecoration::onEndWindowDragOnDeco(const Vector2D& pos, CWindow } bool CHyprGroupBarDecoration::onMouseButtonOnDeco(const Vector2D& pos, wlr_pointer_button_event* e) { - if (e->state != WLR_BUTTON_PRESSED) - return false; + if (m_pWindow->m_bIsFullscreen && g_pCompositor->getWorkspaceByID(m_pWindow->m_iWorkspaceID)->m_efFullscreenMode == FULLSCREEN_FULL) + return true; const float BARRELATIVEX = pos.x - assignedBoxGlobal().x; const int WINDOWINDEX = (BARRELATIVEX) / (m_fBarWidth + BAR_HORIZONTAL_PADDING); + // close window on middle click + if (e->button == 274) { + static Vector2D pressedCursorPos; + + if (e->state == WLR_BUTTON_PRESSED) + pressedCursorPos = pos; + else if (e->state == WLR_BUTTON_RELEASED && pressedCursorPos == pos) + g_pXWaylandManager->sendCloseWindow(m_pWindow->getGroupWindowByIndex(WINDOWINDEX)); + + return true; + } + + if (e->state != WLR_BUTTON_PRESSED) + return true; + + // click on padding if (BARRELATIVEX - (m_fBarWidth + BAR_HORIZONTAL_PADDING) * WINDOWINDEX > m_fBarWidth) { if (!g_pCompositor->isWindowActive(m_pWindow)) g_pCompositor->focusWindow(m_pWindow); @@ -403,8 +419,8 @@ bool CHyprGroupBarDecoration::onMouseButtonOnDeco(const Vector2D& pos, wlr_point if (pWindow != m_pWindow) pWindow->setGroupCurrent(pWindow); - if (!g_pCompositor->isWindowActive(pWindow)) - g_pCompositor->focusWindow(pWindow); + if (pWindow->m_bIsFloating) + g_pCompositor->changeWindowZOrder(pWindow, 1); return true; }