aboutsummaryrefslogtreecommitdiff
path: root/src/niri.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-10-10 12:42:24 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-10-10 12:42:24 +0400
commitc8105ae1a67f78a7b31374eb390a89538064cc59 (patch)
tree5eb764bb817e35923fe6ffd09fad0f465bb761f6 /src/niri.rs
parentcb73bcfb3248a5f5d2349d59790ed75c8431efcd (diff)
downloadniri-c8105ae1a67f78a7b31374eb390a89538064cc59.tar.gz
niri-c8105ae1a67f78a7b31374eb390a89538064cc59.tar.bz2
niri-c8105ae1a67f78a7b31374eb390a89538064cc59.zip
Add screenshot-window action
Diffstat (limited to 'src/niri.rs')
-rw-r--r--src/niri.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/niri.rs b/src/niri.rs
index 3fbb35f0..8d437de1 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -1510,6 +1510,40 @@ impl Niri {
let elements = self.render(renderer, output, true);
let pixels = render_to_vec(renderer, size, scale, &elements)?;
+ self.save_screenshot(size, pixels)
+ .context("error saving screenshot")
+ }
+
+ pub fn screenshot_window(
+ &mut self,
+ renderer: &mut GlesRenderer,
+ output: &Output,
+ window: &Window,
+ ) -> anyhow::Result<()> {
+ let _span = tracy_client::span!("Niri::screenshot_window");
+
+ let scale = Scale::from(output.current_scale().fractional_scale());
+ let bbox = window.bbox_with_popups();
+ let size = bbox.size.to_physical_precise_ceil(scale);
+ let buf_pos = Point::from((0, 0)) - bbox.loc;
+ // FIXME: pointer.
+ let elements = window.render_elements::<WaylandSurfaceRenderElement<GlesRenderer>>(
+ renderer,
+ buf_pos.to_physical_precise_ceil(scale),
+ scale,
+ 1.,
+ );
+ let pixels = render_to_vec(renderer, size, scale, &elements)?;
+
+ self.save_screenshot(size, pixels)
+ .context("error saving screenshot")
+ }
+
+ fn save_screenshot(
+ &mut self,
+ size: Size<i32, Physical>,
+ pixels: Vec<u8>,
+ ) -> anyhow::Result<()> {
let path = make_screenshot_path().context("error making screenshot path")?;
debug!("saving screenshot to {path:?}");