summaryrefslogtreecommitdiff
path: root/src/managers/SeatManager.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-05-11 01:02:57 +0100
committerVaxry <vaxry@vaxry.net>2024-05-14 23:13:33 +0100
commitfc72df8e58bc127442a245f2f29a3246acf77cce (patch)
treebe68c03888760af0c2a13bad4aed224fd6adfaa3 /src/managers/SeatManager.cpp
parent0cfdde3d1acbfbf698af17f6986fbc4d644214da (diff)
seatmgr: Add a grab class
Diffstat (limited to 'src/managers/SeatManager.cpp')
-rw-r--r--src/managers/SeatManager.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/managers/SeatManager.cpp b/src/managers/SeatManager.cpp
index f9d394b5..d962dd84 100644
--- a/src/managers/SeatManager.cpp
+++ b/src/managers/SeatManager.cpp
@@ -371,6 +371,40 @@ void CSeatManager::sendTouchOrientation(int32_t id, double angle) {
}
}
+void CSeatManager::refocusGrab() {
+ if (!seatGrab)
+ return;
+
+ if (seatGrab->surfs.size() > 0) {
+ // try to find a surf in focus first
+ const auto MOUSE = g_pInputManager->getMouseCoordsInternal();
+ for (auto& s : seatGrab->surfs) {
+ auto hlSurf = CWLSurface::surfaceFromWlr(s);
+ if (!hlSurf)
+ continue;
+
+ auto b = hlSurf->getSurfaceBoxGlobal();
+ if (!b.has_value())
+ continue;
+
+ if (!b->containsPoint(MOUSE))
+ continue;
+
+ if (seatGrab->keyboard)
+ setKeyboardFocus(s);
+ if (seatGrab->pointer)
+ setPointerFocus(s, MOUSE - b->pos());
+ return;
+ }
+
+ wlr_surface* surf = seatGrab->surfs.at(0);
+ if (seatGrab->keyboard)
+ setKeyboardFocus(surf);
+ if (seatGrab->pointer)
+ setPointerFocus(surf, {});
+ }
+}
+
void CSeatManager::onSetCursor(SP<CWLSeatResource> seatResource, uint32_t serial, wlr_surface* surf, const Vector2D& hotspot) {
if (!state.pointerFocusResource || !seatResource || seatResource->client() != state.pointerFocusResource->client()) {
Debug::log(LOG, "[seatmgr] Rejecting a setCursor because the client ain't in focus");
@@ -389,3 +423,42 @@ void CSeatManager::onSetCursor(SP<CWLSeatResource> seatResource, uint32_t serial
SP<CWLSeatResource> CSeatManager::seatResourceForClient(wl_client* client) {
return PROTO::seat->seatResourceForClient(client);
}
+
+void CSeatManager::setGrab(SP<CSeatGrab> grab) {
+ if (seatGrab) {
+ auto oldGrab = seatGrab;
+ seatGrab.reset();
+ g_pInputManager->refocus();
+ if (oldGrab->onEnd)
+ oldGrab->onEnd();
+ }
+
+ if (!grab)
+ return;
+
+ seatGrab = grab;
+
+ refocusGrab();
+}
+
+bool CSeatGrab::accepts(wlr_surface* surf) {
+ return std::find(surfs.begin(), surfs.end(), surf) != surfs.end();
+}
+
+void CSeatGrab::add(wlr_surface* surf) {
+ surfs.push_back(surf);
+}
+
+void CSeatGrab::remove(wlr_surface* surf) {
+ std::erase(surfs, surf);
+ if ((keyboard && g_pSeatManager->state.keyboardFocus == surf) || (pointer && g_pSeatManager->state.pointerFocus == surf))
+ g_pSeatManager->refocusGrab();
+}
+
+void CSeatGrab::setCallback(std::function<void()> onEnd_) {
+ onEnd = onEnd_;
+}
+
+void CSeatGrab::clear() {
+ surfs.clear();
+}