1 | use crate::{ffi, AsRaw, FromRaw}; |
2 | |
3 | /// Available tool types for a device with the `DeviceCapability::TabletTool` capability. |
4 | /// |
5 | /// The tool type defines the default usage of the tool as advertised by the |
6 | /// manufacturer. Multiple different physical tools may share the same tool type, e.g. a |
7 | /// Wacom Classic Pen, Wacom Pro Pen and a Wacom Grip Pen are all of type |
8 | /// `TabletToolType::Pen`. Use `TabletTool::tool_id` to get a specific model where |
9 | /// applicable. |
10 | /// |
11 | /// Note that on some device, the eraser tool is on the tail end of a pen device. On |
12 | /// other devices, e.g. MS Surface 3, the eraser is the pen tip while a button is held |
13 | /// down. |
14 | /// |
15 | /// ## Note |
16 | /// |
17 | /// The `TabletToolType` can only describe the default physical type of the device. For |
18 | /// devices with adjustable physical properties the tool type remains the same, i.e. |
19 | /// putting a Wacom stroke nib into a classic pen leaves the tool type as |
20 | /// `TabletToolType::Pen`. |
21 | #[derive (Debug, Clone, Copy, PartialEq, Eq, Hash)] |
22 | #[non_exhaustive ] |
23 | pub enum TabletToolType { |
24 | /// A generic pen. |
25 | Pen, |
26 | /// Eraser. |
27 | Eraser, |
28 | /// A paintbrush-like tool. |
29 | Brush, |
30 | /// Physical drawing tool, e.g. Wacom Inking Pen |
31 | Pencil, |
32 | /// An airbrush-like tool. |
33 | Airbrush, |
34 | /// A mouse bound to the tablet. |
35 | Mouse, |
36 | /// A mouse tool with a lens. |
37 | Lens, |
38 | /// A rotary device with positional and rotation data |
39 | #[cfg (feature = "libinput_1_14" )] |
40 | Totem, |
41 | } |
42 | |
43 | ffi_ref_struct! { |
44 | /// An object representing a tool being used by a device with the |
45 | /// `DeviceCapability::TabletTool` capability. |
46 | /// |
47 | /// Tablet events generated by such a device are bound to a specific tool rather than |
48 | /// coming from the device directly. Depending on the hardware it is possible to track |
49 | /// the same physical tool across multiple `Device`s, see |
50 | /// [Tracking unique tools](https://wayland.freedesktop.org/libinput/doc/latest/tablet-support.html#tablet-serial-numbers). |
51 | struct TabletTool, ffi::libinput_tablet_tool, ffi::libinput_tablet_tool_ref, ffi::libinput_tablet_tool_unref |
52 | } |
53 | |
54 | impl TabletTool { |
55 | ffi_func!( |
56 | /// Return the serial number of a tool. |
57 | /// |
58 | /// If the tool does not report a serial number, this function returns zero. |
59 | /// See [Tracking unique tools](https://wayland.freedesktop.org/libinput/doc/latest/tablet-support.html#tablet-serial-numbers) for details. |
60 | pub fn serial, ffi::libinput_tablet_tool_get_serial, u64); |
61 | ffi_func!( |
62 | /// Return the tool ID for a tool object. |
63 | /// |
64 | /// If nonzero, this number identifies the specific type of the tool with more |
65 | /// precision than the type returned in `tool_type`, |
66 | /// see [Vendor-specific tablet tool types](https://wayland.freedesktop.org/libinput/doc/latest/tablet-support.html#tablet-tool-types). |
67 | /// Not all tablets support a tool ID. |
68 | /// |
69 | /// Tablets known to support tool IDs include the Wacom Intuos 3, 4, 5, Wacom Cintiq |
70 | /// and Wacom Intuos Pro series. |
71 | pub fn tool_id, ffi::libinput_tablet_tool_get_tool_id, u64); |
72 | |
73 | /// Return the tool type for a tool object, |
74 | /// see [Vendor-specific tablet tool types](https://wayland.freedesktop.org/libinput/doc/latest/tablet-support.html#tablet-tool-types) |
75 | /// for details. |
76 | /// |
77 | /// A return value of `None` means the tool type is not known. |
78 | pub fn tool_type(&self) -> Option<TabletToolType> { |
79 | match unsafe { ffi::libinput_tablet_tool_get_type(self.as_raw_mut()) } { |
80 | ffi::libinput_tablet_tool_type_LIBINPUT_TABLET_TOOL_TYPE_PEN => { |
81 | Some(TabletToolType::Pen) |
82 | } |
83 | ffi::libinput_tablet_tool_type_LIBINPUT_TABLET_TOOL_TYPE_ERASER => { |
84 | Some(TabletToolType::Eraser) |
85 | } |
86 | ffi::libinput_tablet_tool_type_LIBINPUT_TABLET_TOOL_TYPE_BRUSH => { |
87 | Some(TabletToolType::Brush) |
88 | } |
89 | ffi::libinput_tablet_tool_type_LIBINPUT_TABLET_TOOL_TYPE_PENCIL => { |
90 | Some(TabletToolType::Pencil) |
91 | } |
92 | ffi::libinput_tablet_tool_type_LIBINPUT_TABLET_TOOL_TYPE_AIRBRUSH => { |
93 | Some(TabletToolType::Airbrush) |
94 | } |
95 | ffi::libinput_tablet_tool_type_LIBINPUT_TABLET_TOOL_TYPE_MOUSE => { |
96 | Some(TabletToolType::Mouse) |
97 | } |
98 | ffi::libinput_tablet_tool_type_LIBINPUT_TABLET_TOOL_TYPE_LENS => { |
99 | Some(TabletToolType::Lens) |
100 | } |
101 | #[cfg (feature = "libinput_1_14" )] |
102 | ffi::libinput_tablet_tool_type_LIBINPUT_TABLET_TOOL_TYPE_TOTEM => { |
103 | Some(TabletToolType::Totem) |
104 | } |
105 | _x => { |
106 | #[cfg (feature = "log" )] |
107 | log::warn!("Unknown `TabletToolType` returned by libinput: {}" , _x); |
108 | None |
109 | } |
110 | } |
111 | } |
112 | |
113 | /// Check if a tablet tool has a button with the passed-in code (see linux/input.h). |
114 | pub fn has_button(&self, button: u32) -> bool { |
115 | unsafe { ffi::libinput_tablet_tool_has_button(self.as_raw_mut(), button) != 0 } |
116 | } |
117 | |
118 | ffi_func!( |
119 | /// Return whether the tablet tool supports distance. |
120 | pub fn has_distance, ffi::libinput_tablet_tool_has_distance, bool); |
121 | ffi_func!( |
122 | /// Return whether the tablet tool supports pressure. |
123 | pub fn has_pressure, ffi::libinput_tablet_tool_has_pressure, bool); |
124 | ffi_func!( |
125 | /// Return whether the tablet tool supports z-rotation.v |
126 | pub fn has_rotation, ffi::libinput_tablet_tool_has_rotation, bool); |
127 | ffi_func!( |
128 | /// Return whether the tablet tool has a slider axis. |
129 | pub fn has_slider, ffi::libinput_tablet_tool_has_slider, bool); |
130 | ffi_func!( |
131 | /// Return whether the tablet tool supports tilt. |
132 | pub fn has_tilt, ffi::libinput_tablet_tool_has_tilt, bool); |
133 | ffi_func!( |
134 | /// Return whether the tablet tool has a relative wheel. |
135 | pub fn has_wheel, ffi::libinput_tablet_tool_has_wheel, bool); |
136 | ffi_func!( |
137 | /// Returns `true` if the physical tool can be uniquely identified by libinput, or |
138 | /// `false` otherwise. |
139 | /// |
140 | /// If a tool can be uniquely identified, keeping a reference to the tool allows |
141 | /// tracking the tool across proximity out sequences and across compatible tablets. |
142 | /// See [Tracking unique tools](https://wayland.freedesktop.org/libinput/doc/latest/tablet-support.html#tablet-serial-numbers) |
143 | /// for more details. |
144 | pub fn is_unique, ffi::libinput_tablet_tool_is_unique, bool); |
145 | #[cfg (feature = "libinput_1_14" )] |
146 | ffi_func!( |
147 | /// Returns whether the tablet tool has a ellipsis major and minor. |
148 | /// |
149 | /// Where the underlying hardware only supports one of either major or minor, |
150 | /// libinput emulated the other axis as a cicular contact, i.e. major == minor |
151 | /// for all values of major. |
152 | pub fn tablet_tool_has_size, ffi::libinput_tablet_tool_has_size, bool); |
153 | } |
154 | |