diff --git a/Cargo.lock b/Cargo.lock index c24304d..700d14a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1042,7 +1042,7 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "waydock" -version = "0.1.3" +version = "0.1.4" dependencies = [ "async-channel", "gtk4", diff --git a/Cargo.toml b/Cargo.toml index 340feb6..d8ac45a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "waydock" -version = "0.1.3" +version = "0.1.4" edition = "2021" description = "Modern, resurssnål dock för Wayfire — transparent, JSON-konfigurerad, per-skärm" license = "MIT" diff --git a/README.md b/README.md index 2204f22..44486ff 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,12 @@ Samma dock, sex olika configar — bara JSON-filen ändrades mellan bilderna: (minimera/maximera/flytta till skärm/pinna/stäng) - **Per skärm**: vilken inställning som helst kan överridas per skärm — egna pins, position, färger, filter för bara-den-skärmens-fönster +- **Reservera plats**: maximerade fönster stannar vid docklinjen i stället + för att täcka dockan — finjustera avståndet med `reserve_margin` + (0 = kant i kant, minus = ännu närmare). Fungerar ihop med autohide: + + ![reservera plats](assets/screenshots/reserve-demo.png) + - **Autohide**: dodge (göm vid fönsteröverlapp) eller göm alltid, med sensor vid kanten och animation - **Hotspots**: hot corners/edges som kör kommandon eller Wayfire-IPC diff --git a/assets/screenshots/reserve-demo.png b/assets/screenshots/reserve-demo.png new file mode 100644 index 0000000..2faac65 Binary files /dev/null and b/assets/screenshots/reserve-demo.png differ diff --git a/doc/usage.md b/doc/usage.md index 19c8b08..7f5c396 100644 --- a/doc/usage.md +++ b/doc/usage.md @@ -64,6 +64,9 @@ gruppering, fönsterlistans öppning och hover-effekt), **menyinnehåll**, // skuggutrymme läggs aldrig på förankrade sidor, // så 0 = verkligen kant i kant "layer": "top", // top | overlay | bottom (always-on-top = overlay) + "reserve_margin": 0, // extra px ovanpå reservationen: 0 = fönster ända + // till panelkanten, minus = ännu närmare (in i + // skuggan), plus = luft mellan panel och fönster "avoid_windows": false, // true = reservera plats: maximerade fönster // stannar vid dockan. Funkar IHOP med autohide — // då gömmer dodge bara för fönster du själv diff --git a/src/config.rs b/src/config.rs index 9467050..a3aa798 100644 --- a/src/config.rs +++ b/src/config.rs @@ -312,6 +312,10 @@ pub struct Config { pub expand: bool, /// avstånd från kanten baren ligger mot (px) pub margin: i32, + /// extra marginal ovanpå det reserverade området (px). 0 = fönster + /// maximeras ända till panelens kant; minus låter dem gå närmare + /// (in i skuggan), plus ger luft mellan panel och fönster + pub reserve_margin: i32, /// marginal i början av kanten: vänster (topp/botten) resp. topp (vänster/höger) pub margin_start: i32, /// marginal i slutet av kanten: höger resp. botten @@ -336,6 +340,7 @@ impl Default for Config { alignment: Alignment::Center, expand: false, margin: 8, + reserve_margin: 0, margin_start: 0, margin_end: 0, layer: Layer::Top, diff --git a/src/dock.rs b/src/dock.rs index b425796..7092ad4 100644 --- a/src/dock.rs +++ b/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, dock: &Rc) { 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, monitor: &gdk::Monitor, connector: String) -> Rc, 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, 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) { // 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") diff --git a/src/settings.rs b/src/settings.rs index a891b15..f9ea0bf 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -468,6 +468,7 @@ fn build_layout_page(ctx: &Rc) -> gtk::ScrolledWindow { }; })); row(&list, "Reservera plats (maximerade fönster stannar vid dockan)", &switch(ctx, cfg.avoid_windows, |c, v| c.avoid_windows = v)); + row(&list, "Extra reservationsmarginal (px)", &spin(ctx, cfg.reserve_margin as f64, (-64.0, 128.0), 1.0, |c, v| c.reserve_margin = v as i32)); heading(&list, "Marginaler"); list.append(&margin_illustration(ctx));