diff --git a/src/managers/input/Tablets.cpp b/src/managers/input/Tablets.cpp index 4aa80061..e69fc9be 100644 --- a/src/managers/input/Tablets.cpp +++ b/src/managers/input/Tablets.cpp @@ -2,6 +2,7 @@ #include "../../desktop/Window.hpp" #include "../../protocols/Tablet.hpp" #include "../../devices/Tablet.hpp" +#include "../../managers/HookSystemManager.hpp" #include "../../managers/PointerManager.hpp" #include "../../managers/SeatManager.hpp" #include "../../protocols/PointerConstraints.hpp" @@ -167,6 +168,8 @@ void CInputManager::onTabletAxis(CTablet::SAxisEvent e) { } void CInputManager::onTabletTip(CTablet::STipEvent e) { + EMIT_HOOK_EVENT_CANCELLABLE("tabletTip", e); + const auto PTAB = e.tablet; const auto PTOOL = ensureTabletToolPresent(e.tool); const auto POS = e.tip; diff --git a/src/protocols/core/DataDevice.cpp b/src/protocols/core/DataDevice.cpp index 0ede65ed..254a55a3 100644 --- a/src/protocols/core/DataDevice.cpp +++ b/src/protocols/core/DataDevice.cpp @@ -591,6 +591,14 @@ void CWLDataDeviceProtocol::initiateDrag(WP currentSource dropDrag(); }); + m_dnd.tabletTip = g_pHookSystem->hookDynamic("tabletTip", [this](void* self, SCallbackInfo& info, std::any e) { + auto E = std::any_cast(e); + if (!E.in) { + LOGM(LOG, "Dropping drag on tablet tipUp"); + dropDrag(); + } + }); + m_dnd.mouseMove = g_pHookSystem->hookDynamic("mouseMove", [this](void* self, SCallbackInfo& info, std::any e) { auto V = std::any_cast(e); if (m_dnd.focusedDevice && g_pSeatManager->m_state.dndPointerFocus) { @@ -695,6 +703,7 @@ void CWLDataDeviceProtocol::cleanupDndState(bool resetDevice, bool resetSource, m_dnd.mouseMove.reset(); m_dnd.touchUp.reset(); m_dnd.touchMove.reset(); + m_dnd.tabletTip.reset(); if (resetDevice) m_dnd.focusedDevice.reset(); diff --git a/src/protocols/core/DataDevice.hpp b/src/protocols/core/DataDevice.hpp index d54927d2..8b52933e 100644 --- a/src/protocols/core/DataDevice.hpp +++ b/src/protocols/core/DataDevice.hpp @@ -180,6 +180,7 @@ class CWLDataDeviceProtocol : public IWaylandProtocol { SP mouseButton; SP touchUp; SP touchMove; + SP tabletTip; } m_dnd; void abortDrag();