summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
authordranull <150595692+dranull@users.noreply.github.com>2023-12-28 22:54:41 +0000
committerGitHub <noreply@github.com>2023-12-28 23:54:41 +0100
commit8321d6be46ed2df7dfe7ec142716a7d1a50d2d5e (patch)
tree8381a98e72b0ae839847da7ac7a122027317b6bf /src/render
parentcedf5f1fca057351d85560ff72bf2cc6cc609755 (diff)
internal: Unify input handling on decorations (#4280)
* Unify input handling on decorations * Make input methods private * Optional data
Diffstat (limited to 'src/render')
-rw-r--r--src/render/decorations/CHyprGroupBarDecoration.cpp76
-rw-r--r--src/render/decorations/CHyprGroupBarDecoration.hpp11
-rw-r--r--src/render/decorations/IHyprWindowDecoration.cpp12
-rw-r--r--src/render/decorations/IHyprWindowDecoration.hpp7
4 files changed, 62 insertions, 44 deletions
diff --git a/src/render/decorations/CHyprGroupBarDecoration.cpp b/src/render/decorations/CHyprGroupBarDecoration.cpp
index 3bc819bf..9c785935 100644
--- a/src/render/decorations/CHyprGroupBarDecoration.cpp
+++ b/src/render/decorations/CHyprGroupBarDecoration.cpp
@@ -300,10 +300,35 @@ void refreshGroupBarGradients() {
renderGradientTo(m_tGradientLockedInactive, ((CGradientValueData*)PGROUPCOLINACTIVELOCKED->get())->m_vColors[0]);
}
-bool CHyprGroupBarDecoration::onEndWindowDragOnDeco(CWindow* pDraggedWindow, const Vector2D& pos) {
+bool CHyprGroupBarDecoration::onBeginWindowDragOnDeco(const Vector2D& pos) {
+ const float BARRELATIVEX = pos.x - assignedBoxGlobal().x;
+ const int WINDOWINDEX = (BARRELATIVEX) / (m_fBarWidth + BAR_HORIZONTAL_PADDING);
+
+ if (BARRELATIVEX - (m_fBarWidth + BAR_HORIZONTAL_PADDING) * WINDOWINDEX > m_fBarWidth)
+ return false;
+
+ CWindow* pWindow = m_pWindow->getGroupWindowByIndex(WINDOWINDEX);
+
+ // hack
+ g_pLayoutManager->getCurrentLayout()->onWindowRemoved(pWindow);
+ if (!pWindow->m_bIsFloating) {
+ const bool GROUPSLOCKEDPREV = g_pKeybindManager->m_bGroupsLocked;
+ g_pKeybindManager->m_bGroupsLocked = true;
+ g_pLayoutManager->getCurrentLayout()->onWindowCreated(pWindow);
+ g_pKeybindManager->m_bGroupsLocked = GROUPSLOCKEDPREV;
+ }
+
+ g_pInputManager->currentlyDraggedWindow = pWindow;
+
+ if (!g_pCompositor->isWindowActive(pWindow))
+ g_pCompositor->focusWindow(pWindow);
+
+ return true;
+}
+bool CHyprGroupBarDecoration::onEndWindowDragOnDeco(const Vector2D& pos, CWindow* pDraggedWindow) {
if (!pDraggedWindow->canBeGroupedInto(m_pWindow))
- return true;
+ return false;
const float BARRELATIVEX = pos.x - assignedBoxGlobal().x - m_fBarWidth / 2;
const int WINDOWINDEX = BARRELATIVEX < 0 ? -1 : (BARRELATIVEX) / (m_fBarWidth + BAR_HORIZONTAL_PADDING);
@@ -357,12 +382,12 @@ bool CHyprGroupBarDecoration::onEndWindowDragOnDeco(CWindow* pDraggedWindow, con
if (!pDraggedWindow->getDecorationByType(DECORATION_GROUPBAR))
pDraggedWindow->addWindowDeco(std::make_unique<CHyprGroupBarDecoration>(pDraggedWindow));
- return false;
+ return true;
}
-void CHyprGroupBarDecoration::onMouseButtonOnDeco(const Vector2D& pos, wlr_pointer_button_event* e) {
+bool CHyprGroupBarDecoration::onMouseButtonOnDeco(const Vector2D& pos, wlr_pointer_button_event* e) {
if (e->state != WLR_BUTTON_PRESSED)
- return;
+ return false;
const float BARRELATIVEX = pos.x - assignedBoxGlobal().x;
const int WINDOWINDEX = (BARRELATIVEX) / (m_fBarWidth + BAR_HORIZONTAL_PADDING);
@@ -370,7 +395,7 @@ void CHyprGroupBarDecoration::onMouseButtonOnDeco(const Vector2D& pos, wlr_point
if (BARRELATIVEX - (m_fBarWidth + BAR_HORIZONTAL_PADDING) * WINDOWINDEX > m_fBarWidth) {
if (!g_pCompositor->isWindowActive(m_pWindow))
g_pCompositor->focusWindow(m_pWindow);
- return;
+ return true;
}
CWindow* pWindow = m_pWindow->getGroupWindowByIndex(WINDOWINDEX);
@@ -380,30 +405,33 @@ void CHyprGroupBarDecoration::onMouseButtonOnDeco(const Vector2D& pos, wlr_point
if (!g_pCompositor->isWindowActive(pWindow))
g_pCompositor->focusWindow(pWindow);
-}
-
-void CHyprGroupBarDecoration::onBeginWindowDragOnDeco(const Vector2D& pos) {
- const float BARRELATIVEX = pos.x - assignedBoxGlobal().x;
- const int WINDOWINDEX = (BARRELATIVEX) / (m_fBarWidth + BAR_HORIZONTAL_PADDING);
- if (BARRELATIVEX - (m_fBarWidth + BAR_HORIZONTAL_PADDING) * WINDOWINDEX > m_fBarWidth)
- return;
+ return true;
+}
- CWindow* pWindow = m_pWindow->getGroupWindowByIndex(WINDOWINDEX);
+bool CHyprGroupBarDecoration::onScrollOnDeco(const Vector2D& pos, wlr_pointer_axis_event* e) {
+ static auto* const PGROUPBARSCROLLING = &g_pConfigManager->getConfigValuePtr("group:groupbar:scrolling")->intValue;
- // hack
- g_pLayoutManager->getCurrentLayout()->onWindowRemoved(pWindow);
- if (!pWindow->m_bIsFloating) {
- const bool GROUPSLOCKEDPREV = g_pKeybindManager->m_bGroupsLocked;
- g_pKeybindManager->m_bGroupsLocked = true;
- g_pLayoutManager->getCurrentLayout()->onWindowCreated(pWindow);
- g_pKeybindManager->m_bGroupsLocked = GROUPSLOCKEDPREV;
+ if (!*PGROUPBARSCROLLING || !m_pWindow->m_sGroupData.pNextWindow) {
+ return false;
}
- g_pInputManager->currentlyDraggedWindow = pWindow;
+ if (e->delta > 0)
+ m_pWindow->setGroupCurrent(m_pWindow->m_sGroupData.pNextWindow);
+ else
+ m_pWindow->setGroupCurrent(m_pWindow->getGroupPrevious());
- if (!g_pCompositor->isWindowActive(pWindow))
- g_pCompositor->focusWindow(pWindow);
+ return true;
+}
+
+bool CHyprGroupBarDecoration::onInputOnDeco(const eInputType type, const Vector2D& mouseCoords, std::any data) {
+ switch (type) {
+ case INPUT_TYPE_AXIS: return onScrollOnDeco(mouseCoords, std::any_cast<wlr_pointer_axis_event*>(data));
+ case INPUT_TYPE_BUTTON: return onMouseButtonOnDeco(mouseCoords, std::any_cast<wlr_pointer_button_event*>(data));
+ case INPUT_TYPE_DRAG_START: return onBeginWindowDragOnDeco(mouseCoords);
+ case INPUT_TYPE_DRAG_END: return onEndWindowDragOnDeco(mouseCoords, std::any_cast<CWindow*>(data));
+ default: return false;
+ }
}
eDecorationLayer CHyprGroupBarDecoration::getDecorationLayer() {
diff --git a/src/render/decorations/CHyprGroupBarDecoration.hpp b/src/render/decorations/CHyprGroupBarDecoration.hpp
index a0242e2f..04f5123b 100644
--- a/src/render/decorations/CHyprGroupBarDecoration.hpp
+++ b/src/render/decorations/CHyprGroupBarDecoration.hpp
@@ -35,11 +35,7 @@ class CHyprGroupBarDecoration : public IHyprWindowDecoration {
virtual void damageEntire();
- virtual void onBeginWindowDragOnDeco(const Vector2D&);
-
- virtual bool onEndWindowDragOnDeco(CWindow* pDraggedWindow, const Vector2D&);
-
- virtual void onMouseButtonOnDeco(const Vector2D&, wlr_pointer_button_event*);
+ virtual bool onInputOnDeco(const eInputType, const Vector2D&, std::any = {});
virtual eDecorationLayer getDecorationLayer();
@@ -63,6 +59,11 @@ class CHyprGroupBarDecoration : public IHyprWindowDecoration {
CBox assignedBoxGlobal();
+ bool onBeginWindowDragOnDeco(const Vector2D&);
+ bool onEndWindowDragOnDeco(const Vector2D&, CWindow*);
+ bool onMouseButtonOnDeco(const Vector2D&, wlr_pointer_button_event*);
+ bool onScrollOnDeco(const Vector2D&, wlr_pointer_axis_event*);
+
struct STitleTexs {
// STitleTexs* overriden = nullptr; // TODO: make shit shared in-group to decrease VRAM usage.
std::deque<std::unique_ptr<CTitleTex>> titleTexs;
diff --git a/src/render/decorations/IHyprWindowDecoration.cpp b/src/render/decorations/IHyprWindowDecoration.cpp
index 24acdc47..973f2700 100644
--- a/src/render/decorations/IHyprWindowDecoration.cpp
+++ b/src/render/decorations/IHyprWindowDecoration.cpp
@@ -8,16 +8,8 @@ IHyprWindowDecoration::IHyprWindowDecoration(CWindow* pWindow) {
IHyprWindowDecoration::~IHyprWindowDecoration() {}
-void IHyprWindowDecoration::onBeginWindowDragOnDeco(const Vector2D&) {
- ;
-}
-
-bool IHyprWindowDecoration::onEndWindowDragOnDeco(CWindow* pDraggedWindow, const Vector2D&) {
- return true;
-}
-
-void IHyprWindowDecoration::onMouseButtonOnDeco(const Vector2D&, wlr_pointer_button_event*) {
- ;
+bool IHyprWindowDecoration::onInputOnDeco(const eInputType, const Vector2D&, std::any) {
+ return false;
}
eDecorationLayer IHyprWindowDecoration::getDecorationLayer() {
diff --git a/src/render/decorations/IHyprWindowDecoration.hpp b/src/render/decorations/IHyprWindowDecoration.hpp
index 2203304b..b457adf4 100644
--- a/src/render/decorations/IHyprWindowDecoration.hpp
+++ b/src/render/decorations/IHyprWindowDecoration.hpp
@@ -2,6 +2,7 @@
#include "../../defines.hpp"
#include "../../helpers/Region.hpp"
+#include "../../managers/input/InputManager.hpp"
#include "DecorationPositioner.hpp"
enum eDecorationType {
@@ -46,11 +47,7 @@ class IHyprWindowDecoration {
virtual void damageEntire() = 0; // should be ignored by non-absolute decos
- virtual void onBeginWindowDragOnDeco(const Vector2D&); // called when the user calls the "movewindow" mouse dispatcher on the deco
-
- virtual bool onEndWindowDragOnDeco(CWindow* pDraggedWindow, const Vector2D&); // returns true if the window should be placed by the layout
-
- virtual void onMouseButtonOnDeco(const Vector2D&, wlr_pointer_button_event*);
+ virtual bool onInputOnDeco(const eInputType, const Vector2D&, std::any = {});
virtual eDecorationLayer getDecorationLayer();