improv(view): make workspace item sizing more dynamic

This makes the `workspace_bar` more responsive to different child sizes, which enables fixing the size of the smaller dimension of the screencopy, while allowing it to expand unrestricted in the larger dimension (to match the aspect ratio).
This commit is contained in:
Vukašin Vojinović 2025-04-09 13:40:08 +02:00 committed by Ian Douglas Scott
parent d4ddae7799
commit 2b7a8b133e
5 changed files with 322 additions and 289 deletions

400
Cargo.lock generated
View file

@ -141,12 +141,6 @@ version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd"
[[package]]
name = "allocator-api2"
version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]] [[package]]
name = "almost" name = "almost"
version = "0.2.0" version = "0.2.0"
@ -575,6 +569,18 @@ dependencies = [
"zbus 3.15.2", "zbus 3.15.2",
] ]
[[package]]
name = "auto_enums"
version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c170965892137a3a9aeb000b4524aa3cc022a310e709d848b6e1cdce4ab4781"
dependencies = [
"derive_utils",
"proc-macro2",
"quote",
"syn 2.0.98",
]
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.4.0" version = "1.4.0"
@ -734,39 +740,6 @@ version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9"
[[package]]
name = "cached"
version = "0.54.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9718806c4a2fe9e8a56fd736f97b340dd10ed1be8ed733ed50449f351dc33cae"
dependencies = [
"ahash",
"cached_proc_macro",
"cached_proc_macro_types",
"hashbrown 0.14.5",
"once_cell",
"thiserror 1.0.69",
"web-time",
]
[[package]]
name = "cached_proc_macro"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f42a145ed2d10dce2191e1dcf30cfccfea9026660e143662ba5eec4017d5daa"
dependencies = [
"darling",
"proc-macro2",
"quote",
"syn 2.0.98",
]
[[package]]
name = "cached_proc_macro_types"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0"
[[package]] [[package]]
name = "calloop" name = "calloop"
version = "0.13.0" version = "0.13.0"
@ -856,16 +829,16 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]] [[package]]
name = "chrono" name = "chrono"
version = "0.4.39" version = "0.4.40"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c"
dependencies = [ dependencies = [
"android-tzdata", "android-tzdata",
"iana-time-zone", "iana-time-zone",
"js-sys", "js-sys",
"num-traits", "num-traits",
"wasm-bindgen", "wasm-bindgen",
"windows-targets 0.52.6", "windows-link",
] ]
[[package]] [[package]]
@ -933,7 +906,7 @@ version = "0.2.2"
source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f"
dependencies = [ dependencies = [
"dnd", "dnd",
"mime", "mime 0.1.0",
"smithay-clipboard", "smithay-clipboard",
] ]
@ -1004,7 +977,7 @@ version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a5f405d474b9d05e0a093d3120e77e9bf26461b57a84b40aa2a221ac5617fb6" checksum = "6a5f405d474b9d05e0a093d3120e77e9bf26461b57a84b40aa2a221ac5617fb6"
dependencies = [ dependencies = [
"csscolorparser", "csscolorparser 0.6.2",
] ]
[[package]] [[package]]
@ -1057,26 +1030,6 @@ dependencies = [
"crossbeam-utils", "crossbeam-utils",
] ]
[[package]]
name = "const-random"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359"
dependencies = [
"const-random-macro",
]
[[package]]
name = "const-random-macro"
version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
dependencies = [
"getrandom 0.2.15",
"once_cell",
"tiny-keccak",
]
[[package]] [[package]]
name = "core-foundation" name = "core-foundation"
version = "0.9.4" version = "0.9.4"
@ -1157,16 +1110,16 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-config" name = "cosmic-config"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"atomicwrites", "atomicwrites",
"cosmic-config-derive", "cosmic-config-derive",
"dirs", "dirs 6.0.0",
"iced_futures", "iced_futures",
"known-folders", "known-folders",
"notify", "notify",
"once_cell", "once_cell",
"ron 0.9.0-alpha.1", "ron 0.9.0",
"serde", "serde",
"tokio", "tokio",
"tracing", "tracing",
@ -1176,7 +1129,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-config-derive" name = "cosmic-config-derive"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"quote", "quote",
"syn 1.0.109", "syn 1.0.109",
@ -1185,12 +1138,12 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-freedesktop-icons" name = "cosmic-freedesktop-icons"
version = "0.3.0" version = "0.3.0"
source = "git+https://github.com/pop-os/freedesktop-icons#98f78d49022c893be2e974e95d95aaea963a6833" source = "git+https://github.com/pop-os/freedesktop-icons#8a05c322c482ff3c69cf34bacfee98907ac45307"
dependencies = [ dependencies = [
"dirs", "dirs 5.0.1",
"ini_core", "ini_core",
"once_cell", "memmap2 0.9.5",
"thiserror 1.0.69", "thiserror 2.0.12",
"tracing", "tracing",
"xdg", "xdg",
] ]
@ -1211,8 +1164,8 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-text" name = "cosmic-text"
version = "0.13.2" version = "0.14.1"
source = "git+https://github.com/pop-os/cosmic-text.git#500a8fc6d172de5c9e08c6013070b6b7fcdf79dd" source = "git+https://github.com/pop-os/cosmic-text.git#87a937056da57e3c8ac367b5d74c6d488dd94ac6"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.8.0",
"fontdb 0.16.2", "fontdb 0.16.2",
@ -1234,18 +1187,18 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-theme" name = "cosmic-theme"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"almost", "almost",
"cosmic-config", "cosmic-config",
"csscolorparser", "csscolorparser 0.7.0",
"dirs", "dirs 6.0.0",
"lazy_static", "lazy_static",
"palette", "palette",
"ron 0.9.0-alpha.1", "ron 0.9.0",
"serde", "serde",
"serde_json", "serde_json",
"thiserror 1.0.69", "thiserror 2.0.12",
] ]
[[package]] [[package]]
@ -1262,7 +1215,6 @@ dependencies = [
"cosmic-config", "cosmic-config",
"delegate", "delegate",
"env_logger", "env_logger",
"freedesktop-desktop-entry",
"freedesktop-icons", "freedesktop-icons",
"futures-channel", "futures-channel",
"futures-executor", "futures-executor",
@ -1298,15 +1250,6 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "crossbeam-channel"
version = "0.5.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471"
dependencies = [
"crossbeam-utils",
]
[[package]] [[package]]
name = "crossbeam-utils" name = "crossbeam-utils"
version = "0.8.21" version = "0.8.21"
@ -1340,6 +1283,15 @@ name = "csscolorparser"
version = "0.6.2" version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf"
dependencies = [
"phf",
]
[[package]]
name = "csscolorparser"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46f9a16a848a7fb95dd47ce387ac1ee9a6df879ba784b815537fcd388a1a8288"
dependencies = [ dependencies = [
"phf", "phf",
"serde", "serde",
@ -1457,6 +1409,17 @@ dependencies = [
"syn 2.0.98", "syn 2.0.98",
] ]
[[package]]
name = "derive_utils"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccfae181bab5ab6c5478b2ccb69e4c68a02f8c3ec72f6616bfec9dbc599d2ee0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.98",
]
[[package]] [[package]]
name = "digest" name = "digest"
version = "0.10.7" version = "0.10.7"
@ -1473,7 +1436,16 @@ version = "5.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
dependencies = [ dependencies = [
"dirs-sys", "dirs-sys 0.4.1",
]
[[package]]
name = "dirs"
version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"
dependencies = [
"dirs-sys 0.5.0",
] ]
[[package]] [[package]]
@ -1484,10 +1456,22 @@ checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
dependencies = [ dependencies = [
"libc", "libc",
"option-ext", "option-ext",
"redox_users", "redox_users 0.4.6",
"windows-sys 0.48.0", "windows-sys 0.48.0",
] ]
[[package]]
name = "dirs-sys"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
dependencies = [
"libc",
"option-ext",
"redox_users 0.5.0",
"windows-sys 0.59.0",
]
[[package]] [[package]]
name = "dispatch" name = "dispatch"
version = "0.2.0" version = "0.2.0"
@ -1514,22 +1498,13 @@ dependencies = [
"libloading", "libloading",
] ]
[[package]]
name = "dlv-list"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f"
dependencies = [
"const-random",
]
[[package]] [[package]]
name = "dnd" name = "dnd"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.8.0",
"mime", "mime 0.1.0",
"raw-window-handle", "raw-window-handle",
"smithay-client-toolkit", "smithay-client-toolkit",
"smithay-clipboard", "smithay-clipboard",
@ -1976,31 +1951,29 @@ dependencies = [
[[package]] [[package]]
name = "freedesktop-desktop-entry" name = "freedesktop-desktop-entry"
version = "0.7.7" version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "016f6ee9509f11c985aa402451f4ee900d1fafeb501a4c3d734ebecfc1130e05" checksum = "2258b98a780699da05c858682498ceaf3942013d7d93ca7584e26fbacc58f2d9"
dependencies = [ dependencies = [
"cached",
"dirs",
"gettext-rs", "gettext-rs",
"log", "log",
"memchr", "memchr",
"strsim", "thiserror 2.0.12",
"textdistance", "unicase",
"thiserror 2.0.11",
"xdg", "xdg",
] ]
[[package]] [[package]]
name = "freedesktop-icons" name = "freedesktop-icons"
version = "0.2.6" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8ef34245e0540c9a3ce7a28340b98d2c12b75da0d446da4e8224923fcaa0c16" checksum = "72e592df580f8f0e7c48135383e9c0e0d18d9de346b95f9839857fe27a67ad47"
dependencies = [ dependencies = [
"dirs", "dirs 5.0.1",
"ini_core",
"once_cell", "once_cell",
"rust-ini",
"thiserror 1.0.69", "thiserror 1.0.69",
"tracing",
"xdg", "xdg",
] ]
@ -2355,10 +2328,6 @@ name = "hashbrown"
version = "0.14.5" version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
"ahash",
"allocator-api2",
]
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
@ -2520,7 +2489,7 @@ dependencies = [
[[package]] [[package]]
name = "iced" name = "iced"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"dnd", "dnd",
"iced_accessibility", "iced_accessibility",
@ -2530,7 +2499,7 @@ dependencies = [
"iced_widget", "iced_widget",
"iced_winit", "iced_winit",
"image", "image",
"mime", "mime 0.1.0",
"thiserror 1.0.69", "thiserror 1.0.69",
"window_clipboard", "window_clipboard",
] ]
@ -2538,7 +2507,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_accessibility" name = "iced_accessibility"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"accesskit", "accesskit",
"accesskit_winit", "accesskit_winit",
@ -2547,7 +2516,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_core" name = "iced_core"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.8.0",
"bytes", "bytes",
@ -2555,7 +2524,7 @@ dependencies = [
"dnd", "dnd",
"glam", "glam",
"log", "log",
"mime", "mime 0.1.0",
"num-traits", "num-traits",
"once_cell", "once_cell",
"palette", "palette",
@ -2571,7 +2540,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_futures" name = "iced_futures"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"futures", "futures",
"iced_core", "iced_core",
@ -2597,7 +2566,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_graphics" name = "iced_graphics"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.8.0",
"bytemuck", "bytemuck",
@ -2619,7 +2588,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_renderer" name = "iced_renderer"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"iced_graphics", "iced_graphics",
"iced_tiny_skia", "iced_tiny_skia",
@ -2631,7 +2600,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_runtime" name = "iced_runtime"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"bytes", "bytes",
"cosmic-client-toolkit", "cosmic-client-toolkit",
@ -2646,7 +2615,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_tiny_skia" name = "iced_tiny_skia"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"cosmic-text", "cosmic-text",
@ -2662,7 +2631,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_wgpu" name = "iced_wgpu"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"as-raw-xcb-connection", "as-raw-xcb-connection",
"bitflags 2.8.0", "bitflags 2.8.0",
@ -2693,7 +2662,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_widget" name = "iced_widget"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"cosmic-client-toolkit", "cosmic-client-toolkit",
"dnd", "dnd",
@ -2711,7 +2680,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_winit" name = "iced_winit"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"cosmic-client-toolkit", "cosmic-client-toolkit",
"dnd", "dnd",
@ -2932,11 +2901,11 @@ dependencies = [
[[package]] [[package]]
name = "inotify" name = "inotify"
version = "0.9.6" version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 2.8.0",
"inotify-sys", "inotify-sys",
"libc", "libc",
] ]
@ -3159,17 +3128,18 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.169" version = "0.2.171"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
[[package]] [[package]]
name = "libcosmic" name = "libcosmic"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" source = "git+https://github.com/pop-os/libcosmic#0ddde755ee922edcff1a3b11cc00753cb29fe3b0"
dependencies = [ dependencies = [
"apply", "apply",
"ashpd 0.9.2", "ashpd 0.9.2",
"auto_enums",
"chrono", "chrono",
"cosmic-client-toolkit", "cosmic-client-toolkit",
"cosmic-config", "cosmic-config",
@ -3177,6 +3147,8 @@ dependencies = [
"cosmic-theme", "cosmic-theme",
"css-color", "css-color",
"derive_setters", "derive_setters",
"freedesktop-desktop-entry",
"futures",
"iced", "iced",
"iced_core", "iced_core",
"iced_futures", "iced_futures",
@ -3188,13 +3160,17 @@ dependencies = [
"iced_winit", "iced_winit",
"image", "image",
"lazy_static", "lazy_static",
"libc",
"mime 0.3.17",
"palette", "palette",
"rfd", "rfd",
"ron 0.8.1", "ron 0.9.0",
"rustix 1.0.5",
"serde", "serde",
"shlex",
"slotmap", "slotmap",
"taffy", "taffy",
"thiserror 1.0.69", "thiserror 2.0.12",
"tokio", "tokio",
"tracing", "tracing",
"unicode-segmentation", "unicode-segmentation",
@ -3257,6 +3233,12 @@ version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7"
[[package]]
name = "linux-raw-sys"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
[[package]] [[package]]
name = "litemap" name = "litemap"
version = "0.7.4" version = "0.7.4"
@ -3430,6 +3412,12 @@ dependencies = [
"smithay-clipboard", "smithay-clipboard",
] ]
[[package]]
name = "mime"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.8.3" version = "0.8.3"
@ -3440,18 +3428,6 @@ dependencies = [
"simd-adler32", "simd-adler32",
] ]
[[package]]
name = "mio"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
dependencies = [
"libc",
"log",
"wasi 0.11.0+wasi-snapshot-preview1",
"windows-sys 0.48.0",
]
[[package]] [[package]]
name = "mio" name = "mio"
version = "1.0.3" version = "1.0.3"
@ -3459,6 +3435,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
dependencies = [ dependencies = [
"libc", "libc",
"log",
"wasi 0.11.0+wasi-snapshot-preview1", "wasi 0.11.0+wasi-snapshot-preview1",
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
@ -3556,23 +3533,29 @@ dependencies = [
[[package]] [[package]]
name = "notify" name = "notify"
version = "6.1.1" version = "8.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" checksum = "2fee8403b3d66ac7b26aee6e40a897d85dc5ce26f44da36b8b73e987cc52e943"
dependencies = [ dependencies = [
"bitflags 2.8.0", "bitflags 2.8.0",
"crossbeam-channel",
"filetime", "filetime",
"fsevent-sys", "fsevent-sys",
"inotify", "inotify",
"kqueue", "kqueue",
"libc", "libc",
"log", "log",
"mio 0.8.11", "mio",
"notify-types",
"walkdir", "walkdir",
"windows-sys 0.48.0", "windows-sys 0.59.0",
] ]
[[package]]
name = "notify-types"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d"
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.19" version = "0.2.19"
@ -3857,9 +3840,9 @@ dependencies = [
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.20.2" version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]] [[package]]
name = "option-ext" name = "option-ext"
@ -3876,16 +3859,6 @@ dependencies = [
"libredox", "libredox",
] ]
[[package]]
name = "ordered-multimap"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79"
dependencies = [
"dlv-list",
"hashbrown 0.14.5",
]
[[package]] [[package]]
name = "ordered-stream" name = "ordered-stream"
version = "0.2.0" version = "0.2.0"
@ -4365,6 +4338,17 @@ dependencies = [
"thiserror 1.0.69", "thiserror 1.0.69",
] ]
[[package]]
name = "redox_users"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b"
dependencies = [
"getrandom 0.2.15",
"libredox",
"thiserror 2.0.12",
]
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.11.1" version = "1.11.1"
@ -4462,9 +4446,9 @@ dependencies = [
[[package]] [[package]]
name = "ron" name = "ron"
version = "0.9.0-alpha.1" version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7644a2a539ff7fa991c8f4652373cd722d387e39229415103243914249730836" checksum = "63f3aa105dea217ef30d89581b65a4d527a19afc95ef5750be3890e8d3c5b837"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"bitflags 2.8.0", "bitflags 2.8.0",
@ -4513,16 +4497,6 @@ dependencies = [
"walkdir", "walkdir",
] ]
[[package]]
name = "rust-ini"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e0698206bcb8882bf2a9ecb4c1e7785db57ff052297085a6efd4fe42302068a"
dependencies = [
"cfg-if",
"ordered-multimap",
]
[[package]] [[package]]
name = "rustc-demangle" name = "rustc-demangle"
version = "0.1.24" version = "0.1.24"
@ -4568,6 +4542,19 @@ dependencies = [
"windows-sys 0.59.0", "windows-sys 0.59.0",
] ]
[[package]]
name = "rustix"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf"
dependencies = [
"bitflags 2.8.0",
"errno",
"libc",
"linux-raw-sys 0.9.4",
"windows-sys 0.59.0",
]
[[package]] [[package]]
name = "rustversion" name = "rustversion"
version = "1.0.19" version = "1.0.19"
@ -4648,18 +4635,18 @@ checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.217" version = "1.0.219"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.217" version = "1.0.219"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -4668,9 +4655,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.138" version = "1.0.140"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
dependencies = [ dependencies = [
"indexmap", "indexmap",
"itoa", "itoa",
@ -5025,12 +5012,6 @@ dependencies = [
"winapi-util", "winapi-util",
] ]
[[package]]
name = "textdistance"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa672c55ab69f787dbc9126cc387dbe57fdd595f585e4524cf89018fa44ab819"
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.69" version = "1.0.69"
@ -5042,11 +5023,11 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "2.0.11" version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
dependencies = [ dependencies = [
"thiserror-impl 2.0.11", "thiserror-impl 2.0.12",
] ]
[[package]] [[package]]
@ -5062,24 +5043,15 @@ dependencies = [
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "2.0.11" version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.98", "syn 2.0.98",
] ]
[[package]]
name = "tiny-keccak"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
dependencies = [
"crunchy",
]
[[package]] [[package]]
name = "tiny-skia" name = "tiny-skia"
version = "0.11.4" version = "0.11.4"
@ -5146,14 +5118,14 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.43.0" version = "1.44.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48"
dependencies = [ dependencies = [
"backtrace", "backtrace",
"bytes", "bytes",
"libc", "libc",
"mio 1.0.3", "mio",
"pin-project-lite", "pin-project-lite",
"signal-hook-registry", "signal-hook-registry",
"socket2 0.5.8", "socket2 0.5.8",
@ -5328,6 +5300,12 @@ dependencies = [
"tinystr", "tinystr",
] ]
[[package]]
name = "unicase"
version = "2.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539"
[[package]] [[package]]
name = "unicode-bidi" name = "unicode-bidi"
version = "0.3.18" version = "0.3.18"
@ -5885,7 +5863,7 @@ dependencies = [
"clipboard_wayland", "clipboard_wayland",
"clipboard_x11", "clipboard_x11",
"dnd", "dnd",
"mime", "mime 0.1.0",
"raw-window-handle", "raw-window-handle",
"thiserror 1.0.69", "thiserror 1.0.69",
] ]
@ -5953,6 +5931,12 @@ dependencies = [
"syn 2.0.98", "syn 2.0.98",
] ]
[[package]]
name = "windows-link"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
[[package]] [[package]]
name = "windows-result" name = "windows-result"
version = "0.1.2" version = "0.1.2"

View file

@ -12,10 +12,16 @@ cosmic-comp-config = { git = "https://github.com/pop-os/cosmic-comp" }
env_logger = "0.11.0" env_logger = "0.11.0"
futures-channel = "0.3.25" futures-channel = "0.3.25"
gbm = "0.18.0" gbm = "0.18.0"
libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = false, features = ["tokio", "wayland", "single-instance", "multi-window", "winit"] } libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = false, features = [
"tokio",
"wayland",
"single-instance",
"desktop",
"multi-window",
"winit",
] }
cosmic-config = { git = "https://github.com/pop-os/libcosmic" } cosmic-config = { git = "https://github.com/pop-os/libcosmic" }
freedesktop-desktop-entry = "0.7.0" freedesktop-icons = "0.3.1"
freedesktop-icons = "0.2.4"
memmap2 = "0.9.0" memmap2 = "0.9.0"
tokio = "1.23.0" tokio = "1.23.0"
@ -26,7 +32,7 @@ itertools = "0.14.0"
log = "0.4.20" log = "0.4.20"
i18n-embed-fl = "0.9.0" i18n-embed-fl = "0.9.0"
rust-embed = "8.1.0" rust-embed = "8.1.0"
rustix = { version = "0.38.30", features = ["fs"] } rustix = { version = "0.38.30", features = ["fs"] }
calloop-wayland-source = "0.4.0" calloop-wayland-source = "0.4.0"
aliasable = "0.1.3" aliasable = "0.1.3"
futures-executor = { version = "0.3.31", features = ["thread-pool"] } futures-executor = { version = "0.3.31", features = ["thread-pool"] }

