Fix refresh_focus

This commit is contained in:
Darksome 2023-04-01 20:35:58 +04:00
parent 32805d8ee0
commit a11c3e8f67
5 changed files with 35 additions and 3 deletions

0
rustfmt.toml Normal file
View file

View file

@ -132,6 +132,14 @@ impl CosmicMapped {
}
}
pub fn has_active_window(&self, window: &CosmicSurface) -> bool {
match &self.element {
CosmicMappedInternal::Stack(stack) => stack.has_active(window),
CosmicMappedInternal::Window(win) => win.contains_surface(window),
_ => unreachable!(),
}
}
pub fn active_window_offset(&self) -> Point<i32, Logical> {
match &self.element {
CosmicMappedInternal::Stack(stack) => stack.offset(),

View file

@ -124,6 +124,11 @@ impl CosmicStack {
.with_program(|p| p.windows.lock().unwrap()[p.active.load(Ordering::SeqCst)].clone())
}
pub fn has_active(&self, window: &CosmicSurface) -> bool {
self.0
.with_program(|p| &p.windows.lock().unwrap()[p.active.load(Ordering::SeqCst)] == window)
}
pub fn set_active(&self, window: &CosmicSurface) {
self.0.with_program(|p| {
if let Some(val) = p.windows.lock().unwrap().iter().position(|w| w == window) {

View file

@ -149,6 +149,10 @@ impl CosmicWindow {
self.0.with_program(|p| p.window.clone())
}
pub fn contains_surface(&self, window: &CosmicSurface) -> bool {
self.0.with_program(|p| &p.window == window)
}
pub fn offset(&self) -> Point<i32, Logical> {
let has_ssd = self.0.with_program(|p| p.has_ssd());
if has_ssd {

View file

@ -216,9 +216,24 @@ impl Common {
continue; // Focus is valid,
}
}
KeyboardFocusTarget::Popup(_) | KeyboardFocusTarget::Fullscreen(_) => {
continue;
} // Focus is valid
KeyboardFocusTarget::Fullscreen(surface) => {
let workspace = state.common.shell.active_space(&output);
let focus_stack = workspace.focus_stack.get(&seat);
if focus_stack
.last()
.map(|m| m.has_active_window(&surface))
.unwrap_or(false)
&& workspace.get_fullscreen(&output).is_some()
{
continue; // Focus is valid
} else {
trace!("Wrong Window, focus fixup");
}
}
KeyboardFocusTarget::Popup(_) => {
continue; // Focus is valid
}
};
} else {
trace!("Surface dead, focus fixup");