diff options
| author | vaxerski <vaxry@vaxry.net> | 2024-06-12 16:49:26 +0200 |
|---|---|---|
| committer | vaxerski <vaxry@vaxry.net> | 2024-06-12 16:49:26 +0200 |
| commit | c7e85e26f761fb58db6692649e259589cdf55cf0 (patch) | |
| tree | 15a665d22fdddbc22f50ea8029578c1a31927e17 /src/managers/SeatManager.cpp | |
| parent | 1bae19ce85ae9a25f2dddb6cee8bbd6ed3872ade (diff) | |
seat: fixup touch event handling
fixes #6353
Diffstat (limited to 'src/managers/SeatManager.cpp')
| -rw-r--r-- | src/managers/SeatManager.cpp | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/src/managers/SeatManager.cpp b/src/managers/SeatManager.cpp index 862bd2b5..c1b13ccb 100644 --- a/src/managers/SeatManager.cpp +++ b/src/managers/SeatManager.cpp @@ -337,34 +337,11 @@ void CSeatManager::sendPointerAxis(uint32_t timeMs, wl_pointer_axis axis, double } void CSeatManager::sendTouchDown(SP<CWLSurfaceResource> surf, uint32_t timeMs, int32_t id, const Vector2D& local) { - if (state.touchFocus == surf) - return; - listeners.touchSurfaceDestroy.reset(); - if (state.touchFocusResource) { - auto client = state.touchFocusResource->client(); - for (auto& s : seatResources) { - if (s->resource->client() != client) - continue; - - for (auto& t : s->resource->touches) { - if (!t) - continue; - - t->sendUp(timeMs, id); - } - } - } - state.touchFocusResource.reset(); state.touchFocus = surf; - if (!surf) { - events.touchFocusChange.emit(); - return; - } - auto client = surf->client(); for (auto& r : seatResources | std::views::reverse) { if (r->resource->client() != client) @@ -381,11 +358,34 @@ void CSeatManager::sendTouchDown(SP<CWLSurfaceResource> surf, uint32_t timeMs, i listeners.touchSurfaceDestroy = surf->events.destroy.registerListener([this, timeMs, id](std::any d) { sendTouchUp(timeMs + 10, id); }); - events.touchFocusChange.emit(); + touchLocks++; + + if (touchLocks <= 1) + events.touchFocusChange.emit(); } void CSeatManager::sendTouchUp(uint32_t timeMs, int32_t id) { - sendTouchDown(nullptr, timeMs, id, {}); + if (!state.touchFocusResource || touchLocks <= 0) + return; + + auto client = state.touchFocusResource->client(); + for (auto& r : seatResources | std::views::reverse) { + if (r->resource->client() != client) + continue; + + state.touchFocusResource = r->resource; + for (auto& t : r->resource->touches) { + if (!t) + continue; + + t->sendUp(timeMs, id); + } + } + + touchLocks--; + + if (touchLocks <= 0) + events.touchFocusChange.emit(); } void CSeatManager::sendTouchMotion(uint32_t timeMs, int32_t id, const Vector2D& local) { |
