<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Sep 21, 2014 at 11:43 PM, Pekka Paalanen <span dir="ltr"><<a href="mailto:ppaalanen@gmail.com" target="_blank">ppaalanen@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Sat, 20 Sep 2014 11:43:22 -0700<br>
Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> wrote:<br>
<br>
> On Sat, Sep 20, 2014 at 1:29 AM, Pekka Paalanen <<a href="mailto:ppaalanen@gmail.com">ppaalanen@gmail.com</a>> wrote:<br>
><br>
> > On Fri, 19 Sep 2014 20:20:53 +0200<br>
> > Jonas Ådahl <<a href="mailto:jadahl@gmail.com">jadahl@gmail.com</a>> wrote:<br>
> ><br>
> > > On Fri, Sep 19, 2014 at 11:00:21AM -0600, Jasper St. Pierre wrote:<br>
> > > > On Fri, Sep 19, 2014 at 2:54 AM, Pekka Paalanen <<a href="mailto:ppaalanen@gmail.com">ppaalanen@gmail.com</a>><br>
> > wrote:<br>
> > > ><br>
<br>
</span><div><div class="h5">> > > > > > non-sensible requests (set_cursor) on the additional wl_pointer,<br>
> > and<br>
> > > > > > potentially more as wl_pointer is extended. The alternatives that<br>
> > has<br>
> > > > > > come up in IRC discussions and backlog reading are:<br>
> > > > > ><br>
> > > > > >  1) Create a wl_relative_pointer that would replace wl_pointer,<br>
> > i.e.<br>
> > > > > >     have its own button, axis, etc events. This would solve all<br>
> > problems<br>
> > > > > >     related to versioning and wl_pointer being extended, but<br>
> > brings a<br>
> > > > > >     bunch of other problems for example we'd have to extend<br>
> > > > > >     wl_relative_pointer each time wl_pointer is extended to keep<br>
> > up, as<br>
> > > > > >     well as the issue where a wl_pointer is used in a interface or<br>
> > > > > >     request.<br>
> > > > ><br>
> > > > > Either you use wl_pointer and get extensions automatically even if<br>
> > you<br>
> > > > > don't want to, or you use a new interface that you have to extend<br>
> > > > > explicitly if you want the same as in wl_pointer. Two sides of a<br>
> > coin.<br>
> > > > ><br>
> > > > > As concluded in IRC, wl_pointer is not used as argument in any<br>
> > messages.<br>
> > ><br>
> > > But it is by wl_pointer_lock.lock_pointer, and who says it'll be the only<br>
> > > place its used as an argument?<br>
> ><br>
> > I think wl_seat might be a better argument. After all, all<br>
> > wl_pointer objects created from the same wl_seat in the same way<br>
> > will be identical. I think we should keep it that way, too.<br>
> ><br>
><br>
> That's a decent idea.  We could simply have<br>
> wl_pointer_lock.get_relative_pointer(seat) which creates a relative<br>
> pointer.  At that point, all the absolute pointers get a leave.  The<br>
> client, if it wants, can create multiple relative pointers.  Once all of<br>
> them are destroyed, the absolute pointers get an enter again, and off we go.<br>
<br>
</div></div>Mind, you are saying that simply a client creating the<br>
wl_relative_pointer will never get normal wl_pointer events as long as<br>
a wl_relative_pointer object exists. Is this a deliberate design<br>
choice? You seem to contradict it right below here with the leave<br>
events.<br>
<span class=""><br>
> One note though:  I don't think we want to try too hard to make multiple<br>
> pointers per seat seamless.  That's going to be an awkward case no matter<br>
> what we do.  We do need to make it well-defined.  I think that having all<br>
> the absolute pointers get a leave is a reasonable way to do that.  If the<br>
> compositor has to break the lock, all the relative pointers should get a<br>
> leave and absolute motion resumes.  (It probably won't get an absolute<br>
> enter right away.  The use probably went to an expose or alt-tab view so it<br>
> probably would have gotten an absolute leave anyway.)<br>
<br>
</span>Yes, that is a logical consequence of the "all <wl_* input device type><br>
objects for the same wl_seat and created the same way are<br>
identical." :-)<br>
<br>
It's actually a pretty logical implication from the globals: binding<br>
several times to a specific global name creates identical objects that<br>
all refer to the same thing, and act the same way at the same time.<br>
<br>
This might be a good design rule to set, don't you think?<br>
<span class=""><br>
> > > Hmm. Maybe we need to lock pointer given a seat instead. It'd change the<br>
> > > "mode" of the underlying pointer to be locked in its position, i.e. not<br>
> > > send any wl_pointer.motion events. Locking could then be ref counted, so<br>
> > > that as long as more than one wl_relative_pointer is alive, it's in<br>
> > > relative mode. Maybe thats unnecessarily complex though.<br>
> ><br>
> > We are distinguishing "wl_relative_pointer exists" from<br>
> > "pointer-lock is active", right?<br>
> ><br>
> > A question is: how does the client know when pointer-lock is<br>
> > active? I think we'd need something like<br>
> > wl_relative_pointer.enter/leave.<br>
> ><br>
><br>
> I'm still a fan of destroying relative pointers when not in use.  It's a<br>
> bit more protocol churn, but it makes it clear when they are/are not<br>
> active.  Maybe enter/leave will work, but I'm not convinced it's the right<br>
> way forward.  I'll have to give that a bit more thought before I could give<br>
> a real solid argument though.<br>
<br>
</span>Yes, of course. It's more a matter of how does the client know to<br>
destroy the wl_relative_pointer, when the compositor chooses to<br>
deactivate the pointer-lock. If there is a leave event for that, good.<br>
<br>
I think with this, it could actually make sense what you said above: no<br>
normal wl_pointer events as long as any wl_relative_pointer exists.<br>
This would strongly push app devs to destroy the wl_relative_pointer at<br>
the right time, I believe.<br>
<br>
And then we need a backup plan for clients that do not destroy it, for<br>
protocol definition completeness.<br></blockquote><div><br></div><div>If the server sends a "leave" it becomes inert and the server assumes the client will destroy it.  If the client doesn't then you leak an object but there's no real harm.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class=""><br>
> > > I can imagine that the second use case may very well be implemented both<br>
> > > with confinement and relative pointer events and as such relative<br>
> > > pointer events would need support both non-accelerated and accelerated<br>
> > > modes.<br>
> ><br>
> > IMHO that raises the question: should be have separate interfaces,<br>
> > or at least separate requests for asking raw relative motion vs.<br>
> > desktop-like relative (i.e. accelerated) motion?<br>
> ><br>
> > Or should wl_relative_pointer maybe deliver both at the same time?<br>
> ><br>
> > Maybe have separate requests for creating the wl_relative_pointer...<br>
> ><br>
><br>
> Both of those seem reasonable to me.<br>
<br>
</span>I would suggest we go with a separate request with "raw" input data.<br>
This way we can easily add it later. I suspect it may also need<br>
libinput additions. We don't even have a good definition of "raw" yet,<br>
either, AFAIK. Going with just the normal (accelerated) motion for now<br>
should be easier to try out.<br></blockquote><div><br></div><div>fine with me<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
Thanks,<br>
pq<br>
</blockquote></div><br></div></div>