v0.1.4: reserve_margin + panelbaserad zon + reservationsdemo i docs
- Zonen mäts på synliga panelen (inte fönstret med skuggutrymme) — maximerade fönster kommer ~20px närmare docken direkt - Ny inställning reserve_margin (även i settings → Layout): finjustera avståndet mellan panel och maximerade fönster; minus tillåtet - README + wiki: före/efter-bild som demonstrerar reservationen Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
26
src/dock.rs
26
src/dock.rs
@@ -53,6 +53,7 @@ pub struct Ctx {
|
||||
|
||||
pub struct Dock {
|
||||
pub window: gtk::ApplicationWindow,
|
||||
pub panel: gtk::Box,
|
||||
pub items_box: gtk::Box,
|
||||
pub revealer: gtk::Revealer,
|
||||
pub connector: String,
|
||||
@@ -158,16 +159,19 @@ pub fn update_exclusive_zone(ctx: &Rc<Ctx>, dock: &Rc<Dock>) {
|
||||
return;
|
||||
}
|
||||
let horizontal = matches!(cfg.position, Position::Bottom | Position::Top);
|
||||
// mät den SYNLIGA panelen — fönstret innehåller även skuggutrymmet,
|
||||
// som inte ska räknas in i reservationen
|
||||
let size = if horizontal {
|
||||
dock.window.height()
|
||||
dock.panel.height()
|
||||
} else {
|
||||
dock.window.width()
|
||||
dock.panel.width()
|
||||
};
|
||||
if size > 1 && !dock.hidden.get() {
|
||||
dock.main_size.set(size);
|
||||
}
|
||||
if dock.main_size.get() > 1 {
|
||||
let zone = dock.main_size.get() + cfg.margin.max(0);
|
||||
let zone =
|
||||
(dock.main_size.get() + cfg.margin.max(0) + cfg.reserve_margin).max(1);
|
||||
debug!("{}: exclusive zone {}px", dock.connector, zone);
|
||||
dock.window.set_exclusive_zone(zone);
|
||||
}
|
||||
@@ -313,6 +317,7 @@ fn build_dock(ctx: &Rc<Ctx>, monitor: &gdk::Monitor, connector: String) -> Rc<Do
|
||||
|
||||
let dock = Rc::new(Dock {
|
||||
window: win.clone(),
|
||||
panel: panel.clone(),
|
||||
items_box: items_box.clone(),
|
||||
revealer,
|
||||
connector,
|
||||
@@ -428,7 +433,7 @@ fn set_dock_hidden(ctx: &Ctx, dock: &Rc<Dock>, hidden: bool) {
|
||||
let horizontal = matches!(cfg.position, Position::Bottom | Position::Top);
|
||||
// kom ihåg synlig storlek innan vi gömmer
|
||||
if hidden {
|
||||
let size = if horizontal { dock.window.height() } else { dock.window.width() };
|
||||
let size = if horizontal { dock.panel.height() } else { dock.panel.width() };
|
||||
if size > 1 {
|
||||
dock.main_size.set(size);
|
||||
}
|
||||
@@ -439,8 +444,10 @@ fn set_dock_hidden(ctx: &Ctx, dock: &Rc<Dock>, hidden: bool) {
|
||||
if cfg.avoid_windows {
|
||||
// reservera plats även gömd: håll fönstret mappat (kollapsat)
|
||||
// med frusen zon — maximerade fönster stannar vid docklinjen
|
||||
dock.window
|
||||
.set_exclusive_zone(dock.main_size.get().max(1) + cfg.margin.max(0));
|
||||
dock.window.set_exclusive_zone(
|
||||
(dock.main_size.get().max(1) + cfg.margin.max(0) + cfg.reserve_margin)
|
||||
.max(1),
|
||||
);
|
||||
} else {
|
||||
let duration = dock.revealer.transition_duration();
|
||||
let dock2 = dock.clone();
|
||||
@@ -528,14 +535,15 @@ pub fn recompute_dodge(ctx: &Rc<Ctx>) {
|
||||
// den kollapsade storleken skulle få hidden/synlig att flappa
|
||||
if !dock.hidden.get() {
|
||||
let current = match position {
|
||||
Position::Bottom | Position::Top => dock.window.height(),
|
||||
_ => dock.window.width(),
|
||||
Position::Bottom | Position::Top => dock.panel.height(),
|
||||
_ => dock.panel.width(),
|
||||
};
|
||||
if current > 1 {
|
||||
dock.main_size.set(current);
|
||||
}
|
||||
}
|
||||
let depth = (dock.main_size.get().max(40) + margin) as f64;
|
||||
let extra = if eff.avoid_windows { eff.reserve_margin } else { 0 };
|
||||
let depth = (dock.main_size.get().max(24) + margin + extra).max(1) as f64;
|
||||
|
||||
let overlap = views.iter().any(|v| {
|
||||
if v["role"].as_str() != Some("toplevel")
|
||||
|
||||
Reference in New Issue
Block a user