View file

@ -1,7 +1,7 @@
// Coppied from cosmic-app-list // Coppied from cosmic-app-list
// - Put in a library? libcosmic? // - Put in a library? libcosmic?
use freedesktop_desktop_entry::DesktopEntry; use cosmic::desktop::fde;
use itertools::Itertools; use itertools::Itertools;
use std::path::PathBuf; use std::path::PathBuf;
@ -47,9 +47,9 @@ fn default_app_icon() -> PathBuf {
fn desktop_info_for_app_ids(mut app_ids: Vec<String>) -> Vec<DesktopInfo> { fn desktop_info_for_app_ids(mut app_ids: Vec<String>) -> Vec<DesktopInfo> {
let app_ids_clone = app_ids.clone(); let app_ids_clone = app_ids.clone();
let mut ret = freedesktop_desktop_entry::Iter::new(freedesktop_desktop_entry::default_paths()) let mut ret = fde::Iter::new(fde::default_paths())
.filter_map(|path| { .filter_map(|path| {
DesktopEntry::from_path::<String>(path.clone(), None) fde::DesktopEntry::from_path::<String>(path.clone(), None)
.ok() .ok()
.and_then(|de| { .and_then(|de| {
if let Some(i) = app_ids.iter().position(|s| { if let Some(i) = app_ids.iter().position(|s| {

View file

@ -8,7 +8,7 @@ use cosmic::{
advanced::layout::flex::Axis, advanced::layout::flex::Axis,
clipboard::mime::AllowedMimeTypes, clipboard::mime::AllowedMimeTypes,
widget::{column, row}, widget::{column, row},
Border, Border, Length,
}, },
iced_core::{text::Wrapping, Shadow}, iced_core::{text::Wrapping, Shadow},
iced_winit::platform_specific::wayland::subsurface_widget::Subsurface, iced_winit::platform_specific::wayland::subsurface_widget::Subsurface,
@ -99,14 +99,14 @@ pub(crate) fn layer_surface<'a>(
WorkspaceLayout::Vertical => widget::layer_container( WorkspaceLayout::Vertical => widget::layer_container(
row![sidebar, toplevels] row![sidebar, toplevels]
.spacing(12) .spacing(12)
.height(iced::Length::Fill) .height(Length::Fill)
.width(iced::Length::Fill), .width(Length::Fill),
), ),
WorkspaceLayout::Horizontal => widget::layer_container( WorkspaceLayout::Horizontal => widget::layer_container(
column![sidebar, toplevels] column![sidebar, toplevels]
.spacing(12) .spacing(12)
.height(iced::Length::Fill) .height(Length::Fill)
.width(iced::Length::Fill), .width(Length::Fill),
), ),
}; };
let output = surface.output.clone(); let output = surface.output.clone();
@ -147,40 +147,90 @@ fn workspace_item_appearance(
fn workspace_item<'a>( fn workspace_item<'a>(
workspace: &'a Workspace, workspace: &'a Workspace,
_output: &wl_output::WlOutput, _output: &wl_output::WlOutput,
layout: WorkspaceLayout,
is_drop_target: bool, is_drop_target: bool,
) -> cosmic::Element<'static, Msg> { ) -> cosmic::Element<'static, Msg> {
let image = capture_image(workspace.img.as_ref(), 1.0); let (image, image_height) = if let Some(img) = workspace.img.as_ref() {
let is_rotated = matches!(
img.transform,
wl_output::Transform::_90
| wl_output::Transform::_270
| wl_output::Transform::Flipped90
| wl_output::Transform::Flipped270
);
let (effective_width, effective_height) = if is_rotated {
// If rotated, swap width and height
(img.height, img.width)
} else {
(img.width, img.height)
};
let fixed_size = 126.0;
if effective_width > effective_height {
(
// Landscape: fix height
widget::container(capture_image(Some(img), 1.0)).max_height(fixed_size),
fixed_size,
)
} else {
(
// Portrait: fix width
widget::container(capture_image(Some(img), 1.0)).max_width(fixed_size),
fixed_size * effective_height as f32 / effective_width as f32,
)
}
} else {
(
widget::container(capture_image(None, 1.0))
.max_width(224.0)
.max_height(126.0),
126.0,
)
};
let workspace_name = widget::text::body(fl!(
"workspace",
HashMap::from([("number", &workspace.name)])
));
// Needed to prevent text getting pushed out when scaling on Vertical layout
let content = match layout {
WorkspaceLayout::Horizontal => column![image, workspace_name]
.align_x(iced::Alignment::Center)
.spacing(4)
.apply(widget::container),
WorkspaceLayout::Vertical => column![image.height(Length::Fill), workspace_name]
.align_x(iced::Alignment::Center)
.spacing(4)
.apply(widget::container)
.max_height(image_height + 21.0 + 4.0), // text height + spacing
};
let is_active = workspace.is_active; let is_active = workspace.is_active;
// TODO editable name? // TODO editable name?
widget::button::custom( widget::button::custom(content)
column![ .selected(workspace.is_active)
image, .class(cosmic::theme::Button::Custom {
widget::text::body(fl!( active: Box::new(move |_focused, theme| {
"workspace", workspace_item_appearance(theme, is_active, is_drop_target)
HashMap::from([("number", &workspace.name)]) }),
)) disabled: Box::new(|_theme| unreachable!()),
] hovered: Box::new(move |_focused, theme| {
.align_x(iced::Alignment::Center) workspace_item_appearance(theme, is_active, true)
.spacing(4), }),
) pressed: Box::new(move |_focused, theme| {
.selected(workspace.is_active) workspace_item_appearance(theme, is_active, true)
.class(cosmic::theme::Button::Custom { }),
active: Box::new(move |_focused, theme| { })
workspace_item_appearance(theme, is_active, is_drop_target) .on_press(Msg::ActivateWorkspace(workspace.handle.clone()))
}), .padding(8)
disabled: Box::new(|_theme| unreachable!()), .into()
hovered: Box::new(move |_focused, theme| workspace_item_appearance(theme, is_active, true)),
pressed: Box::new(move |_focused, theme| workspace_item_appearance(theme, is_active, true)),
})
.on_press(Msg::ActivateWorkspace(workspace.handle.clone()))
.padding(8)
.width(iced::Length::Fixed(240.0))
.into()
} }
fn workspace_sidebar_entry<'a>( fn workspace_sidebar_entry<'a>(
workspace: &'a Workspace, workspace: &'a Workspace,
output: &'a wl_output::WlOutput, output: &'a wl_output::WlOutput,
layout: WorkspaceLayout,
is_drop_target: bool, is_drop_target: bool,
) -> cosmic::Element<'a, Msg> { ) -> cosmic::Element<'a, Msg> {
/* XXX /* XXX
@ -190,7 +240,7 @@ fn workspace_sidebar_entry<'a>(
iced::mouse::Interaction::Idle iced::mouse::Interaction::Idle
}; };
*/ */
let item = workspace_item(workspace, output, is_drop_target); let item = workspace_item(workspace, output, layout, is_drop_target);
/* TODO allow moving workspaces (needs compositor support) /* TODO allow moving workspaces (needs compositor support)
let workspace_clone = workspace.clone(); // TODO avoid clone let workspace_clone = workspace.clone(); // TODO avoid clone
let output_clone = output.clone(); let output_clone = output.clone();
@ -227,19 +277,15 @@ fn workspaces_sidebar<'a>(
drop_target: Option<&backend::ExtWorkspaceHandleV1>, drop_target: Option<&backend::ExtWorkspaceHandleV1>,
) -> cosmic::Element<'a, Msg> { ) -> cosmic::Element<'a, Msg> {
let sidebar_entries = workspaces let sidebar_entries = workspaces
.map(|w| workspace_sidebar_entry(w, output, drop_target == Some(&w.handle))) .map(|w| workspace_sidebar_entry(w, output, layout, drop_target == Some(&w.handle)))
.collect(); .collect();
let axis = match layout { let (axis, width, height) = match layout {
WorkspaceLayout::Vertical => Axis::Vertical, WorkspaceLayout::Vertical => (Axis::Vertical, Length::Shrink, Length::Fill),
WorkspaceLayout::Horizontal => Axis::Horizontal, WorkspaceLayout::Horizontal => (Axis::Horizontal, Length::Fill, Length::Shrink),
}; };
let sidebar_entries_container = let sidebar_entries_container =
widget::container(crate::widgets::workspace_bar(sidebar_entries, axis)).padding(8.0); widget::container(crate::widgets::workspace_bar(sidebar_entries, axis)).padding(8.0);
let (width, height) = match layout {
WorkspaceLayout::Vertical => (iced::Length::Fixed(256.0), iced::Length::Shrink),
WorkspaceLayout::Horizontal => (iced::Length::Shrink, iced::Length::Fill),
};
widget::container( widget::container(
widget::container(sidebar_entries_container) widget::container(sidebar_entries_container)
.width(width) .width(width)
@ -304,8 +350,8 @@ fn toplevel_preview(toplevel: &Toplevel, is_being_dragged: bool) -> cosmic::Elem
} }
})) }))
.apply(widget::container) .apply(widget::container)
.width(iced::Length::FillPortion(5)), .width(Length::FillPortion(5)),
widget::horizontal_space().width(iced::Length::Fixed(8.0)), widget::horizontal_space().width(Length::Fixed(8.0)),
close_button(Msg::CloseToplevel(toplevel.handle.clone())) close_button(Msg::CloseToplevel(toplevel.handle.clone()))
] ]
.padding([0, 0, 4, 0]) .padding([0, 0, 4, 0])
@ -326,7 +372,7 @@ fn toplevel_preview(toplevel: &Toplevel, is_being_dragged: bool) -> cosmic::Elem
) )
//.spacing(4) //.spacing(4)
//.align_items(iced::Alignment::Center) //.align_items(iced::Alignment::Center)
//.width(iced::Length::Fill) //.width(Length::Fill)
.into() .into()
} }
@ -367,8 +413,8 @@ fn toplevel_previews<'a>(
drag_toplevel: Option<&'a backend::ExtForeignToplevelHandleV1>, drag_toplevel: Option<&'a backend::ExtForeignToplevelHandleV1>,
) -> cosmic::Element<'a, Msg> { ) -> cosmic::Element<'a, Msg> {
let (width, height) = match layout { let (width, height) = match layout {
WorkspaceLayout::Vertical => (iced::Length::FillPortion(4), iced::Length::Fill), WorkspaceLayout::Vertical => (Length::FillPortion(4), Length::Fill),
WorkspaceLayout::Horizontal => (iced::Length::Fill, iced::Length::FillPortion(4)), WorkspaceLayout::Horizontal => (Length::Fill, Length::FillPortion(4)),
}; };
let entries = toplevels let entries = toplevels
.map(|t| toplevel_previews_entry(t, drag_toplevel == Some(&t.handle))) .map(|t| toplevel_previews_entry(t, drag_toplevel == Some(&t.handle)))
@ -401,12 +447,12 @@ fn bg_element<'a>(
widget::image::Handle::from_path(path), widget::image::Handle::from_path(path),
) )
.content_fit(iced::ContentFit::Cover) .content_fit(iced::ContentFit::Cover)
.width(iced::Length::Fill) .width(Length::Fill)
.height(iced::Length::Fill) .height(Length::Fill)
.into(), .into(),
Some(Source::Color(color)) => widget::layer_container(widget::horizontal_space()) Some(Source::Color(color)) => widget::layer_container(widget::horizontal_space())
.width(iced::Length::Fill) .width(Length::Fill)
.height(iced::Length::Fill) .height(Length::Fill)
.class(cosmic::theme::Container::Custom(Box::new(move |_| { .class(cosmic::theme::Container::Custom(Box::new(move |_| {
let color = color.clone(); let color = color.clone();
cosmic::iced::widget::container::Style { cosmic::iced::widget::container::Style {
@ -441,8 +487,8 @@ fn bg_element<'a>(
"/usr/share/backgrounds/pop/kate-hazen-COSMIC-desktop-wallpaper.png", "/usr/share/backgrounds/pop/kate-hazen-COSMIC-desktop-wallpaper.png",
)) ))
.content_fit(iced::ContentFit::Cover) .content_fit(iced::ContentFit::Cover)
.width(iced::Length::Fill) .width(Length::Fill)
.height(iced::Length::Fill) .height(Length::Fill)
.into() .into()
} }
} }

View file

@ -61,8 +61,8 @@ pub struct WorkspaceBar<'a, Msg> {
impl<Msg> Widget<Msg, cosmic::Theme, cosmic::Renderer> for WorkspaceBar<'_, Msg> { impl<Msg> Widget<Msg, cosmic::Theme, cosmic::Renderer> for WorkspaceBar<'_, Msg> {
fn size(&self) -> Size<Length> { fn size(&self) -> Size<Length> {
Size { Size {
width: Length::Fill, width: Length::Shrink,
height: Length::Fill, height: Length::Shrink,
} }
} }
@ -72,48 +72,45 @@ impl<Msg> Widget<Msg, cosmic::Theme, cosmic::Renderer> for WorkspaceBar<'_, Msg>
renderer: &cosmic::Renderer, renderer: &cosmic::Renderer,
limits: &layout::Limits, limits: &layout::Limits,
) -> layout::Node { ) -> layout::Node {
// TODO configurable
let spacing = 8.0;
/*
layout::flex::resolve(
layout::flex::Axis::Vertical,
renderer,
&limits,
iced::Padding::ZERO,
0.0, // spacing
iced::Alignment::Start,
&self.children,
&mut tree.children,
)
*/
if self.children.is_empty() { if self.children.is_empty() {
return layout::Node::new(limits.min()); return layout::Node::new(limits.min());
} }
let total_spacing = spacing * (self.children.len().saturating_sub(1)).max(0) as f32; // TODO configurable
let max_main = let spacing = 8.0;
(self.axis.main(limits.max()) - total_spacing) / self.children().len() as f32;
let total_spacing = spacing * (self.children.len() - 1) as f32;
let max_main = (self.axis.main(limits.max()) - total_spacing) / self.children.len() as f32;
let max_cross = self.axis.cross(limits.max()); let max_cross = self.axis.cross(limits.max());
let mut total_main = 0.0; let mut total_main = 0.0;
let mut max_child_cross = 0.0;
let nodes = self let nodes = self
.children .children
.iter() .iter()
.zip(tree.children.iter_mut()) .zip(tree.children.iter_mut())
.map(|(child, tree)| { .enumerate()
.map(|(i, (child, tree))| {
let (max_width, max_height) = self.axis.pack(max_main, max_cross); let (max_width, max_height) = self.axis.pack(max_main, max_cross);
let child_limits = let child_limits =
layout::Limits::new(Size::ZERO, Size::new(max_width, max_height)); layout::Limits::new(Size::ZERO, Size::new(max_width, max_height));
let mut layout = child.as_widget().layout(tree, renderer, &child_limits); let mut layout = child.as_widget().layout(tree, renderer, &child_limits);
let child_size = layout.size();
let (x, y) = self.axis.pack(total_main, 0.0); let (x, y) = self.axis.pack(total_main, 0.0);
layout = layout.move_to(Point::new(x, y)); layout = layout.move_to(Point::new(x, y));
total_main += self.axis.main(layout.size()) + spacing; max_child_cross = f32::max(max_child_cross, self.axis.cross(child_size));
let main = self.axis.main(child_size);
// XXX Don't add spacing for 0 length `dnd_source` placeholder widget
if main != 0.0 {
total_main += main;
if i < self.children.len() - 1 {
total_main += spacing;
}
}
layout layout
}) })
.collect(); .collect();
let (total_width, total_height) = self.axis.pack(total_main, max_cross); let (total_width, total_height) = self.axis.pack(total_main, max_child_cross);
let size = Size::new(total_width, total_height); let size = Size::new(total_width, total_height);
layout::Node::with_children(size, nodes) layout::Node::with_children(size, nodes)
} }