wl_tablet draft v2
Peter Hutterer
peter.hutterer at who-t.net
Thu Jul 17 22:30:07 PDT 2014
On Thu, Jul 17, 2014 at 11:48:03AM -0700, Bill Spitzak wrote:
> On 07/13/2014 12:17 PM, Lyude wrote:
>
> > - proximity_out
> > Sent whenever the tool leaves the proximity of the tablet or moves
> > out of the client surface. When the tool goes out of proximity,
> > button release events are sent before the initial proximity_out
> > event for each button that was held down before the tablet tool left
> > proximity. Following that, an up event will be sent if the tool was
> > in contact with the surface of the tablet before it went out of
> > proximity. In addition, axis updates always come before a
> > proximity-out event.
> > Arguments:
> > - Name: time
> > Type: uint
> > The time of the event with millisecond granularity.
>
> This design has the same bug as current enter/leave events (and X
> enter/leave, too): a client has to look ahead in the events if it wants to
> update highlighting without blinking. Basically it needs to see if the leave
> event is due to the pointer entering another surface it owns. Right now the
> only solution is to use a look-ahead api to peek at the events after a leave
> to see if there is an enter there. I think it would be nice if such
> look-ahead was not required by the most basic functions of a toolkit.
>
> To fix this, proximity-out needs some kind of indicator, such as a surface
> id, so that the client can know that a proximity-in event is coming, and
> thus it can ignore the proximity-out. If the new surface id is used (and
> zero for surfaces belonging to a different client) then only one event is
> needed: proximity-changed.
>
> > - down
> > Sent when the tool makes contact with the surface of the tablet.
> > Arguments:
> > - Name: time
> > Type: uint
> > The time of the event with millisecond granularity.
> >
> > - up
> > Sent when the tool is no longer making contact with the surface of
> > the tablet.
> > - Name: time
> > Type: uint
> > The time of the event with millisecond granularity.
> > - button
> > Sent whenever a button on the tool is pressed or released.
> > Arguments:
> > - Name: button
> > Type: uint
> > The button whose state has changed
> >
> > - Name: state
> > Type: uint
> > Whether the button was pressed or released
> >
> > - Name: time
> > Type: uint
> > The time of the event with millisecond granularity.
>
> Why not make the tip be a "button", so these events can be unified?
>
> A count of how many buttons are currently down would help a lot. It would
> allow recovery if an event is lost, and avoid the need for the careful
if an event is lost, you have a bug in the client and that shouldn't be
papered over. a number doesn't help you anyway, you still don't know _which_
buttons are down, so I really don't see the point of this.
if you get duplicate up or down events over the protocol that's a bug in the
compositor.
> matching of pairs of events which is consuming a lot of code in wayland and
> libinput. Such pair-enforcement is really complex and bug prone, so all
> toolkits I have seen ignore it, they just maintain a map of what buttons are
> down, and widgets are prepared to handle multiple up and down events for the
> same button. The same simplification can be done to wayland and libinput, by
> sending a count. Values of 0 (and 1 on push events) will allow a client to
> resync any errors in their map.
>
> >Ideas:
> >- wl_tablet_tool
> > This is something that hasn't really been decided on. Basically, the concept
> > of this is a lot similar to the concept of how tablet tools are currently
> > handled in libinput, we return a struct with all of the tool information
> > inside it, instead of just providing a separate tool type variable and
> > serial number we provide an entire object, which may or may not be easier
> > for the client to work with.
> > Enumerators:
> > - wl_tablet_tool_type:
> > - pen
> > - eraser
> > - brush
> > - pencil
> > - airbrush
> > - finger
> > - mouse
> > - lens
>
> It seems like each tool should be a different device. Ie the api should
> support the entry of two different tools, and the pushing of the tip of both
> of them. The above api does not, because the push event does not indicate
> which tool.
tablets don't have multiple tools in-prox at the same time, so the tool
currently in proximity is the one generating the event. If you swap from pen
to airbrush you get a prox out, then a prox in.
Cheers,
Peter
More information about the wayland-devel
mailing list