diff --git a/src/cli/color_management.rs b/src/cli/color_management.rs index b70a8c9d..edae33ca 100644 --- a/src/cli/color_management.rs +++ b/src/cli/color_management.rs @@ -56,9 +56,17 @@ impl ColorManagement { jay_color_management::Enabled::handle(tc, id, enabled.clone(), |iv, msg| { iv.set(msg.enabled != 0); }); + let available = Rc::new(Cell::new(false)); + jay_color_management::Available::handle(tc, id, available.clone(), |iv, msg| { + iv.set(msg.available != 0); + }); tc.round_trip().await; if enabled.get() { - println!("Enabled"); + print!("Enabled"); + if !available.get() { + print!(" (Unavailable)"); + } + println!(); } else { println!("Disabled"); } diff --git a/src/gfx_api.rs b/src/gfx_api.rs index 4577f8a3..67a06bc1 100644 --- a/src/gfx_api.rs +++ b/src/gfx_api.rs @@ -742,6 +742,10 @@ pub trait GfxContext: Debug { width: i32, height: i32, ) -> Result, GfxError>; + + fn supports_color_management(&self) -> bool { + false + } } #[derive(Clone, Debug)] diff --git a/src/gfx_apis/vulkan.rs b/src/gfx_apis/vulkan.rs index 24b13165..8a1e568d 100644 --- a/src/gfx_apis/vulkan.rs +++ b/src/gfx_apis/vulkan.rs @@ -363,6 +363,10 @@ impl GfxContext for Context { let buffer = self.0.acquire_blend_buffer(width, height)?; Ok(buffer) } + + fn supports_color_management(&self) -> bool { + self.0.device.descriptor_buffer.is_some() + } } impl Drop for Context { diff --git a/src/ifs/color_management/wp_color_manager_v1.rs b/src/ifs/color_management/wp_color_manager_v1.rs index 72119287..acdf3d9d 100644 --- a/src/ifs/color_management/wp_color_manager_v1.rs +++ b/src/ifs/color_management/wp_color_manager_v1.rs @@ -201,7 +201,7 @@ impl Global for WpColorManagerV1Global { } fn exposed(&self, state: &State) -> bool { - state.color_management_enabled.get() + state.color_management_available() } } diff --git a/src/ifs/jay_color_management.rs b/src/ifs/jay_color_management.rs index 565160f3..5d5194e9 100644 --- a/src/ifs/jay_color_management.rs +++ b/src/ifs/jay_color_management.rs @@ -23,6 +23,13 @@ impl JayColorManagement { enabled: self.client.state.color_management_enabled.get() as u32, }); } + + fn send_available(&self) { + self.client.event(Available { + self_id: self.id, + available: self.client.state.color_management_available() as u32, + }); + } } impl JayColorManagementRequestHandler for JayColorManagement { @@ -35,6 +42,7 @@ impl JayColorManagementRequestHandler for JayColorManagement { fn get(&self, _req: Get, _slf: &Rc) -> Result<(), Self::Error> { self.send_enabled(); + self.send_available(); Ok(()) } diff --git a/src/state.rs b/src/state.rs index 07580bc3..d56b523f 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1315,6 +1315,16 @@ impl State { pub fn tray_icon_size(&self) -> i32 { (self.theme.sizes.title_height.get() - 2).max(0) } + + pub fn color_management_available(&self) -> bool { + if !self.color_management_enabled.get() { + return false; + } + let Some(ctx) = self.render_ctx.get() else { + return false; + }; + ctx.supports_color_management() + } } #[derive(Debug, Error)] diff --git a/wire/jay_color_management.txt b/wire/jay_color_management.txt index 8d75eb0a..82f8d79c 100644 --- a/wire/jay_color_management.txt +++ b/wire/jay_color_management.txt @@ -13,3 +13,7 @@ request set_enabled { event enabled { enabled: u32, } + +event available { + available: u32, +}