On Tue, Jan 05, 2016 at 09:21:27AM +0800, Jonas Ådahl wrote:
> On Mon, Jan 04, 2016 at 02:21:37PM +1000, Peter Hutterer wrote:
> > On Fri, Jan 01, 2016 at 04:54:14PM +0000, Daniel Stone wrote:
> > > Hi,
> > > A couple of (belated) comments ...
> > > 
> > > On 3 December 2015 at 07:28, Jonas Ådahl <jad...@gmail.com> wrote:
> > > > +    <request name="lock_pointer">
> > > > +      <description summary="lock pointer to a position">
> > > > +       The lock_pointer request lets the client request to disable 
> > > > movements of
> > > > +       the virtual pointer (i.e. the cursor), effectively locking the 
> > > > pointer
> > > > +       to a position. This request may not take effect immediately; in 
> > > > the
> > > > +       future, when the compositor deems implementation-specific 
> > > > constraints
> > > > +       are satisfied, the pointer lock will be activated and the 
> > > > compositor
> > > > +       sends a locked event.
> > > > +
> > > > +       The protocol provides no guarantee that the constraints are ever
> > > > +       satisfied, and does not require the compositor to send an error 
> > > > if the
> > > > +       constraints cannot ever be satisfied. It is thus possible to 
> > > > request a
> > > > +       lock that will never activate.
> > > > +
> > > > +       There may not be another lock of any kind requested or active 
> > > > on the
> > > > +        surface for the seat when requesting a lock. If there is, an 
> > > > error will
> > > > +        be raised. See general pointer lock documentation for more 
> > > > details.
> > > > +
> > > > +       The intersection of the region passed with this request and the 
> > > > input
> > > > +       region of the surface is used to determine where the pointer 
> > > > must be
> > > > +       in order for the lock to activate. It is up to the compositor 
> > > > whether to
> > > > +       warp the pointer or require some kind of user interaction for 
> > > > the lock
> > > > +       to activate. If the region is null the surface input region is 
> > > > used.
> > > > +
> > > > +       A surface may receive pointer focus without the lock being 
> > > > activated.
> > > > +
> > > > +       The request will create a new object wp_locked_pointer which is 
> > > > used to
> > > > +       interact with the lock as well as receive updates about its 
> > > > state. See
> > > > +       the the description of wp_locked_pointer for further 
> > > > information.
> > > > +
> > > > +       Note that while a pointer is locked, the wl_pointer objects of 
> > > > the
> > > > +       corresponding seat will not emit any wl_pointer.motion events, 
> > > > but
> > > > +       relative motion events will still be emitted via 
> > > > wp_relative_pointer
> > > > +       objects of the same seat. wl_pointer.axis and wl_pointer.button 
> > > > events
> > > > +       are unaffected.
> > > > +      </description>
> > > > +
> > > > +      <arg name="id" type="new_id" interface="zwp_locked_pointer_v1"/>
> > > > +      <arg name="surface" type="object" interface="wl_surface"
> > > > +          summary="surface to lock pointer to"/>
> > > > +      <arg name="seat" type="object" interface="wl_seat"
> > > > +          summary="seat where the pointer should be locked"/>
> > > > +      <arg name="region" type="object" interface="wl_region" 
> > > > allow-null="true"
> > > > +          summary="region of surface"/>
> > > > +    </request>
> > > > +
> > > > +    <request name="confine_pointer">
> > > > +      <description summary="confine pointer to a region">
> > > > +       The confine_pointer request lets the client request to confine 
> > > > the
> > > > +       pointer cursor to a given region. This request may not take 
> > > > effect
> > > > +       immediately; in the future, when the compositor deems 
> > > > implementation-
> > > > +       specific constraints are satisfied, the pointer confinement 
> > > > will be
> > > > +       activated and the compositor sends a confined event.
> > > > +
> > > > +       The intersection of the region passed with this request and the 
> > > > input
> > > > +       region of the surface is used to determine where the pointer 
> > > > must be
> > > > +       in order for the confinement to activate. It is up to the 
> > > > compositor
> > > > +       whether to warp the pointer or require some kind of user 
> > > > interaction for
> > > > +       the confinement to activate. If the region is null the surface 
> > > > input
> > > > +       region is used.
> > > > +
> > > > +       The request will create a new object wp_confined_pointer which 
> > > > is used
> > > > +       to interact with the confinement as well as receive updates 
> > > > about its
> > > > +       state. See the the description of wp_confined_pointer for 
> > > > further
> > > > +       information.
> > > > +      </description>
> > > > +
> > > > +      <arg name="id" type="new_id" 
> > > > interface="zwp_confined_pointer_v1"/>
> > > > +      <arg name="surface" type="object" interface="wl_surface"
> > > > +          summary="surface to lock pointer to"/>
> > > > +      <arg name="seat" type="object" interface="wl_seat"
> > > > +          summary="seat where the pointer should be locked"/>
> > > > +      <arg name="region" type="object" interface="wl_region" 
> > > > allow-null="true"
> > > > +          summary="region of surface"/>
> > > > +    </request>
> > > > +  </interface>
> > > 
> > > I almost wonder if we couldn't make peoples' lives easier by merging
> > > locking and confinement into a single interface, adding a bool for
> > > whether or not to allow pointer movement (confine) or not (lock). Or
> > > perhaps, rather than a bool, we could add an allow-null
> > > wp_relative_pointer argument instead: gives you lock if non-null, or
> > > confine if null.
> > 
> > you get a much less expressive API, less checking, etc. for a fairly minimal
> > benefit. Furthermore, any extension to *either/or* the lock/confine
> > interface would need to handle the appropriate NULL cases for the other
> > interface. Right now we can easily add a locking-specific request without
> > messing up the logic of the confinement, and vice versa.
> > 
> > I don't think merging the two is a good long-term strategy.
> > 
> > > Also, for symmetry with wp_relative_pointer, should this take a
> > > wl_pointer instead of wl_seat?
> > 
> > you'd be restricting locking and confinement to a pointer device, with a
> > wl_seat you can confine and lock devices that are not wl_pointer devices,
> > e.g. a wl_tablet tool in relative mode.
> 
> Then again... how would a single "lock" request deal with multiple
> tablet pointers? Seems we would need a request per device, i.e.
> lock_pointer(wl_pointer) and a lock_tablet_pointer(wp_tablet). So maybe
> its best to make lock/confine take a wl_pointer to begin with.

