wl_tablet draft v2

Lyude thatslyude at gmail.com
Sun Jul 13 12:17:05 PDT 2014


                           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.

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.
	  Arguments:
		- Name: time
		  Type: uint
		  The time of the event with millisecond granularity.

	- 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.

	- motion
	  Sent whenever the tool moves.
	  	- Name: x
		  Type: fixed
		  Surface relative x coordinate

		- Name: y
		  Type: fixed
		  Surface relative y coordinate

		- Name: time
		  Type: uint
		  The time of the event with millisecond granularity.

	- distance
	  Sent whenever the distance of the tool from the tablet changes. The
	  value of the axis is normalized from 0 to WL_TABLET_AXIS_MAX.
	  	- Name: distance
		  Type: fixed
		  The new distance of the tool

		- Name: time
		  Type: uint
		  The time of the event with millisecond granularity.

	- pressure
	  Sent whenever the pressure of the tool tablet changes. The value of
	  the axis is normalized from 0 to WL_TABLET_AXIS_MAX.
	  	- Name: pressure
		  Type: fixed
		  The new pressure value for the tool

		- Name: time
		  Type: uint
		  The time of the event with millisecond granularity.

	- tilt
	  Sent whenever the tilt of the tool changes. Each axis value is
	  normalized from WL_TABLET_AXIS_MIN to WL_TABLET_AXIS_MAX.
	  	- Name: tilt_x
		  Type: fixed
		  The X tilt axis of the tool

		- Name: tilt_y
		  Type: fixed
		  The Y tilt axis of the tool

		- 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.

	- frame
	  Indicates the end of a sequence of device events

	- device_removed
	  Sent when this tablet has been removed from the host

Requests:
	- release
	  Releases the wl_tablet object, resulting in the reference count
	  being decremented by one. When the reference count reaches 0, the
	  wl_tablet object will be destroyed.

- wl_tablet_manager
	Enumerators:
	- tablet_type:
		- external
		  The drawing tablet is external and lacks a display, like the
		  Wacom Intuos series.
		- internal
		  The tablet is part of a display that is built into the
		  computer, like the ones built into the Microsoft Surface.
		- display
		  The tablet is part of a display that is connected to the
		  computer externally, like the Wacom Cintiq series.
	- axis_flag
	  Used along with the supported_axes bitfield to indicate which
	  additional axes a tablet can support
		- tilt
		- pressure
		- distance

	Events:
	- device_added
	  Sent when a new tablet has been connected to the host.
	  Arguments:
	  	- Name: id
		  Type: new_id
		  Interface: wl_tablet
		  The new wl_tablet object for the tablet

		- Name: name
		  Type: string
		  The name of the tablet device

		- Name: vid
		  Type: uint
		  The vendor id of the tablet

		- Name: pid
		  Type: uint
		  The product id of the tablet

		- Name: type
		  Type: uint
		  The type of tablet. Uses values from
		  wl_tablet_manager::tablet_type

		- Name: extra_axes
		  Type: uint
		  A bitfield containing information on which extra axes are
		  supported.

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
	Events:
		- Name: removed
		  Sent when a tool has been removed from the system.

  Using this would require us changing the proximity_in event to provide the
  object ID of the tool currently in use, instead of the serial number and
  type.
  In addition, we would have to add this event to wl_tablet_manager:
	- Name: tool_added
	  Sent when a new tool is being used with one of the tablets connected
	  to the system
	  Arguments:
	  	- Name: id
		  Type: new_id
		  Interface: wl_tablet_tool
		  The ID of the new tool

	  	- Name: type
		  Type: uint
		  Returns the tool's physical type

		- Name: serial
		  Type: uint
		  Returns the tool's serial numbers. On tablets where this is
		  not supported, this will always be 0.



More information about the wayland-devel mailing list