floating: Fix next window logic
This commit is contained in:
parent
1fa6167f25
commit
be192c80e5
2 changed files with 36 additions and 127 deletions
|
|
@ -31,9 +31,9 @@ use crate::{
|
|||
window::CosmicWindowRenderElement,
|
||||
CosmicMapped, CosmicMappedRenderElement, CosmicWindow,
|
||||
},
|
||||
focus::{target::KeyboardFocusTarget, FocusDirection, FocusStackMut},
|
||||
focus::{target::KeyboardFocusTarget, FocusStackMut},
|
||||
grabs::{ReleaseMode, ResizeEdge},
|
||||
CosmicSurface, Direction, FocusResult, MoveResult, ResizeDirection, ResizeMode,
|
||||
CosmicSurface, Direction, MoveResult, ResizeDirection, ResizeMode,
|
||||
},
|
||||
state::State,
|
||||
utils::{prelude::*, tween::EaseRectangle},
|
||||
|
|
@ -566,78 +566,6 @@ impl FloatingLayout {
|
|||
true
|
||||
}
|
||||
|
||||
pub fn next_focus<'a>(
|
||||
&mut self,
|
||||
direction: FocusDirection,
|
||||
seat: &Seat<State>,
|
||||
_focus_stack: impl Iterator<Item = &'a CosmicMapped> + 'a,
|
||||
) -> FocusResult {
|
||||
let Some(target) = seat.get_keyboard().unwrap().current_focus() else {
|
||||
return FocusResult::None
|
||||
};
|
||||
|
||||
let Some(focused) = (match target {
|
||||
KeyboardFocusTarget::Popup(popup) => {
|
||||
let Some(toplevel_surface) = (match popup {
|
||||
PopupKind::Xdg(xdg) => get_popup_toplevel(&xdg),
|
||||
PopupKind::InputMethod(_) => unreachable!(),
|
||||
}) else {
|
||||
return FocusResult::None
|
||||
};
|
||||
self.space.elements().find(|elem| elem.wl_surface().as_ref() == Some(&toplevel_surface))
|
||||
},
|
||||
KeyboardFocusTarget::Element(elem) => self.space.elements().find(|e| *e == &elem),
|
||||
_ => None,
|
||||
}) else {
|
||||
return FocusResult::None
|
||||
};
|
||||
|
||||
if focused.handle_focus(direction, None) {
|
||||
return FocusResult::Handled;
|
||||
}
|
||||
|
||||
let geometry = self.space.element_geometry(focused).unwrap();
|
||||
|
||||
let next = match direction {
|
||||
FocusDirection::Up => self.space.elements().min_by_key(|other| {
|
||||
let res = geometry.loc.y - self.space.element_geometry(other).unwrap().loc.y;
|
||||
if res.is_positive() {
|
||||
res
|
||||
} else {
|
||||
i32::MAX
|
||||
}
|
||||
}),
|
||||
FocusDirection::Down => self.space.elements().max_by_key(|other| {
|
||||
let res = geometry.loc.y - self.space.element_geometry(other).unwrap().loc.y;
|
||||
if res.is_negative() {
|
||||
res
|
||||
} else {
|
||||
i32::MIN
|
||||
}
|
||||
}),
|
||||
FocusDirection::Left => self.space.elements().min_by_key(|other| {
|
||||
let res = geometry.loc.x - self.space.element_geometry(other).unwrap().loc.x;
|
||||
if res.is_positive() {
|
||||
res
|
||||
} else {
|
||||
i32::MAX
|
||||
}
|
||||
}),
|
||||
FocusDirection::Right => self.space.elements().max_by_key(|other| {
|
||||
let res = geometry.loc.x - self.space.element_geometry(other).unwrap().loc.x;
|
||||
if res.is_negative() {
|
||||
res
|
||||
} else {
|
||||
i32::MIN
|
||||
}
|
||||
}),
|
||||
_ => return FocusResult::None,
|
||||
};
|
||||
|
||||
next.map(|elem| FocusResult::Some(KeyboardFocusTarget::Element(elem.clone())))
|
||||
.unwrap_or(FocusResult::None)
|
||||
}
|
||||
|
||||
pub fn toggle_stacking(&mut self, mapped: &CosmicMapped) -> Option<KeyboardFocusTarget> {
|
||||
if !self.space.elements().any(|m| m == mapped) {
|
||||
return None;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue