input: Add screenshotting shortcut

This commit is contained in:
Victoria Brekenfeld 2022-07-20 17:25:36 +02:00
parent 979e282768
commit 63b252e47d
8 changed files with 193 additions and 14 deletions

View file

@ -8,7 +8,7 @@ use crate::{
wayland::protocols::{
drm::WlDrmState, output_configuration::OutputConfigurationState,
workspace::WorkspaceClientState,
},
}, utils::prelude::OutputExt,
};
use smithay::{
backend::drm::DrmNode,
@ -199,6 +199,61 @@ impl BackendData {
_ => unreachable!("No backend was initialized"),
}
}
pub fn offscreen_for_output(
&mut self,
output: &Output,
state: &mut Common,
) -> anyhow::Result<image::ImageBuffer<image::Rgba<u8>, Vec<u8>>> {
use anyhow::Context;
use smithay::{
backend::{
drm::NodeType,
renderer::{
Bind, Offscreen, ExportMem,
gles2::Gles2Renderbuffer,
},
},
utils::Rectangle,
};
use crate::backend::render::render_output;
let mut _tmp_multirenderer = None;
let (node, renderer) = match self {
BackendData::Winit(winit) => (None, winit.backend.renderer()),
BackendData::X11(x11) => (None, &mut x11.renderer),
BackendData::Kms(kms) => {
let node = kms.target_node_for_output(output)
.unwrap_or(kms.primary)
.node_with_type(NodeType::Render)
.with_context(|| "Unable to find node")??;
_tmp_multirenderer = Some(kms.api.renderer::<Gles2Renderbuffer>(&node, &node)?);
(Some(node), _tmp_multirenderer.as_mut().map(|x| x.as_mut()).unwrap())
},
BackendData::Unset => unreachable!(),
};
let size = output.geometry().size.to_f64().to_buffer(
output.current_scale().fractional_scale(),
output.current_transform().into()
).to_i32_round();
let buffer = Offscreen::<Gles2Renderbuffer>::create_buffer(renderer, size)?;
renderer.bind(buffer)?;
render_output(
node.as_ref(),
renderer,
0,
state,
output,
false,
#[cfg(feature = "debug")]
None,
)?;
let mapping = renderer.copy_framebuffer(Rectangle::from_loc_and_size((0, 0), size))?;
let data = Vec::from(renderer.map_texture(&mapping)?);
Ok(image::ImageBuffer::from_raw(size.w as u32, size.h as u32, data).with_context(|| "buffer smaller then dimensions")?)
}
}
impl State {