outputs: Notify the state manager about changes
This commit is contained in:
@ -22,7 +22,7 @@ pub mod c {
|
||||
// Defined in C
|
||||
|
||||
#[repr(transparent)]
|
||||
#[derive(Clone, PartialEq, Copy)]
|
||||
#[derive(Clone, PartialEq, Copy, Debug)]
|
||||
pub struct WlOutput(*const c_void);
|
||||
|
||||
#[repr(C)]
|
||||
@ -68,7 +68,7 @@ pub mod c {
|
||||
}
|
||||
|
||||
/// Map to `wl_output.transform` values
|
||||
#[derive(Clone)]
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub enum Transform {
|
||||
Normal = 0,
|
||||
Rotated90 = 1,
|
||||
@ -206,13 +206,25 @@ pub mod c {
|
||||
let mut collection = outputs.borrow_mut();
|
||||
let output = collection
|
||||
.find_output_mut(wl_output);
|
||||
match output {
|
||||
Some(output) => { output.current = output.pending.clone(); }
|
||||
None => log_print!(
|
||||
let event = match output {
|
||||
Some(output) => {
|
||||
output.current = output.pending.clone();
|
||||
Some(Event {
|
||||
output: OutputId(wl_output),
|
||||
change: ChangeType::Altered(output.current),
|
||||
})
|
||||
},
|
||||
None => {
|
||||
log_print!(
|
||||
logging::Level::Warning,
|
||||
"Got done on unknown output",
|
||||
),
|
||||
);
|
||||
None
|
||||
}
|
||||
};
|
||||
if let Some(event) = event {
|
||||
collection.send_event(event);
|
||||
}
|
||||
}
|
||||
|
||||
extern fn outputs_handle_scale(
|
||||
@ -288,13 +300,13 @@ pub struct Size {
|
||||
}
|
||||
|
||||
/// wl_output mode
|
||||
#[derive(Clone)]
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
struct Mode {
|
||||
width: i32,
|
||||
height: i32,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct OutputState {
|
||||
current_mode: Option<Mode>,
|
||||
transform: Option<c::Transform>,
|
||||
@ -345,7 +357,13 @@ impl OutputState {
|
||||
|
||||
/// Not guaranteed to exist,
|
||||
/// but can be used to look up state.
|
||||
pub type OutputId = c::WlOutput;
|
||||
#[derive(Clone, Copy, PartialEq, Debug)]
|
||||
pub struct OutputId(c::WlOutput);
|
||||
|
||||
// WlOutput is a pointer,
|
||||
// but in the public interface,
|
||||
// we're only using it as a lookup key.
|
||||
unsafe impl Send for OutputId {}
|
||||
|
||||
struct Output {
|
||||
output: c::WlOutput,
|
||||
@ -366,6 +384,10 @@ impl Outputs {
|
||||
}
|
||||
}
|
||||
|
||||
fn send_event(&self, event: Event) {
|
||||
self.sender.send(event.into()).unwrap()
|
||||
}
|
||||
|
||||
fn find_output(&self, wl_output: c::WlOutput) -> Option<&Output> {
|
||||
self.outputs
|
||||
.iter()
|
||||
@ -384,3 +406,16 @@ impl Outputs {
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub enum ChangeType {
|
||||
/// Added or changed
|
||||
Altered(OutputState),
|
||||
Removed,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct Event {
|
||||
output: OutputId,
|
||||
change: ChangeType,
|
||||
}
|
||||
|
||||
14
src/state.rs
14
src/state.rs
@ -8,6 +8,7 @@
|
||||
use crate::animation;
|
||||
use crate::imservice::{ ContentHint, ContentPurpose };
|
||||
use crate::main::{ Commands, PanelCommand };
|
||||
use crate::outputs;
|
||||
use std::time::Instant;
|
||||
|
||||
|
||||
@ -36,7 +37,7 @@ pub enum Event {
|
||||
InputMethod(InputMethod),
|
||||
Visibility(visibility::Event),
|
||||
PhysicalKeyboard(Presence),
|
||||
|
||||
Output(outputs::Event),
|
||||
/// Event triggered because a moment in time passed.
|
||||
/// Use to animate state transitions.
|
||||
/// The value is the ideal arrival time.
|
||||
@ -49,6 +50,12 @@ impl From<InputMethod> for Event {
|
||||
}
|
||||
}
|
||||
|
||||
impl From<outputs::Event> for Event {
|
||||
fn from(ev: outputs::Event) -> Self {
|
||||
Self::Output(ev)
|
||||
}
|
||||
}
|
||||
|
||||
pub mod visibility {
|
||||
#[derive(Clone)]
|
||||
pub enum Event {
|
||||
@ -166,6 +173,11 @@ impl Application {
|
||||
..self
|
||||
},
|
||||
|
||||
Event::Output(output) => {
|
||||
println!("Stub: output event {:?}", output);
|
||||
self
|
||||
},
|
||||
|
||||
Event::InputMethod(new_im) => match (self.im.clone(), new_im) {
|
||||
(InputMethod::Active(_old), InputMethod::Active(new_im))
|
||||
=> Self {
|
||||
|
||||
Reference in New Issue
Block a user