Merge pull request #97 from xDarksome/master_jammy

Fix latest window not getting focus when switching from a "fullscreen" workspace
This commit is contained in:
Victoria Brekenfeld 2023-04-03 12:09:18 +02:00 committed by GitHub
commit bb59a2d437
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 43 additions and 4 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,15 +216,37 @@ 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");
}
} else {
continue;
let workspace = state.common.shell.active_space(&output);
let focus_stack = workspace.focus_stack.get(&seat);
if focus_stack.last().is_none() {
continue; // Focus is valid
} else {
trace!("No previous window, focus fixup");
}
}
// fixup focus