From 49f5cd7e4df1a00b641d9febbb5872d9b1b14205 Mon Sep 17 00:00:00 2001 From: Enrico Lumetti Date: Sun, 8 Nov 2020 10:48:28 +0100 Subject: [PATCH] Cargo fmt + update lock + remove test binaries --- Cargo.lock | 32 +------- Cargo.toml | 1 - src/bin/gtk_capture.rs | 158 ------------------------------------ src/bin/libinput_capture.rs | 67 --------------- src/main.rs | 85 +++++++++++-------- 5 files changed, 52 insertions(+), 291 deletions(-) delete mode 100644 src/bin/gtk_capture.rs delete mode 100644 src/bin/libinput_capture.rs diff --git a/Cargo.lock b/Cargo.lock index 36e5a6f..25b4deb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -772,25 +772,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "input" -version = "0.5.0" -source = "git+https://github.com/Smithay/input.rs#2b2f372101cbb165f5f92e8d6b05ca1be9e4fefe" -dependencies = [ - "bitflags", - "input-sys", - "libc", - "udev 0.4.0", -] - -[[package]] -name = "input-sys" -version = "1.15.0" -source = "git+https://github.com/Smithay/input.rs#2b2f372101cbb165f5f92e8d6b05ca1be9e4fefe" -dependencies = [ - "libc", -] - [[package]] name = "instant" version = "0.1.7" @@ -1360,9 +1341,8 @@ dependencies = [ "gio", "gtk", "im", - "input", "libc", - "udev 0.2.0", + "udev", ] [[package]] @@ -1507,16 +1487,6 @@ dependencies = [ "libudev-sys", ] -[[package]] -name = "udev" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24953d50a3bce0f5f5a9a2766567072dc9af8096f8c40ea81815da651066bc9f" -dependencies = [ - "libc", - "libudev-sys", -] - [[package]] name = "unic-bidi" version = "0.9.0" diff --git a/Cargo.toml b/Cargo.toml index 69b976d..79e1dd8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,6 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -input = { git = "https://github.com/Smithay/input.rs" } udev = "0.2" libc = "0.2" errno = "0.2" diff --git a/src/bin/gtk_capture.rs b/src/bin/gtk_capture.rs deleted file mode 100644 index efab0f4..0000000 --- a/src/bin/gtk_capture.rs +++ /dev/null @@ -1,158 +0,0 @@ -use std::vec::Vec; -use std::cell::RefCell; -use std::rc::Rc; -use gtk::prelude::*; -use gio::prelude::*; - -use gtk::{Application, ApplicationWindow, DrawingArea, Box, Button, CheckButton, HeaderBar}; - -struct AppState { - draw_lines: bool, - do_draw: bool, - point_buffer: Vec<(f64, f64)>, -} - -fn main() { - let application = Application::new( - Some("team.acqua.enrico.styluscapture"), - Default::default(), - ).expect("failed to initialize GTK application"); - - - application.connect_activate(|app| { - let app_state = Rc::new(RefCell::new(AppState{ - draw_lines: false, - do_draw: false, - point_buffer: Vec::new(), - })); - - let drawing_area = DrawingArea::new(); - let state_clone_1 = Rc::clone(&app_state); - drawing_area.set_size_request(100, 100); - drawing_area.connect_draw(move |widget, cr| { - let style_context = widget.get_style_context(); - let wa = widget.get_allocation(); - - gtk::render_background( - &style_context, - &cr, - wa.x as f64, - wa.y as f64, - wa.width as f64, - wa.height as f64 - ); - - let state = state_clone_1.borrow(); - - if state.point_buffer.len() > 0 { - cr.set_source_rgb(1.0, 0.0, 0.0); - if state.draw_lines { - let (x, y) = state.point_buffer[0]; - cr.move_to(x - wa.x as f64, y - wa.y as f64); - - for pt in &state.point_buffer[1..] { - cr.line_to(pt.0 - wa.x as f64, pt.1 - wa.y as f64); - } - cr.set_line_width(3.); - cr.stroke(); - } else { - for pt in &state.point_buffer[1..] { - use std::f64::consts::PI; - cr.arc(pt.0 - wa.x as f64, pt.1 - wa.y as f64, 3., 0., 2. * PI); - cr.fill(); - } - } - - } - - gtk::Inhibit(false) - }); - - let save_button = Button::from_icon_name(Some("document-save-symbolic"), gtk::IconSize::Menu); - let clear_button = Button::from_icon_name(Some("edit-clear-all-symbolic"), gtk::IconSize::Menu); - let check_button = CheckButton::with_label("Join Points"); - - let header = HeaderBar::new(); - header.pack_start(&save_button); - header.pack_start(&clear_button); - header.pack_start(&check_button); - - let w_box = Box::new(gtk::Orientation::Vertical, 10); - w_box.pack_start(&header, false, false, 0); - w_box.pack_end(&drawing_area, true, true, 0); - - let window = Rc::new(ApplicationWindow::new(app)); - window.set_title("Stylus Capture"); - window.set_default_size(500, 500); - - let state_clone_3 = Rc::clone(&app_state); - let win_clone = Rc::clone(&window); - clear_button.connect_clicked(move |_| { - state_clone_3.borrow_mut().point_buffer.clear(); - win_clone.queue_draw(); - }); - - let state_clone_4 = Rc::clone(&app_state); - save_button.connect_clicked(move |_| { - let writer = csv::Writer::from_path("acquired_data.csv"); - if let Ok(mut wrt) = writer { - wrt.write_record(&["x", "y"]).expect("write error"); - for pt in &state_clone_4.borrow().point_buffer { - wrt.write_record(&[pt.0.to_string(), pt.1.to_string()]).expect("write error"); - } - wrt.flush().unwrap(); - } - }); - - let state_clone_3 = Rc::clone(&app_state); - let win_clone_2 = Rc::clone(&window); - check_button.connect_clicked(move |_| { - let mut borrow = state_clone_3.borrow_mut(); - borrow.draw_lines = ! borrow.draw_lines; - win_clone_2.queue_draw(); - }); - - let state_clone_2 = Rc::clone(&app_state); - window.connect_event(move |widget, event| { - let mut capture_event = false; - if event.get_device_tool() - .map(|tool| tool.get_tool_type() == gdk::DeviceToolType::Pen) == Some(true) { - match event.get_event_type() { - gdk::EventType::ProximityOut => { - std::println!("pen out of proximity"); - }, - gdk::EventType::ProximityIn => { - std::println!("pen in proximity"); - }, - gdk::EventType::MotionNotify => { - let mut state = state_clone_2.borrow_mut(); - if state.do_draw { - state.point_buffer.push(event.get_coords().unwrap()); - widget.queue_draw(); - } - }, - gdk::EventType::ButtonPress | gdk::EventType::ButtonRelease => { - std::println!("evt: {:#?}, tool: {:#?}", event, event.get_device_tool()); - - state_clone_2.borrow_mut().do_draw = event.get_event_type() == gdk::EventType::ButtonPress; - capture_event = true; - }, - _ => { - std::println!("{:#?}", event); - } - } - } - std::println!("{:#?}\n", event.get_device_tool().map(|tool| tool.get_tool_type())); - gtk::Inhibit(capture_event) - //std::println!("{:#?}",event.get_event_type()); - //std::println!("{:#?}", event.get_source_device().and_then(|d| d.get_property_tool()).map(|t| t.get_tool_type())); - //std::println!("{:#?}", event.get_device().and_then(|d| d.get_property_tool()).map(|t| t.get_tool_type())); - }); - - - window.add(&w_box); - window.show_all(); - }); - - application.run(&[]); -} diff --git a/src/bin/libinput_capture.rs b/src/bin/libinput_capture.rs deleted file mode 100644 index 5130d1f..0000000 --- a/src/bin/libinput_capture.rs +++ /dev/null @@ -1,67 +0,0 @@ -use input::{Libinput, LibinputInterface}; -use input::event::Event; -use input::event::tablet_tool::{TabletToolEvent, TabletToolEventTrait}; -use std::time; -use std::ffi::CString; -use std::path::Path; -use std::os::unix::io::{RawFd}; - -struct SimpleLibinputInterface; - - -impl LibinputInterface for SimpleLibinputInterface { - fn open_restricted(&mut self, path: &Path, flags: i32) -> Result { - let c_path = path.to_str() - .map(|s| CString::new(s).unwrap()) - .unwrap(); - - let fd = unsafe { - libc::open64(c_path.as_ptr(), flags) - }; - - if fd < 0 { - let err: i32 = errno::errno().into(); - std::println!("{:?}, flags({}), fd({})", path, flags, fd); - Err(-err) - } else { - Ok(fd) - } - } - fn close_restricted(&mut self, fd: RawFd) { - unsafe { libc::close(fd); } - } -} - -fn main() { - let libinput_interface = SimpleLibinputInterface{}; - let mut libinput_ctx = Libinput::new_with_udev(libinput_interface); - - libinput_ctx.udev_assign_seat("seat0").unwrap(); - - let mut csv_writer = csv::Writer::from_path("acquired_data.csv").unwrap(); - csv_writer.write_record(&["x", "y", "pressure", "time_usec"]).expect("write error"); - loop { - while let Some(event) = libinput_ctx.next() { - if let Event::Tablet(tablet_evt) = event { - if let TabletToolEvent::Axis(axis_evt) = tablet_evt { - if axis_evt.pressure() > 1e-3 { - let pressure = axis_evt.pressure(); - let x_t = axis_evt.x_transformed(1080); - let y_t = axis_evt.y_transformed(1920); - let time_usec = axis_evt.time_usec(); - std::println!( - "(x, y) = ({}, {})\npressure = {}\n(tilt_x, tilt_y) = ({}, {})\n", - x_t, - y_t, - pressure, - axis_evt.tilt_x(), - axis_evt.tilt_y()); - csv_writer.write_record(&[x_t.to_string(), y_t.to_string(), pressure.to_string(), time_usec.to_string()]).expect("write error"); - csv_writer.flush().expect("write error"); - } - } - } - } - libinput_ctx.dispatch().unwrap(); - } -} diff --git a/src/main.rs b/src/main.rs index 2d6b9ef..e5b9aab 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,17 +14,16 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -use std::rc::Rc; use druid::im::{vector, Vector}; use druid::kurbo::BezPath; use druid::widget::prelude::*; -use druid::{ - AppLauncher, Color, Data, Event, LocalizedString, Rect, WindowDesc, -}; +use druid::{AppLauncher, Color, Data, Event, LocalizedString, Rect, WindowDesc}; +use std::rc::Rc; mod stiletto { use druid::widget::prelude::*; - pub trait CanvasElement { //: CanvasElementData { + pub trait CanvasElement { + //: CanvasElementData { /// returns the axis-aligned bounding box fn bounding_box(&self) -> druid::Rect; @@ -85,8 +84,6 @@ mod stiletto { ctx.stroke(&self.kurbo_path, &stroke_color, 2.0); } } - - } struct CanvasWidget; @@ -98,33 +95,44 @@ struct CanvasData { } impl Widget for CanvasWidget { - fn event<'a>(&mut self, _ctx: &mut EventCtx, event: &Event, data: &'a mut CanvasData, _env: &Env) { - + fn event<'a>( + &mut self, + _ctx: &mut EventCtx, + event: &Event, + data: &'a mut CanvasData, + _env: &Env, + ) { match event { - Event::MouseDown(mouse_event) => { - if true /*&& mouse_event.pointer_type == druid::PointerType::Stylus || mouse_event.pointer_type == druid::PointerType::Mouse*/ { - data.is_drawing = true; - let mut kurbo_path = BezPath::new(); - kurbo_path.move_to((mouse_event.pos.x, mouse_event.pos.y)); - let new_path = Rc::new(stiletto::CanvasPath{kurbo_path}); - data.elements.push_back(new_path); - } - }, - Event::MouseMove(mouse_event) => { - if data.is_drawing /*&& (mouse_event.pointer_type == druid::PointerType::Stylus || mouse_event.pointer_type == druid::PointerType::Mouse)*/ { - let ptr: &'a mut dyn stiletto::CanvasElement = Rc::get_mut(data.elements.back_mut().unwrap()).unwrap(); - let last_canvas_path: &'a mut stiletto::CanvasPath = ptr.get_path().unwrap(); - - last_canvas_path.kurbo_path.line_to((mouse_event.pos.x, mouse_event.pos.y)); - } - }, - Event::MouseUp(_) => { - if data.is_drawing { - data.is_drawing = false; - } - }, - _ => {} + Event::MouseDown(mouse_event) => { + if true + /*&& mouse_event.pointer_type == druid::PointerType::Stylus || mouse_event.pointer_type == druid::PointerType::Mouse*/ + { + data.is_drawing = true; + let mut kurbo_path = BezPath::new(); + kurbo_path.move_to((mouse_event.pos.x, mouse_event.pos.y)); + let new_path = Rc::new(stiletto::CanvasPath { kurbo_path }); + data.elements.push_back(new_path); + } + } + Event::MouseMove(mouse_event) => { + if data.is_drawing + /*&& (mouse_event.pointer_type == druid::PointerType::Stylus || mouse_event.pointer_type == druid::PointerType::Mouse)*/ + { + let ptr: &'a mut dyn stiletto::CanvasElement = + Rc::get_mut(data.elements.back_mut().unwrap()).unwrap(); + let last_canvas_path: &'a mut stiletto::CanvasPath = ptr.get_path().unwrap(); + last_canvas_path + .kurbo_path + .line_to((mouse_event.pos.x, mouse_event.pos.y)); + } + } + Event::MouseUp(_) => { + if data.is_drawing { + data.is_drawing = false; + } + } + _ => {} } } @@ -137,7 +145,13 @@ impl Widget for CanvasWidget { ) { } - fn update(&mut self, ctx: &mut UpdateCtx, _old_data: &CanvasData, _data: &CanvasData, _env: &Env) { + fn update( + &mut self, + ctx: &mut UpdateCtx, + _old_data: &CanvasData, + _data: &CanvasData, + _env: &Env, + ) { ctx.request_paint_rect(Rect::new(0., 0., 200., 200.)); } @@ -179,7 +193,10 @@ impl Widget for CanvasWidget { pub fn main() { let window = WindowDesc::new(|| CanvasWidget {}) //.window_size((1024.0, 1400.0)) - .title(LocalizedString::new("custom-widget-demo-window-title").with_placeholder("Fancy Colors")); + .title( + LocalizedString::new("custom-widget-demo-window-title") + .with_placeholder("Fancy Colors"), + ); let canvas_data = CanvasData { elements: vector![], is_drawing: false,