diff options
| author | Michael Yang <admin@my4ng.dev> | 2024-07-30 13:38:25 +1000 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-08-08 13:32:37 +0300 |
| commit | b6a7b3e9e4715c099b1d0e67252c0a149238d683 (patch) | |
| tree | e0f93b6c04c1f1e136c946b64dcd4b5647579f79 /src/handlers | |
| parent | 1cf5cfce064ba9926b9777df34cb5a4add0e1f64 (diff) | |
| download | niri-b6a7b3e9e4715c099b1d0e67252c0a149238d683.tar.gz niri-b6a7b3e9e4715c099b1d0e67252c0a149238d683.tar.bz2 niri-b6a7b3e9e4715c099b1d0e67252c0a149238d683.zip | |
feat: update screencopy to version 3
Diffstat (limited to 'src/handlers')
| -rw-r--r-- | src/handlers/mod.rs | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index ce2896b2..b5c4392d 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -17,6 +17,7 @@ use smithay::input::{keyboard, Seat, SeatHandler, SeatState}; use smithay::output::Output; use smithay::reexports::rustix::fs::{fcntl_setfl, OFlags}; use smithay::reexports::wayland_protocols::xdg::shell::server::xdg_toplevel; +use smithay::reexports::wayland_protocols_wlr::screencopy::v1::server::zwlr_screencopy_manager_v1::ZwlrScreencopyManagerV1; use smithay::reexports::wayland_server::protocol::wl_data_source::WlDataSource; use smithay::reexports::wayland_server::protocol::wl_output::WlOutput; use smithay::reexports::wayland_server::protocol::wl_surface::WlSurface; @@ -69,7 +70,7 @@ use crate::protocols::foreign_toplevel::{ }; use crate::protocols::gamma_control::{GammaControlHandler, GammaControlManagerState}; use crate::protocols::output_management::{OutputManagementHandler, OutputManagementManagerState}; -use crate::protocols::screencopy::{Screencopy, ScreencopyHandler}; +use crate::protocols::screencopy::{Screencopy, ScreencopyHandler, ScreencopyManagerState}; use crate::utils::{output_size, send_scale_transform}; use crate::{ delegate_foreign_toplevel, delegate_gamma_control, delegate_output_management, @@ -419,14 +420,30 @@ impl ForeignToplevelHandler for State { delegate_foreign_toplevel!(State); impl ScreencopyHandler for State { - fn frame(&mut self, screencopy: Screencopy) { - if let Err(err) = self - .niri - .render_for_screencopy(&mut self.backend, screencopy) - { - warn!("error rendering for screencopy: {err:?}"); + fn frame(&mut self, manager: &ZwlrScreencopyManagerV1, screencopy: Screencopy) { + // If with_damage then push it onto the queue for redraw of the output, + // otherwise render it immediately. + if screencopy.with_damage() { + let Some(queue) = self.niri.screencopy_state.get_queue_mut(manager) else { + trace!("screencopy manager destroyed already"); + return; + }; + queue.push(screencopy); + } else { + self.backend.with_primary_renderer(|renderer| { + if let Err(err) = self + .niri + .render_for_screencopy_without_damage(renderer, manager, screencopy) + { + warn!("error rendering for screencopy: {err:?}"); + } + }); } } + + fn screencopy_state(&mut self) -> &mut ScreencopyManagerState { + &mut self.niri.screencopy_state + } } delegate_screencopy!(State); |
