Consider cursor and drag surfaces in visible_output_for_surface
This ensures that a commit to a cursor or drag surface will queue a redraw, even if nothing else has changed on screen. This can be tested by running `vkgears` in an otherwise empty cosmic-comp instance, and dragging it.
This commit is contained in:
parent
3197e52afd
commit
726994b858
1 changed files with 33 additions and 1 deletions
|
|
@ -12,7 +12,7 @@ use std::{
|
||||||
use wayland_backend::server::ClientId;
|
use wayland_backend::server::ClientId;
|
||||||
|
|
||||||
use crate::wayland::{
|
use crate::wayland::{
|
||||||
handlers::data_device,
|
handlers::data_device::{self, get_dnd_icon},
|
||||||
protocols::workspace::{State as WState, WorkspaceCapabilities},
|
protocols::workspace::{State as WState, WorkspaceCapabilities},
|
||||||
};
|
};
|
||||||
use cosmic_comp_config::{
|
use cosmic_comp_config::{
|
||||||
|
|
@ -1833,6 +1833,38 @@ impl Shell {
|
||||||
.any(|e| e.has_surface(surface, WindowSurfaceType::ALL))
|
.any(|e| e.has_surface(surface, WindowSurfaceType::ALL))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
// cursor and drag surfaces
|
||||||
|
.or_else(|| {
|
||||||
|
self.outputs().find(|o| {
|
||||||
|
self.seats
|
||||||
|
.iter()
|
||||||
|
.filter(|seat| seat.active_output() == **o)
|
||||||
|
.any(|seat| {
|
||||||
|
let cursor_status = seat.cursor_image_status();
|
||||||
|
if let CursorImageStatus::Surface(s) = cursor_status {
|
||||||
|
if s == *surface {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(move_grab) = seat.user_data().get::<SeatMoveGrabState>() {
|
||||||
|
if let Some(grab_state) = move_grab.lock().unwrap().as_ref() {
|
||||||
|
for (window, _) in grab_state.element().windows() {
|
||||||
|
let mut matches = false;
|
||||||
|
window.0.with_surfaces(|s, _| {
|
||||||
|
matches |= s == surface;
|
||||||
|
});
|
||||||
|
if matches {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get_dnd_icon(seat).is_some_and(|icon| icon.surface == *surface)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn workspace_for_surface(&self, surface: &WlSurface) -> Option<(WorkspaceHandle, Output)> {
|
pub fn workspace_for_surface(&self, surface: &WlSurface) -> Option<(WorkspaceHandle, Output)> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue