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 43222ae849364fb7f78fd8a3c1055bf378517ad6
Author: Cedric BAIL <[email protected]>
AuthorDate: Tue Aug 11 18:38:28 2026 -0600

    e_comp_wl - a oneshot constraint dropped by a grab stays dropped
    
    Two paths deactivate a pointer constraint and they disagreed about what
    that means. Losing pointer focus goes through _constraints_deactivate(),
    which marks a non-persistent constraint dead so it can never come back.
    An input grab goes through e_comp_wl_extension_pointer_unconstrain(NULL),
    which sent the same unlocked/unconfined event and left the constraint
    merely inactive - so the next motion after the grab ended could switch it
    back on.
    
    That is the one thing a oneshot lifetime rules out. The protocol names
    this exact event as the point of no return: "A oneshot pointer constraint
    will never reactivate once it has been deactivated. See the corresponding
    deactivation event (wp_locked_pointer.unlocked and
    wp_confined_pointer.unconfined)."
    
    Nothing in wlcs covers it - no test takes a compositor input grab while a
    constraint is held - so this is a protocol reading, not a measured fix,
    and it is worth saying so. What it has going for it is that the answer
    already exists forty lines above in the same file and the two spellings
    of "deactivate" now agree.
    
    wlcs unchanged, 712 passed either way, no regressions.
---
 src/bin/e_comp_wl_extensions.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/bin/e_comp_wl_extensions.c b/src/bin/e_comp_wl_extensions.c
index 871d69ca4..880373636 100644
--- a/src/bin/e_comp_wl_extensions.c
+++ b/src/bin/e_comp_wl_extensions.c
@@ -1385,10 +1385,18 @@ e_comp_wl_extension_pointer_unconstrain(E_Client *ec)
         return;
      }
 
-   /* no client: an input grab is being taken, everything is dropped */
+   /* no client: an input grab is being taken, everything is dropped.
+    *
+    * This is a deactivation like any other - unlocked/unconfined is exactly
+    * the event the protocol points at when it says a oneshot constraint "will
+    * never reactivate once it has been deactivated". Leaving it merely
+    * inactive lets the next motion switch it back on once the grab ends,
+    * which is the one thing its lifetime rules out. _constraints_deactivate()
+    * forty lines up already gets this right; the two paths disagreed. */
    EINA_LIST_FREE(active_constraints, c)
      {
         c->active = EINA_FALSE;
+        if (!c->persistent) c->dead = 1;
         if (c->lock)
           zwp_locked_pointer_v1_send_unlocked(c->res);
         else

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to