stack: Adjust decorations to window geometry

This commit is contained in:
Victoria Brekenfeld 2024-03-28 18:21:44 +01:00
parent 10940a723f
commit 3da08ed22d
4 changed files with 63 additions and 21 deletions

View file

@ -413,6 +413,14 @@ impl CosmicMapped {
} }
} }
pub fn on_commit(&self, surface: &WlSurface) {
match &self.element {
CosmicMappedInternal::Stack(s) => s.on_commit(surface),
CosmicMappedInternal::Window(w) => w.on_commit(surface),
_ => {}
}
}
pub fn min_size(&self) -> Option<Size<i32, Logical>> { pub fn min_size(&self) -> Option<Size<i32, Logical>> {
match &self.element { match &self.element {
CosmicMappedInternal::Stack(stack) => { CosmicMappedInternal::Stack(stack) => {

View file

@ -45,6 +45,7 @@ use smithay::{
Seat, Seat,
}, },
output::Output, output::Output,
reexports::wayland_server::protocol::wl_surface::WlSurface,
render_elements, render_elements,
utils::{Buffer, IsAlive, Logical, Physical, Point, Rectangle, Scale, Serial, Size}, utils::{Buffer, IsAlive, Logical, Physical, Point, Rectangle, Scale, Serial, Size},
wayland::seat::WaylandFocus, wayland::seat::WaylandFocus,
@ -90,7 +91,6 @@ pub struct CosmicStackInternal {
scroll_to_focus: Arc<AtomicBool>, scroll_to_focus: Arc<AtomicBool>,
previous_keyboard: Arc<AtomicUsize>, previous_keyboard: Arc<AtomicUsize>,
pointer_entered: Arc<AtomicU8>, pointer_entered: Arc<AtomicU8>,
previous_pointer: Arc<AtomicUsize>,
reenter: Arc<AtomicBool>, reenter: Arc<AtomicBool>,
potential_drag: Arc<Mutex<Option<usize>>>, potential_drag: Arc<Mutex<Option<usize>>>,
override_alive: Arc<AtomicBool>, override_alive: Arc<AtomicBool>,
@ -130,6 +130,7 @@ pub enum Focus {
ResizeBottomLeft, ResizeBottomLeft,
} }
#[derive(Debug, Clone)]
pub enum MoveResult { pub enum MoveResult {
Handled, Handled,
MoveOut(CosmicSurface, LoopHandle<'static, crate::state::State>), MoveOut(CosmicSurface, LoopHandle<'static, crate::state::State>),
@ -161,7 +162,6 @@ impl CosmicStack {
scroll_to_focus: Arc::new(AtomicBool::new(false)), scroll_to_focus: Arc::new(AtomicBool::new(false)),
previous_keyboard: Arc::new(AtomicUsize::new(0)), previous_keyboard: Arc::new(AtomicUsize::new(0)),
pointer_entered: Arc::new(AtomicU8::new(Focus::None as u8)), pointer_entered: Arc::new(AtomicU8::new(Focus::None as u8)),
previous_pointer: Arc::new(AtomicUsize::new(0)),
reenter: Arc::new(AtomicBool::new(false)), reenter: Arc::new(AtomicBool::new(false)),
potential_drag: Arc::new(Mutex::new(None)), potential_drag: Arc::new(Mutex::new(None)),
override_alive: Arc::new(AtomicBool::new(true)), override_alive: Arc::new(AtomicBool::new(true)),
@ -192,7 +192,6 @@ impl CosmicStack {
if old_idx == idx { if old_idx == idx {
p.reenter.store(true, Ordering::SeqCst); p.reenter.store(true, Ordering::SeqCst);
p.previous_keyboard.store(old_idx, Ordering::SeqCst); p.previous_keyboard.store(old_idx, Ordering::SeqCst);
p.previous_pointer.store(old_idx, Ordering::SeqCst);
} }
} else { } else {
let mut windows = p.windows.lock().unwrap(); let mut windows = p.windows.lock().unwrap();
@ -201,6 +200,8 @@ impl CosmicStack {
} }
p.scroll_to_focus.store(true, Ordering::SeqCst); p.scroll_to_focus.store(true, Ordering::SeqCst);
}); });
self.0
.resize(Size::from((self.active().geometry().size.w, TAB_HEIGHT)));
self.0.force_redraw() self.0.force_redraw()
} }
@ -227,6 +228,8 @@ impl CosmicStack {
p.active.fetch_min(windows.len() - 1, Ordering::SeqCst); p.active.fetch_min(windows.len() - 1, Ordering::SeqCst);
}); });
self.0
.resize(Size::from((self.active().geometry().size.w, TAB_HEIGHT)));
self.0.force_redraw() self.0.force_redraw()
} }
@ -254,6 +257,8 @@ impl CosmicStack {
Some(window) Some(window)
}); });
self.0
.resize(Size::from((self.active().geometry().size.w, TAB_HEIGHT)));
self.0.force_redraw(); self.0.force_redraw();
window window
} }
@ -273,7 +278,6 @@ impl CosmicStack {
}) })
{ {
p.previous_keyboard.store(old, Ordering::SeqCst); p.previous_keyboard.store(old, Ordering::SeqCst);
p.previous_pointer.store(old, Ordering::SeqCst);
p.scroll_to_focus.store(true, Ordering::SeqCst); p.scroll_to_focus.store(true, Ordering::SeqCst);
true true
} else { } else {
@ -297,7 +301,6 @@ impl CosmicStack {
}) })
{ {
p.previous_keyboard.store(old, Ordering::SeqCst); p.previous_keyboard.store(old, Ordering::SeqCst);
p.previous_pointer.store(old, Ordering::SeqCst);
p.scroll_to_focus.store(true, Ordering::SeqCst); p.scroll_to_focus.store(true, Ordering::SeqCst);
true true
} else { } else {
@ -333,6 +336,8 @@ impl CosmicStack {
}); });
if result { if result {
self.0
.resize(Size::from((self.active().geometry().size.w, TAB_HEIGHT)));
self.0.force_update(); self.0.force_update();
} }
@ -341,7 +346,7 @@ impl CosmicStack {
pub fn handle_move(&self, direction: Direction) -> MoveResult { pub fn handle_move(&self, direction: Direction) -> MoveResult {
let loop_handle = self.0.loop_handle(); let loop_handle = self.0.loop_handle();
self.0.with_program(|p| { let result = self.0.with_program(|p| {
if p.group_focused.load(Ordering::SeqCst) { if p.group_focused.load(Ordering::SeqCst) {
return MoveResult::Default; return MoveResult::Default;
} }
@ -359,7 +364,6 @@ impl CosmicStack {
let old = p.active.swap(val, Ordering::SeqCst); let old = p.active.swap(val, Ordering::SeqCst);
windows.swap(old, val); windows.swap(old, val);
p.previous_keyboard.store(old, Ordering::SeqCst); p.previous_keyboard.store(old, Ordering::SeqCst);
p.previous_pointer.store(old, Ordering::SeqCst);
p.scroll_to_focus.store(true, Ordering::SeqCst); p.scroll_to_focus.store(true, Ordering::SeqCst);
MoveResult::Handled MoveResult::Handled
} else { } else {
@ -376,7 +380,15 @@ impl CosmicStack {
MoveResult::MoveOut(window, loop_handle) MoveResult::MoveOut(window, loop_handle)
} }
}) });
if !matches!(result, MoveResult::Default) {
self.0
.resize(Size::from((self.active().geometry().size.w, TAB_HEIGHT)));
self.0.force_update();
}
result
} }
pub fn active(&self) -> CosmicSurface { pub fn active(&self) -> CosmicSurface {
@ -399,9 +411,10 @@ impl CosmicStack {
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) {
let old = p.active.swap(val, Ordering::SeqCst); let old = p.active.swap(val, Ordering::SeqCst);
p.previous_keyboard.store(old, Ordering::SeqCst); p.previous_keyboard.store(old, Ordering::SeqCst);
p.previous_pointer.store(old, Ordering::SeqCst);
} }
}); });
self.0
.resize(Size::from((self.active().geometry().size.w, TAB_HEIGHT)));
self.0.force_redraw() self.0.force_redraw()
} }
@ -492,7 +505,16 @@ impl CosmicStack {
*p.geometry.lock().unwrap() = Some(geo); *p.geometry.lock().unwrap() = Some(geo);
p.mask.lock().unwrap().take(); p.mask.lock().unwrap().take();
}); });
self.0.resize(Size::from((geo.size.w, TAB_HEIGHT))); }
pub fn on_commit(&self, surface: &WlSurface) {
if let Some(surface) = self.surfaces().find(|w| w == surface) {
surface.0.on_commit();
if self.active() == surface {
self.0
.resize(Size::from((surface.geometry().size.w, TAB_HEIGHT)));
}
}
} }
fn keyboard_leave_if_previous( fn keyboard_leave_if_previous(
@ -673,10 +695,12 @@ impl Program for CosmicStackInternal {
} }
Message::Activate(idx) => { Message::Activate(idx) => {
*self.potential_drag.lock().unwrap() = None; *self.potential_drag.lock().unwrap() = None;
if self.windows.lock().unwrap().get(idx).is_some() { if let Some(surface) = self.windows.lock().unwrap().get(idx).cloned() {
let old = self.active.swap(idx, Ordering::SeqCst); loop_handle.insert_idle(move |state| {
self.previous_keyboard.store(old, Ordering::SeqCst); if let Some(mapped) = state.common.shell.element_for_surface(&surface) {
self.previous_pointer.store(old, Ordering::SeqCst); mapped.stack_ref().unwrap().set_active(&surface);
}
});
self.scroll_to_focus.store(true, Ordering::SeqCst); self.scroll_to_focus.store(true, Ordering::SeqCst);
} }
} }
@ -989,7 +1013,8 @@ impl SpaceElement for CosmicStack {
let mut windows = p.windows.lock().unwrap(); let mut windows = p.windows.lock().unwrap();
// don't let the stack become empty // don't let the stack become empty
let active = windows[p.active.load(Ordering::SeqCst)].clone(); let old_active = p.active.load(Ordering::SeqCst);
let active = windows[old_active].clone();
windows.retain(IsAlive::alive); windows.retain(IsAlive::alive);
if windows.is_empty() { if windows.is_empty() {
windows.push(active); windows.push(active);
@ -1003,6 +1028,12 @@ impl SpaceElement for CosmicStack {
}); });
let active = p.active.load(Ordering::SeqCst); let active = p.active.load(Ordering::SeqCst);
if old_active != active {
self.0
.resize(Size::from((self.active().geometry().size.w, TAB_HEIGHT)));
self.0.force_redraw();
}
windows.iter().enumerate().for_each(|(i, w)| { windows.iter().enumerate().for_each(|(i, w)| {
if i == active { if i == active {
w.set_suspended(false); w.set_suspended(false);

View file

@ -175,6 +175,14 @@ impl CosmicWindow {
self.0.resize(Size::from((geo.size.w, SSD_HEIGHT))); self.0.resize(Size::from((geo.size.w, SSD_HEIGHT)));
} }
pub fn on_commit(&self, surface: &WlSurface) {
self.0.with_program(|p| {
if &p.window == surface {
p.window.0.on_commit();
}
})
}
pub fn surface(&self) -> CosmicSurface { pub fn surface(&self) -> CosmicSurface {
self.0.with_program(|p| p.window.clone()) self.0.with_program(|p| p.window.clone())
} }

View file

@ -1699,12 +1699,7 @@ impl Shell {
pub fn on_commit(&mut self, surface: &WlSurface) { pub fn on_commit(&mut self, surface: &WlSurface) {
if let Some(mapped) = self.element_for_surface(surface) { if let Some(mapped) = self.element_for_surface(surface) {
mapped mapped.on_commit(surface);
.windows()
.find(|(w, _)| w.wl_surface().as_ref() == Some(surface))
.unwrap()
.0
.on_commit();
} }
self.popups.commit(surface); self.popups.commit(surface);
} }