This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch wl/browser-all
in repository enlightenment.
View the commit online.
commit e4be54e58b98dbda47f3f5761c9ffde50a398e2a
Author: Cedric BAIL <[email protected]>
AuthorDate: Mon Aug 10 12:04:48 2026 -0600
e_comp_wl - leave a surface before it stops existing
A surface that goes away under the pointer never sent wl_pointer.leave.
Nothing looked broken from the compositor side: E re-targets the client
underneath correctly, calls _e_comp_wl_mouse_in on it, and that client
ends up with mouse.in set. The damage is on the wire.
_e_comp_wl_mouse_in refuses to send a second enter without a leave in
between, because a client treats that as the protocol violation it is.
With the leave missing, ptr->entered stays set, and the guard then
faithfully suppresses the enter for whatever came under the pointer
next. The client goes on believing the pointer is inside a surface it
has already destroyed, and the input lands nowhere.
Both ends need it. On unmap the surface is still there to be named, so
the ordinary leave path works. On destroy it has to happen before
comp_data->surface is cleared - after that there is nothing left to name
and _e_comp_wl_pointer_leave_send returns early, which is exactly how
this stayed invisible.
*XdgPopup* is now 105 / 0: popup_gives_up_pointer_focus_when_gone passes
for stable and v6.
This does NOT touch the subsurface cluster - measured, 25 failures
before and the same 25 after. Those look like the same symptom and are
not the same cause.
Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01FtoiXoSKUmZb6Aix6U3GZS
---
src/bin/e_comp_wl.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c
index a0eaed62c..1318e05b7 100644
--- a/src/bin/e_comp_wl.c
+++ b/src/bin/e_comp_wl.c
@@ -1540,7 +1540,16 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
*
* Thawed on map, below. */
if (!ec->comp_data->mapped)
- evas_object_freeze_events_set(ec->frame, 1);
+ {
+ evas_object_freeze_events_set(ec->frame, 1);
+ /* And tell the client the pointer has left, while its
+ * surface is still around to be named. Without this the
+ * seat goes on believing the pointer is inside a surface
+ * the client has unmapped, and the next surface to come
+ * under the pointer is refused its wl_pointer.enter as a
+ * duplicate - so the input lands nowhere at all. */
+ e_comp_wl_pointer_focus_drop(ec);
+ }
}
}
else
@@ -1714,7 +1723,14 @@ _e_comp_wl_surface_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_re
E_Client *ec;
DBG("Surface Cb Destroy: %d", wl_resource_get_id(resource));
ec = wl_resource_get_user_data(resource);
- if (ec && (!e_object_is_del(E_OBJECT(ec)))) ec->comp_data->surface = NULL;
+ if (ec && (!e_object_is_del(E_OBJECT(ec))))
+ {
+ /* Before the surface stops being nameable: a client destroying the
+ * surface under the pointer still has to leave it, or the seat keeps
+ * a stale focus and denies the enter to whatever is underneath. */
+ e_comp_wl_pointer_focus_drop(ec);
+ ec->comp_data->surface = NULL;
+ }
wl_resource_destroy(resource);
}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.