Skip to content

Commit 9f46bee

Browse files
committed
fix: allow hiding and showing empty windows
1 parent ba43653 commit 9f46bee

File tree

4 files changed

+78
-2
lines changed

4 files changed

+78
-2
lines changed

cosmic-panel-bin/src/space/layout.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ impl PanelSpace {
6767
let mut right_overflow_button = None;
6868
let mut center_overflow_button = None;
6969

70-
let to_map = self
70+
let mut to_map = self
7171
.space
7272
.elements()
7373
.cloned()

cosmic-panel-bin/src/space/panel_space.rs

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ use smithay::{
7575
compositor::with_states,
7676
fractional_scale::with_fractional_scale,
7777
seat::WaylandFocus,
78-
shell::xdg::{PopupSurface, PositionerState},
78+
shell::xdg::{PopupSurface, PositionerState, ToplevelSurface},
7979
},
8080
};
8181
use tokio::sync::{mpsc, oneshot};
@@ -313,6 +313,7 @@ pub struct PanelSpace {
313313
pub c_display: Option<WlDisplay>,
314314
pub config: CosmicPanelConfig,
315315
pub space: Space<CosmicMappedInternal>,
316+
pub unmapped_windows: Vec<CosmicMappedInternal>,
316317
pub damage_tracked_renderer: Option<OutputDamageTracker>,
317318
pub clients_left: Clients,
318319
pub clients_center: Clients,
@@ -396,6 +397,7 @@ impl PanelSpace {
396397
config,
397398
shared: shared.clone(),
398399
space: Space::default(),
400+
unmapped_windows: Vec::new(),
399401
overflow_left: Space::default(),
400402
overflow_center: Space::default(),
401403
overflow_right: Space::default(),
@@ -1940,6 +1942,55 @@ impl PanelSpace {
19401942
});
19411943
}
19421944
}
1945+
1946+
pub fn minimize_window(&mut self, surface: ToplevelSurface) -> bool {
1947+
let w = self
1948+
.space
1949+
.elements()
1950+
.find(|e| {
1951+
if let CosmicMappedInternal::Window(w) = e {
1952+
if let Some(t) = w.toplevel() {
1953+
return *t == surface;
1954+
}
1955+
}
1956+
false
1957+
})
1958+
.cloned();
1959+
1960+
if let Some(window) = w {
1961+
self.space.unmap_elem(&window);
1962+
self.unmapped_windows.push(window);
1963+
true
1964+
} else {
1965+
false
1966+
}
1967+
}
1968+
1969+
pub fn unminimize_window(&mut self, surface: ToplevelSurface) -> bool {
1970+
let pos = self.unmapped_windows.iter().position(|e| {
1971+
if let CosmicMappedInternal::Window(w) = e {
1972+
if let Some(t) = w.toplevel() {
1973+
return *t == surface;
1974+
}
1975+
}
1976+
false
1977+
});
1978+
1979+
if let Some(idx) = pos {
1980+
let window = self.unmapped_windows.remove(idx);
1981+
if let Some(wl_surface) = window.wl_surface() {
1982+
with_states(&wl_surface, |states| {
1983+
with_fractional_scale(states, |fractional_scale| {
1984+
fractional_scale.set_preferred_scale(self.scale);
1985+
});
1986+
});
1987+
}
1988+
self.space.map_element(window, (0, 0), false);
1989+
true
1990+
} else {
1991+
false
1992+
}
1993+
}
19431994
}
19441995

19451996
impl Drop for PanelSpace {

cosmic-panel-bin/src/space_container/space_container.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ use smithay::{
3636
backend::renderer::gles::GlesRenderer,
3737
output::Output,
3838
reexports::wayland_server::{self, backend::ClientId},
39+
wayland::shell::xdg::ToplevelSurface,
3940
};
4041
use tokio::sync::mpsc;
4142
use tracing::{error, info};
@@ -569,4 +570,20 @@ impl SpaceContainer {
569570
);
570571
}
571572
}
573+
574+
pub(crate) fn minimize_window(&mut self, surface: ToplevelSurface) {
575+
for space in &mut self.space_list {
576+
if space.minimize_window(surface.clone()) {
577+
break;
578+
}
579+
}
580+
}
581+
582+
pub(crate) fn maximize_window(&mut self, surface: ToplevelSurface) {
583+
for space in &mut self.space_list {
584+
if space.unminimize_window(surface.clone()) {
585+
break;
586+
}
587+
}
588+
}
572589
}

cosmic-panel-bin/src/xdg_shell_wrapper/server/handlers/xdg_shell.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,14 @@ impl XdgShellHandler for GlobalState {
114114
fn popup_destroyed(&mut self, surface: PopupSurface) {
115115
self.server_state.popup_manager.commit(surface.wl_surface());
116116
}
117+
118+
fn minimize_request(&mut self, surface: ToplevelSurface) {
119+
self.space.minimize_window(surface.clone());
120+
}
121+
122+
fn maximize_request(&mut self, surface: ToplevelSurface) {
123+
self.space.maximize_window(surface.clone());
124+
}
117125
}
118126

119127
// Xdg Shell

0 commit comments

Comments
 (0)