From 974511277b8207948f1ce7a0e95b9573b5ec3b08 Mon Sep 17 00:00:00 2001 From: Till Wegmueller Date: Tue, 7 Apr 2026 19:37:41 +0200 Subject: [PATCH] Fix keycode mapping, client disconnect, and server shutdown - Keycodes: add +8 offset for XKB (evdev scancode + 8 = XKB keycode) - Client: force exit on Cmd+Q/close (network thread may block) - Server: force exit on Ctrl+C (network thread may block on accept) Proper graceful shutdown with tokio CancellationToken deferred. --- crates/wrclient/src/main.rs | 4 +++- crates/wrsrvd/src/backend/headless.rs | 5 +++-- crates/wrsrvd/src/state.rs | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/crates/wrclient/src/main.rs b/crates/wrclient/src/main.rs index a33fb7d..60d52ef 100644 --- a/crates/wrclient/src/main.rs +++ b/crates/wrclient/src/main.rs @@ -125,8 +125,10 @@ impl ApplicationHandler for App { ) { match event { WindowEvent::CloseRequested => { - info!("close requested, exiting"); + info!("close requested, shutting down"); event_loop.exit(); + // Force exit since the network thread may be blocking. + std::process::exit(0); } WindowEvent::Resized(physical_size) => { if let Some(display) = &mut self.display { diff --git a/crates/wrsrvd/src/backend/headless.rs b/crates/wrsrvd/src/backend/headless.rs index e0fca40..ba2cee5 100644 --- a/crates/wrsrvd/src/backend/headless.rs +++ b/crates/wrsrvd/src/backend/headless.rs @@ -181,8 +181,9 @@ pub fn run( } info!("headless backend shutting down"); - calloop_data.net_handle.shutdown(); - Ok(()) + // Force exit — the network thread may be blocking on accept(). + // Proper graceful shutdown with tokio CancellationToken is a future improvement. + std::process::exit(0); } /// Drain all pending network events (input, connection changes). diff --git a/crates/wrsrvd/src/state.rs b/crates/wrsrvd/src/state.rs index fbb9052..b88c3d8 100644 --- a/crates/wrsrvd/src/state.rs +++ b/crates/wrsrvd/src/state.rs @@ -210,9 +210,10 @@ impl WayRay { smithay::backend::input::KeyState::Released } }; + // XKB keycodes = evdev scancode + 8 keyboard.input::<(), _>( self, - ev.keycode.into(), + (ev.keycode + 8).into(), state, serial, ev.time,