From ec442b87a3f109745cc25c76d152dc08fec82f3e Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 2 Mar 2025 17:23:27 +0100 Subject: [PATCH] inputd: Use a single global display rather than have a per-vt display selection --- inputd/src/main.rs | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/inputd/src/main.rs b/inputd/src/main.rs index eb6caaadfd..b642d5f8aa 100644 --- a/inputd/src/main.rs +++ b/inputd/src/main.rs @@ -12,7 +12,7 @@ //! events are available. use core::mem::size_of; -use std::collections::BTreeMap; +use std::collections::{BTreeMap, BTreeSet}; use std::mem::transmute; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -46,18 +46,14 @@ enum Handle { Control, } -#[derive(Debug)] -struct Vt { - display: String, -} - struct InputScheme { handles: BTreeMap, next_id: AtomicUsize, next_vt_id: AtomicUsize, - vts: BTreeMap, + display: Option, + vts: BTreeSet, super_key: bool, active_vt: Option, @@ -68,11 +64,13 @@ struct InputScheme { impl InputScheme { fn new() -> Self { Self { + handles: BTreeMap::new(), + next_id: AtomicUsize::new(0), next_vt_id: AtomicUsize::new(1), - handles: BTreeMap::new(), - vts: BTreeMap::new(), + display: None, + vts: BTreeSet::new(), super_key: false, active_vt: None, @@ -88,7 +86,7 @@ impl InputScheme { } } - if !self.vts.contains_key(&new_active) { + if !self.vts.contains(&new_active) { log::warn!("inputd: switch to non-existent VT #{new_active} was requested"); return Ok(()); } @@ -106,7 +104,7 @@ impl InputScheme { device, .. } => { - if &self.vts[&new_active].display == &*device { + if self.display.as_deref() == Some(&*device) { pending.push(VtEvent { kind: VtEventKind::Activate, vt: new_active, @@ -152,6 +150,9 @@ impl Scheme for InputScheme { } "handle_early" => { let display = path_parts.collect::>().join("."); + if self.display.is_none() { + self.maybe_perform_handoff_to = Some(display.clone()); + } Handle::Display { events: EventFlags::empty(), pending: Vec::new(), @@ -210,8 +211,8 @@ impl Scheme for InputScheme { let handle = self.handles.get(&id).ok_or(SysError::new(EINVAL))?; if let Handle::Consumer { vt, .. } = handle { - let display = self.vts.get(vt).ok_or(SysError::new(EINVAL))?; - let vt = format!("{}:{vt}", display.display); + let display = self.display.as_ref().ok_or(SysError::new(EINVAL))?; + let vt = format!("{}:{vt}", display); let size = core::cmp::min(vt.len(), buf.len()); buf[..size].copy_from_slice(&vt.as_bytes()[..size]); @@ -262,12 +263,7 @@ impl Scheme for InputScheme { // Trying to do an empty read creates a new VT. let vt = self.next_vt_id.fetch_add(1, Ordering::SeqCst); log::info!("inputd: created VT #{vt} for {device}"); - self.vts.insert( - vt, - Vt { - display: device.clone(), - }, - ); + self.vts.insert(vt); if self.active_vt.is_none() { self.switch_vt(vt)?; @@ -385,7 +381,7 @@ impl Scheme for InputScheme { device, .. } => { - if &self.vts[&self.active_vt.unwrap()].display == &*device { + if self.display.as_ref() == Some(device) { pending.push(VtEvent { kind: VtEventKind::Resize, vt: self.active_vt.unwrap(), @@ -510,9 +506,7 @@ fn deamon(deamon: redox_daemon::Daemon) -> anyhow::Result<()> { if let Some(display) = scheme.maybe_perform_handoff_to.take() { scheme.has_new_events = true; - for vt in scheme.vts.values_mut() { - vt.display = display.clone(); - } + scheme.display = Some(display.clone()); for handle in scheme.handles.values_mut() { match handle {