diff --git a/src/compositor.rs b/src/compositor.rs index 5b2e08f1..dd75f6cd 100644 --- a/src/compositor.rs +++ b/src/compositor.rs @@ -36,7 +36,7 @@ use { HeadManagers, HeadState, jay_head_manager_session_v1::handle_jay_head_manager_done, }, jay_screencast::{perform_screencast_realloc, perform_toplevel_screencasts}, - wl_output::{OutputId, PersistentOutputState, WlOutputGlobal}, + wl_output::{BlendSpace, OutputId, PersistentOutputState, WlOutputGlobal}, wl_seat::handle_position_hint_requests, wl_surface::{ NoneSurfaceExt, xdg_surface::handle_xdg_surface_configure_events, @@ -704,6 +704,9 @@ fn create_dummy_output(state: &Rc) { eotf: backend_state.eotf, supported_formats: Default::default(), brightness: None, + blend_space: BlendSpace::Srgb, + use_native_gamut: false, + vrr_cursor_hz: None, }; let connector_data = Rc::new(ConnectorData { id, diff --git a/src/ifs/head_management.rs b/src/ifs/head_management.rs index 750b48b8..8b1bf6bc 100644 --- a/src/ifs/head_management.rs +++ b/src/ifs/head_management.rs @@ -7,9 +7,12 @@ use { client::ClientId, format::Format, globals::GlobalName, - ifs::head_management::{ - head_management_macros::HeadExts, jay_head_manager_session_v1::JayHeadManagerSessionV1, - jay_head_v1::JayHeadV1, + ifs::{ + head_management::{ + head_management_macros::HeadExts, + jay_head_manager_session_v1::JayHeadManagerSessionV1, jay_head_v1::JayHeadV1, + }, + wl_output::BlendSpace, }, scale::Scale, state::OutputData, @@ -92,6 +95,9 @@ pub struct HeadState { pub eotf: BackendEotfs, pub supported_formats: RcEq>, pub brightness: Option, + pub blend_space: BlendSpace, + pub use_native_gamut: bool, + pub vrr_cursor_hz: Option, } pub struct ReadOnlyHeadState { @@ -258,6 +264,10 @@ impl HeadManagers { state.transform = n.global.persistent.transform.get(); state.vrr_mode = n.global.persistent.vrr_mode.get(); state.tearing_mode = n.global.persistent.tearing_mode.get(); + state.brightness = n.global.persistent.brightness.get(); + state.blend_space = n.global.persistent.blend_space.get(); + state.use_native_gamut = n.global.persistent.use_native_gamut.get(); + state.vrr_cursor_hz = n.global.persistent.vrr_cursor_hz.get(); } for head in self.managers.lock().values() { skip_in_transaction!(head); @@ -548,4 +558,19 @@ impl HeadManagers { } } } + + pub fn handle_blend_space_change(&self, blend_space: BlendSpace) { + let state = &mut *self.state.borrow_mut(); + state.blend_space = blend_space; + } + + pub fn handle_use_native_gamut_change(&self, use_native_gamut: bool) { + let state = &mut *self.state.borrow_mut(); + state.use_native_gamut = use_native_gamut; + } + + pub fn handle_cursor_hz_change(&self, cursor_hz: Option) { + let state = &mut *self.state.borrow_mut(); + state.vrr_cursor_hz = cursor_hz; + } } diff --git a/src/output_schedule.rs b/src/output_schedule.rs index 8164922e..c9420c21 100644 --- a/src/output_schedule.rs +++ b/src/output_schedule.rs @@ -127,6 +127,7 @@ impl OutputSchedule { Some(v) => v, }; self.persistent.vrr_cursor_hz.set(hz); + self.connector.head_managers.handle_cursor_hz_change(hz); self.cursor_delta_nsec.set(delta); self.trigger(); } diff --git a/src/tasks/connector.rs b/src/tasks/connector.rs index bd4afc00..aee14494 100644 --- a/src/tasks/connector.rs +++ b/src/tasks/connector.rs @@ -74,6 +74,9 @@ pub fn handle(state: &Rc, connector: &Rc) { eotf: backend_state.eotf, supported_formats: Default::default(), brightness: None, + blend_space: BlendSpace::Srgb, + use_native_gamut: false, + vrr_cursor_hz: None, }; let data = Rc::new(ConnectorData { id, diff --git a/src/tree/output.rs b/src/tree/output.rs index 39e1d794..7eda4d6c 100644 --- a/src/tree/output.rs +++ b/src/tree/output.rs @@ -1000,6 +1000,10 @@ impl OutputNode { .replace(use_native_gamut); if old != use_native_gamut { self.update_color_description(); + self.global + .connector + .head_managers + .handle_use_native_gamut_change(use_native_gamut); } } @@ -1007,6 +1011,10 @@ impl OutputNode { let old = self.global.persistent.blend_space.replace(blend_space); if old != blend_space { self.state.damage(self.global.position()); + self.global + .connector + .head_managers + .handle_blend_space_change(blend_space); } } fn find_stacked_at(