Mercurial > tablet-emu
comparison src/main.rs @ 11:0193041f01d4
Split State into another module.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sun, 01 Nov 2020 15:56:00 +0100 |
parents | 06d77bb94a50 |
children | d43c31aff57c |
comparison
equal
deleted
inserted
replaced
10:06d77bb94a50 | 11:0193041f01d4 |
---|---|
19 use gtk::prelude::*; | 19 use gtk::prelude::*; |
20 | 20 |
21 use std::env::args; | 21 use std::env::args; |
22 use std::fs::{File, OpenOptions}; | 22 use std::fs::{File, OpenOptions}; |
23 use std::io::ErrorKind; | 23 use std::io::ErrorKind; |
24 use std::sync::{Arc, Mutex}; | 24 use std::sync::Arc; |
25 | 25 |
26 use input_linux::{ | 26 use input_linux::{ |
27 sys::input_event, sys::timeval, AbsoluteAxis, AbsoluteInfo, AbsoluteInfoSetup, EventKind, | 27 sys::input_event, sys::timeval, AbsoluteAxis, AbsoluteInfo, AbsoluteInfoSetup, EventKind, |
28 InputId, InputProperty, Key, MiscKind, SynchronizeKind, UInputHandle, | 28 InputId, InputProperty, Key, MiscKind, SynchronizeKind, UInputHandle, |
29 }; | 29 }; |
30 | |
31 mod state; | |
32 use state::State; | |
30 | 33 |
31 const WIDTH: i32 = 320; | 34 const WIDTH: i32 = 320; |
32 const HEIGHT: i32 = 180; | 35 const HEIGHT: i32 = 180; |
33 | 36 |
34 const MAX_X: i32 = 69920; | 37 const MAX_X: i32 = 69920; |
204 input_event_new(EventKind::Misc, code as u16, value) | 207 input_event_new(EventKind::Misc, code as u16, value) |
205 } | 208 } |
206 | 209 |
207 fn input_synchronize_new(code: SynchronizeKind, value: i32) -> input_event { | 210 fn input_synchronize_new(code: SynchronizeKind, value: i32) -> input_event { |
208 input_event_new(EventKind::Synchronize, code as u16, value) | 211 input_event_new(EventKind::Synchronize, code as u16, value) |
209 } | |
210 | |
211 struct State { | |
212 dev: UInputHandle<File>, | |
213 width: f64, | |
214 height: f64, | |
215 selected_tool: Key, | |
216 pressed: bool, | |
217 } | |
218 | |
219 impl State { | |
220 fn new() -> std::io::Result<Arc<Mutex<State>>> { | |
221 let dev = create_uinput_device()?; | |
222 println!( | |
223 "New device at {:?} ({:?})", | |
224 dev.evdev_path()?, | |
225 dev.sys_path()? | |
226 ); | |
227 | |
228 Ok(Arc::new(Mutex::new(State { | |
229 dev, | |
230 width: WIDTH as f64, | |
231 height: HEIGHT as f64, | |
232 selected_tool: Key::ButtonToolPen, | |
233 pressed: false, | |
234 }))) | |
235 } | |
236 | |
237 fn select_tool(&mut self, tool: Key) { | |
238 self.selected_tool = tool; | |
239 } | |
240 | |
241 fn press(&mut self, x: f64, y: f64) -> std::io::Result<()> { | |
242 self.pressed = true; | |
243 self.dev.write(&[ | |
244 input_axis_new(AbsoluteAxis::X, (x * MAX_X as f64 / self.width) as i32), | |
245 input_axis_new(AbsoluteAxis::Y, (y * MAX_Y as f64 / self.height) as i32), | |
246 input_axis_new(AbsoluteAxis::Z, 0), | |
247 input_axis_new(AbsoluteAxis::Wheel, 0), | |
248 input_axis_new(AbsoluteAxis::Pressure, 1024), | |
249 input_axis_new(AbsoluteAxis::Distance, 0), | |
250 input_axis_new(AbsoluteAxis::TiltX, 16), | |
251 input_axis_new(AbsoluteAxis::TiltY, 0), | |
252 input_misc_new(MiscKind::Serial, 0), | |
253 input_key_new(self.selected_tool, 1), | |
254 input_synchronize_new(SynchronizeKind::Report, 0), | |
255 ])?; | |
256 Ok(()) | |
257 } | |
258 | |
259 fn release(&mut self, x: f64, y: f64) -> std::io::Result<()> { | |
260 self.pressed = false; | |
261 self.dev.write(&[ | |
262 input_axis_new(AbsoluteAxis::X, (x * MAX_X as f64 / self.width) as i32), | |
263 input_axis_new(AbsoluteAxis::Y, (y * MAX_Y as f64 / self.height) as i32), | |
264 input_axis_new(AbsoluteAxis::Z, 0), | |
265 input_axis_new(AbsoluteAxis::Wheel, 0), | |
266 input_axis_new(AbsoluteAxis::Pressure, 0), | |
267 input_axis_new(AbsoluteAxis::Distance, 16), | |
268 input_axis_new(AbsoluteAxis::TiltX, 16), | |
269 input_axis_new(AbsoluteAxis::TiltY, 0), | |
270 input_misc_new(MiscKind::Serial, 0), | |
271 input_key_new(self.selected_tool, 1), | |
272 input_synchronize_new(SynchronizeKind::Report, 0), | |
273 ])?; | |
274 Ok(()) | |
275 } | |
276 | |
277 fn motion(&mut self, x: f64, y: f64) -> std::io::Result<()> { | |
278 self.dev.write(&[ | |
279 input_axis_new(AbsoluteAxis::X, (x * MAX_X as f64 / self.width) as i32), | |
280 input_axis_new(AbsoluteAxis::Y, (y * MAX_Y as f64 / self.height) as i32), | |
281 input_axis_new(AbsoluteAxis::Z, 0), | |
282 input_axis_new(AbsoluteAxis::Wheel, 0), | |
283 input_axis_new(AbsoluteAxis::Pressure, if self.pressed { 2048 } else { 0 }), | |
284 input_axis_new(AbsoluteAxis::Distance, if self.pressed { 0 } else { 32 }), | |
285 input_axis_new(AbsoluteAxis::TiltX, 16), | |
286 input_axis_new(AbsoluteAxis::TiltY, 0), | |
287 input_misc_new(MiscKind::Serial, 0), | |
288 input_key_new(self.selected_tool, 1), | |
289 input_synchronize_new(SynchronizeKind::Report, 0), | |
290 ])?; | |
291 Ok(()) | |
292 } | |
293 } | 212 } |
294 | 213 |
295 fn build_main_menu(application: >k::Application) { | 214 fn build_main_menu(application: >k::Application) { |
296 let quit = gio::SimpleAction::new("quit", None); | 215 let quit = gio::SimpleAction::new("quit", None); |
297 application.set_accels_for_action("app.quit", &["<Control>q"]); | 216 application.set_accels_for_action("app.quit", &["<Control>q"]); |
392 ); | 311 ); |
393 let state_weak = Arc::downgrade(&state); | 312 let state_weak = Arc::downgrade(&state); |
394 drawing_area.connect_configure_event(move |_, event| { | 313 drawing_area.connect_configure_event(move |_, event| { |
395 let state = state_weak.upgrade().unwrap(); | 314 let state = state_weak.upgrade().unwrap(); |
396 let mut state = state.lock().unwrap(); | 315 let mut state = state.lock().unwrap(); |
397 match event.get_size() { | 316 state.set_size(event.get_size()); |
398 (width, height) => { | |
399 state.width = width as f64; | |
400 state.height = height as f64; | |
401 } | |
402 } | |
403 true | 317 true |
404 }); | 318 }); |
405 let state_weak = Arc::downgrade(&state); | 319 let state_weak = Arc::downgrade(&state); |
406 drawing_area.connect_button_press_event(move |_, event| { | 320 drawing_area.connect_button_press_event(move |_, event| { |
407 if event.get_button() != 1 { | 321 if event.get_button() != 1 { |