<div dir="ltr"><div><div>Any client that gets a grab should *NOT* get any kind of focus-lost events during the grab. This is just going to confuse things and make it more difficult to implement toolkits. They know that events go to one place so they <br>can easily handle internally the fact that some other widget lost the focus. This is the same as my oft-repeated request that clients getting enter events not get exit events (or at least swap the order so it gets the enter first), because the current scheme actually makes handling the events much more complicated, requiring lookahead to avoid drawing an incorrect display after getting the exit.<br><br></div>If another client (ie one without focus) manages to grab the pointer or keyboard it seems like sending the first client the same event it would get if the pointer or keyboard focus was moved away normally would work. Though I can imagine the client may want to know it is a grab, as it might want to avoid changing the highlighting since it expects to get the focus back "soon", but I'm not really sure if this decision would depend on the fact that it is a grab. The most useful cases are where the client that has focus also does the grab, though, this is certainly necessary to avoid the annoying titlebar flicker you get in some X window managers when popup menus are used.<br><br>If any keys change during the grab (such as the Alt key mentioned) the client that got the focus-out event should get a focus-in event with the new keymap when the grab ends, so it knows this.<br><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 11, 2015 at 5:33 AM, Carlos Garnacho <span dir="ltr"><<a href="mailto:carlosg@gnome.org" target="_blank">carlosg@gnome.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On mié, 2015-06-10 at 08:20 -0700, Jasper St. Pierre wrote:<br>
> On Wed, Jun 10, 2015 at 4:50 AM, Carlos Garnacho <<a href="mailto:carlosg@gnome.org">carlosg@gnome.org</a>><br>
> wrote:<br>
> > On mar, 2015-06-09 at 11:03 -0700, Jasper St. Pierre wrote:<br>
> > > What is the value of clients having this information?<br>
> ><br>
> > The same there is in having wl_touch.cancelled. See the cases in<br>
> > the<br>
> > original email in the thread.<br>
> ><br>
> > > I think we've<br>
> > > tried to hide grab semantics from the point of view of the client<br>
> > > and<br>
> > > simply say "we can revoke input at any time, including in<br>
> > > response to<br>
> > > a request you make", which gives us, the compositor, a lot more<br>
> > > leeway<br>
> > > with future possibilities.<br>
> ><br>
> > Sure, I'm all for that. What I'd really want is having a way to<br>
> > tell<br>
> > clients we do so. I'm totally fine with documenting the places<br>
> > where<br>
> > this potentially happens on a per-case basis, even if the final<br>
> > wording<br>
> > is "compositor dependent", same as for seat.release_input emission.<br>
> ><br>
> > That said, toolkits/clients will surely expect some consistence<br>
> > across<br>
> > compositors, so the leeway is relative.<br>
> ><br>
> > ><br>
> > > Grabs were a major pain point in X11 since they were<br>
> > > overspecified,<br>
> > > so<br>
> > > we're trying to not fall into that same trap again.<br>
> ><br>
> > I'm sure there is a lot of ground between "let's not overspecify"<br>
> > and<br>
> > "let's go shopping".<br>
> ><br>
> > It would be convenient first to identify what are the sore points<br>
> > with<br>
> > X grabs. AFAICT, most of these come from grabs not being easily<br>
> > transferred, and the WM/screensaver/etc not being more of a client<br>
> > to<br>
> > revoke/break grabs. On wayland the compositor is completely free to<br>
> > do<br>
> > as it pleases, with and without this change I'm proposing.<br>
><br>
> Yeah, transferring grabs race-free, a lack of being able to override<br>
> or revoke grabs are the top two. But focus management + grabs in X11<br>
> is tricksy and sort of awkward: if I take a keyboard grab, key focus<br>
> can still navigate around as usual, we'll just get NotifyWhileGrabbed<br>
> as our detail.<br>
><br>
> > However, one thing that X did well is defining a consistent event<br>
> > delivery model when grabs were being taken (well, except for touch<br>
> > events...), so both the grabbing and the pre-grab windows are well<br>
> > aware of what's going on, I think one is due in wayland, at least<br>
> > face<br>
> > to clients.<br>
><br>
> Did it? I don't know of any model that lets me know when a client has<br>
> taken a grab or ungrabs their existing grab.<br>
<br>
</div></div>The same happens on wayland *between clients*, and that's a good thing.<br>
Sure, it wasn't convenient on X11 for a WM, as yet another client.<br>
<span class=""><br>
> The exception is that I<br>
> believe if I'm the key or pointer focus, I'll get a FocusOut / Leave<br>
> event with the "NotifyGrabbed" detail, and when the grab is dropped<br>
> (and I am still the key focus / pointer focus, which is not<br>
> guaranteed!), we'll get the reverse event with "NotifyUngrabbed".<br>
<br>
</span>Precisely, a focus out/leave event with NotifyGrabbed means "I may<br>
never see this device again", The second enter/focus in event may not<br>
happen because the pointer/keyboard focus went elsewhere mid-grab, but<br>
for all that matters, the client already forgot about the device(s), so<br>
is in a consistent state.<br>
<span class=""><br>
><br>
> And in X11, this is actually good, because such an event would be<br>
> racy: some other client might have taken a grab in such a time. And<br>
> it<br>
> happens all the time because of passive grabs, including X11's own<br>
> implicit passive grab on the pointer.<br>
> Anyway, this model matches well with wl_keyboard.leave /<br>
> wl_pointer.leave being sent at the start of device grabs.<br>
><br>
> > ><br>
> > > For instance, if the user is in a game that has a keyboard grab<br>
> > > and<br>
> > > presses Alt-Tab to switch out, the client should just have its<br>
> > > keyboard grab revoked without having to have that as a<br>
> > > possibility in<br>
> > > the protocol spec. Same thing with tray icon behavior, etc.<br>
> ><br>
> > sure, in that case you'd still get wl_keyboard.leave and the client<br>
> > can<br>
> > properly undo the key press / mods. But notice there is always a<br>
> > need<br>
> > to know when to undo (eg. in your example above, the game might<br>
> > have<br>
> > bound Alt to "release flares", if you first press Alt and then Tab,<br>
> > and<br>
> > the client doesn't get the Alt key release, you don't want to leave<br>
> > that stuck when you focus back)<br>
><br>
> The client gets a wl_keyboard.leave. Is that not good enough?<br>
<br>
</span>Ok, we fixed keyboards. Keyboard is actually an easy usecase, they in<br>
the end have a binary state, even if for multiple keys, and not much<br>
retained state behind. Some observations though:<br>
<br>
- This works here because in this alt-tab example focus is being taken<br>
elsewhere, say we're raising a notification area or anything else that<br>
only steals focus temporarily, how do we convey the app "you should<br>
still consider yourself focused nonetheless, and still should appear as<br>
such"?<br>
<br>
- Do we take the same approach with wl_pointer, start telling "You must<br>
forget everything about this pointer on wl_pointer.leave events" and<br>
issue it mid-press if necessary? What about the legit places you may<br>
want enter/leave events while a button is pressed (eg. moving across<br>
subsurfaces)<br>
<br>
- Let's say this is enough for keyboards and pointers. What do we do<br>
about interfaces with no "leave" semantics like wl_touch?<br>
wl_touch.cancelled is not too thinly grained, mostly thought out for<br>
compositor gestures taking over the whole device/capability. Issuing<br>
wl_touch.up to "cancel" individual touches, or touches happening in an<br>
specific surface is definitely not what we want here.<br>
<br>
- Looking a bit forward to the future, we'll have tablets and<br>
buttonsets too, tablets will be specially funky as there's different<br>
interaction levels ("proximity" and pen in contact, pen buttons work on<br>
both states...), how do we behave orderly wrt the combination of those<br>
states?<br>
<br>
It strikes me as simpler having a new event that will also work for<br>
future capabilities than cramming current events with vague semantics<br>
that toolkits would need to heavily adapt for.<br>
<span class=""><br>
><br>
<br>
>  What use<br>
> cases does this new event solve?<br>
<br>
</span>I again recommend you to read <a href="http://lists.freedesktop.org/archives/way
land-devel/2015-April/021407.html" rel="noreferrer" target="_blank">http://lists.freedesktop.org/archives/way<br>
land-devel/2015-April/021407.html</a><br>
<br>
In short, I see all sorts of problems with simultaneous interaction<br>
(multitouch alone, and combinations of any two device capabilities),<br>
where one happens to trigger a xdg_popup, dnd or another compositor<br>
grab. The state in which the former/grabbing surface are left is both<br>
unspecified and broken in implementations.<br>
<br>
Cheers,<br>
  Carlos<br>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
wayland-devel mailing list<br>
<a href="mailto:wayland-devel@lists.freedesktop.org">wayland-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/wayland-devel" rel="noreferrer" target="_blank">http://lists.freedesktop.org/mailman/listinfo/wayland-devel</a><br>
</div></div></blockquote></div><br></div>