On Thursday, June 26, 2014, Peter Hutterer <<a href="mailto:peter.hutterer@who-t.net">peter.hutterer@who-t.net</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On Thu, Jun 26, 2014 at 09:48:37AM +0300, Pekka Paalanen wrote:<br>
> Hi,<br>
><br>
> it seems you forgot to reply-to-all, so I have re-added everyone and<br>
> not trimmed the quotation.<br>
><br>
> On Wed, 25 Jun 2014 18:37:08 -0400<br>
> Lyude <<a href="javascript:;" onclick="_e(event, 'cvml', 'thatslyude@gmail.com')">thatslyude@gmail.com</a>> wrote:<br>
><br>
> > On Wed, 2014-06-25 at 15:19 +0300, Pekka Paalanen wrote:<br>
> > > On Tue, 24 Jun 2014 21:56:09 -0400<br>
> > > Chandler Paul <<a href="javascript:;" onclick="_e(event, 'cvml', 'thatslyude@gmail.com')">thatslyude@gmail.com</a>> wrote:<br>
> > ><br>
> > > > Hello! As you all know I've been working on adding drawing tablet<br>
> > > > support to the Wayland protocol. Now that we've added support for<br>
> > > > tablets to libinput, the next step is writing the actual protocol that<br>
> > > > will be implemented by the compositor. Following this blurb is the<br>
> > > > current draft of the tablet protocol we have. Feel free to critique it.<br>
> > > ><br>
> > > > Cheers,<br>
> > > >         Lyude<br>
> > > ><br>
> > > > ----------------------------------------------------------------------------<br>
> > > ><br>
> > > >                            wl_tablet specifications<br>
> > > ><br>
> > > > General notes:<br>
> > > > - Many of the axis values in this are normalized to either 0-65535 or<br>
> > > >   (-65535)-65535. I would leave the axis values as-is since libinput reports<br>
> > > >   them as doubles, but since we only have 8 bits of precision we'd lose way<br>
> > > >   too many values. 65535 seemed like the best choice since it's the maximum<br>
> > > >   length of a signed short, it's a whole number, it's way higher then the<br>
> > > >   range of any of the axes (with the exception of X and Y, but these aren't<br>
> > > >   normalized anyway) and we can do just about any basic arithmatic with it<br>
> > > >   without having to worry about overflowing. plus, all we have to do is<br>
> > > >   multiply the value by 65535 after we get it from libinput.<br>
> > > ><br>
> > > > Definitions:<br>
> > > > - WL_TABLET_AXIS_MAX = 65535<br>
> > > > - WL_TABLET_AXIS_MIN = (-65535)<br>
> > > ><br>
> > > > Enumerators:<br>
> > > > - wl_tablet_axis:<br>
> > > >         - WL_TABLET_AXIS_X<br>
> > > >         - WL_TABLET_AXIS_Y<br>
> > > >           Represents the X and Y axes respectively. Only used in bitfields to<br>
> > > >           indicate whether or not they've changed since the last event.<br>
> > > ><br>
> > > >         - WL_TABLET_AXIS_DISTANCE<br>
> > > >           Represents the distance axis on a tablet. Normalized from 0 to<br>
> > > >           WL_TABLET_AXIS_MAX. For tablets that do not support reporting the<br>
> > > >           distance, this will always be 0.<br>
> > > ><br>
> > > >         - WL_TABLET_AXIS_PRESSURE<br>
> > > >           Represents the pressure axis on a tablet. Normalized from 0 to<br>
> > > >           WL_TABLET_AXIS_MAX. For tablets that do not support reporting the<br>
> > > >           pressure, this will always be WL_TABLET_AXIS_MAX.<br>
> > > ><br>
> > > >         - WL_TABLET_AXIS_TILT_VERTICAL<br>
> > > >         - WL_TABLET_AXIS_TILT_HORIZONTAL<br>
> > > >           Each represents the vertical and horizontal tilt axes respectfully.<br>
> > > >           Normalized from WL_TABLET_AXIS_MIN to WL_TABLET_AXIS_MAX. For<br>
> > > >           tablets that do not support this, this value will always be 0.<br>
> > > ><br>
> > > >         - WL_TABLET_AXIS_CNT<br>
> > > >           Represents the number of axes<br>
> > > > - wl_tablet_tool_type:<br>
> > > >         - pen<br>
> > > >         - eraser<br>
> > > >         - brush<br>
> > > >         - pencil<br>
> > > >         - airbrush<br>
> > > >         - finger<br>
> > > >         - mouse<br>
> > > >         - lens<br>
> > > > - wl_tablet_button_state<br>
> > > >         - pressed<br>
> > > >         - released<br>
> > > ><br>
> > > > Events:<br>
> > > > - proximity_in<br>
> > > >   Sent when the tool comes into proximity above the client surface, either by<br>
> > > >   the tool coming into proximity or a tool being in-proximity and moving to<br>
> > > >   the client surface. If a tablet tool makes contact with the tablet at the<br>
> > > >   same time that the tool comes into proximity, the proximity event comes<br>
> > > >   first and the down event comes afterwards.<br>
> > > >   Arguments:<br>
> > > >         - Name: id<br>
> > > >           Type: uint<br>
> > > >           the id of the tablet sending this event.<br>
> > > ><br>
> > > >         - Name: type<br>
> > > >           Type: uint<br>
> > > >           The type of tool that came into proximity, e.g. pen, airbrush, etc.<br>
> > > ><br>
> > > >         - Name: serial<br>
> > > >           Type: uint<br>
> > > >           The serial number of the tool that came into proximity. On tablets<br>
> > > >           where this isn't provided, this value will always be 0.<br>
> > > ><br>
> > > >         - Name: x<br>
> > > >           Type: fixed<br>
> > > >           Surface relative x coordinate<br>
> > > ><br>
> > > >         - Name: y<br>
> > > >           Type: fixed<br>
> > > >           Surface relative y coordinate<br>
> > > ><br>
> > > >         - Name: surface<br>
> > > >           Type: object<br>
> > > >           Interface: wl_surface<br>
> > > >           The current surface the tablet tool is over<br>
> > > ><br>
> > > >         - Name: time<br>
> > > >           Type: uint<br>
> > > >           The time of the event with millisecond granularity.<br>
> > > ><br>
> > > >         - Name: axes<br>
> > > >           Type: array<br>
> > > >           The current values of each of the tablet axes starting at<br>
> > > >           WL_TABLET_AXIS_DISTANCE. The length of the array is equal to the<br>
> > > >           number of axes that are reported. Any axes >= WL_TABLET_AXIS_CNT<br>
> > > >           must be ignored. The size of the array remains fixed for the<br>
> > > >           lifetime of the tablet.<br>
> > > ><br>
> > > > - proximity_out<br>
> > > >   Send whenever the tool leaves the proximity of the tablet or moves out of<br>
> > > >   the client surface. When the tool goes out of proximity, a set of button<br>
> > > >   release events are sent before the initial proximity_out event for each<br>
> > > >   button that was held down before the tablet tool left proximity. In<br>
> > > >   addition, axis updates always come before a proximity-out event.<br>
> > > >   Arguments:<br>
> > > >         - Name: id<br>
> > > >           Type: uint<br>
> > > >           The id of the tablet sending this event.<br>
> > > ><br>
> > > >         - Name: time<br>
> > > >           Type: uint<br>
> > > >           The time of the event with millisecond granularity.<br>
> > > ><br>
> > > > - axis<br>
> > > >   Sent whenever an axis on the tool changes. This can include movement on the<br>
> > > >   X and Y axis.<br>
> > > >   Arguments:<br>
> > > >         - Name: id<br>
> > > >           Type: uint<br>
> > > >           The id of the tablet sending this event.<br>
> > > ><br>
> > > >         - Name: x<br>
> > > >           Type: fixed<br>
> > > >           Surface relative x coordinate<br>
> > > ><br>
> > > >         - Name: y<br>
> > > >           Type: fixed<br>
> > > >           Surface relative y coordinate<br>
> > > ><br>
> > > >         - Name: surface<br>
> > > >           Type: object<br>
> > > >           Interface: wl_surface<br>
> > > >           The current surface the tablet tool is over<br>
> > ><br>
> > > How about using enter/leave events telling the client which wl_surface<br>
> > > the input device is targeting? That way you don't have to repeat the<br>
> > > wl_surface argument in every event<br>
> > I did originally have enter/leave events in the protocol but we ended up<br>
> > removing them because they end up being somewhat redundant. When you<br>
> > think about it, there's not much use in differentiating the two. Most<br>
> > clients are only really going to care about whether or not the tool is<br>
> > on their surface, not whether or not it's in proximity while it's on<br>
> > their surface. And of course when the tool is out of proximity on the<br>
> > surface, there's no useful data it can send to the tablet. In that case<br>
> > we might as well get rid of the proximity_(in/out) stuff and just use<br>
> > enter and leave to minimize the amount we have to add to the protocol. I<br>
> > also don't think including the surface in all of the enter/leave events<br>
> > is too big of a deal.<br>
><br>
> Making proximity_in/out work as enter/leave would be fine by me, if it<br>
> works for you. I'm just looking to reduce the amount of duplicated data<br>
> in the most heavily used events sent over the wire.<br>
<br>
Lyude: what Pekka is referring to here is to have the surface _only_ in the<br>
proximity events, and then skipping the surface field for motion/button<br>
events.<br>
<br>
> I only now realized that you can have several different tools on the<br>
> same tablet. You'd probably have per-tool enter/leave rather than<br>
> per-tablet, sort of depending on how (or if?) the tablet maps to the<br>
> screen.<br>
<br>
Indeed, and that is why we dropped enter/leave in favour of prox in/out. To<br>
the client it doesn't really matter if we move off the surface by removing<br>
the tool, or off the surface by moving into another surface.<br>
<br>
And those prox in/out events have the tool ID, so they're technically<br>
per-tool and per-tablet already. Only one tool can be in proximity at a<br>
time, but you can have two tools in prox on two different tablets.<br>
<br>
> Does the tablet map to the screen in a way that you can use the tablet<br>
> address any window on screen at any time like a touchscreen does, or<br>
> would it be more appropriate to have the whole tablet surface assigned<br>
> to "the current" window and let the client use the whole range of the<br>
> tablet instead of just the sub-region determined by its window on<br>
> screen? (That is probably a stupid question, but would have you<br>
> considered if the latter way had any solid benefits?)</blockquote><div><br></div><div>With my experience, mapping whole tablet to a window or a specific display area is preferred. That is how mapping works on Windows and Mac too.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">GIMP used to/still has that feature, I don't know how common it's being used<br>
(need to chase this up). We had that in the original draft but decided to<br>
remove it from this version, it's something we can add later with little<br>
changes.</blockquote><div><br></div><div>As Jason mentioned, mapping to a window in Gimp is hardly usable. That was partially because Gimp did not process mapping well; partially because tablet to specific display area mapping was not properly supported.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">the common use-case right now is having the tablet mapped to either all<br>
screens or a single screen.</blockquote><div><br></div><div>This common use case is for normal users. Artists/drawing app users prefer to map whole tablet to their whole drawing areas. They use mode toggle to reach objects/button/functions outside of the drawing area.</div>
<div><br></div><div>Ping</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">> > Of course though, if you know of uses where a client would want to know<br>

> > when the tool's gone out of proximity without leaving the surface and<br>
> > couldn't just settle with a single event for both, feel free to bring it<br>
> > up.<br>
><br>
> I have never used tablets, so I can't imagine real use cases. What<br>
> happens if you press a physical button on a tool that is out of<br>
> proximity? Should it be ignored completely, or should it still be<br>
> delivered to the app?<br>
<br>
The HW doesn't know about the event then. The best you can do is move into<br>
proximity with a button already down, but that'll just trigger a button<br>
press anyway.<br>
<br>
Cheers,<br>
   Peter<br>
</blockquote>