diff --git a/client/src/input/inputs.rs b/client/src/input/inputs.rs index e49125d..5db70e4 100644 --- a/client/src/input/inputs.rs +++ b/client/src/input/inputs.rs @@ -136,8 +136,8 @@ impl InputAggregator { } else { tracing::info!("🧙 magic chord - freeing devices 🪄 EXPELLIARMUS!!! 🔓🕊️"); } - for k in &mut self.keyboards { k.set_grab(self.released); } - for m in &mut self.mice { m.set_grab(self.released); } + for k in &mut self.keyboards { k.set_grab(self.released); k.set_send(self.released); } + for m in &mut self.mice { m.set_grab(self.released); m.set_send(self.released); } self.released = !self.released; } } diff --git a/client/src/input/keyboard.rs b/client/src/input/keyboard.rs index eb7ee69..21f4af1 100644 --- a/client/src/input/keyboard.rs +++ b/client/src/input/keyboard.rs @@ -13,6 +13,7 @@ pub struct KeyboardAggregator { dev: Device, tx: Sender, dev_mode: bool, + sending_disabled: bool, pressed_keys: HashSet, } @@ -23,13 +24,17 @@ static SEQ: AtomicU32 = AtomicU32::new(0); impl KeyboardAggregator { pub fn new(dev: Device, dev_mode: bool, tx: Sender) -> Self { let _ = dev.set_nonblocking(true); - Self { dev, tx, dev_mode, pressed_keys: HashSet::new()} + Self { dev, tx, dev_mode, sending_disabled: false, pressed_keys: HashSet::new()} } pub fn set_grab(&mut self, grab: bool) { let _ = if grab { self.dev.grab() } else { self.dev.ungrab() }; } + pub fn set_send(&mut self, send: bool) { + self.sending_disabled = !send; + } + pub fn process_events(&mut self) { // --- first fetch, then log (avoids aliasing borrow) --- let events: Vec = match self.dev.fetch_events() { @@ -55,9 +60,9 @@ impl KeyboardAggregator { // Generate a local sequence number for debugging/log-merge only. let id = SEQ.fetch_add(1, Ordering::Relaxed); if self.dev_mode { debug!(seq = id, ?report, "kbd"); } - let _ = self.tx.send(KeyboardReport { - data: report.to_vec() - }); + if !self.sending_disabled { + let _ = self.tx.send(KeyboardReport { data: report.to_vec() }); + } } } diff --git a/client/src/input/mouse.rs b/client/src/input/mouse.rs index fe12e48..dd219d1 100644 --- a/client/src/input/mouse.rs +++ b/client/src/input/mouse.rs @@ -13,6 +13,7 @@ pub struct MouseAggregator { dev: Device, tx: Sender, dev_mode: bool, + sending_disabled: bool, next_send: Instant, buttons: u8, @@ -24,7 +25,7 @@ pub struct MouseAggregator { impl MouseAggregator { pub fn new(dev: Device, dev_mode: bool, tx: Sender) -> Self { - Self { dev, tx, dev_mode, next_send: Instant::now(), buttons:0, last_buttons:0, dx:0, dy:0, wheel:0 } + Self { dev, tx, dev_mode, sending_disabled: false, next_send: Instant::now(), buttons:0, last_buttons:0, dx:0, dy:0, wheel:0 } } #[inline] fn slog(&self, f: impl FnOnce()) { if self.dev_mode { f() } } @@ -32,6 +33,10 @@ impl MouseAggregator { let _ = if grab { self.dev.grab() } else { self.dev.ungrab() }; } + pub fn set_send(&mut self, send: bool) { + self.sending_disabled = !send; + } + pub fn process_events(&mut self) { let evts: Vec = match self.dev.fetch_events() { Ok(it) => it.collect(), @@ -77,10 +82,15 @@ impl MouseAggregator { self.wheel as u8, ]; - if let Err(broadcast::error::SendError(_)) = - self.tx.send(MouseReport { data: pkt.to_vec() }) - { if self.dev_mode { warn!("❌ no HID receiver (mouse)"); } } - else if self.dev_mode { debug!("📤 mouse {:?}", pkt) } + if !self.sending_disabled { + if let Err(broadcast::error::SendError(_)) = + self.tx.send(MouseReport { data: pkt.to_vec() }) + { + if self.dev_mode { warn!("❌ no HID receiver (mouse)"); } + } else if self.dev_mode { + debug!("📤 mouse {:?}", pkt); + } + } self.dx=0; self.dy=0; self.wheel=0; self.last_buttons=self.buttons; } diff --git a/scripts/install/server.sh b/scripts/install/server.sh index 96b7699..3e61fe6 100755 --- a/scripts/install/server.sh +++ b/scripts/install/server.sh @@ -105,7 +105,7 @@ After=network.target lesavka-core.service [Service] ExecStart=/usr/local/bin/lesavka-server Restart=always -Environment=RUST_LOG=lesavka_server::video=trace,lesavka_server::usb_gadget=info,lesavka_server=info +Environment=RUST_LOG=lesavka_server::video=trace,lesavka_server::usb_gadget=debug Environment=RUST_BACKTRACE=1 Restart=always RestartSec=5 diff --git a/server/Cargo.toml b/server/Cargo.toml index c5d544c..e5d3b88 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -15,7 +15,7 @@ tonic-reflection = "0.13" anyhow = "1.0" lesavka_common = { path = "../common" } tracing = { version = "0.1", features = ["std"] } -tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] } +tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt", "ansi"] } tracing-appender = "0.2" libc = "0.2" futures-util = "0.3" diff --git a/server/src/main.rs b/server/src/main.rs index f9968de..d54a227 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -38,12 +38,27 @@ fn init_tracing() -> anyhow::Result { .open("/tmp/lesavka-server.log")?; let (file_writer, guard) = tracing_appender::non_blocking(file); + let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| { + EnvFilter::new("lesavka_server=info,lesavka_server::video=warn") + }); + let filter_str = env_filter.to_string(); + tracing_subscriber::registry() - .with(EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("lesavka_server=info"))) - .with(fmt::layer().with_target(true).with_thread_ids(true)) - .with(fmt::layer().with_writer(file_writer).with_ansi(false)) + .with(env_filter) + .with( + fmt::layer() + .with_target(true) + .with_thread_ids(true), + ) + .with( + fmt::layer() + .with_writer(file_writer) + .with_ansi(false) + .with_target(true) + .with_level(true), + ) .init(); + tracing::info!("📜 effective RUST_LOG = \"{}\"", filter_str); Ok(guard) }