From 4fd37543099e36461ae253287bac65d865bc8b14 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Sat, 4 May 2024 10:37:19 +0200 Subject: [PATCH] metal: initialize initially paused input devices --- src/backends/metal.rs | 1 + src/backends/metal/monitor.rs | 50 ++++++++++++++++++----------------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/backends/metal.rs b/src/backends/metal.rs index 614f02f6..8cf68ae9 100644 --- a/src/backends/metal.rs +++ b/src/backends/metal.rs @@ -343,6 +343,7 @@ struct MetalInputDevice { state: Rc, slot: usize, id: InputDeviceId, + fully_initialized: Cell, devnum: c::dev_t, fd: CloneCell>>, inputdev: CloneCell>>, diff --git a/src/backends/metal/monitor.rs b/src/backends/metal/monitor.rs index c9baf699..1d9a85e5 100644 --- a/src/backends/metal/monitor.rs +++ b/src/backends/metal/monitor.rs @@ -110,16 +110,10 @@ impl MetalBackend { fn handle_input_device_resume(self: &Rc, dev: &Rc, fd: Rc) { log::info!("Device resumed: {}", dev.devnode.to_bytes().as_bstr()); - if let Some(old) = dev.fd.set(Some(fd)) { + if let Some(old) = dev.fd.take() { self.state.fdcloser.close(old); } - let inputdev = match self.libinput.open(dev.devnode.as_c_str()) { - Ok(d) => Rc::new(d), - Err(_) => return, - }; - inputdev.device().set_slot(dev.slot); - dev.inputdev.set(Some(inputdev)); - dev.apply_config(); + self.reinit_input_device(dev, &fd); } fn handle_device_removed(self: &Rc, dev: c::dev_t) { @@ -309,6 +303,7 @@ impl MetalBackend { state: self.state.clone(), slot, id: device_id, + fully_initialized: Cell::new(false), devnum, fd: Default::default(), inputdev: Default::default(), @@ -354,26 +349,33 @@ impl MetalBackend { if res.inactive == TRUE { return; } - if let Err(e) = set_nonblock(res.fd.raw()) { - log::error!("Could set input fd to non-blocking: {}", ErrorFmt(e)); - return; - } - dev.fd.set(Some(res.fd.clone())); - let inputdev = match slf.libinput.open(dev.devnode.as_c_str()) { - Ok(d) => Rc::new(d), - Err(_) => return, - }; - inputdev.device().set_slot(slot); - dev.name.set(Rc::new(inputdev.device().name())); - dev.inputdev.set(Some(inputdev)); - dev.apply_config(); - slf.state - .backend_events - .push(BackendEvent::NewInputDevice(dev.clone())); + slf.reinit_input_device(&dev, &res.fd); }); None } + fn reinit_input_device(&self, dev: &Rc, fd: &Rc) { + if let Err(e) = set_nonblock(fd.raw()) { + log::error!("Could set input fd to non-blocking: {}", ErrorFmt(e)); + return; + } + dev.fd.set(Some(fd.clone())); + let inputdev = match self.libinput.open(dev.devnode.as_c_str()) { + Ok(d) => Rc::new(d), + Err(_) => return, + }; + inputdev.device().set_slot(dev.slot); + if !dev.fully_initialized.get() { + dev.name.set(Rc::new(inputdev.device().name())); + self.state + .backend_events + .push(BackendEvent::NewInputDevice(dev.clone())); + dev.fully_initialized.set(true); + } + dev.inputdev.set(Some(inputdev)); + dev.apply_config(); + } + fn get_device(self: &Rc, dev: c::dev_t, f: F) where F: FnOnce(Result<&TakeDeviceReply, DbusError>) + 'static,