diff --git a/src/wayland/handlers/screencopy/render.rs b/src/wayland/handlers/screencopy/render.rs index a22b03ae..03c48b4f 100644 --- a/src/wayland/handlers/screencopy/render.rs +++ b/src/wayland/handlers/screencopy/render.rs @@ -41,7 +41,7 @@ use crate::{ }, shell::{CosmicMappedRenderElement, CosmicSurface, WorkspaceRenderElement}, state::{Common, KmsNodes, State}, - utils::prelude::SeatExt, + utils::prelude::{PointExt, PointGlobalExt, RectExt, RectLocalExt, SeatExt}, wayland::{ handlers::screencopy::{ constraints_for_output, constraints_for_toplevel, SessionData, SessionUserData, @@ -531,7 +531,7 @@ pub fn render_window_to_buffer( additional_damage: Vec>, draw_cursor: bool, common: &mut Common, - window: &CosmicSurface, + toplevel: &CosmicSurface, geometry: Rectangle, ) -> Result, DTError> where @@ -560,17 +560,22 @@ pub fn render_window_to_buffer( let shell = common.shell.read(); let seat = shell.seats.last_active().clone(); - let location = if let Some(mapped) = shell.element_for_surface(window) { - mapped.cursor_position(&seat).and_then(|mut p| { - p -= mapped.active_window_offset().to_f64(); - if p.x < 0. || p.y < 0. { - None - } else { - Some(p) + let pointer = seat.get_pointer().unwrap(); + let pointer_loc = pointer.current_location().to_i32_round().as_global(); + let mut location = None; + if let Some(element) = shell.element_for_surface(toplevel) { + if element.has_active_window(toplevel) { + if let Some(workspace) = shell.space_for(element) { + if let Some(geometry) = workspace.element_geometry(element) { + let mut surface_geo = element.active_window_geometry().as_local(); + surface_geo.loc += geometry.loc; + let global_geo = surface_geo.to_global(workspace.output()); + if global_geo.contains(pointer_loc) { + location = Some((pointer_loc - global_geo.loc).as_logical().to_f64()); + } + } } - }) - } else { - None + } }; std::mem::drop(shell); @@ -614,7 +619,7 @@ pub fn render_window_to_buffer( elements.extend(AsRenderElements::::render_elements::< WindowCaptureElement, >( - window, + toplevel, renderer, (-geometry.loc.x, -geometry.loc.y).into(), Scale::from(1.0),