Skip to content

Commit f63d901

Browse files
ids1024Drakulix
authored andcommitted
screencopy: Render cursor for toplevel capture at right position
`CosmicMapped::cursor_positon` may have worked previously, but doesn't now. This is based on the code used for seperate cursor capture sessions. Maybe this could be consolidated in some way. But this seems to work. Including for rotated outputs.
1 parent 0c941b8 commit f63d901

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

src/wayland/handlers/screencopy/render.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ use crate::{
4141
},
4242
shell::{CosmicMappedRenderElement, CosmicSurface, WorkspaceRenderElement},
4343
state::{Common, KmsNodes, State},
44-
utils::prelude::SeatExt,
44+
utils::prelude::{PointExt, PointGlobalExt, RectExt, RectLocalExt, SeatExt},
4545
wayland::{
4646
handlers::screencopy::{
4747
constraints_for_output, constraints_for_toplevel, SessionData, SessionUserData,
@@ -531,7 +531,7 @@ pub fn render_window_to_buffer(
531531
additional_damage: Vec<Rectangle<i32, BufferCoords>>,
532532
draw_cursor: bool,
533533
common: &mut Common,
534-
window: &CosmicSurface,
534+
toplevel: &CosmicSurface,
535535
geometry: Rectangle<i32, Logical>,
536536
) -> Result<RenderOutputResult<'d>, DTError<R::Error>>
537537
where
@@ -560,17 +560,22 @@ pub fn render_window_to_buffer(
560560

561561
let shell = common.shell.read();
562562
let seat = shell.seats.last_active().clone();
563-
let location = if let Some(mapped) = shell.element_for_surface(window) {
564-
mapped.cursor_position(&seat).and_then(|mut p| {
565-
p -= mapped.active_window_offset().to_f64();
566-
if p.x < 0. || p.y < 0. {
567-
None
568-
} else {
569-
Some(p)
563+
let pointer = seat.get_pointer().unwrap();
564+
let pointer_loc = pointer.current_location().to_i32_round().as_global();
565+
let mut location = None;
566+
if let Some(element) = shell.element_for_surface(toplevel) {
567+
if element.has_active_window(toplevel) {
568+
if let Some(workspace) = shell.space_for(element) {
569+
if let Some(geometry) = workspace.element_geometry(element) {
570+
let mut surface_geo = element.active_window_geometry().as_local();
571+
surface_geo.loc += geometry.loc;
572+
let global_geo = surface_geo.to_global(workspace.output());
573+
if global_geo.contains(pointer_loc) {
574+
location = Some((pointer_loc - global_geo.loc).as_logical().to_f64());
575+
}
576+
}
570577
}
571-
})
572-
} else {
573-
None
578+
}
574579
};
575580
std::mem::drop(shell);
576581

@@ -614,7 +619,7 @@ pub fn render_window_to_buffer(
614619
elements.extend(AsRenderElements::<R>::render_elements::<
615620
WindowCaptureElement<R>,
616621
>(
617-
window,
622+
toplevel,
618623
renderer,
619624
(-geometry.loc.x, -geometry.loc.y).into(),
620625
Scale::from(1.0),

0 commit comments

Comments
 (0)