From 462781b16f9763cbfd8f182b8680b00c823ecd9e Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sun, 3 Apr 2022 13:49:21 +0200 Subject: [PATCH] Added drag to move window --- src/Window.hpp | 1 + src/layout/DwindleLayout.cpp | 13 +++++++++++++ src/layout/DwindleLayout.hpp | 1 + src/layout/IHyprLayout.hpp | 5 +++++ src/managers/InputManager.cpp | 10 +++++++--- 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/Window.hpp b/src/Window.hpp index f59e037a..2911cfea 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -42,6 +42,7 @@ public: uint64_t m_iTags = 0; bool m_bIsFloating = false; + bool m_bDraggingTiled = false; // for dragging around tiled windows bool m_bIsFullscreen = false; uint64_t m_iMonitorID = -1; std::string m_szTitle = ""; diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp index ce1e2a3f..5e4be345 100644 --- a/src/layout/DwindleLayout.cpp +++ b/src/layout/DwindleLayout.cpp @@ -324,12 +324,25 @@ void CHyprDwindleLayout::onBeginDragWindow() { return; } + if (!DRAGGINGWINDOW->m_bIsFloating) { + DRAGGINGWINDOW->m_bDraggingTiled = true; + changeWindowFloatingMode(DRAGGINGWINDOW); + } else { + DRAGGINGWINDOW->m_bDraggingTiled = false; + } m_vBeginDragXY = g_pInputManager->getMouseCoordsInternal(); m_vBeginDragPositionXY = DRAGGINGWINDOW->m_vRealPosition; m_vBeginDragSizeXY = DRAGGINGWINDOW->m_vRealSize; } +void CHyprDwindleLayout::onEndDragWindow() { + const auto DRAGGINGWINDOW = g_pInputManager->currentlyDraggedWindow; + + if (DRAGGINGWINDOW->m_bDraggingTiled) + changeWindowFloatingMode(DRAGGINGWINDOW); +} + void CHyprDwindleLayout::onMouseMove(const Vector2D& mousePos) { const auto DRAGGINGWINDOW = g_pInputManager->currentlyDraggedWindow; diff --git a/src/layout/DwindleLayout.hpp b/src/layout/DwindleLayout.hpp index f1411322..957c8330 100644 --- a/src/layout/DwindleLayout.hpp +++ b/src/layout/DwindleLayout.hpp @@ -35,6 +35,7 @@ public: virtual void recalculateWindow(CWindow*); virtual void changeWindowFloatingMode(CWindow*); virtual void onBeginDragWindow(); + virtual void onEndDragWindow(); virtual void onMouseMove(const Vector2D&); virtual void onWindowCreatedFloating(CWindow*); virtual void fullscreenRequestForWindow(CWindow*); diff --git a/src/layout/IHyprLayout.hpp b/src/layout/IHyprLayout.hpp index b214dd50..3e85cc24 100644 --- a/src/layout/IHyprLayout.hpp +++ b/src/layout/IHyprLayout.hpp @@ -36,6 +36,11 @@ public: as. */ virtual void onBeginDragWindow() = 0; + /* + Called when a window is ended being dragged + (mouse up) + */ + virtual void onEndDragWindow() = 0; /* Called whenever the mouse moves, should the layout want to do anything with it. diff --git a/src/managers/InputManager.cpp b/src/managers/InputManager.cpp index 2483832a..e8cb19b9 100644 --- a/src/managers/InputManager.cpp +++ b/src/managers/InputManager.cpp @@ -122,7 +122,7 @@ void CInputManager::onMouseButton(wlr_pointer_button_event* e) { refocus(); if ((e->button == BTN_LEFT || e->button == BTN_RIGHT) && wlr_keyboard_get_modifiers(PKEYBOARD) == (uint32_t)g_pConfigManager->getInt("general:main_mod_internal")) { - currentlyDraggedWindow = g_pCompositor->windowFloatingFromCursor(); + currentlyDraggedWindow = g_pCompositor->windowFromCursor(); dragButton = e->button; g_pLayoutManager->getCurrentLayout()->onBeginDragWindow(); @@ -131,8 +131,12 @@ void CInputManager::onMouseButton(wlr_pointer_button_event* e) { } break; case WLR_BUTTON_RELEASED: - currentlyDraggedWindow = nullptr; - dragButton = -1; + if (currentlyDraggedWindow) { + g_pLayoutManager->getCurrentLayout()->onEndDragWindow(); + currentlyDraggedWindow = nullptr; + dragButton = -1; + } + break; }