image-copy: Use seat from WlPointer instead of last_active()
This commit is contained in:
parent
60137c0d9e
commit
d84d5d46ce
1 changed files with 34 additions and 22 deletions
|
|
@ -14,6 +14,7 @@ use smithay::{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
desktop::space::SpaceElement,
|
desktop::space::SpaceElement,
|
||||||
|
input::{Seat, pointer::PointerHandle},
|
||||||
output::Output,
|
output::Output,
|
||||||
reexports::wayland_server::protocol::{wl_pointer::WlPointer, wl_shm::Format as ShmFormat},
|
reexports::wayland_server::protocol::{wl_pointer::WlPointer, wl_shm::Format as ShmFormat},
|
||||||
utils::{Buffer as BufferCoords, Point, Size, Transform},
|
utils::{Buffer as BufferCoords, Point, Size, Transform},
|
||||||
|
|
@ -30,7 +31,7 @@ use smithay::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
shell::CosmicSurface,
|
shell::{CosmicSurface, Shell},
|
||||||
state::{BackendData, State},
|
state::{BackendData, State},
|
||||||
utils::prelude::{
|
utils::prelude::{
|
||||||
OutputExt, PointExt, PointGlobalExt, PointLocalExt, RectExt, RectLocalExt, SeatExt,
|
OutputExt, PointExt, PointGlobalExt, PointLocalExt, RectExt, RectLocalExt, SeatExt,
|
||||||
|
|
@ -44,6 +45,14 @@ pub use self::render::*;
|
||||||
use self::user_data::*;
|
use self::user_data::*;
|
||||||
pub use self::user_data::{FrameHolder, ImageCopySessions, SessionData, SessionHolder};
|
pub use self::user_data::{FrameHolder, ImageCopySessions, SessionData, SessionHolder};
|
||||||
|
|
||||||
|
fn seat_for_wl_pointer<'a>(shell: &'a Shell, pointer: &WlPointer) -> Option<&'a Seat<State>> {
|
||||||
|
let pointer_handle = PointerHandle::<State>::from_resource(pointer)?;
|
||||||
|
shell
|
||||||
|
.seats
|
||||||
|
.iter()
|
||||||
|
.find(|seat| seat.get_pointer().is_some_and(|p| p == pointer_handle))
|
||||||
|
}
|
||||||
|
|
||||||
impl ImageCopyCaptureHandler for State {
|
impl ImageCopyCaptureHandler for State {
|
||||||
fn image_copy_capture_state(&mut self) -> &mut ImageCopyCaptureState {
|
fn image_copy_capture_state(&mut self) -> &mut ImageCopyCaptureState {
|
||||||
&mut self.common.image_copy_capture_state
|
&mut self.common.image_copy_capture_state
|
||||||
|
|
@ -73,15 +82,12 @@ impl ImageCopyCaptureHandler for State {
|
||||||
fn cursor_capture_constraints(
|
fn cursor_capture_constraints(
|
||||||
&mut self,
|
&mut self,
|
||||||
_source: &ImageCaptureSource,
|
_source: &ImageCaptureSource,
|
||||||
_pointer: &WlPointer,
|
pointer: &WlPointer,
|
||||||
) -> Option<BufferConstraints> {
|
) -> Option<BufferConstraints> {
|
||||||
let size = if let Some((geometry, _)) = self
|
let shell = self.common.shell.read();
|
||||||
.common
|
let seat = seat_for_wl_pointer(&shell, pointer)?;
|
||||||
.shell
|
let size = if let Some((geometry, _)) =
|
||||||
.read()
|
seat.cursor_geometry((0.0, 0.0), self.common.clock.now())
|
||||||
.seats
|
|
||||||
.last_active()
|
|
||||||
.cursor_geometry((0.0, 0.0), self.common.clock.now())
|
|
||||||
{
|
{
|
||||||
geometry.size
|
geometry.size
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -149,8 +155,8 @@ impl ImageCopyCaptureHandler for State {
|
||||||
|
|
||||||
fn new_cursor_session(&mut self, session: CursorSession) {
|
fn new_cursor_session(&mut self, session: CursorSession) {
|
||||||
let (pointer_loc, pointer_size, hotspot) = {
|
let (pointer_loc, pointer_size, hotspot) = {
|
||||||
let seat = self.common.shell.read().seats.last_active().clone();
|
let shell = self.common.shell.read();
|
||||||
|
if let Some(seat) = seat_for_wl_pointer(&shell, &session.pointer()) {
|
||||||
let pointer = seat.get_pointer().unwrap();
|
let pointer = seat.get_pointer().unwrap();
|
||||||
let pointer_loc = pointer.current_location().to_i32_round().as_global();
|
let pointer_loc = pointer.current_location().to_i32_round().as_global();
|
||||||
|
|
||||||
|
|
@ -163,6 +169,9 @@ impl ImageCopyCaptureHandler for State {
|
||||||
};
|
};
|
||||||
|
|
||||||
(pointer_loc, pointer_size, hotspot)
|
(pointer_loc, pointer_size, hotspot)
|
||||||
|
} else {
|
||||||
|
(Point::new(0, 0), Size::from((64, 64)), Point::from((0, 0)))
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
session.user_data().insert_if_missing_threadsafe(|| {
|
session.user_data().insert_if_missing_threadsafe(|| {
|
||||||
|
|
@ -299,9 +308,12 @@ impl ImageCopyCaptureHandler for State {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let seat = self.common.shell.read().seats.last_active().clone();
|
let shell = self.common.shell.read();
|
||||||
|
if let Some(seat) = seat_for_wl_pointer(&shell, &session.pointer()).cloned() {
|
||||||
|
drop(shell);
|
||||||
render_cursor_to_buffer(self, session, frame, &seat);
|
render_cursor_to_buffer(self, session, frame, &seat);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn frame_aborted(&mut self, frame: FrameRef) {
|
fn frame_aborted(&mut self, frame: FrameRef) {
|
||||||
let shell = self.common.shell.read();
|
let shell = self.common.shell.read();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue