diff --git a/src/event_loop/mod.rs b/src/event_loop/mod.rs index fa749aab..0dad4ba8 100644 --- a/src/event_loop/mod.rs +++ b/src/event_loop/mod.rs @@ -170,6 +170,7 @@ mod test { im: InputMethod::Active(imdetails_new()), physical_keyboard: Presence::Missing, visibility_override: visibility::State::NotForced, + ..Application::new(start) }; let l = State::new(state, now); diff --git a/src/outputs.rs b/src/outputs.rs index e82995bc..d04872b2 100644 --- a/src/outputs.rs +++ b/src/outputs.rs @@ -23,7 +23,7 @@ pub mod c { // Defined in C #[repr(transparent)] - #[derive(Clone, PartialEq, Copy, Debug)] + #[derive(Clone, PartialEq, Copy, Debug, Eq, Hash)] pub struct WlOutput(*const c_void); impl WlOutput { @@ -382,7 +382,7 @@ impl OutputState { /// Not guaranteed to exist, /// but can be used to look up state. -#[derive(Clone, Copy, PartialEq, Debug)] +#[derive(Clone, Copy, PartialEq, Debug, Eq, Hash)] pub struct OutputId(c::WlOutput); // WlOutput is a pointer, @@ -399,8 +399,10 @@ struct Output { #[derive(Debug)] struct NotFound; +/// Wayland global ID type type GlobalId = u32; +/// The outputs manager pub struct Outputs { outputs: Vec<(Output, GlobalId)>, sender: event_loop::driver::Threaded, @@ -463,6 +465,6 @@ pub enum ChangeType { #[derive(Clone, Copy, Debug)] pub struct Event { - output: OutputId, - change: ChangeType, + pub output: OutputId, + pub change: ChangeType, } diff --git a/src/state.rs b/src/state.rs index 9009f1f4..f9bdcd8c 100644 --- a/src/state.rs +++ b/src/state.rs @@ -9,9 +9,10 @@ use crate::animation; use crate::imservice::{ ContentHint, ContentPurpose }; use crate::main::{ Commands, PanelCommand }; use crate::outputs; +use crate::outputs::{OutputId, OutputState}; +use std::collections::HashMap; use std::time::Instant; - #[derive(Clone, Copy)] pub enum Presence { Present, @@ -139,6 +140,7 @@ pub struct Application { pub im: InputMethod, pub visibility_override: visibility::State, pub physical_keyboard: Presence, + pub outputs: HashMap, } impl Application { @@ -153,6 +155,7 @@ impl Application { im: InputMethod::InactiveSince(now), visibility_override: visibility::State::NotForced, physical_keyboard: Presence::Missing, + outputs: Default::default(), } } @@ -173,9 +176,17 @@ impl Application { ..self }, - Event::Output(output) => { - println!("Stub: output event {:?}", output); - self + Event::Output(outputs::Event { output, change }) => { + let mut app = self; + match change { + outputs::ChangeType::Altered(state) => { + app.outputs.insert(output, state); + }, + outputs::ChangeType::Removed => { + app.outputs.remove(&output); + }, + }; + app }, Event::InputMethod(new_im) => match (self.im.clone(), new_im) { @@ -271,6 +282,7 @@ mod test { im: InputMethod::Active(imdetails_new()), physical_keyboard: Presence::Missing, visibility_override: visibility::State::NotForced, + ..Application::new(start) }; let state = state.apply_event(Event::InputMethod(InputMethod::InactiveSince(now)), now); @@ -299,6 +311,7 @@ mod test { im: InputMethod::Active(imdetails_new()), physical_keyboard: Presence::Missing, visibility_override: visibility::State::NotForced, + ..Application::new(start) }; let state = state.apply_event(Event::InputMethod(InputMethod::InactiveSince(now)), now); @@ -323,6 +336,7 @@ mod test { im: InputMethod::Active(imdetails_new()), physical_keyboard: Presence::Missing, visibility_override: visibility::State::NotForced, + ..Application::new(start) }; // This reflects the sequence from Wayland: // disable, disable, enable, disable @@ -361,6 +375,7 @@ mod test { im: InputMethod::InactiveSince(now), physical_keyboard: Presence::Missing, visibility_override: visibility::State::NotForced, + ..Application::new(start) }; now += Duration::from_secs(1); @@ -394,6 +409,7 @@ mod test { im: InputMethod::Active(imdetails_new()), physical_keyboard: Presence::Missing, visibility_override: visibility::State::NotForced, + ..Application::new(start) }; now += Duration::from_secs(1);