Add dragging support

This commit is contained in:
vaxerski 2023-02-28 22:53:49 +00:00
parent 5f48afd655
commit 18ebaa7189
2 changed files with 39 additions and 1 deletions

View file

@ -19,6 +19,8 @@ CHyprBar::CHyprBar(CWindow* pWindow) {
m_pMouseButtonCallback = m_pMouseButtonCallback =
HyprlandAPI::registerCallbackDynamic(PHANDLE, "mouseButton", [&](void* self, std::any param) { onMouseDown(std::any_cast<wlr_pointer_button_event*>(param)); }); HyprlandAPI::registerCallbackDynamic(PHANDLE, "mouseButton", [&](void* self, std::any param) { onMouseDown(std::any_cast<wlr_pointer_button_event*>(param)); });
m_pMouseMoveCallback = HyprlandAPI::registerCallbackDynamic(PHANDLE, "mouseMove", [&](void* self, std::any param) { onMouseMove(std::any_cast<Vector2D>(param)); });
} }
CHyprBar::~CHyprBar() { CHyprBar::~CHyprBar() {
@ -26,6 +28,10 @@ CHyprBar::~CHyprBar() {
HyprlandAPI::unregisterCallback(PHANDLE, m_pMouseButtonCallback); HyprlandAPI::unregisterCallback(PHANDLE, m_pMouseButtonCallback);
} }
bool CHyprBar::allowsInput() {
return true;
}
SWindowDecorationExtents CHyprBar::getWindowDecorationExtents() { SWindowDecorationExtents CHyprBar::getWindowDecorationExtents() {
return m_seExtents; return m_seExtents;
} }
@ -36,8 +42,16 @@ void CHyprBar::onMouseDown(wlr_pointer_button_event* e) {
const auto COORDS = cursorRelativeToBar(); const auto COORDS = cursorRelativeToBar();
if (e->state != WLR_BUTTON_PRESSED) if (e->state != WLR_BUTTON_PRESSED) {
if (m_bDraggingThis) {
g_pKeybindManager->m_mDispatchers["mouse"]("0movewindow");
m_bDraggingThis = false;
Debug::log(LOG, "[hyprbars] Dragging ended on %x", m_pWindow);
}
return; return;
}
// check if on a button // check if on a button
static auto* const PBORDERSIZE = &HyprlandAPI::getConfigValue(PHANDLE, "general:border_size")->intValue; static auto* const PBORDERSIZE = &HyprlandAPI::getConfigValue(PHANDLE, "general:border_size")->intValue;
@ -61,6 +75,23 @@ void CHyprBar::onMouseDown(wlr_pointer_button_event* e) {
g_pKeybindManager->m_mDispatchers["fullscreen"]("1"); g_pKeybindManager->m_mDispatchers["fullscreen"]("1");
return; return;
} }
// if we do this here the handler later will remove our mouse bind
m_bDragPending = true;
}
void CHyprBar::onMouseMove(Vector2D coords) {
static auto* const PHEIGHT = &HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprbars:bar_height")->intValue;
if (m_bDragPending) {
m_bDragPending = false;
g_pKeybindManager->m_mDispatchers["mouse"]("1movewindow");
m_bDraggingThis = true;
Debug::log(LOG, "[hyprbars] Dragging initiated on %x", m_pWindow);
return;
}
} }
void CHyprBar::renderBarTitle(const Vector2D& bufferSize) { void CHyprBar::renderBarTitle(const Vector2D& bufferSize) {

View file

@ -23,6 +23,8 @@ class CHyprBar : public IHyprWindowDecoration {
virtual SWindowDecorationExtents getWindowDecorationReservedArea(); virtual SWindowDecorationExtents getWindowDecorationReservedArea();
virtual bool allowsInput();
private: private:
SWindowDecorationExtents m_seExtents; SWindowDecorationExtents m_seExtents;
@ -41,8 +43,13 @@ class CHyprBar : public IHyprWindowDecoration {
void renderBarTitle(const Vector2D& bufferSize); void renderBarTitle(const Vector2D& bufferSize);
void renderBarButtons(const Vector2D& bufferSize); void renderBarButtons(const Vector2D& bufferSize);
void onMouseDown(wlr_pointer_button_event* e); void onMouseDown(wlr_pointer_button_event* e);
void onMouseMove(Vector2D coords);
HOOK_CALLBACK_FN* m_pMouseButtonCallback; HOOK_CALLBACK_FN* m_pMouseButtonCallback;
HOOK_CALLBACK_FN* m_pMouseMoveCallback;
std::string m_szLastTitle; std::string m_szLastTitle;
bool m_bDraggingThis = false;
bool m_bDragPending = false;
}; };