wl_tablet draft v2

Peter Hutterer peter.hutterer at who-t.net
Wed Jul 16 17:36:34 PDT 2014


On Wed, Jul 16, 2014 at 08:08:29PM -0400, Lyude wrote:
> On Mon, 2014-07-14 at 13:25 -0700, Jason Gerecke wrote:
> > On Sun, Jul 13, 2014 at 12:17 PM, Lyude <thatslyude at gmail.com> wrote:
> > >                            wl_tablet specifications
> > >                                   Version 2
> > >
> > > General notes:
> > > - Many of the axis values in this are normalized to either 0-65535 or
> > >   (-65535)-65535. I would leave the axis values as-is since libinput reports
> > >   them as doubles, but since we only have 8 bits of precision we'd lose way
> > >   too many values. 65535 seemed like the best choice since it's the maximum
> > >   length of a signed short, it's a whole number, it's way higher then the
> > >   range of any of the axes (with the exception of X and Y, but these aren't
> > >   normalized anyway) and we can do just about any basic arithmetic with it
> > >   without having to worry about overflowing. Plus, all we have to do is
> > >   multiply the value by 65535 after we get it from libinput.
> > >
> > Speaking of overflow, what's Wayland's stance on whether the
> > compositor or client is responsible for dealing with it? I remember
> > Google mentioned that while working on Android's input driver, they
> > noticed some input devices could be "turned up to 11" and report
> > values beyond the kernel-indicated minimum/maximum. They decided to
> > punt the problem to app developers and documented that an app may e.g.
> > see 110% pressure if that's what the hardware reported. The question
> > is mostly academic since the Wacom kernel driver shouldn't be an
> > offender, but I might as well ask :)
> If it comes down to handling overflow, it'll probably be up to the
> client. I'm hoping it shouldn't though. The reason I choose 65535 in the
> first place is because it can more then cover any of the axes (other
> then the X and Y axes, but those aren't normalized anyway so I'm not
> worried about that), and it's difficult to accidentally overflow doing
> general arithmetic with a value of 65535. In most situations, addition,
> subtraction, multiplication, etc. shouldn't overflow. In fact you can
> (almost) square it at least once without overflowing. I'm assuming if
> there's a chance they might, then the client's doing something that the
> developers understand the risk of. It's just a number though, so we can
> always turn it down if we need to.

And as for the "turning up to 11", we can/must handle that in libinput
anyway, since that already provides normalized values. The simple approach
of clipping the first event sequence above the max and then rescaling
min/max to fit in the future will probably cater for most use-cases.

> > > Changes since the last version:
> > > - The surface argument is now only included in the proximity-in events
> > > - wl_tablet_manager has been added. Events no longer have a separate id
> > >   argument, and instead rely on wl_tablet objects to differentiate each tablet
> > >   from each other. A lot of it was copied from Peter's initial wl_tablet
> > >   proposal, but a few additions have been made; I've added an argument for
> > >   each of the axis events that a tablet supports to the device_added event.
> > > - Axis changes have been split up into a couple different events
> > > - Added a generic frame event. Because of the different kinds of click
> > >   emulations done with tablets, having each event packed into a frame is
> > >   convenient.
> > > - All of the starting values for each axis are provided as normal events in
> > >   the same frame as a proximity_in event. The same goes for the status of each
> > >   button on the tool. This makes the protocol a lot cleaner
> > >
> > > Definitions:
> > > - WL_TABLET_AXIS_MAX = 65535
> > > - WL_TABLET_AXIS_MIN = (-65535)
> > >
> > > Interfaces:
> > > - wl_tablet
> > >         Enumerators:
> > >         - wl_tablet_tool_type:
> > >                 - pen
> > >                 - eraser
> > >                 - brush
> > >                 - pencil
> > >                 - airbrush
> > >                 - finger
> > >                 - mouse
> > >                 - lens
> > >         - wl_tablet_button
> > >                 - stylus_1
> > >                 - stylus_2
> > >         - wl_tablet_button_state
> > >                 - pressed
> > >                 - released
> > >
> > >         Events:
> > >         - proximity_in
> > >           Sent when the tool comes into proximity above the client surface,
> > >           either by the tool coming into proximity or a tool being
> > >           in-proximity and moving to the client surface. If a tablet tool
> > >           makes contact with the tablet at the same time that the tool comes
> > >           into proximity, the proximity event comes first and the down event
> > >           comes afterwards.
> > >           A proximity_in event is immediately followed by the following
> > >           sequence of events in the same frame:
> > >                 - motion
> > >                 - down (if the tool is touching the tablet's surface at the
> > >                   same time it comes into proximity)
> > >                 - a button press event for each button held down on the tool
> > >                   as it comes into proximity
> > >                 - pressure (if supported by the tablet)
> > >                 - distance (if supported by the tablet)
> > >                 - tilt (if supported by the tablet)
> > >           This allows a client to get the starting values for all of the axes,
> > >           along with the starting coordinates of the tool, and the state of
> > >           each button on the tool.
> > >
> > >           Arguments:
> > >                 - Name: id
> > >                   Type: uint
> > >                   the id of the tablet sending this event.
> > >
> > >                 - Name: type
> > >                   Type: uint
> > >                   The type of tool that came into proximity, e.g. pen,
> > >                   airbrush, etc.
> > >
> > >                 - Name: serial
> > >                   Type: uint
> > >                   The serial number of the tool that came into proximity. On
> > >                   tablets where this isn't provided, this value will always be
> > >                   0.
> > >
> > >                 - Name: surface
> > >                   Type: object
> > >                   Interface: wl_surface
> > >                   The current surface the tablet tool is over
> > >
> > >                 - Name: time
> > >                   Type: uint
> > >                   The time of the event with millisecond granularity.
> > >
> > >         - 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.
> > 
> > How does this compare to the event sequence sent when a mouse leaves a
> > surface? If, for example, I hold down the left mouse button inside a
> > client and drag outside, does the client see a button-up event?
> > Sending the sequence above seems sane enough, but I wonder if there
> > are cases where it would cause an application to run into trouble.
> Currently, dragging with a mouse makes the mouse continue to report a
> button being held down to the surface it was originally on until it
> reaches the surface we're dragging an item too. Tablet's will most
> likely work the same way.

agree, this should copy the enter/leave semantics. The main reason we called
it proximity here is because unlike a mouse we can leave while being in the
middle of a surface in the vertical direction.

Cheers,
   Peter



More information about the wayland-devel mailing list