From be192c80e5c2fd0f2f1b779834f8a480945a7ffd Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Tue, 2 Jan 2024 18:13:27 +0000 Subject: [PATCH] floating: Fix next window logic --- src/shell/layout/floating/mod.rs | 76 +--------------------------- src/shell/mod.rs | 87 +++++++++++++------------------- 2 files changed, 36 insertions(+), 127 deletions(-) diff --git a/src/shell/layout/floating/mod.rs b/src/shell/layout/floating/mod.rs index afc2f413..41ed12af 100644 --- a/src/shell/layout/floating/mod.rs +++ b/src/shell/layout/floating/mod.rs @@ -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, - _focus_stack: impl Iterator + '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 { if !self.space.elements().any(|m| m == mapped) { return None; diff --git a/src/shell/mod.rs b/src/shell/mod.rs index 94f57922..d984b0f0 100644 --- a/src/shell/mod.rs +++ b/src/shell/mod.rs @@ -2420,77 +2420,57 @@ impl Shell { .or_else(|| floating_layer.space.element_geometry(&focused)) .unwrap(); + let elements = sticky_layer + .space + .elements() + .chain(floating_layer.space.elements()) + .filter(|elem| *elem != &focused) + .map(|elem| { + ( + elem, + sticky_layer + .space + .element_geometry(elem) + .or_else(|| floating_layer.space.element_geometry(elem)) + .unwrap(), + ) + }); + let next = match direction { - FocusDirection::Up => sticky_layer - .space - .elements() - .chain(floating_layer.space.elements()) - .min_by_key(|other| { - let res = geometry.loc.y - - sticky_layer - .space - .element_geometry(other) - .or_else(|| floating_layer.space.element_geometry(other)) - .unwrap() - .loc - .y; + FocusDirection::Up => elements + .filter(|(_, other_geo)| other_geo.loc.y <= geometry.loc.y) + .min_by_key(|(_, other_geo)| { + let res = geometry.loc.y - other_geo.loc.y; if res.is_positive() { res } else { i32::MAX } }), - FocusDirection::Down => sticky_layer - .space - .elements() - .chain(floating_layer.space.elements()) - .max_by_key(|other| { - let res = geometry.loc.y - - sticky_layer - .space - .element_geometry(other) - .or_else(|| floating_layer.space.element_geometry(other)) - .unwrap() - .loc - .y; + FocusDirection::Down => elements + .filter(|(_, other_geo)| other_geo.loc.y > geometry.loc.y) + .max_by_key(|(_, other_geo)| { + let res = geometry.loc.y - other_geo.loc.y; if res.is_negative() { res } else { i32::MIN } }), - FocusDirection::Left => sticky_layer - .space - .elements() - .chain(floating_layer.space.elements()) - .min_by_key(|other| { - let res = geometry.loc.x - - sticky_layer - .space - .element_geometry(other) - .or_else(|| floating_layer.space.element_geometry(other)) - .unwrap() - .loc - .x; + FocusDirection::Left => elements + .filter(|(_, other_geo)| other_geo.loc.x <= geometry.loc.x) + .min_by_key(|(_, other_geo)| { + let res = geometry.loc.x - other_geo.loc.x; if res.is_positive() { res } else { i32::MAX } }), - FocusDirection::Right => sticky_layer - .space - .elements() - .chain(floating_layer.space.elements()) - .max_by_key(|other| { - let res = geometry.loc.x - - sticky_layer - .space - .element_geometry(other) - .or_else(|| floating_layer.space.element_geometry(other)) - .unwrap() - .loc - .x; + FocusDirection::Right => elements + .filter(|(_, other_geo)| other_geo.loc.x > geometry.loc.x) + .max_by_key(|(_, other_geo)| { + let res = geometry.loc.x - other_geo.loc.x; if res.is_negative() { res } else { @@ -2498,7 +2478,8 @@ impl Shell { } }), _ => return FocusResult::None, - }; + } + .map(|(other, _)| other); next.map(|elem| FocusResult::Some(KeyboardFocusTarget::Element(elem.clone()))) .unwrap_or(FocusResult::None)