I was about to make an argument against this and then I realised that the
reasoning here is the same as a few paragraphs above where we both agree
that separate interfaces is better. So now I'm out of arguments, wl_pointer
it is :)

Cheers,
   Peter


> > the "pointer" vs "wl_pointer" ambiguity isn't helping here, I admit.
> > 
> > > > +  <interface name="zwp_locked_pointer_v1" version="1">
> > > > +    <description summary="receive relative pointer motion events">
> > > > +      The wp_locked_pointer interface represents a locked pointer 
> > > > state.
> > > > +
> > > > +      While the lock of this object is active, the wl_pointer objects 
> > > > of the
> > > > +      associated seat will not emit any wl_pointer.motion events.
> > > > +
> > > > +      This object will send the event 'locked' when the lock is 
> > > > activated.
> > > > +      Whenever the lock is activated, it is guaranteed that the locked 
> > > > surface
> > > > +      will already have received pointer focus and that the pointer 
> > > > will be
> > > > +      within the region passed to the request creating this object.
> > > > +
> > > > +      To unlock the pointer, send the destroy request. This will also 
> > > > destroy
> > > > +      the wp_locked_pointer object.
> > > > +
> > > > +      If the compositor decides to unlock the pointer the unlocked 
> > > > event is
> > > > +      sent. The wp_locked_pointer object is at this point defunct and 
> > > > should be
> > > > +      destroyed.
> > > 
> > > Egads. :( This is a bit hostile - what's the harm in allowing latent
> > > objects to remain? To my mind, once a previously-locked/confined
> > > wp_{locked,confined}_pointer object is unlocked, it is for all intents
> > > and purposes the same as one which just hasn't yet been activated. 
> > 
> > what happens whe the wl_pointer goes away on the wl_seat? does the client
> > expect the wp_locked_pointer object to hang around and reattach to the new
> > pointer should it come back on the seat?
> > see the mess with documenting the capabilities and lifetime of wl_pointer
> > objects, forcing this object to be dead avoids all that for very little
> > cost.
> > 
> > Cheers,
> >    Peter
> > 
> > > It
> > > also introduces an annoying race where if you recreate the object just
> > > after you receive focus (not unlikely for transient loss of focus,
> > > e.g. cancelled Alt-Tab or temporary notifications ... ?), then you'll
> > > receive a different event stream to if you won the race.
> > > 
> > > There shouldn't be any need the event to prompt destruction anyway, if
> > > you define the conditions under which a client must destroy more
> > > clearly: i.e. when the wp_relative_pointer (for locks) or
> > > wl_pointer/wl_seat (for confinement) is destroyed, or when the
> > > wl_surface is destroyed.
> > > 
> > > > +      If the surface the lock was requested on is destroyed and the 
> > > > lock is not
> > > > +      yet activated, the wp_locked_pointer object is now defunct and 
> > > > must be
> > > > +      destroyed.
> > > 
> > > I think you can delete '... and the lock is not yet activated',
> > > assuming that the intention here was just to make sure that people
> > > process outstanding events before they destroy the object. If they've
> > > deleted the surface, presumably any input events are going to be
> > > discarded as being meaningless anyway.
> > > 
> > > > +    <request name="set_region">
> > > > +      <description summary="set a new lock region">
> > > > +       Set a new region used to lock the pointer.
> > > > +
> > > > +       The new lock region is double-buffered. The new lock region will
> > > > +       only take effect when the associated surface gets its pending 
> > > > state
> > > > +       applied. See wl_surface.commit for details.
> > > > +
> > > > +       The new region has no effect on a lock that has already been 
> > > > activated.
> > > > +
> > > > +       For details about the lock region, see wp_locked_pointer.
> > > > +      </description>
> > > > +
> > > > +      <arg name="region" type="object" interface="wl_region" 
> > > > allow-null="true"
> > > > +          summary="region of surface"/>
> > > > +    </request>
> > > 
> > > If unlocked/unconfined didn't require destruction and recreation of
> > > the object (as above), the wording of 'new region has no effect' would
> > > become ambiguous here: it could mean 'this state is double-buffered on
> > > lock/confine activation state and the update will be applied the next
> > > time the region is unlocked', or 'any changes requested whilst a lock
> > > is active will be discarded'. The latter reading makes it unreliable,
> > > and the former makes implementing it more of a pain.
> > > 
> > > > +    <event name="locked">
> > > > +      <description summary="lock activation event">
> > > > +       Notification that the pointer lock of this seat's pointer is 
> > > > activated.
> > > > +      </description>
> > > > +    </event>
> > > > +
> > > > +    <event name="unlocked">
> > > > +      <description summary="lock deactivation event">
> > > > +       Notification that the pointer lock of seat's pointer is no 
> > > > longer
> > > > +       active. This object is now defunct and should be destroyed.
> > > > +      </description>
> > > > +    </event>
> > > 
> > > I think these (and ditto for confinement) need clarification of their
> > > relationship to wl_pointer::{enter,leave}. Are they still sent? What
> > > about in corner cases such as destroying a currently-active
> > > lock/confinement region, i.e. where focus is retained and ownership
> > > thus passes to wl_pointer?
> > > 
> > > Other than that, looks pretty good to me! Should've reviewed this earlier 
> > > ... :\
> > > 
> > > Cheers,
> > > Daniel
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to