From a06890d9e1e7d26320458de68b943f50781e2187 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Wed, 13 Aug 2025 13:51:39 -0500 Subject: [PATCH] updating and fixing some small performance issues --- Cargo.lock | 1001 ++++++++++++++++------------------ Cargo.toml | 8 +- flake.lock | 76 ++- src/core/slide.rs | 65 ++- src/main.rs | 110 ++-- src/ui/mod.rs | 1 + src/ui/presenter.rs | 159 +++--- src/ui/text_svg.rs | 86 ++- src/ui/widgets/mod.rs | 1 + src/ui/widgets/slide_text.rs | 116 ++++ 10 files changed, 911 insertions(+), 712 deletions(-) create mode 100644 src/ui/widgets/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 106d5bc..e4c7d3e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "ab_glyph" -version = "0.2.30" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0f4f6fbdc5ee39f2ede9f5f3ec79477271a6d6a2baff22310d51736bda6cea" +checksum = "e074464580a518d16a7126262fffaaa47af89d4099d4cb403f8ed938ba12ee7d" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -219,9 +219,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -249,22 +249,22 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -318,13 +318,16 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.1", + "rand 0.9.2", "raw-window-handle", "serde", "serde_repr", "tokio", "url", - "zbus 5.7.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "zbus 5.9.0", ] [[package]] @@ -343,7 +346,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.4.1", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -351,9 +354,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -370,7 +373,7 @@ dependencies = [ "async-task", "concurrent-queue", "fastrand 2.3.0", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "pin-project-lite", "slab", ] @@ -397,21 +400,20 @@ dependencies = [ [[package]] name = "async-io" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" +checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" dependencies = [ - "async-lock 3.4.0", + "async-lock 3.4.1", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "parking", - "polling 3.8.0", - "rustix 1.0.7", + "polling 3.10.0", + "rustix 1.0.8", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -425,11 +427,11 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.4.1", "event-listener-strategy", "pin-project-lite", ] @@ -453,21 +455,20 @@ dependencies = [ [[package]] name = "async-process" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" +checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" dependencies = [ "async-channel", - "async-io 2.4.1", - "async-lock 3.4.0", + "async-io 2.5.0", + "async-lock 3.4.1", "async-signal", "async-task", "blocking", "cfg-if", - "event-listener 5.4.0", - "futures-lite 2.6.0", - "rustix 1.0.7", - "tracing", + "event-listener 5.4.1", + "futures-lite 2.6.1", + "rustix 1.0.8", ] [[package]] @@ -483,20 +484,20 @@ dependencies = [ [[package]] name = "async-signal" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" +checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" dependencies = [ - "async-io 2.4.1", - "async-lock 3.4.0", + "async-io 2.5.0", + "async-lock 3.4.1", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 1.0.7", + "rustix 1.0.8", "signal-hook-registry", "slab", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -679,16 +680,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" dependencies = [ - "bit-vec 0.7.0", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec 0.8.0", + "bit-vec", ] [[package]] @@ -697,12 +689,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - [[package]] name = "bitflags" version = "1.3.2" @@ -753,14 +739,14 @@ dependencies = [ [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ "async-channel", "async-task", "futures-io", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "piper", ] @@ -778,18 +764,18 @@ checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] name = "bytemuck" -version = "1.23.1" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.9.3" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" +checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" dependencies = [ "proc-macro2", "quote", @@ -822,7 +808,7 @@ checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ "bitflags 2.9.1", "log", - "polling 3.8.0", + "polling 3.10.0", "rustix 0.38.44", "slab", "thiserror 1.0.69", @@ -842,9 +828,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.27" +version = "1.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e" dependencies = [ "jobserver", "libc", @@ -868,9 +854,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.20.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34e221e91c7eb5e8315b5c9cf1a61670938c0626451f954a51693ed44b37f45" +checksum = "c8d458d63f0f0f482c8da9b7c8b76c21bd885a02056cc94c6404d861ca2b8206" dependencies = [ "smallvec", "target-lexicon", @@ -904,6 +890,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-link", ] @@ -921,9 +908,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.40" +version = "4.5.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +checksum = "1c1f056bae57e3e54c3375c41ff79619ddd13460a17d7438712bd0d83fda4ff8" dependencies = [ "clap_builder", "clap_derive", @@ -931,9 +918,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.40" +version = "4.5.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" dependencies = [ "anstream", "anstyle", @@ -944,9 +931,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -968,9 +955,9 @@ checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" [[package]] name = "clipboard-win" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" dependencies = [ "error-code", ] @@ -991,7 +978,7 @@ version = "0.2.2" source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" dependencies = [ "dnd", - "mime", + "mime 0.1.0", "smithay-clipboard", ] @@ -1044,15 +1031,6 @@ dependencies = [ "unicode-width 0.1.14", ] -[[package]] -name = "codespan-reporting" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" -dependencies = [ - "unicode-width 0.2.1", -] - [[package]] name = "color_quant" version = "1.1.0" @@ -1211,7 +1189,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1227,13 +1205,13 @@ dependencies = [ "tokio", "tracing", "xdg", - "zbus 5.7.1", + "zbus 5.9.0", ] [[package]] name = "cosmic-config-derive" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "quote", "syn 2.0.104", @@ -1246,7 +1224,7 @@ source = "git+https://github.com/pop-os/freedesktop-icons#8a05c322c482ff3c69cf34 dependencies = [ "dirs 5.0.1", "ini_core", - "memmap2 0.9.5", + "memmap2 0.9.7", "thiserror 2.0.12", "tracing", "xdg", @@ -1266,25 +1244,39 @@ dependencies = [ "wayland-server", ] +[[package]] +name = "cosmic-settings-config" +version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-settings-daemon#19f10525ff00d76558147ea060bd856a87122353" +dependencies = [ + "cosmic-config", + "ron 0.9.0", + "serde", + "serde_with", + "thiserror 2.0.12", + "tracing", + "xkbcommon", +] + [[package]] name = "cosmic-settings-daemon" version = "0.1.0" source = "git+https://github.com/pop-os/dbus-settings-bindings#3b86984332be2c930a3536ab714b843c851fa8ca" dependencies = [ - "zbus 5.7.1", + "zbus 5.9.0", ] [[package]] name = "cosmic-text" version = "0.14.2" -source = "git+https://github.com/pop-os/cosmic-text.git#3b1aa511d19aaa40be447a9b7ebe212b1bbb6a9a" +source = "git+https://github.com/pop-os/cosmic-text.git#f7033bb0433f6a9ba109007027781ba46ea9ba27" dependencies = [ "bitflags 2.9.1", "fontdb 0.23.0", "log", "rangemap", "rustc-hash 1.1.0", - "rustybuzz 0.14.1", + "rustybuzz", "self_cell", "smol_str", "swash", @@ -1299,7 +1291,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "almost", "cosmic-config", @@ -1362,9 +1354,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -1516,6 +1508,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -1531,9 +1524,9 @@ dependencies = [ [[package]] name = "derive_setters" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c848e86c87e5cc305313041c5677d4d95d60baa71cf95e5f6ea2554bb629ff" +checksum = "ae5c625eda104c228c06ecaf988d1c60e542176bd7a490e60eeda3493244c0c9" dependencies = [ "darling", "proc-macro2", @@ -1608,7 +1601,7 @@ checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", - "redox_users 0.5.0", + "redox_users 0.5.2", "windows-sys 0.60.2", ] @@ -1618,18 +1611,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" -[[package]] -name = "dispatch2" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0d569e003ff27784e0e14e4a594048698e0c0f0b66cabcb51511be55a7caa0" -dependencies = [ - "bitflags 2.9.1", - "block2 0.6.1", - "libc", - "objc2 0.6.1", -] - [[package]] name = "dispatch2" version = "0.3.0" @@ -1637,6 +1618,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ "bitflags 2.9.1", + "block2 0.6.1", + "libc", "objc2 0.6.1", ] @@ -1666,7 +1649,7 @@ version = "0.1.0" source = "git+https://github.com/pop-os/window_clipboard.git?tag=pop-0.13-2#6b9faab87bea9cebec6ae036906fd67fed254f5f" dependencies = [ "bitflags 2.9.1", - "mime", + "mime 0.1.0", "raw-window-handle", "smithay-client-toolkit", "smithay-clipboard", @@ -1737,6 +1720,12 @@ dependencies = [ "linux-raw-sys 0.6.5", ] +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "either" version = "1.15.0" @@ -1859,9 +1848,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -1874,7 +1863,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.4.1", "pin-project-lite", ] @@ -1912,7 +1901,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" dependencies = [ "cfg-if", - "rustix 1.0.7", + "rustix 1.0.8", "windows-sys 0.59.0", ] @@ -1925,42 +1914,6 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "femtovg" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66a4045686ce22a7e99a1e9ec3b5c86f43cdedf678a699f544f10af286da893" -dependencies = [ - "bitflags 2.9.1", - "bytemuck", - "fnv", - "glow 0.16.0", - "image", - "imgref", - "log", - "lru 0.16.0", - "rgb", - "rustybuzz 0.20.1", - "slotmap", - "unicode-bidi", - "unicode-segmentation", - "wasm-bindgen", - "web-sys", - "wgpu 26.0.1", -] - -[[package]] -name = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - [[package]] name = "flate2" version = "1.1.2" @@ -2032,7 +1985,7 @@ checksum = "e32eac81c1135c1df01d4e6d4233c47ba11f6a6d07f33e0bba09d18797077770" dependencies = [ "fontconfig-parser", "log", - "memmap2 0.9.5", + "memmap2 0.9.7", "slotmap", "tinyvec", "ttf-parser 0.21.1", @@ -2046,7 +1999,7 @@ checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" dependencies = [ "fontconfig-parser", "log", - "memmap2 0.9.5", + "memmap2 0.9.7", "slotmap", "tinyvec", "ttf-parser 0.25.1", @@ -2088,6 +2041,20 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "freedesktop-desktop-entry" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb78ccb4eb670a9c659f1c61e709d41fd6401cddf562f14cac1a47077918d3" +dependencies = [ + "gettext-rs", + "log", + "memchr", + "thiserror 2.0.12", + "unicase", + "xdg", +] + [[package]] name = "fsevent-sys" version = "4.1.0" @@ -2174,9 +2141,9 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand 2.3.0", "futures-core", @@ -2269,6 +2236,26 @@ dependencies = [ "wasi 0.14.2+wasi-0.2.4", ] +[[package]] +name = "gettext-rs" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44e92f7dc08430aca7ed55de161253a22276dfd69c5526e5c5e95d1f7cf338a" +dependencies = [ + "gettext-sys", + "locale_config", +] + +[[package]] +name = "gettext-sys" +version = "0.22.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb45773f5b8945f12aecd04558f545964f943dacda1b1155b3d738f5469ef661" +dependencies = [ + "cc", + "temp-dir", +] + [[package]] name = "gif" version = "0.13.3" @@ -2361,9 +2348,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "glow" @@ -2377,18 +2364,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "glow" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "glutin_wgl_sys" version = "0.6.1" @@ -2449,7 +2424,7 @@ checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ "bitflags 2.9.1", "gpu-descriptor-types", - "hashbrown", + "hashbrown 0.15.5", ] [[package]] @@ -2668,14 +2643,19 @@ checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", - "num-traits", ] [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", @@ -2688,7 +2668,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown", + "hashbrown 0.15.5", ] [[package]] @@ -2811,7 +2791,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "dnd", "iced_accessibility", @@ -2821,7 +2801,7 @@ dependencies = [ "iced_widget", "iced_winit", "image", - "mime", + "mime 0.1.0", "thiserror 1.0.69", "window_clipboard", ] @@ -2829,7 +2809,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "accesskit", "accesskit_winit", @@ -2838,7 +2818,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "bitflags 2.9.1", "bytes", @@ -2846,7 +2826,7 @@ dependencies = [ "glam", "iced_accessibility", "log", - "mime", + "mime 0.1.0", "num-traits", "once_cell", "palette", @@ -2862,7 +2842,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "futures", "iced_core", @@ -2880,15 +2860,15 @@ source = "git+https://github.com/pop-os/glyphon.git?tag=iced-0.14-dev#6ef9d12a20 dependencies = [ "cosmic-text", "etagere", - "lru 0.12.5", + "lru", "rustc-hash 2.1.1", - "wgpu 22.1.0", + "wgpu", ] [[package]] name = "iced_graphics" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "bitflags 2.9.1", "bytemuck", @@ -2910,7 +2890,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -2922,7 +2902,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "bytes", "dnd", @@ -2937,7 +2917,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "bytemuck", "cosmic-text", @@ -2970,7 +2950,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "as-raw-xcb-connection", "bitflags 2.9.1", @@ -2994,14 +2974,14 @@ dependencies = [ "wayland-client", "wayland-protocols", "wayland-sys", - "wgpu 22.1.0", + "wgpu", "x11rb", ] [[package]] name = "iced_widget" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "dnd", "iced_accessibility", @@ -3020,7 +3000,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "dnd", "iced_accessibility", @@ -3173,12 +3153,6 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" -[[package]] -name = "imgref" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" - [[package]] name = "immutable-chunkmap" version = "2.0.6" @@ -3188,6 +3162,17 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + [[package]] name = "indexmap" version = "2.10.0" @@ -3195,7 +3180,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.5", + "serde", ] [[package]] @@ -3247,6 +3233,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "libc", +] + [[package]] name = "is_ci" version = "1.2.0" @@ -3359,11 +3356,11 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] name = "known-folders" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7d9a1740cc8b46e259a0eb787d79d855e79ff10b9855a5eba58868d5da7927c" +checksum = "c644f4623d1c55eb60a9dac35e0858a59f982fb87db6ce34c872372b0a5b728f" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -3398,11 +3395,12 @@ dependencies = [ [[package]] name = "kurbo" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1077d333efea6170d9ccb96d3c3026f300ca0773da4938cc4c811daa6df68b0c" +checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" dependencies = [ "arrayvec", + "euclid", "smallvec", ] @@ -3449,14 +3447,14 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libcosmic" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#aaa4b83577a70c15af8b91d1fb161e2a2931596b" +source = "git+https://github.com/pop-os/libcosmic#562e88587207368969e7bcd43bce3ccf81aee8d9" dependencies = [ "apply", "ashpd", @@ -3464,10 +3462,12 @@ dependencies = [ "chrono", "cosmic-config", "cosmic-freedesktop-icons", + "cosmic-settings-config", "cosmic-settings-daemon", "cosmic-theme", "css-color", "derive_setters", + "freedesktop-desktop-entry", "futures", "iced", "iced_accessibility", @@ -3481,10 +3481,14 @@ dependencies = [ "iced_winit", "image", "lazy_static", + "libc", + "mime 0.3.17", "palette", "raw-window-handle", "rfd", + "rustix 1.0.8", "serde", + "shlex", "slotmap", "taffy", "thiserror 2.0.12", @@ -3492,7 +3496,7 @@ dependencies = [ "tracing", "unicode-segmentation", "url", - "zbus 5.7.1", + "zbus 5.9.0", ] [[package]] @@ -3502,7 +3506,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.2", + "windows-targets 0.53.3", ] [[package]] @@ -3513,13 +3517,13 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.4" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ "bitflags 2.9.1", "libc", - "redox_syscall 0.5.13", + "redox_syscall 0.5.17", ] [[package]] @@ -3565,9 +3569,22 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litrs" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" + +[[package]] +name = "locale_config" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" +dependencies = [ + "lazy_static", + "objc", + "objc-foundation", + "regex", + "winapi", +] [[package]] name = "lock_api" @@ -3591,12 +3608,6 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" -[[package]] -name = "lru" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ea4e65087ff52f3862caff188d489f1fab49a0cb09e01b2e3f1a617b10aaed" - [[package]] name = "lumina" version = "0.1.0" @@ -3605,7 +3616,6 @@ dependencies = [ "colors-transform", "crisp", "dirs 5.0.1", - "femtovg", "gstreamer", "gstreamer-app", "iced_video_player", @@ -3732,9 +3742,9 @@ dependencies = [ [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" dependencies = [ "libc", ] @@ -3810,6 +3820,12 @@ dependencies = [ "smithay-clipboard", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3857,12 +3873,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad" dependencies = [ "arrayvec", - "bit-set 0.6.0", + "bit-set", "bitflags 2.9.1", "cfg_aliases 0.1.1", - "codespan-reporting 0.11.1", + "codespan-reporting", "hexf-parse", - "indexmap", + "indexmap 2.10.0", "log", "rustc-hash 1.1.0", "spirv", @@ -3871,31 +3887,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "naga" -version = "26.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916cbc7cb27db60be930a4e2da243cf4bc39569195f22fd8ee419cd31d5b662c" -dependencies = [ - "arrayvec", - "bit-set 0.8.0", - "bitflags 2.9.1", - "cfg-if", - "cfg_aliases 0.2.1", - "codespan-reporting 0.12.0", - "half", - "hashbrown", - "hexf-parse", - "indexmap", - "libm", - "log", - "num-traits", - "once_cell", - "rustc-hash 1.1.0", - "thiserror 2.0.12", - "unicode-ident", -] - [[package]] name = "ndk" version = "0.8.0" @@ -4007,12 +3998,11 @@ dependencies = [ [[package]] name = "notify" -version = "8.0.0" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fee8403b3d66ac7b26aee6e40a897d85dc5ce26f44da36b8b73e987cc52e943" +checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ "bitflags 2.9.1", - "filetime", "fsevent-sys", "inotify", "kqueue", @@ -4021,7 +4011,7 @@ dependencies = [ "mio", "notify-types", "walkdir", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -4271,7 +4261,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ "bitflags 2.9.1", - "dispatch2 0.3.0", + "dispatch2", "objc2 0.6.1", ] @@ -4549,9 +4539,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "owned_ttf_parser" -version = "0.25.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" dependencies = [ "ttf-parser 0.25.1", ] @@ -4636,7 +4626,7 @@ checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.13", + "redox_syscall 0.5.17", "smallvec", "windows-targets 0.52.6", ] @@ -4811,17 +4801,16 @@ dependencies = [ [[package]] name = "polling" -version = "3.8.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" +checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi 0.5.2", "pin-project-lite", - "rustix 1.0.7", - "tracing", - "windows-sys 0.59.0", + "rustix 1.0.8", + "windows-sys 0.60.2", ] [[package]] @@ -4830,21 +4819,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" -[[package]] -name = "portable-atomic" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" - -[[package]] -name = "portable-atomic-util" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" -dependencies = [ - "portable-atomic", -] - [[package]] name = "potential_utf" version = "0.1.2" @@ -4906,9 +4880,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "beef09f85ae72cea1ef96ba6870c51e6382ebfa4f0e85b643459331f3daa5be0" dependencies = [ "unicode-ident", ] @@ -4979,9 +4953,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -5033,9 +5007,9 @@ checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" [[package]] name = "rangemap" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" +checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" [[package]] name = "raw-window-handle" @@ -5073,9 +5047,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags 2.9.1", ] @@ -5093,15 +5067,35 @@ dependencies = [ [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", "thiserror 2.0.12", ] +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "regex" version = "1.11.1" @@ -5170,13 +5164,13 @@ dependencies = [ [[package]] name = "rfd" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c844748fdc82aae252ee4594a89b6e7ebef1063de7951545564cbc4e57075d" +checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" dependencies = [ "ashpd", "block2 0.6.1", - "dispatch2 0.2.0", + "dispatch2", "js-sys", "log", "objc2 0.6.1", @@ -5194,9 +5188,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.50" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" dependencies = [ "bytemuck", ] @@ -5268,9 +5262,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -5313,22 +5307,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rustybuzz" @@ -5341,26 +5335,8 @@ dependencies = [ "libm", "smallvec", "ttf-parser 0.21.1", - "unicode-bidi-mirroring 0.2.0", - "unicode-ccc 0.2.0", - "unicode-properties", - "unicode-script", -] - -[[package]] -name = "rustybuzz" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" -dependencies = [ - "bitflags 2.9.1", - "bytemuck", - "core_maths", - "log", - "smallvec", - "ttf-parser 0.25.1", - "unicode-bidi-mirroring 0.4.0", - "unicode-ccc 0.4.0", + "unicode-bidi-mirroring", + "unicode-ccc", "unicode-properties", "unicode-script", ] @@ -5402,6 +5378,30 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -5422,7 +5422,7 @@ checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" dependencies = [ "ab_glyph", "log", - "memmap2 0.9.5", + "memmap2 0.9.7", "smithay-client-toolkit", "tiny-skia", ] @@ -5465,11 +5465,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ - "indexmap", + "indexmap 2.10.0", "itoa", "memchr", "ryu", @@ -5508,6 +5508,38 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.10.0", + "schemars 0.9.0", + "schemars 1.0.4", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "sha1" version = "0.10.6" @@ -5547,9 +5579,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -5597,9 +5629,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "slotmap" @@ -5632,7 +5664,7 @@ dependencies = [ "cursor-icon", "libc", "log", - "memmap2 0.9.5", + "memmap2 0.9.7", "pkg-config", "rustix 0.38.44", "thiserror 1.0.69", @@ -5679,12 +5711,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.10" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5702,7 +5734,7 @@ dependencies = [ "foreign-types", "js-sys", "log", - "memmap2 0.9.5", + "memmap2 0.9.7", "objc", "raw-window-handle", "redox_syscall 0.4.1", @@ -5769,14 +5801,14 @@ dependencies = [ "crc", "crossbeam-queue", "either", - "event-listener 5.4.0", + "event-listener 5.4.1", "futures-core", "futures-intrusive", "futures-io", "futures-util", - "hashbrown", + "hashbrown 0.15.5", "hashlink", - "indexmap", + "indexmap 2.10.0", "log", "memchr", "once_cell", @@ -6029,7 +6061,7 @@ version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" dependencies = [ - "kurbo 0.11.2", + "kurbo 0.11.3", "siphasher", ] @@ -6261,6 +6293,12 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" +[[package]] +name = "temp-dir" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964" + [[package]] name = "tempfile" version = "3.20.0" @@ -6270,7 +6308,7 @@ dependencies = [ "fastrand 2.3.0", "getrandom 0.3.3", "once_cell", - "rustix 1.0.7", + "rustix 1.0.8", "windows-sys 0.59.0", ] @@ -6285,12 +6323,12 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ - "rustix 1.0.7", - "windows-sys 0.59.0", + "rustix 1.0.8", + "windows-sys 0.60.2", ] [[package]] @@ -6451,20 +6489,22 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.10", + "slab", + "socket2 0.6.0", "tokio-macros", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -6516,7 +6556,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap", + "indexmap 2.10.0", "toml_datetime", "winnow 0.5.40", ] @@ -6527,11 +6567,11 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap", + "indexmap 2.10.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.7.11", + "winnow 0.7.12", ] [[package]] @@ -6630,6 +6670,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-bidi" version = "0.3.18" @@ -6642,24 +6688,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" -[[package]] -name = "unicode-bidi-mirroring" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" - [[package]] name = "unicode-ccc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" -[[package]] -name = "unicode-ccc" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" - [[package]] name = "unicode-ident" version = "1.0.18" @@ -6752,11 +6786,11 @@ dependencies = [ "flate2", "fontdb 0.18.0", "imagesize", - "kurbo 0.11.2", + "kurbo 0.11.3", "log", "pico-args", "roxmltree", - "rustybuzz 0.14.1", + "rustybuzz", "simplecss", "siphasher", "strict-num", @@ -6935,13 +6969,13 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" +checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" dependencies = [ "cc", "downcast-rs", - "rustix 0.38.44", + "rustix 1.0.8", "scoped-tls", "smallvec", "wayland-sys", @@ -6949,12 +6983,12 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.10" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" +checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" dependencies = [ "bitflags 2.9.1", - "rustix 0.38.44", + "rustix 1.0.8", "wayland-backend", "wayland-scanner", ] @@ -6972,20 +7006,20 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.31.10" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182" +checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" dependencies = [ - "rustix 0.38.44", + "rustix 1.0.8", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.32.8" +version = "0.32.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" +checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" dependencies = [ "bitflags 2.9.1", "wayland-backend", @@ -6996,9 +7030,9 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175" +checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" dependencies = [ "bitflags 2.9.1", "wayland-backend", @@ -7009,9 +7043,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" +checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" dependencies = [ "bitflags 2.9.1", "wayland-backend", @@ -7023,9 +7057,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" +checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" dependencies = [ "proc-macro2", "quick-xml", @@ -7034,22 +7068,22 @@ dependencies = [ [[package]] name = "wayland-server" -version = "0.31.9" +version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "485dfb8ccf0daa0d34625d34e6ac15f99e550a7999b6fd88a0835ccd37655785" +checksum = "fcbd4f3aba6c9fba70445ad2a484c0ef0356c1a9459b1e8e435bedc1971a6222" dependencies = [ "bitflags 2.9.1", "downcast-rs", - "rustix 0.38.44", + "rustix 1.0.8", "wayland-backend", "wayland-scanner", ] [[package]] name = "wayland-sys" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" +checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" dependencies = [ "dlib", "log", @@ -7094,7 +7128,7 @@ dependencies = [ "document-features", "js-sys", "log", - "naga 22.1.0", + "naga", "parking_lot 0.12.4", "profiling", "raw-window-handle", @@ -7103,32 +7137,9 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "wgpu-core 22.1.0", - "wgpu-hal 22.0.0", - "wgpu-types 22.0.0", -] - -[[package]] -name = "wgpu" -version = "26.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b6ff82bbf6e9206828e1a3178e851f8c20f1c9028e74dd3a8090741ccd5798" -dependencies = [ - "arrayvec", - "bitflags 2.9.1", - "cfg-if", - "cfg_aliases 0.2.1", - "document-features", - "hashbrown", - "log", - "portable-atomic", - "profiling", - "raw-window-handle", - "smallvec", - "static_assertions", - "wgpu-core 26.0.1", - "wgpu-hal 26.0.4", - "wgpu-types 26.0.0", + "wgpu-core", + "wgpu-hal", + "wgpu-types", ] [[package]] @@ -7138,13 +7149,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a" dependencies = [ "arrayvec", - "bit-vec 0.7.0", + "bit-vec", "bitflags 2.9.1", "cfg_aliases 0.1.1", "document-features", - "indexmap", + "indexmap 2.10.0", "log", - "naga 22.1.0", + "naga", "once_cell", "parking_lot 0.12.4", "profiling", @@ -7152,46 +7163,8 @@ dependencies = [ "rustc-hash 1.1.0", "smallvec", "thiserror 1.0.69", - "wgpu-hal 22.0.0", - "wgpu-types 22.0.0", -] - -[[package]] -name = "wgpu-core" -version = "26.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f62f1053bd28c2268f42916f31588f81f64796e2ff91b81293515017ca8bd9" -dependencies = [ - "arrayvec", - "bit-set 0.8.0", - "bit-vec 0.8.0", - "bitflags 2.9.1", - "cfg_aliases 0.2.1", - "document-features", - "hashbrown", - "indexmap", - "log", - "naga 26.0.0", - "once_cell", - "parking_lot 0.12.4", - "portable-atomic", - "profiling", - "raw-window-handle", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 2.0.12", - "wgpu-core-deps-windows-linux-android", - "wgpu-hal 26.0.4", - "wgpu-types 26.0.0", -] - -[[package]] -name = "wgpu-core-deps-windows-linux-android" -version = "26.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "720a5cb9d12b3d337c15ff0e24d3e97ed11490ff3f7506e7f3d98c68fa5d6f14" -dependencies = [ - "wgpu-hal 26.0.4", + "wgpu-hal", + "wgpu-types", ] [[package]] @@ -7203,13 +7176,13 @@ dependencies = [ "android_system_properties", "arrayvec", "ash", - "bit-set 0.6.0", + "bit-set", "bitflags 2.9.1", "block", "cfg_aliases 0.1.1", "core-graphics-types", "d3d12", - "glow 0.13.1", + "glow", "glutin_wgl_sys", "gpu-alloc", "gpu-allocator", @@ -7221,7 +7194,7 @@ dependencies = [ "libloading", "log", "metal", - "naga 22.1.0", + "naga", "ndk-sys 0.5.0+25.2.9519653", "objc", "once_cell", @@ -7235,30 +7208,10 @@ dependencies = [ "thiserror 1.0.69", "wasm-bindgen", "web-sys", - "wgpu-types 22.0.0", + "wgpu-types", "winapi", ] -[[package]] -name = "wgpu-hal" -version = "26.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df2c64ac282a91ad7662c90bc4a77d4a2135bc0b2a2da5a4d4e267afc034b9e" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "cfg_aliases 0.2.1", - "libloading", - "log", - "naga 26.0.0", - "portable-atomic", - "portable-atomic-util", - "raw-window-handle", - "renderdoc-sys", - "thiserror 2.0.12", - "wgpu-types 26.0.0", -] - [[package]] name = "wgpu-types" version = "22.0.0" @@ -7270,24 +7223,13 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wgpu-types" -version = "26.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca7a8d8af57c18f57d393601a1fb159ace8b2328f1b6b5f80893f7d672c9ae2" -dependencies = [ - "bitflags 2.9.1", - "bytemuck", - "log", -] - [[package]] name = "whoami" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" dependencies = [ - "redox_syscall 0.5.13", + "libredox", "wasite", ] @@ -7338,7 +7280,7 @@ dependencies = [ "clipboard_wayland", "clipboard_x11", "dnd", - "mime", + "mime 0.1.0", "raw-window-handle", "thiserror 1.0.69", ] @@ -7516,7 +7458,7 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.2", + "windows-targets 0.53.3", ] [[package]] @@ -7567,10 +7509,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -7781,7 +7724,7 @@ dependencies = [ "dpi", "js-sys", "libc", - "memmap2 0.9.5", + "memmap2 0.9.7", "ndk 0.9.0", "objc2 0.5.2", "objc2-app-kit 0.2.2", @@ -7823,9 +7766,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -7934,9 +7877,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "xmlwriter" @@ -8018,23 +7961,23 @@ dependencies = [ [[package]] name = "zbus" -version = "5.7.1" +version = "5.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a7c7cee313d044fca3f48fa782cb750c79e4ca76ba7bc7718cd4024cdf6f68" +checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" dependencies = [ "async-broadcast 0.7.2", "async-executor", - "async-io 2.4.1", - "async-lock 3.4.0", - "async-process 2.3.1", + "async-io 2.5.0", + "async-lock 3.4.1", + "async-process 2.4.0", "async-recursion", "async-task", "async-trait", "blocking", "enumflags2", - "event-listener 5.4.0", + "event-listener 5.4.1", "futures-core", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "hex", "nix 0.30.1", "ordered-stream", @@ -8044,10 +7987,10 @@ dependencies = [ "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow 0.7.11", - "zbus_macros 5.7.1", + "winnow 0.7.12", + "zbus_macros 5.9.0", "zbus_names 4.2.0", - "zvariant 5.5.3", + "zvariant 5.6.0", ] [[package]] @@ -8066,16 +8009,16 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.7.1" +version = "5.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e7e5eec1550f747e71a058df81a9a83813ba0f6a95f39c4e218bdc7ba366a" +checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", "quote", "syn 2.0.104", "zbus_names 4.2.0", - "zvariant 5.5.3", + "zvariant 5.6.0", "zvariant_utils 3.2.0", ] @@ -8098,8 +8041,8 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.11", - "zvariant 5.5.3", + "winnow 0.7.12", + "zvariant 5.6.0", ] [[package]] @@ -8168,9 +8111,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -8196,9 +8139,9 @@ checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" [[package]] name = "zune-jpeg" -version = "0.4.18" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7384255a918371b5af158218d131530f694de9ad3815ebdd0453a940485cb0fa" +checksum = "fc1f7e205ce79eb2da3cd71c5f55f3589785cb7c79f6a03d1c8d1491bda5d089" dependencies = [ "zune-core", ] @@ -8219,16 +8162,16 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.5.3" +version = "5.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d30786f75e393ee63a21de4f9074d4c038d52c5b1bb4471f955db249f9dffb1" +checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" dependencies = [ "endi", "enumflags2", "serde", "url", - "winnow 0.7.11", - "zvariant_derive 5.5.3", + "winnow 0.7.12", + "zvariant_derive 5.6.0", "zvariant_utils 3.2.0", ] @@ -8247,9 +8190,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.5.3" +version = "5.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75fda702cd42d735ccd48117b1630432219c0e9616bf6cb0f8350844ee4d9580" +checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", @@ -8280,5 +8223,5 @@ dependencies = [ "serde", "static_assertions", "syn 2.0.104", - "winnow 0.7.11", + "winnow 0.7.12", ] diff --git a/Cargo.toml b/Cargo.toml index 984c4a0..a034fbf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ description = "A cli presentation system" [dependencies] clap = { version = "4.5.20", features = ["debug", "derive"] } -libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = false, features = ["debug", "winit", "winit_wgpu", "tokio", "rfd", "dbus-config", "a11y", "wgpu", "multi-window"] } +libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = false, features = ["debug", "winit", "desktop", "winit_wgpu", "winit_tokio", "tokio", "rfd", "dbus-config", "a11y", "wgpu", "multi-window"] } lexpr = "0.2.7" miette = { version = "7.2.0", features = ["fancy"] } pretty_assertions = "1.4.1" @@ -29,7 +29,8 @@ gstreamer-app = "0.23.3" # cosmic-time = "0.2.0" url = "2" colors-transform = "0.2.11" -femtovg = { version = "0.16.0", features = ["wgpu"] } +# femtovg = { version = "0.16.0", features = ["wgpu"] } +# wgpu = "26.0.1" # mupdf = "0.5.0" # rfd = { version = "0.12.1", features = ["xdg-portal"], default-features = false } @@ -39,7 +40,8 @@ branch = "cosmic" features = ["wgpu"] [profile.dev] -opt-level = 0 +opt-level = 3 [profile.release] opt-level = 3 +debug = true diff --git a/flake.lock b/flake.lock index dc70aa1..a01319c 100644 --- a/flake.lock +++ b/flake.lock @@ -6,11 +6,33 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1745303921, - "narHash": "sha256-zYucemS2QvJUR5GKJ/u3eZAoe82AKhcxMtNVZDERXsw=", + "lastModified": 1754980813, + "narHash": "sha256-Wr9ei2V4rfr3HR5eJUA7pjMIrHH5o4DtWazQC5UwxHA=", "owner": "nix-community", "repo": "fenix", - "rev": "14850d5984f3696a2972f85f19085e5fb46daa95", + "rev": "a1ce805b08279ee4e697b47aa3aa28fe2b335de6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, + "fenix_2": { + "inputs": { + "nixpkgs": [ + "naersk", + "nixpkgs" + ], + "rust-analyzer-src": "rust-analyzer-src_2" + }, + "locked": { + "lastModified": 1752475459, + "narHash": "sha256-z6QEu4ZFuHiqdOPbYss4/Q8B0BFhacR8ts6jO/F/aOU=", + "owner": "nix-community", + "repo": "fenix", + "rev": "bf0d6f70f4c9a9cf8845f992105652173f4b617f", "type": "github" }, "original": { @@ -39,14 +61,15 @@ }, "naersk": { "inputs": { + "fenix": "fenix_2", "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1743800763, - "narHash": "sha256-YFKV+fxEpMgP5VsUcM6Il28lI0NlpM7+oB1XxbBAYCw=", + "lastModified": 1752689277, + "narHash": "sha256-uldUBFkZe/E7qbvxa3mH1ItrWZyT6w1dBKJQF/3ZSsc=", "owner": "nix-community", "repo": "naersk", - "rev": "ed0232117731a4c19d3ee93aa0c382a8fe754b01", + "rev": "0e72363d0938b0208d6c646d10649164c43f4d64", "type": "github" }, "original": { @@ -57,11 +80,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1744932701, - "narHash": "sha256-fusHbZCyv126cyArUwwKrLdCkgVAIaa/fQJYFlCEqiU=", + "lastModified": 1754725699, + "narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=", "owner": "nixos", "repo": "nixpkgs", - "rev": "b024ced1aac25639f8ca8fdfc2f8c4fbd66c48ef", + "rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054", "type": "github" }, "original": { @@ -73,11 +96,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1744868846, - "narHash": "sha256-5RJTdUHDmj12Qsv7XOhuospjAjATNiTMElplWnJE9Hs=", + "lastModified": 1752077645, + "narHash": "sha256-HM791ZQtXV93xtCY+ZxG1REzhQenSQO020cu6rHtAPk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ebe4301cbd8f81c4f8d3244b3632338bbeb6d49c", + "rev": "be9e214982e20b8310878ac2baa063a961c1bdf6", "type": "github" }, "original": { @@ -89,11 +112,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1745234285, - "narHash": "sha256-GfpyMzxwkfgRVN0cTGQSkTC0OHhEkv3Jf6Tcjm//qZ0=", + "lastModified": 1754725699, + "narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=", "owner": "nixos", "repo": "nixpkgs", - "rev": "c11863f1e964833214b767f4a369c6e6a7aba141", + "rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054", "type": "github" }, "original": { @@ -114,11 +137,28 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1745247864, - "narHash": "sha256-QA1Ba8Flz5K+0GbG03HwiX9t46mh/jjKgwavbuKtwMg=", + "lastModified": 1754926538, + "narHash": "sha256-fuHLsvM5z5/5ia3yL0/mr472wXnxSrtXECa+pspQchA=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "31dbec70c68e97060916d4754c687a3e93c2440f", + "rev": "9db05508ed08a4c952017769b45b57c4ad505872", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + }, + "rust-analyzer-src_2": { + "flake": false, + "locked": { + "lastModified": 1752428706, + "narHash": "sha256-EJcdxw3aXfP8Ex1Nm3s0awyH9egQvB2Gu+QEnJn2Sfg=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "591e3b7624be97e4443ea7b5542c191311aa141d", "type": "github" }, "original": { diff --git a/src/core/slide.rs b/src/core/slide.rs index 277034d..b394bdb 100644 --- a/src/core/slide.rs +++ b/src/core/slide.rs @@ -9,6 +9,8 @@ use std::{ }; use tracing::error; +use crate::ui::text_svg::{self, TextSvg}; + use super::songs::Song; #[derive( @@ -234,6 +236,8 @@ pub struct Slide { video_loop: bool, video_start_time: f32, video_end_time: f32, + #[serde(skip)] + pub text_svg: TextSvg, } impl From<&Slide> for Value { @@ -498,6 +502,8 @@ pub struct SlideBuilder { video_loop: Option, video_start_time: Option, video_end_time: Option, + #[serde(skip)] + text_svg: Option, } impl SlideBuilder { @@ -571,6 +577,14 @@ impl SlideBuilder { self } + pub(crate) fn text_svg( + mut self, + text_svg: impl Into, + ) -> Self { + let _ = self.text_svg.insert(text_svg.into()); + self + } + pub(crate) fn build(self) -> Result { let Some(background) = self.background else { return Err(miette!("No background")); @@ -596,18 +610,45 @@ impl SlideBuilder { let Some(video_end_time) = self.video_end_time else { return Err(miette!("No video_end_time")); }; - Ok(Slide { - background, - text, - font, - font_size, - text_alignment, - audio: self.audio, - video_loop, - video_start_time, - video_end_time, - ..Default::default() - }) + if let Some(text_svg) = self.text_svg { + Ok(Slide { + background, + text, + font, + font_size, + text_alignment, + audio: self.audio, + video_loop, + video_start_time, + video_end_time, + text_svg, + ..Default::default() + }) + } else { + let text_svg = TextSvg::new(text.clone()) + .alignment(text_alignment) + .fill("#fff") + .shadow(text_svg::shadow(2, 2, 5, "#000000")) + .stroke(text_svg::stroke(3, "#000")) + .font( + text_svg::Font::from(font.clone()) + .size(font_size.try_into().unwrap()), + ) + .build(); + Ok(Slide { + background, + text, + font, + font_size, + text_alignment, + audio: self.audio, + video_loop, + video_start_time, + video_end_time, + text_svg, + ..Default::default() + }) + } } } diff --git a/src/main.rs b/src/main.rs index c1e4db2..228d234 100644 --- a/src/main.rs +++ b/src/main.rs @@ -72,7 +72,10 @@ fn main() -> Result<()> { let settings; if args.ui { debug!("main view"); - settings = Settings::default().debug(false).is_daemon(true); + settings = Settings::default() + .debug(false) + .is_daemon(true) + .transparent(true); } else { debug!("window view"); settings = Settings::default() @@ -105,6 +108,7 @@ struct App { library_width: f32, editor_mode: Option, song_editor: SongEditor, + searching: bool, } #[derive(Debug, Clone)] @@ -126,6 +130,7 @@ enum Message { None, DndLeave(Entity), EditorToggle(bool), + SearchFocus, } const HEADER_SPACE: u16 = 6; @@ -203,6 +208,7 @@ impl cosmic::Application for App { library_width: 60.0, editor_mode: None, song_editor, + searching: false, }; let mut batch = vec![]; @@ -243,18 +249,18 @@ impl cosmic::Application for App { debug!("left"); cosmic::Action::App(Message::DndLeave(entity)) }) - .drag_id(DragId::new()) - .on_context(|id| { - cosmic::Action::Cosmic( - cosmic::app::Action::NavBarContext(id), - ) - }) .on_dnd_drop::(|entity, data, action| { debug!("dropped"); cosmic::Action::App(Message::DndDrop( entity, data, action, )) }) + .drag_id(DragId::new()) + .on_context(|id| { + cosmic::Action::Cosmic( + cosmic::app::Action::NavBarContext(id), + ) + }) .context_menu(None) .into_container() // XXX both must be shrink to avoid flex layout from ignoring it @@ -288,6 +294,25 @@ impl cosmic::Application for App { } fn header_start(&self) -> Vec> { + vec![] + } + + fn header_center(&self) -> Vec> { + vec![search_input("Search...", "") + .on_input(|_| Message::None) + .on_submit(|_| Message::None) + .on_focus(Message::SearchFocus) + .width(1200) + .into()] + } + + fn header_end(&self) -> Vec> { + // let editor_toggle = toggler(self.editor_mode.is_some()) + // .label("Editor") + // .spacing(10) + // .width(Length::Shrink) + // .on_toggle(Message::EditorToggle); + let presenter_window = self.windows.get(1); let text = if self.presentation_open { text::body("End Presentation") @@ -295,7 +320,7 @@ impl cosmic::Application for App { text::body("Present") }; - vec![ + let row = row![ tooltip( button::custom( row!( @@ -318,9 +343,7 @@ impl cosmic::Application for App { )), "Enter Edit Mode", TPosition::Bottom, - ) - .into(), - horizontal_space().width(HEADER_SPACE).into(), + ), tooltip( button::custom( row!( @@ -351,33 +374,7 @@ impl cosmic::Application for App { }), "Start Presentation", TPosition::Bottom, - ) - .into(), - horizontal_space().width(HEADER_SPACE).into(), - ] - } - fn header_center(&self) -> Vec> { - vec![search_input("Search...", "") - .on_input(|_| Message::None) - .on_submit(|_| Message::None) - .width(300) - .into()] - } - fn header_end(&self) -> Vec> { - // let editor_toggle = toggler(self.editor_mode.is_some()) - // .label("Editor") - // .spacing(10) - // .width(Length::Shrink) - // .on_toggle(Message::EditorToggle); - - let presenter_window = self.windows.get(1); - let text = if self.presentation_open { - text::body("End Presentation") - } else { - text::body("Present") - }; - - vec![ + ), tooltip( button::custom( row!( @@ -399,9 +396,10 @@ impl cosmic::Application for App { "Open Library", TPosition::Bottom, ) - .into(), - horizontal_space().width(HEADER_SPACE).into(), ] + .spacing(HEADER_SPACE) + .into(); + vec![row] } fn footer(&self) -> Option> { @@ -466,6 +464,14 @@ impl cosmic::Application for App { None } + fn dialog(&self) -> Option> { + if self.searching { + Some(text("hello").into()) + } else { + None + } + } + fn update(&mut self, message: Message) -> Task { match message { Message::Key(key, modifiers) => { @@ -587,16 +593,16 @@ impl cosmic::Application for App { Message::WindowOpened(id, _) => { debug!(?id, "Window opened"); if self.cli_mode - || id > self.core.main_window_id().expect("Cosmic core seems to be missing a main window, was this started in cli mode?") - { - self.presentation_open = true; - if let Some(video) = &mut self.presenter.video { - video.set_muted(false); - } - window::change_mode(id, Mode::Fullscreen) - } else { - Task::none() - } + || id > self.core.main_window_id().expect("Cosmic core seems to be missing a main window, was this started in cli mode?") + { + self.presentation_open = true; + if let Some(video) = &mut self.presenter.video { + video.set_muted(false); + } + window::change_mode(id, Mode::Fullscreen) + } else { + Task::none() + } } Message::WindowClosed(id) => { warn!("Closing window: {id}"); @@ -658,6 +664,10 @@ impl cosmic::Application for App { } Task::none() } + Message::SearchFocus => { + self.searching = true; + Task::none() + } } } diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 259e2c1..ff81e8c 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -6,6 +6,7 @@ pub mod presenter; pub mod song_editor; pub mod text_svg; pub mod video; +pub mod widgets; pub enum EditorMode { Song, diff --git a/src/ui/presenter.rs b/src/ui/presenter.rs index a1a8c73..1c3afac 100644 --- a/src/ui/presenter.rs +++ b/src/ui/presenter.rs @@ -33,6 +33,7 @@ use url::Url; use crate::{ core::{service_items::ServiceItemModel, slide::Slide}, ui::text_svg::{self, Font as SvgFont}, + // ui::widgets::slide_text, BackgroundKind, }; @@ -88,7 +89,7 @@ impl Presenter { gst::init().into_diagnostic()?; let pipeline = format!( - r#"playbin uri="{}" video-sink="videoscale ! videoconvert ! appsink name=iced_video drop=true caps=video/x-raw,format=NV12,pixel-aspect-ratio=1/1""#, + r#"playbin uri="{}" video-sink="videoscale ! videoconvert ! appsink name=lumina_video drop=true caps=video/x-raw,format=NV12,pixel-aspect-ratio=1/1""#, url.as_str() ); @@ -108,13 +109,14 @@ impl Presenter { .unwrap() .downcast::() .unwrap(); - let video_sink = bin.by_name("iced_video").unwrap(); + let video_sink = bin.by_name("lumina_video").unwrap(); let video_sink = video_sink.downcast::().unwrap(); let result = Video::from_gst_pipeline(pipeline, video_sink, None); result.into_diagnostic() } + pub fn with_items(items: ServiceItemModel) -> Self { let slides = items.to_slides().unwrap_or_default(); let video = { @@ -545,75 +547,89 @@ pub(crate) fn slide_view( ) -> Element<'_, Message> { responsive(move |size| { let width = size.height * 16.0 / 9.0; - let font_size = scale_font(slide.font_size() as f32, width); let slide_text = slide.text(); - // SVG based // let font = SvgFont::from(font).size(font_size.floor() as u8); - // let text = text_svg::TextSvg::new() - // .text(&slide_text) - // .fill("#fff") - // .shadow(text_svg::shadow(2, 2, 5, "#000000")) - // .stroke(text_svg::stroke(3, "#000")) - // .font(font) - // .view() - // .map(|m| Message::None); - - // text widget based - let lines = slide_text.lines(); - let text: Vec> = lines - .map(|t| { - rich_text([span(format!("{}\n", t)) - .background( - Background::Color(Color::BLACK) - .scale_alpha(0.4), - ) - .border(border::rounded(10)) - .padding(10)]) - .size(font_size) - .font(font) - .center() - .into() - // let chars: Vec = t - // .chars() - // .map(|c| -> Span { - // let character: String = format!("{}/n", c); - // span(character) - // .size(font_size) - // .font(font) - // .background( - // Background::Color(Color::BLACK) - // .scale_alpha(0.4), - // ) - // .border(border::rounded(10)) - // .padding(10) - }) - .collect(); - let text = Column::with_children(text).spacing(26); - - // let lines = slide_text.lines(); - // let stroke_text: Vec> = lines - // .map(|t| { - // let mut stroke_font = font.clone(); - // stroke_font.stretch = Stretch::Condensed; - // stroke_font.weight = Weight::Bold; - // rich_text([span(format!("{}\n", t)) - // .size(font_size + 0.3) - // .font(stroke_font) - // .color(Color::BLACK) - // .border(border::rounded(10)) - // .padding(10)]) - // .center() - // .into() - // }) - // .collect(); - // let stroke_text = - // Column::with_children(stroke_text).spacing(26); - - //Next - let text_container = Container::new(text) - .center(Length::Fill) - .align_x(Horizontal::Left); + let text_container = if delegate { + // text widget based + let font_size = + scale_font(slide.font_size() as f32, width); + let lines = slide_text.lines(); + let text: Vec> = lines + .map(|t| { + rich_text([span(format!("{}\n", t)) + .background( + Background::Color(Color::BLACK) + .scale_alpha(0.4), + ) + .border(border::rounded(10)) + .padding(10)]) + .size(font_size) + .font(font) + .center() + .into() + // let chars: Vec = t + // .chars() + // .map(|c| -> Span { + // let character: String = format!("{}/n", c); + // span(character) + // .size(font_size) + // .font(font) + // .background( + // Background::Color(Color::BLACK) + // .scale_alpha(0.4), + // ) + // .border(border::rounded(10)) + // .padding(10) + }) + .collect(); + let text = Column::with_children(text).spacing(26); + Container::new(text) + .center(Length::Fill) + .align_x(Horizontal::Left) + } else { + // SVG based + let text = slide.text_svg.view().map(|m| Message::None); + Container::new(text) + .center(Length::Fill) + .align_x(Horizontal::Left) + // text widget based + // let font_size = + // scale_font(slide.font_size() as f32, width); + // let lines = slide_text.lines(); + // let text: Vec> = lines + // .map(|t| { + // rich_text([span(format!("{}\n", t)) + // .background( + // Background::Color(Color::BLACK) + // .scale_alpha(0.4), + // ) + // .border(border::rounded(10)) + // .padding(10)]) + // .size(font_size) + // .font(font) + // .center() + // .into() + // // let chars: Vec = t + // // .chars() + // // .map(|c| -> Span { + // // let character: String = format!("{}/n", c); + // // span(character) + // // .size(font_size) + // // .font(font) + // // .background( + // // Background::Color(Color::BLACK) + // // .scale_alpha(0.4), + // // ) + // // .border(border::rounded(10)) + // // .padding(10) + // }) + // .collect(); + // let text = Column::with_children(text).spacing(26); + // Container::new(text) + // .center(Length::Fill) + // .align_x(Horizontal::Left) + }; // let stroke_text_container = Container::new(stroke_text) // .center(Length::Fill) @@ -648,11 +664,10 @@ pub(crate) fn slide_view( Color::BLACK, )) }) - .center_x(width) - .center_y(size.height) + .center(Length::Fill) .clip(true) - .width(Length::Fill) - .height(Length::Fill) + .width(width) + .height(size.height) } else if let Some(video) = &video { Container::new( VideoPlayer::new(video) diff --git a/src/ui/text_svg.rs b/src/ui/text_svg.rs index 6dfa92e..d690198 100644 --- a/src/ui/text_svg.rs +++ b/src/ui/text_svg.rs @@ -7,7 +7,7 @@ use colors_transform::Rgb; use cosmic::{ iced::{ font::{Style, Weight}, - Length, + Length, Size, }, prelude::*, widget::{container, lazy, responsive, svg::Handle, Svg}, @@ -61,6 +61,15 @@ impl From for Font { } } +impl From for Font { + fn from(value: String) -> Self { + Self { + name: value, + ..Default::default() + } + } +} + impl From<&str> for Font { fn from(value: &str) -> Self { Self { @@ -168,8 +177,9 @@ pub enum Message { } impl TextSvg { - pub fn new() -> Self { + pub fn new(text: impl Into) -> Self { Self { + text: text.into(), ..Default::default() } } @@ -206,7 +216,7 @@ impl TextSvg { self } - pub fn view<'a>(self) -> Element<'a, Message> { + pub fn build(mut self) -> Self { let shadow = if let Some(shadow) = &self.shadow { format!("", shadow.offset_x, @@ -224,38 +234,58 @@ impl TextSvg { } else { "".into() }; - container( - responsive(move |s| { - let total_lines = self.text.lines().count(); - let half_lines = (total_lines / 2) as f32; - let middle_position = s.height / 2.0; - let line_spacing = 10.0; - let text_and_line_spacing = self.font.size as f32 + line_spacing; - let starting_y_position = middle_position - (half_lines * text_and_line_spacing); + let size = Size::new(640.0, 360.0); + let total_lines = self.text.lines().count(); + let half_lines = (total_lines / 2) as f32; + let middle_position = size.height / 2.0; + let line_spacing = 10.0; + let text_and_line_spacing = + self.font.size as f32 + line_spacing; + let starting_y_position = + middle_position - (half_lines * text_and_line_spacing); - let text_pieces: Vec = self.text.lines() - .enumerate() - .map(|(index, text)| { - format!("{}", starting_y_position + (index as f32 * text_and_line_spacing), text) - }).collect(); - let text: String = text_pieces.join("\n"); + let text_pieces: Vec = self + .text + .lines() + .enumerate() + .map(|(index, text)| { + format!( + "{}", + starting_y_position + + (index as f32 * text_and_line_spacing), + text + ) + }) + .collect(); + let text: String = text_pieces.join("\n"); - let final_svg = format!("{}{}", - s.width, - s.height, + let final_svg = format!("{}{}", + size.width, + size.height, shadow, self.font.name, self.font.size, self.fill, stroke, text); + let handle = Handle::from_memory( + Box::leak( + ::clone(&final_svg) + .into_boxed_str(), + ) + .as_bytes(), + ); + self.handle = Some(handle); + self + } - // debug!(final_svg); -Svg::new(Handle::from_memory( - Box::leak(::clone(&final_svg).into_boxed_str()).as_bytes(), - )) - .width(Length::Fill) - .height(Length::Fill) - .into() - })).width(Length::Fill).height(Length::Fill).into() + pub fn view<'a>(&self) -> Element<'a, Message> { + container( + Svg::new(self.handle.clone().unwrap()) + .width(Length::Fill) + .height(Length::Fill), + ) + .width(Length::Fill) + .height(Length::Fill) + .into() } fn text_spans(&self) -> Vec { diff --git a/src/ui/widgets/mod.rs b/src/ui/widgets/mod.rs new file mode 100644 index 0000000..d786591 --- /dev/null +++ b/src/ui/widgets/mod.rs @@ -0,0 +1 @@ +// pub mod slide_text; diff --git a/src/ui/widgets/slide_text.rs b/src/ui/widgets/slide_text.rs index e69de29..d393b44 100644 --- a/src/ui/widgets/slide_text.rs +++ b/src/ui/widgets/slide_text.rs @@ -0,0 +1,116 @@ +use cosmic::iced::advanced::layout::{self, Layout}; +use cosmic::iced::advanced::renderer; +use cosmic::iced::advanced::widget::{self, Widget}; +use cosmic::iced::border; +use cosmic::iced::mouse; +use cosmic::iced::{Color, Element, Length, Rectangle, Size}; +use femtovg::renderer::WGPURenderer; +use femtovg::{Canvas, TextContext}; + +pub struct SlideText { + text: String, + font_size: f32, + canvas: Canvas, +} + +impl SlideText { + pub async fn new(text: &str) -> Self { + let backends = wgpu::Backends::PRIMARY; + let instance = + wgpu::Instance::new(wgpu::InstanceDescriptor { + backends, + ..Default::default() + }); + let surface = + instance.create_surface(window.clone()).unwrap(); + let adapter = cosmic::iced::wgpu::util::initialize_adapter_from_env_or_default(&instance, Some(&surface)) + .await + .expect("Failed to find an appropriate adapter"); + let (device, queue) = adapter + .request_device( + &wgpu::DeviceDescriptor { + label: None, + required_features: adapter.features(), + required_limits: wgpu::Limits::default(), + memory_hints: wgpu::MemoryHints::Performance, + }, + None, + ) + .await + .expect("failed to device it"); + let renderer = WGPURenderer::new(device, queue); + let canvas = + Canvas::new_with_text_context(renderer, text_context) + .expect("oops femtovg"); + Self { + text: text.to_owned(), + font_size: 50.0, + canvas, + } + } +} + +fn get_canvas(text_context: TextContext) -> Canvas { + let renderer = WGPURenderer::new(device, queue); + Canvas::new_with_text_context(renderer, text_context) + .expect("oops femtovg") +} + +pub fn slide_text(text: &str) -> SlideText { + SlideText::new(text) +} + +impl Widget + for SlideText +where + Renderer: renderer::Renderer, +{ + fn size(&self) -> Size { + Size { + width: Length::Shrink, + height: Length::Shrink, + } + } + + fn layout( + &self, + _tree: &mut widget::Tree, + _renderer: &Renderer, + _limits: &layout::Limits, + ) -> layout::Node { + layout::Node::new(Size::new( + self.font_size * 2.0, + self.font_size * 2.0, + )) + } + + fn draw( + &self, + _state: &widget::Tree, + renderer: &mut Renderer, + _theme: &Theme, + _style: &renderer::Style, + layout: Layout<'_>, + _cursor: mouse::Cursor, + _viewport: &Rectangle, + ) { + renderer.fill_quad( + renderer::Quad { + bounds: layout.bounds(), + border: border::rounded(self.font_size), + ..renderer::Quad::default() + }, + Color::BLACK, + ); + } +} + +impl From + for Element<'_, Message, Theme, Renderer> +where + Renderer: renderer::Renderer, +{ + fn from(circle: SlideText) -> Self { + Self::new(circle) + } +}