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:
commit
bb59a2d437
5 changed files with 43 additions and 4 deletions
0
rustfmt.toml
Normal file
0
rustfmt.toml
Normal 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> {
|
pub fn active_window_offset(&self) -> Point<i32, Logical> {
|
||||||
match &self.element {
|
match &self.element {
|
||||||
CosmicMappedInternal::Stack(stack) => stack.offset(),
|
CosmicMappedInternal::Stack(stack) => stack.offset(),
|
||||||
|
|
|
||||||
|
|
@ -124,6 +124,11 @@ impl CosmicStack {
|
||||||
.with_program(|p| p.windows.lock().unwrap()[p.active.load(Ordering::SeqCst)].clone())
|
.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) {
|
pub fn set_active(&self, window: &CosmicSurface) {
|
||||||
self.0.with_program(|p| {
|
self.0.with_program(|p| {
|
||||||
if let Some(val) = p.windows.lock().unwrap().iter().position(|w| w == window) {
|
if let Some(val) = p.windows.lock().unwrap().iter().position(|w| w == window) {
|
||||||
|
|
|
||||||
|
|
@ -149,6 +149,10 @@ impl CosmicWindow {
|
||||||
self.0.with_program(|p| p.window.clone())
|
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> {
|
pub fn offset(&self) -> Point<i32, Logical> {
|
||||||
let has_ssd = self.0.with_program(|p| p.has_ssd());
|
let has_ssd = self.0.with_program(|p| p.has_ssd());
|
||||||
if has_ssd {
|
if has_ssd {
|
||||||
|
|
|
||||||
|
|
@ -216,15 +216,37 @@ impl Common {
|
||||||
continue; // Focus is valid,
|
continue; // Focus is valid,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
KeyboardFocusTarget::Popup(_) | KeyboardFocusTarget::Fullscreen(_) => {
|
KeyboardFocusTarget::Fullscreen(surface) => {
|
||||||
continue;
|
let workspace = state.common.shell.active_space(&output);
|
||||||
} // Focus is valid
|
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 {
|
} else {
|
||||||
trace!("Surface dead, focus fixup");
|
trace!("Surface dead, focus fixup");
|
||||||
}
|
}
|
||||||
} else {
|
} 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
|
// fixup focus
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue