diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-01-21 10:03:13 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-01-21 10:03:13 +0400 |
| commit | 5cacd03e859d35e71ff17f0897cdee8a44a8935c (patch) | |
| tree | abc2d079de3b05426ffe6e3927cc5d4fce990618 /src/niri.rs | |
| parent | 6945ccde189b05eb9d9388a4ca5603a39dff9a19 (diff) | |
| download | niri-5cacd03e859d35e71ff17f0897cdee8a44a8935c.tar.gz niri-5cacd03e859d35e71ff17f0897cdee8a44a8935c.tar.bz2 niri-5cacd03e859d35e71ff17f0897cdee8a44a8935c.zip | |
Return error instead of broken screenshot for portal
Diffstat (limited to 'src/niri.rs')
| -rw-r--r-- | src/niri.rs | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/src/niri.rs b/src/niri.rs index d4e39831..3e22a7ab 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -2642,32 +2642,28 @@ impl Niri { include_pointer: bool, on_done: impl FnOnce(PathBuf) + Send + 'static, ) -> anyhow::Result<()> { - use std::cmp::max; - - use smithay::backend::renderer::element::utils::{Relocate, RelocateRenderElement}; - let _span = tracy_client::span!("Niri::screenshot_all_outputs"); - let mut elements = vec![]; - let mut size = Size::from((0, 0)); - let outputs: Vec<_> = self.global_space.outputs().cloned().collect(); - for output in outputs { - let geom = self.global_space.output_geometry(&output).unwrap(); - // FIXME: this does not work when outputs can have non-1 scale. - let geom = geom.to_physical(1); - size.w = max(size.w, geom.loc.x + geom.size.w); - size.h = max(size.h, geom.loc.y + geom.size.h); + // FIXME: support multiple outputs, needs fixing multi-scale handling and cropping. + anyhow::ensure!(outputs.len() == 1); - let output_elements = self.render::<GlesRenderer>(renderer, &output, include_pointer); - elements.extend(output_elements.into_iter().map(|elem| { - RelocateRenderElement::from_element(elem, geom.loc, Relocate::Relative) - })); - } + let output = outputs.into_iter().next().unwrap(); + let geom = self.global_space.output_geometry(&output).unwrap(); + + let output_scale = output.current_scale().integer_scale(); + let geom = geom.to_physical(output_scale); - // FIXME: scale. - let pixels = render_to_vec(renderer, size, Scale::from(1.), Fourcc::Abgr8888, &elements)?; + let size = geom.size; + let elements = self.render::<GlesRenderer>(renderer, &output, include_pointer); + let pixels = render_to_vec( + renderer, + size, + Scale::from(f64::from(output_scale)), + Fourcc::Abgr8888, + &elements, + )?; let path = make_screenshot_path(&self.config.borrow()) .ok() |
