diff --git a/src/ifs/wl_compositor.rs b/src/ifs/wl_compositor.rs index acc2e64e..0156c46a 100644 --- a/src/ifs/wl_compositor.rs +++ b/src/ifs/wl_compositor.rs @@ -80,7 +80,7 @@ impl Global for WlCompositorGlobal { } fn version(&self) -> u32 { - 5 + 6 } } diff --git a/src/ifs/wl_surface.rs b/src/ifs/wl_surface.rs index 3050d1e1..1e2f0ab0 100644 --- a/src/ifs/wl_surface.rs +++ b/src/ifs/wl_surface.rs @@ -76,6 +76,7 @@ const INVALID_TRANSFORM: u32 = 1; const INVALID_SIZE: u32 = 2; const OFFSET_SINCE: u32 = 5; +const BUFFER_SCALE_SINCE: u32 = 6; #[derive(Copy, Clone, Debug, PartialEq)] enum Transform { @@ -211,7 +212,7 @@ impl SurfaceRole { pub struct SurfaceSendPreferredScaleVisitor; impl NodeVisitorBase for SurfaceSendPreferredScaleVisitor { fn visit_surface(&mut self, node: &Rc) { - node.send_preferred_scale(); + node.on_scale_change(); node.node_visit_children(self); } } @@ -432,9 +433,7 @@ impl WlSurface { output.global.send_enter(self); old.global.send_leave(self); if old.preferred_scale.get() != output.preferred_scale.get() { - if let Some(fs) = self.fractional_scale.get() { - fs.send_preferred_scale(); - } + self.on_scale_change(); } let children = self.children.borrow_mut(); if let Some(children) = &*children { @@ -444,10 +443,11 @@ impl WlSurface { } } - pub fn send_preferred_scale(&self) { + fn on_scale_change(&self) { if let Some(fs) = self.fractional_scale.get() { fs.send_preferred_scale(); } + self.send_preferred_buffer_scale(); } pub fn get_toplevel(&self) -> Option> { @@ -518,6 +518,15 @@ impl WlSurface { }) } + pub fn send_preferred_buffer_scale(&self) { + if self.version >= BUFFER_SCALE_SINCE { + self.client.event(PreferredBufferScale { + self_id: self.id, + factor: self.output.get().global.legacy_scale.get() as _, + }); + } + } + fn set_toplevel(&self, tl: Option>) { let ch = self.children.borrow(); if let Some(ch) = &*ch { diff --git a/wire/wl_surface.txt b/wire/wl_surface.txt index 2a3f98f2..46b27eb0 100644 --- a/wire/wl_surface.txt +++ b/wire/wl_surface.txt @@ -60,3 +60,11 @@ msg enter = 0 { msg leave = 1 { output: id(wl_output), } + +msg preferred_buffer_scale = 2 { + factor: i32, +} + +msg preferred_buffer_transform = 3 { + transform: u32, +}