summaryrefslogtreecommitdiff
path: root/src/managers
diff options
context:
space:
mode:
authorSungyoon Cho <sungyoon@sungyooncho.dev>2024-05-15 20:17:56 +0900
committerGitHub <noreply@github.com>2024-05-15 12:17:56 +0100
commit31890026ea9f3ce75dbcfdf060239fc8aa6c144c (patch)
treea482ef52177b88752ce77efdc4ed581be524a418 /src/managers
parent94c20a186372aace78b188842848b873eb3ebbd7 (diff)
wl_seat: send frame event after pointer leave (#6074)
Diffstat (limited to 'src/managers')
-rw-r--r--src/managers/SeatManager.cpp17
-rw-r--r--src/managers/SeatManager.hpp1
2 files changed, 17 insertions, 1 deletions
diff --git a/src/managers/SeatManager.cpp b/src/managers/SeatManager.cpp
index 3e2d595f..b9590c42 100644
--- a/src/managers/SeatManager.cpp
+++ b/src/managers/SeatManager.cpp
@@ -186,10 +186,13 @@ void CSeatManager::setPointerFocus(wlr_surface* surf, const Vector2D& local) {
}
}
+ auto lastPointerFocusResource = state.pointerFocusResource;
+
state.pointerFocusResource.reset();
state.pointerFocus = surf;
if (!surf) {
+ sendPointerFrame(lastPointerFocusResource);
events.pointerFocusChange.emit();
return;
}
@@ -209,6 +212,11 @@ void CSeatManager::setPointerFocus(wlr_surface* surf, const Vector2D& local) {
}
}
+ if (state.pointerFocusResource != lastPointerFocusResource)
+ sendPointerFrame(lastPointerFocusResource);
+
+ sendPointerFrame();
+
hyprListener_pointerSurfaceDestroy.initCallback(
&surf->events.destroy, [this](void* owner, void* data) { setPointerFocus(nullptr, {}); }, nullptr, "CSeatManager");
@@ -245,7 +253,14 @@ void CSeatManager::sendPointerFrame() {
if (!state.pointerFocusResource)
return;
- for (auto& p : state.pointerFocusResource->pointers) {
+ sendPointerFrame(state.pointerFocusResource);
+}
+
+void CSeatManager::sendPointerFrame(WP<CWLSeatResource> pResource) {
+ if (!pResource)
+ return;
+
+ for (auto& p : pResource->pointers) {
if (!p)
continue;
diff --git a/src/managers/SeatManager.hpp b/src/managers/SeatManager.hpp
index f4efda70..cf5e9216 100644
--- a/src/managers/SeatManager.hpp
+++ b/src/managers/SeatManager.hpp
@@ -63,6 +63,7 @@ class CSeatManager {
void sendPointerMotion(uint32_t timeMs, const Vector2D& local);
void sendPointerButton(uint32_t timeMs, uint32_t key, wl_pointer_button_state state);
void sendPointerFrame();
+ void sendPointerFrame(WP<CWLSeatResource> pResource);
void sendPointerAxis(uint32_t timeMs, wl_pointer_axis axis, double value, int32_t discrete, wl_pointer_axis_source source, wl_pointer_axis_relative_direction relative);
void sendTouchDown(wlr_surface* surf, uint32_t timeMs, int32_t id, const Vector2D& local);