From 58f06293a4740f12fac36a42fc10dab65981f888 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Sat, 20 Sep 2025 20:38:58 +0200 Subject: [PATCH 1/2] color-management: implement ext-image-capture-color-management-v1 --- src/client/objects.rs | 25 ++- src/globals.rs | 6 +- src/ifs.rs | 1 + .../wp_image_description_reference_v1.rs | 1 - src/ifs/ext_image_capture_source_colors_v1.rs | 112 ++++++++++++ src/ifs/ext_image_copy.rs | 1 + .../ext_image_capture_color_manager_v1.rs | 167 ++++++++++++++++++ .../ext_image_copy_capture_frame_v1.rs | 29 ++- .../ext_image_copy_capture_session_v1.rs | 3 + src/ifs/wl_output.rs | 3 + src/ifs/wl_surface.rs | 5 + src/macros.rs | 2 +- src/tree/output.rs | 3 + wire/ext_image_capture_color_manager_v1.txt | 12 ++ wire/ext_image_capture_source_colors_v1.txt | 10 ++ 15 files changed, 365 insertions(+), 15 deletions(-) create mode 100644 src/ifs/ext_image_capture_source_colors_v1.rs create mode 100644 src/ifs/ext_image_copy/ext_image_capture_color_manager_v1.rs create mode 100644 wire/ext_image_capture_color_manager_v1.txt create mode 100644 wire/ext_image_capture_source_colors_v1.txt diff --git a/src/client/objects.rs b/src/client/objects.rs index d4449f849..e9f4f9cc5 100644 --- a/src/client/objects.rs +++ b/src/client/objects.rs @@ -8,7 +8,10 @@ use { }, ext_foreign_toplevel_handle_v1::ExtForeignToplevelHandleV1, ext_image_capture_source_v1::ExtImageCaptureSourceV1, - ext_image_copy::ext_image_copy_capture_session_v1::ExtImageCopyCaptureSessionV1, + ext_image_copy::{ + ext_image_copy_capture_frame_v1::ExtImageCopyCaptureFrameV1, + ext_image_copy_capture_session_v1::ExtImageCopyCaptureSessionV1, + }, head_management::jay_head_error_v1::JayHeadErrorV1, ipc::{ data_control::{ @@ -48,14 +51,14 @@ use { }, wire::{ ExtDataControlSourceV1Id, ExtForeignToplevelHandleV1Id, ExtImageCaptureSourceV1Id, - ExtImageCopyCaptureSessionV1Id, ExtWorkspaceGroupHandleV1Id, JayHeadErrorV1Id, - JayOutputId, JayScreencastId, JayToplevelId, JayWorkspaceId, WlBufferId, - WlDataSourceId, WlOutputId, WlPointerId, WlRegionId, WlRegistryId, WlSeatId, - WlSurfaceId, WpDrmLeaseConnectorV1Id, WpImageDescriptionReferenceV1Id, - WpImageDescriptionV1Id, WpLinuxDrmSyncobjTimelineV1Id, XdgPopupId, XdgPositionerId, - XdgSurfaceId, XdgToplevelId, XdgWmBaseId, ZwlrDataControlSourceV1Id, - ZwlrOutputHeadV1Id, ZwlrOutputModeV1Id, ZwpPrimarySelectionSourceV1Id, - ZwpTabletToolV2Id, + ExtImageCopyCaptureFrameV1Id, ExtImageCopyCaptureSessionV1Id, + ExtWorkspaceGroupHandleV1Id, JayHeadErrorV1Id, JayOutputId, JayScreencastId, + JayToplevelId, JayWorkspaceId, WlBufferId, WlDataSourceId, WlOutputId, WlPointerId, + WlRegionId, WlRegistryId, WlSeatId, WlSurfaceId, WpDrmLeaseConnectorV1Id, + WpImageDescriptionReferenceV1Id, WpImageDescriptionV1Id, WpLinuxDrmSyncobjTimelineV1Id, + XdgPopupId, XdgPositionerId, XdgSurfaceId, XdgToplevelId, XdgWmBaseId, + ZwlrDataControlSourceV1Id, ZwlrOutputHeadV1Id, ZwlrOutputModeV1Id, + ZwpPrimarySelectionSourceV1Id, ZwpTabletToolV2Id, }, }, std::{cell::RefCell, rc::Rc}, @@ -90,6 +93,8 @@ pub struct Objects { pub tablet_tools: CopyHashMap>, pub xdg_popups: CopyHashMap>, pub image_capture_sources: CopyHashMap>, + pub image_capture_frames: + CopyHashMap>, pub foreign_toplevel_handles: CopyHashMap>, pub ext_copy_sessions: @@ -137,6 +142,7 @@ impl Objects { tablet_tools: Default::default(), xdg_popups: Default::default(), image_capture_sources: Default::default(), + image_capture_frames: Default::default(), foreign_toplevel_handles: Default::default(), ext_copy_sessions: Default::default(), ext_data_sources: Default::default(), @@ -184,6 +190,7 @@ impl Objects { self.tablet_tools.clear(); self.xdg_popups.clear(); self.image_capture_sources.clear(); + self.image_capture_frames.clear(); self.foreign_toplevel_handles.clear(); self.ext_copy_sessions.clear(); self.ext_data_sources.clear(); diff --git a/src/globals.rs b/src/globals.rs index 59ca1a3c9..95b377f4a 100644 --- a/src/globals.rs +++ b/src/globals.rs @@ -7,7 +7,10 @@ use { ext_foreign_toplevel_image_capture_source_manager_v1::ExtForeignToplevelImageCaptureSourceManagerV1Global, ext_foreign_toplevel_list_v1::ExtForeignToplevelListV1Global, ext_idle_notifier_v1::ExtIdleNotifierV1Global, - ext_image_copy::ext_image_copy_capture_manager_v1::ExtImageCopyCaptureManagerV1Global, + ext_image_copy::{ + ext_image_capture_color_manager_v1::ExtImageCaptureColorManagerV1Global, + ext_image_copy_capture_manager_v1::ExtImageCopyCaptureManagerV1Global, + }, ext_output_image_capture_source_manager_v1::ExtOutputImageCaptureSourceManagerV1Global, ext_session_lock_manager_v1::ExtSessionLockManagerV1Global, head_management::jay_head_manager_v1::JayHeadManagerV1Global, @@ -231,6 +234,7 @@ impl Globals { add_singleton!(XdgToplevelTagManagerV1Global); add_singleton!(JayHeadManagerV1Global); add_singleton!(WpPointerWarpV1Global); + add_singleton!(ExtImageCaptureColorManagerV1Global); } pub fn add_backend_singletons(&self, backend: &Rc) { diff --git a/src/ifs.rs b/src/ifs.rs index 74b2fca69..a525d3267 100644 --- a/src/ifs.rs +++ b/src/ifs.rs @@ -4,6 +4,7 @@ pub mod ext_foreign_toplevel_image_capture_source_manager_v1; pub mod ext_foreign_toplevel_list_v1; pub mod ext_idle_notification_v1; pub mod ext_idle_notifier_v1; +pub mod ext_image_capture_source_colors_v1; pub mod ext_image_capture_source_v1; pub mod ext_image_copy; pub mod ext_output_image_capture_source_manager_v1; diff --git a/src/ifs/color_management/wp_image_description_reference_v1.rs b/src/ifs/color_management/wp_image_description_reference_v1.rs index ca65eaacb..5f3922ecd 100644 --- a/src/ifs/color_management/wp_image_description_reference_v1.rs +++ b/src/ifs/color_management/wp_image_description_reference_v1.rs @@ -10,7 +10,6 @@ use { thiserror::Error, }; -#[expect(dead_code)] pub struct WpImageDescriptionReferenceV1 { pub id: WpImageDescriptionReferenceV1Id, pub client: Rc, diff --git a/src/ifs/ext_image_capture_source_colors_v1.rs b/src/ifs/ext_image_capture_source_colors_v1.rs new file mode 100644 index 000000000..dff6178a7 --- /dev/null +++ b/src/ifs/ext_image_capture_source_colors_v1.rs @@ -0,0 +1,112 @@ +use { + crate::{ + client::{Client, ClientError}, + cmm::cmm_description::ColorDescription, + ifs::color_management::wp_image_description_reference_v1::WpImageDescriptionReferenceV1, + leaks::Tracker, + object::{Object, Version}, + utils::{ + clonecell::CloneCell, + event_listener::{EventListener, EventSource}, + }, + wire::{ExtImageCaptureSourceColorsV1Id, ext_image_capture_source_colors_v1::*}, + }, + std::{ + cell::{Cell, LazyCell}, + ops::Deref, + rc::Rc, + }, + thiserror::Error, +}; + +#[derive(Default)] +pub struct PreferredColorDescriptionListeners { + init: Cell, + source: LazyCell>, +} + +impl PreferredColorDescriptionListeners { + pub fn changed(&self, desc: impl FnOnce() -> Rc) { + if !self.init.get() { + return; + } + let source = self.source.deref(); + if source.has_listeners() { + let desc = desc(); + for listener in source.iter() { + listener.changed(&desc); + } + } + } + + pub fn attach(&self, listener: &EventListener) { + self.init.set(true); + listener.attach(&self.source); + } +} + +pub trait PreferredColorDescriptionListener { + fn changed(&self, new: &Rc); +} + +pub struct ExtImageCaptureSourceColorsV1 { + pub id: ExtImageCaptureSourceColorsV1Id, + pub client: Rc, + pub version: Version, + pub tracker: Tracker, + pub desc: CloneCell>, + pub listener: EventListener, +} + +impl ExtImageCaptureSourceColorsV1 { + fn send_preferred_changed(&self, new: &Rc) { + self.client.event(PreferredChanged { + self_id: self.id, + identity: new.id.raw(), + }); + } +} + +impl PreferredColorDescriptionListener for ExtImageCaptureSourceColorsV1 { + fn changed(&self, new: &Rc) { + self.desc.set(new.clone()); + self.send_preferred_changed(new); + } +} + +impl ExtImageCaptureSourceColorsV1RequestHandler for ExtImageCaptureSourceColorsV1 { + type Error = ExtImageCaptureSourceColorsError; + + fn destroy(&self, _req: Destroy, _slf: &Rc) -> Result<(), Self::Error> { + self.client.remove_obj(self)?; + Ok(()) + } + + fn get_preferred(&self, req: GetPreferred, _slf: &Rc) -> Result<(), Self::Error> { + let ref_ = Rc::new(WpImageDescriptionReferenceV1 { + id: req.id, + client: self.client.clone(), + tracker: Default::default(), + description: self.desc.get(), + }); + track!(self.client, ref_); + self.client.add_client_obj(&ref_)?; + Ok(()) + } +} + +object_base! { + self = ExtImageCaptureSourceColorsV1; + version = self.version; +} + +impl Object for ExtImageCaptureSourceColorsV1 {} + +simple_add_obj!(ExtImageCaptureSourceColorsV1); + +#[derive(Debug, Error)] +pub enum ExtImageCaptureSourceColorsError { + #[error(transparent)] + ClientError(Box), +} +efrom!(ExtImageCaptureSourceColorsError, ClientError); diff --git a/src/ifs/ext_image_copy.rs b/src/ifs/ext_image_copy.rs index d736eed2b..d0e17e5e2 100644 --- a/src/ifs/ext_image_copy.rs +++ b/src/ifs/ext_image_copy.rs @@ -1,3 +1,4 @@ +pub mod ext_image_capture_color_manager_v1; pub mod ext_image_copy_capture_cursor_session_v1; pub mod ext_image_copy_capture_frame_v1; pub mod ext_image_copy_capture_manager_v1; diff --git a/src/ifs/ext_image_copy/ext_image_capture_color_manager_v1.rs b/src/ifs/ext_image_copy/ext_image_capture_color_manager_v1.rs new file mode 100644 index 000000000..9754b2dba --- /dev/null +++ b/src/ifs/ext_image_copy/ext_image_capture_color_manager_v1.rs @@ -0,0 +1,167 @@ +use { + crate::{ + client::{CAP_SCREENCOPY_MANAGER, Client, ClientCaps, ClientError}, + globals::{Global, GlobalName}, + ifs::{ + ext_image_capture_source_colors_v1::ExtImageCaptureSourceColorsV1, + ext_image_capture_source_v1::ImageCaptureSource, + ext_image_copy::ext_image_copy_capture_frame_v1::ExtImageCopyCaptureFrameV1Error, + }, + leaks::Tracker, + object::{Object, Version}, + state::State, + utils::{clonecell::CloneCell, event_listener::EventListener}, + wire::{ExtImageCaptureColorManagerV1Id, ext_image_capture_color_manager_v1::*}, + }, + std::rc::{Rc, Weak}, + thiserror::Error, +}; + +pub struct ExtImageCaptureColorManagerV1Global { + pub name: GlobalName, +} + +impl ExtImageCaptureColorManagerV1Global { + pub fn new(name: GlobalName) -> Self { + Self { name } + } + + fn bind_( + self: Rc, + id: ExtImageCaptureColorManagerV1Id, + client: &Rc, + version: Version, + ) -> Result<(), ExtImageCaptureColorManagerV1Error> { + let obj = Rc::new(ExtImageCaptureColorManagerV1 { + id, + client: client.clone(), + tracker: Default::default(), + version, + }); + track!(client, obj); + client.add_client_obj(&obj)?; + Ok(()) + } +} + +pub struct ExtImageCaptureColorManagerV1 { + pub(super) id: ExtImageCaptureColorManagerV1Id, + pub(super) client: Rc, + pub(super) tracker: Tracker, + pub(super) version: Version, +} + +impl ExtImageCaptureColorManagerV1RequestHandler for ExtImageCaptureColorManagerV1 { + type Error = ExtImageCaptureColorManagerV1Error; + + fn destroy(&self, _req: Destroy, _slf: &Rc) -> Result<(), Self::Error> { + self.client.remove_obj(self)?; + Ok(()) + } + + fn get_capture_source_colors( + &self, + req: GetCaptureSourceColors, + _slf: &Rc, + ) -> Result<(), Self::Error> { + let source = self.client.lookup(req.source)?; + let output; + let surface; + let mut event_source = None; + let mut desc = self.client.state.color_manager.srgb_gamma22().clone(); + match &source.ty { + ImageCaptureSource::Output(o) => { + if let Some(o) = o.get() { + desc = o.color_description.get(); + output = o; + event_source = Some(&output.color_description_listeners2); + } + } + ImageCaptureSource::Toplevel(tl) => { + if let Some(tl) = tl.get() + && let Some(s) = tl.tl_scanout_surface() + { + desc = s.color_description(); + surface = s; + event_source = Some(&surface.color_description_listeners); + } + } + } + let obj = Rc::new_cyclic(|slf: &Weak| { + ExtImageCaptureSourceColorsV1 { + id: req.colors, + client: self.client.clone(), + version: self.version, + tracker: Default::default(), + desc: CloneCell::new(desc), + listener: EventListener::new(slf.clone()), + } + }); + track!(self.client, &obj); + self.client.add_client_obj(&obj)?; + if let Some(source) = event_source { + source.attach(&obj.listener); + } + Ok(()) + } + + fn set_frame_image_description( + &self, + req: SetFrameImageDescription, + _slf: &Rc, + ) -> Result<(), Self::Error> { + let cd = self.client.lookup(req.image_description)?; + let Some(desc) = &cd.description else { + return Err(ExtImageCaptureColorManagerV1Error::NotReady); + }; + let frame = self.client.lookup(req.frame)?; + frame.set_color_description(desc)?; + Ok(()) + } +} + +global_base!( + ExtImageCaptureColorManagerV1Global, + ExtImageCaptureColorManagerV1, + ExtImageCaptureColorManagerV1Error +); + +impl Global for ExtImageCaptureColorManagerV1Global { + fn singleton(&self) -> bool { + true + } + + fn version(&self) -> u32 { + 1 + } + + fn required_caps(&self) -> ClientCaps { + CAP_SCREENCOPY_MANAGER + } + + fn exposed(&self, state: &State) -> bool { + state.color_management_available() + } +} + +simple_add_global!(ExtImageCaptureColorManagerV1Global); + +object_base! { + self = ExtImageCaptureColorManagerV1; + version = self.version; +} + +impl Object for ExtImageCaptureColorManagerV1 {} + +simple_add_obj!(ExtImageCaptureColorManagerV1); + +#[derive(Debug, Error)] +pub enum ExtImageCaptureColorManagerV1Error { + #[error(transparent)] + ClientError(Box), + #[error("The image description is not ready")] + NotReady, + #[error(transparent)] + FrameError(#[from] ExtImageCopyCaptureFrameV1Error), +} +efrom!(ExtImageCaptureColorManagerV1Error, ClientError); diff --git a/src/ifs/ext_image_copy/ext_image_copy_capture_frame_v1.rs b/src/ifs/ext_image_copy/ext_image_copy_capture_frame_v1.rs index 5f47052bf..f98a3ebae 100644 --- a/src/ifs/ext_image_copy/ext_image_copy_capture_frame_v1.rs +++ b/src/ifs/ext_image_copy/ext_image_copy_capture_frame_v1.rs @@ -66,6 +66,7 @@ impl ExtImageCopyCaptureFrameV1 { self.session.status.set(FrameStatus::Failed); self.session.presentation_listener.detach(); self.session.buffer.take(); + self.session.color_description.take(); self.session.pending_download.take(); self.session.force_capture.set(true); } @@ -206,6 +207,10 @@ impl ExtImageCopyCaptureFrameV1 { ) { let transform = on.global.persistent.transform.get(); let req_size = size.unwrap_or(transform.maybe_swap(texture.size())); + let target_cd = self.session.color_description.get(); + let target_cd = target_cd + .as_ref() + .unwrap_or(self.client.state.color_manager.srgb_gamma22()); self.copy(on, req_size, |fb, aq, re| { self.client.state.perform_screencopy( texture, @@ -217,7 +222,7 @@ impl ExtImageCopyCaptureFrameV1 { aq, re, jay_config::video::Transform::None, - self.client.state.color_manager.srgb_gamma22(), + target_cd, on.global.pos.get(), render_hardware_cursors, x_off, @@ -231,11 +236,15 @@ impl ExtImageCopyCaptureFrameV1 { pub(super) fn copy_node(self: &Rc, on: &OutputNode, node: &dyn Node, size: (i32, i32)) { let scale = on.global.persistent.scale.get(); + let target_cd = self.session.color_description.get(); + let target_cd = target_cd + .as_ref() + .unwrap_or(self.client.state.color_manager.srgb_gamma22()); self.copy(on, size, |fb, aq, re| { fb.render_node( aq, re, - self.client.state.color_manager.srgb_gamma22(), + target_cd, node, &self.client.state, Some(node.node_absolute_position()), @@ -275,6 +284,15 @@ impl ExtImageCopyCaptureFrameV1 { self.client.event(Ready { self_id: self.id }); self.session.status.set(FrameStatus::Ready); } + + pub(super) fn set_color_description( + &self, + desc: &Rc, + ) -> Result<(), ExtImageCopyCaptureFrameV1Error> { + self.ensure_unused()?; + self.session.color_description.set(Some(desc.clone())); + Ok(()) + } } impl ExtImageCopyCaptureFrameV1RequestHandler for ExtImageCopyCaptureFrameV1 { @@ -291,6 +309,7 @@ impl ExtImageCopyCaptureFrameV1RequestHandler for ExtImageCopyCaptureFrameV1 { self.session.pending_download.take(); self.session.status.set(FrameStatus::Unused); self.session.buffer.take(); + self.session.color_description.take(); self.client.remove_obj(self)?; Ok(()) } @@ -359,7 +378,11 @@ object_base! { impl Object for ExtImageCopyCaptureFrameV1 {} -simple_add_obj!(ExtImageCopyCaptureFrameV1); +dedicated_add_obj!( + ExtImageCopyCaptureFrameV1, + ExtImageCopyCaptureFrameV1Id, + image_capture_frames, +); #[derive(Debug, Error)] pub enum ExtImageCopyCaptureFrameV1Error { diff --git a/src/ifs/ext_image_copy/ext_image_copy_capture_session_v1.rs b/src/ifs/ext_image_copy/ext_image_copy_capture_session_v1.rs index 286e98500..98f10030f 100644 --- a/src/ifs/ext_image_copy/ext_image_copy_capture_session_v1.rs +++ b/src/ifs/ext_image_copy/ext_image_copy_capture_session_v1.rs @@ -46,6 +46,7 @@ pub struct ExtImageCopyCaptureSessionV1 { pub(super) size_debounce: Cell, pub(super) status: Cell, pub(super) buffer: CloneCell>>, + pub(super) color_description: CloneCell>>, pub(super) pending_download: Cell>, pub(super) presented: Cell>, } @@ -74,6 +75,7 @@ impl ExtImageCopyCaptureSessionV1 { size_debounce: Default::default(), status: Cell::new(FrameStatus::Unused), buffer: Default::default(), + color_description: Default::default(), pending_download: Default::default(), presented: Default::default(), } @@ -182,6 +184,7 @@ impl ExtImageCopyCaptureSessionV1 { self.latch_listener.detach(); self.presentation_listener.detach(); self.buffer.take(); + self.color_description.take(); self.pending_download.take(); self.presented.take(); } diff --git a/src/ifs/wl_output.rs b/src/ifs/wl_output.rs index dd055b615..da76fcdf6 100644 --- a/src/ifs/wl_output.rs +++ b/src/ifs/wl_output.rs @@ -15,6 +15,7 @@ use { globals::{Global, GlobalName}, ifs::{ color_management::wp_color_management_output_v1::WpColorManagementOutputV1, + ext_image_capture_source_colors_v1::PreferredColorDescriptionListeners, wl_surface::WlSurface, zxdg_output_v1::ZxdgOutputV1, }, leaks::Tracker, @@ -93,6 +94,7 @@ pub struct WlOutputGlobal { pub linear_color_description: CloneCell>, pub color_description_listeners: CopyHashMap<(ClientId, WpColorManagementOutputV1Id), Rc>, + pub color_description_listeners2: PreferredColorDescriptionListeners, } #[derive(Default)] @@ -240,6 +242,7 @@ impl WlOutputGlobal { color_description: CloneCell::new(state.color_manager.srgb_gamma22().clone()), linear_color_description: CloneCell::new(state.color_manager.srgb_linear().clone()), color_description_listeners: Default::default(), + color_description_listeners2: Default::default(), }; global.update_damage_matrix(); global.update_color_description(); diff --git a/src/ifs/wl_surface.rs b/src/ifs/wl_surface.rs index 54ed4b4d3..d91ae437e 100644 --- a/src/ifs/wl_surface.rs +++ b/src/ifs/wl_surface.rs @@ -34,6 +34,7 @@ use { }, ifs::{ color_management::wp_color_management_surface_feedback_v1::WpColorManagementSurfaceFeedbackV1, + ext_image_capture_source_colors_v1::PreferredColorDescriptionListeners, wl_buffer::WlBuffer, wl_callback::WlCallback, wl_seat::{ @@ -350,6 +351,7 @@ pub struct WlSurface { color_management_feedback: CopyHashMap>, color_description: CloneCell>>, + pub color_description_listeners: PreferredColorDescriptionListeners, } impl Debug for WlSurface { @@ -704,6 +706,7 @@ impl WlSurface { color_management_surface: Default::default(), color_management_feedback: Default::default(), color_description: Default::default(), + color_description_listeners: Default::default(), } } @@ -1191,6 +1194,8 @@ impl WlSurface { if let Some(desc) = pending.color_description.take() { color_description_changed = true; self.color_description.set(desc); + self.color_description_listeners + .changed(|| self.color_description()); } let mut alpha_changed = false; if let Some(alpha) = pending.alpha_multiplier.take() { diff --git a/src/macros.rs b/src/macros.rs index 5c442c268..110a24e64 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -320,7 +320,7 @@ macro_rules! tree_id { } macro_rules! dedicated_add_obj { - ($oname:ident, $idname:ident, $field:ident) => { + ($oname:ident, $idname:ident, $field:ident $(,)?) => { impl crate::client::WaylandObject for $oname { fn add(self: Rc, client: &crate::client::Client) { client.objects.$field.set(self.id.into(), self); diff --git a/src/tree/output.rs b/src/tree/output.rs index 6cdcc2e7c..c04d88e95 100644 --- a/src/tree/output.rs +++ b/src/tree/output.rs @@ -984,6 +984,9 @@ impl OutputNode { for fb in self.global.color_description_listeners.lock().values() { fb.send_image_description_changed(); } + self.global + .color_description_listeners2 + .changed(|| self.global.color_description.get()); self.visit_children(&mut SurfaceSendPreferredColorDescription); } } diff --git a/wire/ext_image_capture_color_manager_v1.txt b/wire/ext_image_capture_color_manager_v1.txt new file mode 100644 index 000000000..e40f15f96 --- /dev/null +++ b/wire/ext_image_capture_color_manager_v1.txt @@ -0,0 +1,12 @@ +request destroy (destructor) { +} + +request get_capture_source_colors { + colors: id(ext_image_capture_source_colors_v1) (new), + source: id(ext_image_capture_source_v1), +} + +request set_frame_image_description { + frame: id(ext_image_copy_capture_frame_v1), + image_description: id(wp_image_description_v1), +} diff --git a/wire/ext_image_capture_source_colors_v1.txt b/wire/ext_image_capture_source_colors_v1.txt new file mode 100644 index 000000000..6777fbb76 --- /dev/null +++ b/wire/ext_image_capture_source_colors_v1.txt @@ -0,0 +1,10 @@ +request destroy (destructor) { +} + +request get_preferred { + id: id(wp_image_description_reference_v1) (new), +} + +event preferred_changed { + identity: u64, +} From 12da1872f95f285e4f1814a42bb3d3ecb3dd021f Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Sat, 20 Sep 2025 20:42:02 +0200 Subject: [PATCH 2/2] screencapture: implement ext-image-copy-capture-v1 version 2 --- src/ifs/ext_image_copy/ext_image_copy_capture_manager_v1.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ifs/ext_image_copy/ext_image_copy_capture_manager_v1.rs b/src/ifs/ext_image_copy/ext_image_copy_capture_manager_v1.rs index c2a219e11..eb69cc8e6 100644 --- a/src/ifs/ext_image_copy/ext_image_copy_capture_manager_v1.rs +++ b/src/ifs/ext_image_copy/ext_image_copy_capture_manager_v1.rs @@ -147,7 +147,7 @@ impl Global for ExtImageCopyCaptureManagerV1Global { } fn version(&self) -> u32 { - 1 + 2 } fn required_caps(&self) -> ClientCaps {