Mercurial > tablet-emu
annotate src/main.rs @ 2:39f87ef69b2a
Add support for selecting tools.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Fri, 09 Oct 2020 16:04:59 +0200 |
parents | 6dbe2bbeef70 |
children | 72e63d6a3f8a |
rev | line source |
---|---|
0 | 1 use gio::prelude::*; |
2 use gtk::prelude::*; | |
3 | |
4 use std::env::args; | |
5 use std::fs::{File, OpenOptions}; | |
6 use std::io::ErrorKind; | |
7 use std::sync::{Arc, Mutex}; | |
8 | |
9 use input_linux::{ | |
10 sys::input_event, sys::timeval, AbsoluteAxis, AbsoluteInfo, AbsoluteInfoSetup, EventKind, | |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
11 InputId, InputProperty, Key, MiscKind, SynchronizeKind, UInputHandle, |
0 | 12 }; |
13 | |
14 const WIDTH: i32 = 320; | |
15 const HEIGHT: i32 = 180; | |
16 | |
17 const MAX_X: i32 = 69920; | |
18 const MAX_Y: i32 = 39980; | |
19 | |
20 fn create_uinput_device() -> std::io::Result<UInputHandle<File>> { | |
21 let file = OpenOptions::new().write(true).open("/dev/uinput")?; | |
22 let dev = UInputHandle::new(file); | |
23 | |
24 dev.set_evbit(EventKind::Synchronize)?; | |
25 dev.set_evbit(EventKind::Key)?; | |
26 dev.set_evbit(EventKind::Absolute)?; | |
27 dev.set_evbit(EventKind::Misc)?; | |
28 dev.set_keybit(Key::ButtonToolPen)?; | |
29 dev.set_keybit(Key::ButtonToolRubber)?; | |
30 dev.set_keybit(Key::ButtonToolBrush)?; | |
31 dev.set_keybit(Key::ButtonToolPencil)?; | |
32 dev.set_keybit(Key::ButtonToolAirbrush)?; | |
33 dev.set_keybit(Key::ButtonTouch)?; | |
34 dev.set_keybit(Key::ButtonStylus)?; | |
35 dev.set_keybit(Key::ButtonStylus2)?; | |
36 dev.set_keybit(Key::ButtonStylus3)?; | |
37 dev.set_mscbit(MiscKind::Serial)?; | |
38 dev.set_propbit(InputProperty::Direct)?; | |
39 | |
40 dev.set_absbit(AbsoluteAxis::X)?; | |
41 dev.set_absbit(AbsoluteAxis::Y)?; | |
42 dev.set_absbit(AbsoluteAxis::Z)?; | |
43 dev.set_absbit(AbsoluteAxis::Wheel)?; | |
44 dev.set_absbit(AbsoluteAxis::Pressure)?; | |
45 dev.set_absbit(AbsoluteAxis::Distance)?; | |
46 dev.set_absbit(AbsoluteAxis::TiltX)?; | |
47 dev.set_absbit(AbsoluteAxis::TiltY)?; | |
48 dev.set_absbit(AbsoluteAxis::Misc)?; | |
49 | |
50 let id = InputId { | |
51 bustype: 3, | |
52 vendor: 0x56a, | |
53 product: 0x350, | |
54 version: 0xb, | |
55 }; | |
56 | |
57 let x = AbsoluteInfoSetup { | |
58 axis: AbsoluteAxis::X, | |
59 info: AbsoluteInfo { | |
60 value: 0, | |
61 minimum: 0, | |
62 maximum: MAX_X, | |
63 fuzz: 0, | |
64 flat: 0, | |
65 resolution: 200, | |
66 }, | |
67 }; | |
68 let y = AbsoluteInfoSetup { | |
69 axis: AbsoluteAxis::Y, | |
70 info: AbsoluteInfo { | |
71 value: 0, | |
72 minimum: 0, | |
73 maximum: MAX_Y, | |
74 fuzz: 0, | |
75 flat: 0, | |
76 resolution: 200, | |
77 }, | |
78 }; | |
79 let z = AbsoluteInfoSetup { | |
80 axis: AbsoluteAxis::Z, | |
81 info: AbsoluteInfo { | |
82 value: 0, | |
83 minimum: -900, | |
84 maximum: 899, | |
85 fuzz: 0, | |
86 flat: 0, | |
87 resolution: 287, | |
88 }, | |
89 }; | |
90 let wheel = AbsoluteInfoSetup { | |
91 axis: AbsoluteAxis::Wheel, | |
92 info: AbsoluteInfo { | |
93 value: 0, | |
94 minimum: 0, | |
95 maximum: 2047, | |
96 fuzz: 0, | |
97 flat: 0, | |
98 resolution: 0, | |
99 }, | |
100 }; | |
101 let pressure = AbsoluteInfoSetup { | |
102 axis: AbsoluteAxis::Pressure, | |
103 info: AbsoluteInfo { | |
104 value: 0, | |
105 minimum: 0, | |
106 maximum: 8196, | |
107 fuzz: 0, | |
108 flat: 0, | |
109 resolution: 0, | |
110 }, | |
111 }; | |
112 let distance = AbsoluteInfoSetup { | |
113 axis: AbsoluteAxis::Distance, | |
114 info: AbsoluteInfo { | |
115 value: 0, | |
116 minimum: 0, | |
117 maximum: 63, | |
118 fuzz: 0, | |
119 flat: 0, | |
120 resolution: 0, | |
121 }, | |
122 }; | |
123 let tilt_x = AbsoluteInfoSetup { | |
124 axis: AbsoluteAxis::TiltX, | |
125 info: AbsoluteInfo { | |
126 value: 0, | |
127 minimum: -64, | |
128 maximum: 63, | |
129 fuzz: 0, | |
130 flat: 0, | |
131 resolution: 57, | |
132 }, | |
133 }; | |
134 let tilt_y = AbsoluteInfoSetup { | |
135 axis: AbsoluteAxis::TiltY, | |
136 info: AbsoluteInfo { | |
137 value: 0, | |
138 minimum: -64, | |
139 maximum: 63, | |
140 fuzz: 0, | |
141 flat: 0, | |
142 resolution: 57, | |
143 }, | |
144 }; | |
145 let misc = AbsoluteInfoSetup { | |
146 axis: AbsoluteAxis::Misc, | |
147 info: AbsoluteInfo { | |
148 value: 0, | |
149 minimum: 0, | |
150 maximum: 0, | |
151 fuzz: 0, | |
152 flat: 0, | |
153 resolution: 0, | |
154 }, | |
155 }; | |
156 | |
157 dev.create( | |
158 &id, | |
159 b"TabletEmu", | |
160 0, | |
161 &[x, y, z, wheel, pressure, distance, tilt_x, tilt_y, misc], | |
162 )?; | |
163 Ok(dev) | |
164 } | |
165 | |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
166 fn input_event_new(type_: EventKind, code: u16, value: i32) -> input_event { |
0 | 167 input_event { |
168 time: timeval { | |
169 tv_sec: 0, | |
170 tv_usec: 0, | |
171 }, | |
172 type_: type_ as u16, | |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
173 code, |
0 | 174 value, |
175 } | |
176 } | |
177 | |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
178 fn input_axis_new(code: AbsoluteAxis, value: i32) -> input_event { |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
179 input_event_new(EventKind::Absolute, code as u16, value) |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
180 } |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
181 |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
182 fn input_key_new(code: Key, value: i32) -> input_event { |
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
183 input_event_new(EventKind::Key, code as u16, value) |
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
184 } |
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
185 |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
186 fn input_misc_new(code: MiscKind, value: i32) -> input_event { |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
187 input_event_new(EventKind::Misc, code as u16, value) |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
188 } |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
189 |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
190 fn input_synchronize_new(code: SynchronizeKind, value: i32) -> input_event { |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
191 input_event_new(EventKind::Synchronize, code as u16, value) |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
192 } |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
193 |
0 | 194 fn build_ui(application: >k::Application) { |
195 let dev = match create_uinput_device() { | |
196 Ok(dev) => Arc::new(dev), | |
197 Err(err) => { | |
198 match err.kind() { | |
199 ErrorKind::NotFound => { | |
200 eprintln!("Couldn’t find /dev/uinput: {}", err); | |
201 eprintln!("Maybe you forgot to `modprobe uinput`?"); | |
202 } | |
203 ErrorKind::PermissionDenied => { | |
204 eprintln!("Couldn’t open /dev/uinput for writing: {}", err); | |
205 eprintln!("Maybe you aren’t allowed to create input devices?"); | |
206 } | |
207 _ => eprintln!("Couldn’t open /dev/uinput for writing: {}", err), | |
208 } | |
209 return; | |
210 } | |
211 }; | |
212 println!( | |
213 "New device at {:?} ({:?})", | |
214 dev.evdev_path().unwrap(), | |
215 dev.sys_path().unwrap() | |
216 ); | |
217 | |
218 let window = gtk::ApplicationWindow::new(application); | |
219 | |
220 window.set_title("tablet-emu"); | |
221 window.set_position(gtk::WindowPosition::Center); | |
222 | |
223 let hbox = gtk::Box::new(gtk::Orientation::Horizontal, 0); | |
224 let tools_box = gtk::Box::new(gtk::Orientation::Vertical, 0); | |
225 | |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
226 let current_tool = Arc::new(Mutex::new(Key::ButtonToolPen)); |
0 | 227 let tool1 = gtk::Button::with_label("Pen"); |
228 let tool2 = gtk::Button::with_label("Rubber"); | |
229 let tool3 = gtk::Button::with_label("Brush"); | |
230 let tool4 = gtk::Button::with_label("Pencil"); | |
231 let tool5 = gtk::Button::with_label("Airbrush"); | |
232 | |
233 macro_rules! impl_tool_signal { | |
234 ($tool:ident) => { | |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
235 let current_tool_weak = Arc::downgrade(¤t_tool); |
0 | 236 $tool.connect_clicked(move |b| { |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
237 let current_tool = current_tool_weak.upgrade().unwrap(); |
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
238 let mut current_tool = current_tool.lock().unwrap(); |
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
239 *current_tool = match b.get_label().unwrap().as_str() { |
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
240 "Pen" => Key::ButtonToolPen, |
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
241 "Rubber" => Key::ButtonToolRubber, |
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
242 "Brush" => Key::ButtonToolBrush, |
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
243 "Pencil" => Key::ButtonToolPencil, |
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
244 "Airbrush" => Key::ButtonToolAirbrush, |
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
245 _ => unreachable!(), |
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
246 }; |
0 | 247 }); |
248 }; | |
249 }; | |
250 impl_tool_signal!(tool1); | |
251 impl_tool_signal!(tool2); | |
252 impl_tool_signal!(tool3); | |
253 impl_tool_signal!(tool4); | |
254 impl_tool_signal!(tool5); | |
255 | |
256 tools_box.add(&tool1); | |
257 tools_box.add(&tool2); | |
258 tools_box.add(&tool3); | |
259 tools_box.add(&tool4); | |
260 tools_box.add(&tool5); | |
261 | |
262 let current_size = Arc::new(Mutex::new((WIDTH as f64, HEIGHT as f64))); | |
263 let pressed = Arc::new(Mutex::new(false)); | |
264 | |
265 let drawing_area = gtk::DrawingArea::new(); | |
266 drawing_area.set_size_request(WIDTH, HEIGHT); | |
267 drawing_area.set_hexpand(true); | |
268 drawing_area.set_events( | |
269 gdk::EventMask::BUTTON_PRESS_MASK | |
270 | gdk::EventMask::BUTTON_RELEASE_MASK | |
271 | gdk::EventMask::POINTER_MOTION_MASK, | |
272 ); | |
273 let current_size_weak = Arc::downgrade(¤t_size); | |
274 drawing_area.connect_configure_event(move |_, event| { | |
275 let current_size = current_size_weak.upgrade().unwrap(); | |
276 let mut current_size = current_size.lock().unwrap(); | |
277 *current_size = match event.get_size() { | |
278 (width, height) => (width as f64, height as f64), | |
279 }; | |
280 true | |
281 }); | |
282 let dev_weak = Arc::downgrade(&dev); | |
283 let current_size_weak = Arc::downgrade(¤t_size); | |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
284 let current_tool_weak = Arc::downgrade(¤t_tool); |
0 | 285 let pressed_weak = Arc::downgrade(&pressed); |
286 drawing_area.connect_button_press_event(move |_, event| { | |
287 if event.get_button() != 1 { | |
288 return Inhibit(false); | |
289 } | |
290 | |
291 let dev = dev_weak.upgrade().unwrap(); | |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
292 let current_tool = current_tool_weak.upgrade().unwrap(); |
0 | 293 let pressed = pressed_weak.upgrade().unwrap(); |
294 let mut pressed = pressed.lock().unwrap(); | |
295 *pressed = true; | |
296 let (x, y) = event.get_position(); | |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
297 //println!("press tool {} at {}, {}", current_tool.lock().unwrap(), x, y); |
0 | 298 let current_size = current_size_weak.upgrade().unwrap(); |
299 let current_size = current_size.lock().unwrap(); | |
300 let (width, height) = *current_size; | |
301 dev.write(&[ | |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
302 input_axis_new(AbsoluteAxis::X, (x * MAX_X as f64 / width) as i32), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
303 input_axis_new(AbsoluteAxis::Y, (y * MAX_Y as f64 / height) as i32), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
304 input_axis_new(AbsoluteAxis::Z, 0), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
305 input_axis_new(AbsoluteAxis::Wheel, 0), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
306 input_axis_new(AbsoluteAxis::Pressure, 1024), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
307 input_axis_new(AbsoluteAxis::Distance, 0), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
308 input_axis_new(AbsoluteAxis::TiltX, 16), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
309 input_axis_new(AbsoluteAxis::TiltY, 0), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
310 input_misc_new(MiscKind::Serial, 0), |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
311 input_key_new(*current_tool.lock().unwrap(), 0), |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
312 input_synchronize_new(SynchronizeKind::Report, 0), |
0 | 313 ]) |
314 .unwrap(); | |
315 Inhibit(false) | |
316 }); | |
317 let dev_weak = Arc::downgrade(&dev); | |
318 let current_size_weak = Arc::downgrade(¤t_size); | |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
319 let current_tool_weak = Arc::downgrade(¤t_tool); |
0 | 320 let pressed_weak = Arc::downgrade(&pressed); |
321 drawing_area.connect_button_release_event(move |_, event| { | |
322 if event.get_button() != 1 { | |
323 return Inhibit(false); | |
324 } | |
325 | |
326 let dev = dev_weak.upgrade().unwrap(); | |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
327 let current_tool = current_tool_weak.upgrade().unwrap(); |
0 | 328 let (x, y) = event.get_position(); |
329 let pressed = pressed_weak.upgrade().unwrap(); | |
330 let mut pressed = pressed.lock().unwrap(); | |
331 *pressed = false; | |
332 //println!("release {}, {}", x, y); | |
333 let current_size = current_size_weak.upgrade().unwrap(); | |
334 let current_size = current_size.lock().unwrap(); | |
335 let (width, height) = *current_size; | |
336 dev.write(&[ | |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
337 input_axis_new(AbsoluteAxis::X, (x * MAX_X as f64 / width) as i32), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
338 input_axis_new(AbsoluteAxis::Y, (y * MAX_Y as f64 / height) as i32), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
339 input_axis_new(AbsoluteAxis::Z, 0), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
340 input_axis_new(AbsoluteAxis::Wheel, 0), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
341 input_axis_new(AbsoluteAxis::Pressure, 0), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
342 input_axis_new(AbsoluteAxis::Distance, 16), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
343 input_axis_new(AbsoluteAxis::TiltX, 16), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
344 input_axis_new(AbsoluteAxis::TiltY, 0), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
345 input_misc_new(MiscKind::Serial, 0), |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
346 input_key_new(*current_tool.lock().unwrap(), 0), |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
347 input_synchronize_new(SynchronizeKind::Report, 0), |
0 | 348 ]) |
349 .unwrap(); | |
350 Inhibit(false) | |
351 }); | |
352 drawing_area.connect_motion_notify_event(move |_, event| { | |
353 let (x, y) = event.get_position(); | |
354 let pressed = pressed.lock().unwrap(); | |
355 //println!("motion {}, {}", x, y); | |
356 let current_size = current_size.lock().unwrap(); | |
357 let (width, height) = *current_size; | |
358 dev.write(&[ | |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
359 input_axis_new(AbsoluteAxis::X, (x * MAX_X as f64 / width) as i32), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
360 input_axis_new(AbsoluteAxis::Y, (y * MAX_Y as f64 / height) as i32), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
361 input_axis_new(AbsoluteAxis::Z, 0), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
362 input_axis_new(AbsoluteAxis::Wheel, 0), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
363 input_axis_new(AbsoluteAxis::Pressure, if *pressed { 2048 } else { 0 }), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
364 input_axis_new(AbsoluteAxis::Distance, if *pressed { 0 } else { 32 }), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
365 input_axis_new(AbsoluteAxis::TiltX, 16), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
366 input_axis_new(AbsoluteAxis::TiltY, 0), |
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
367 input_misc_new(MiscKind::Serial, 0), |
2
39f87ef69b2a
Add support for selecting tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1
diff
changeset
|
368 input_key_new(*current_tool.lock().unwrap(), 0), |
1
6dbe2bbeef70
Improve input event types with helper functions.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
369 input_synchronize_new(SynchronizeKind::Report, 0), |
0 | 370 ]) |
371 .unwrap(); | |
372 Inhibit(false) | |
373 }); | |
374 drawing_area.connect_draw(move |_, ctx| { | |
375 //println!("drawing {}", drawing_area); | |
376 ctx.set_source_rgb(1., 0., 0.); | |
377 ctx.set_operator(cairo::Operator::Screen); | |
378 ctx.paint(); | |
379 Inhibit(false) | |
380 }); | |
381 | |
382 hbox.add(&tools_box); | |
383 hbox.add(&drawing_area); | |
384 | |
385 window.add(&hbox); | |
386 | |
387 window.show_all(); | |
388 } | |
389 | |
390 fn main() { | |
391 let application = gtk::Application::new( | |
392 Some("fr.linkmauve.TabletEmu"), | |
393 gio::ApplicationFlags::empty(), | |
394 ) | |
395 .expect("Initialisation failed…"); | |
396 application.connect_activate(build_ui); | |
397 application.run(&args().collect::<Vec<_>>()); | |
398 } |