diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f4f19141..754b859e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,11 +19,11 @@ jobs: - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@master with: - toolchain: 1.93.1 + toolchain: 1.90.0 components: clippy - name: install dependencies run: sudo apt update && sudo apt install -y libxkbcommon-dev libwayland-dev libdbus-1-dev libpulse-dev libpipewire-0.3-dev libinput-dev - uses: actions-rs-plus/clippy-check@v2 with: - toolchain: 1.93.1 + toolchain: 1.90.0 args: --all --all-targets --all-features diff --git a/.zed/settings.json b/.zed/settings.json deleted file mode 100644 index 2cc7b98d..00000000 --- a/.zed/settings.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "format_on_save": "on", - "lsp": { - "rust-analyzer": { - "initialization_options": { - "check": { - "command": "clippy", - }, - "rustfmt": { - "extraArgs": ["+nightly"], - }, - }, - }, - }, -} diff --git a/Cargo.lock b/Cargo.lock index 61fb6d5a..1a265c94 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -159,7 +159,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" dependencies = [ "android-properties", - "bitflags 2.11.1", + "bitflags 2.11.0", "cc", "jni", "libc", @@ -244,6 +244,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + [[package]] name = "ash" version = "0.38.0+1.3.281" @@ -262,7 +268,7 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.4", + "rand 0.9.2", "raw-window-handle", "serde", "serde_repr", @@ -280,7 +286,7 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.4", + "rand 0.9.2", "serde", "serde_repr", "tokio", @@ -500,9 +506,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.5.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "base64" @@ -526,7 +532,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ "annotate-snippets", - "bitflags 2.11.1", + "bitflags 2.11.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -561,9 +567,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" dependencies = [ "serde_core", ] @@ -662,15 +668,6 @@ dependencies = [ "cfg_aliases", ] -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "tinyvec", -] - [[package]] name = "bstr" version = "1.12.1" @@ -693,9 +690,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.3" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "by_address" @@ -751,7 +748,7 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "polling", "rustix 1.1.4", "slab", @@ -781,9 +778,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.62" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "jobserver", @@ -867,6 +864,7 @@ dependencies = [ [[package]] name = "clipboard_macos" version = "0.1.0" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "objc", "objc-foundation", @@ -876,12 +874,22 @@ dependencies = [ [[package]] name = "clipboard_wayland" version = "0.2.2" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "dnd", "mime 0.1.0", "smithay-clipboard", ] +[[package]] +name = "clipboard_x11" +version = "0.4.2" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" +dependencies = [ + "thiserror 1.0.69", + "x11rb", +] + [[package]] name = "cocoa" version = "0.25.0" @@ -1025,7 +1033,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "core-foundation 0.10.1", "libc", ] @@ -1052,7 +1060,7 @@ dependencies = [ "i18n-embed", "i18n-embed-fl", "image", - "libcosmic-yoda", + "libcosmic", "memmap2 0.9.10", "rust-embed", "rustc-hash 2.1.2", @@ -1070,7 +1078,7 @@ dependencies = [ name = "cosmic-app-list-config" version = "1.0.2" dependencies = [ - "libcosmic-yoda", + "libcosmic", "serde", ] @@ -1085,7 +1093,7 @@ dependencies = [ "cosmic-settings-accessibility-subscription", "i18n-embed", "i18n-embed-fl", - "libcosmic-yoda", + "libcosmic", "rust-embed", "tokio", "tracing", @@ -1100,7 +1108,7 @@ dependencies = [ "cosmic-settings-sound-subscription", "i18n-embed", "i18n-embed-fl", - "libcosmic-yoda", + "libcosmic", "mpris2-zbus", "rust-embed", "serde", @@ -1122,11 +1130,11 @@ dependencies = [ "cosmic-config", "cosmic-settings-daemon-subscription", "cosmic-settings-upower-subscription", - "drm", + "drm 0.14.1", "futures", "i18n-embed", "i18n-embed-fl", - "libcosmic-yoda", + "libcosmic", "rust-embed", "rustc-hash 2.1.2", "serde", @@ -1148,7 +1156,7 @@ dependencies = [ "futures", "i18n-embed", "i18n-embed-fl", - "libcosmic-yoda", + "libcosmic", "rust-embed", "rustc-hash 2.1.2", "tokio", @@ -1164,7 +1172,7 @@ dependencies = [ "cosmic-comp-config", "i18n-embed", "i18n-embed-fl", - "libcosmic-yoda", + "libcosmic", "rust-embed", "tokio", "tracing", @@ -1181,7 +1189,7 @@ dependencies = [ "i18n-embed", "i18n-embed-fl", "image", - "libcosmic-yoda", + "libcosmic", "memmap2 0.9.10", "rust-embed", "rustix 1.1.4", @@ -1198,14 +1206,15 @@ dependencies = [ "anyhow", "async-fn-stream", "cosmic-dbus-networkmanager", + "cosmic-settings-airplane-mode-subscription", "cosmic-settings-network-manager-subscription", "futures", "futures-util", "i18n-embed", "i18n-embed-fl", "indexmap 2.14.0", - "libcosmic-yoda", - "nmrs", + "libcosmic", + "nm-secret-agent-manager", "rust-embed", "rustc-hash 2.1.2", "secure-string", @@ -1227,7 +1236,7 @@ dependencies = [ "futures-util", "i18n-embed", "i18n-embed-fl", - "libcosmic-yoda", + "libcosmic", "rust-embed", "tokio", "tracing", @@ -1243,7 +1252,7 @@ version = "1.0.2" dependencies = [ "i18n-embed", "i18n-embed-fl", - "libcosmic-yoda", + "libcosmic", "logind-zbus", "rust-embed", "rustix 1.1.4", @@ -1259,7 +1268,7 @@ name = "cosmic-applet-status-area" version = "1.0.2" dependencies = [ "futures", - "libcosmic-yoda", + "libcosmic", "rustc-hash 2.1.2", "serde", "tokio", @@ -1279,7 +1288,7 @@ dependencies = [ "cosmic-protocols", "i18n-embed", "i18n-embed-fl", - "libcosmic-yoda", + "libcosmic", "rust-embed", "rustc-hash 2.1.2", "tokio", @@ -1297,7 +1306,7 @@ dependencies = [ "i18n-embed-fl", "icu", "jiff", - "libcosmic-yoda", + "libcosmic", "logind-zbus", "rust-embed", "timedate-zbus", @@ -1317,7 +1326,7 @@ dependencies = [ "futures", "i18n-embed", "i18n-embed-fl", - "libcosmic-yoda", + "libcosmic", "rust-embed", "tokio", "tracing", @@ -1344,7 +1353,7 @@ dependencies = [ "cosmic-applet-time", "cosmic-applet-workspaces", "cosmic-panel-button", - "libcosmic-yoda", + "libcosmic", "tracing", "tracing-log", "tracing-subscriber", @@ -1362,8 +1371,9 @@ dependencies = [ [[package]] name = "cosmic-client-toolkit" version = "0.2.0" +source = "git+https://github.com/pop-os/cosmic-protocols//?branch=main#160b086abe03cd34a8a375d7fbe47b24308d1f38" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cosmic-protocols", "libc", "smithay-client-toolkit", @@ -1373,7 +1383,8 @@ dependencies = [ [[package]] name = "cosmic-comp-config" -version = "1.0.0" +version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-comp.git?rev=5eb5af4#5eb5af46756f2f2bc5e812cf68fe4c4b79efd924" dependencies = [ "cosmic-config", "input", @@ -1383,6 +1394,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1403,6 +1415,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "quote", "syn", @@ -1411,6 +1424,7 @@ dependencies = [ [[package]] name = "cosmic-dbus-a11y" version = "0.1.0" +source = "git+https://github.com/pop-os/dbus-settings-bindings#507e342c21d3ce6ae41b1d4f3fa2f0ad5ee23e75" dependencies = [ "zbus", ] @@ -1418,8 +1432,9 @@ dependencies = [ [[package]] name = "cosmic-dbus-networkmanager" version = "0.1.0" +source = "git+https://github.com/pop-os/dbus-settings-bindings#507e342c21d3ce6ae41b1d4f3fa2f0ad5ee23e75" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "derive_builder", "jiff", "procfs", @@ -1430,6 +1445,7 @@ dependencies = [ [[package]] name = "cosmic-freedesktop-icons" version = "0.4.0" +source = "git+https://github.com/pop-os/freedesktop-icons#7a61a704f6d1ec41f71cbe766e3cc484858523fa" dependencies = [ "bstr", "btoi", @@ -1443,6 +1459,7 @@ dependencies = [ [[package]] name = "cosmic-notifications-config" version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-notifications#6046bb29d570161196ab98d60806f6d6489df7a6" dependencies = [ "cosmic-config", "serde", @@ -1451,9 +1468,10 @@ dependencies = [ [[package]] name = "cosmic-notifications-util" version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-notifications#6046bb29d570161196ab98d60806f6d6489df7a6" dependencies = [ "fast_image_resize", - "libcosmic-yoda", + "libcosmic", "serde", "tl", "tracing", @@ -1466,7 +1484,7 @@ name = "cosmic-panel-button" version = "1.0.2" dependencies = [ "cosmic-config", - "libcosmic-yoda", + "libcosmic", "rustc-hash 2.1.2", "serde", "tracing", @@ -1477,6 +1495,7 @@ dependencies = [ [[package]] name = "cosmic-panel-config" version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-panel#d518c7d25ef96f1a9696aa8cce008656bf66ece4" dependencies = [ "anyhow", "cosmic-config", @@ -1490,6 +1509,7 @@ dependencies = [ [[package]] name = "cosmic-pipewire" version = "1.0.7" +source = "git+https://github.com/pop-os/cosmic-settings#3639bafcfa3b27fd6a8a9bca7e77589b903975e8" dependencies = [ "intmap", "libspa", @@ -1503,8 +1523,9 @@ dependencies = [ [[package]] name = "cosmic-protocols" version = "0.2.0" +source = "git+https://github.com/pop-os/cosmic-protocols//?branch=main#160b086abe03cd34a8a375d7fbe47b24308d1f38" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -1516,6 +1537,7 @@ dependencies = [ [[package]] name = "cosmic-settings-a11y-manager-subscription" version = "1.0.7" +source = "git+https://github.com/pop-os/cosmic-settings#3639bafcfa3b27fd6a8a9bca7e77589b903975e8" dependencies = [ "cosmic-protocols", "iced_futures", @@ -1529,6 +1551,7 @@ dependencies = [ [[package]] name = "cosmic-settings-accessibility-subscription" version = "1.0.7" +source = "git+https://github.com/pop-os/cosmic-settings#3639bafcfa3b27fd6a8a9bca7e77589b903975e8" dependencies = [ "cosmic-dbus-a11y", "futures", @@ -1538,9 +1561,22 @@ dependencies = [ "zbus", ] +[[package]] +name = "cosmic-settings-airplane-mode-subscription" +version = "1.0.7" +source = "git+https://github.com/pop-os/cosmic-settings#3639bafcfa3b27fd6a8a9bca7e77589b903975e8" +dependencies = [ + "futures", + "iced_futures", + "log", + "rustix 1.1.4", + "tokio", +] + [[package]] name = "cosmic-settings-config" version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-settings-daemon#716da6d6af0b252e2f78aba2ad72ee19ae0241e0" dependencies = [ "cosmic-config", "ron 0.11.0", @@ -1552,7 +1588,8 @@ dependencies = [ [[package]] name = "cosmic-settings-daemon" -version = "0.1.1-yoda.1" +version = "0.1.0" +source = "git+https://github.com/pop-os/dbus-settings-bindings#507e342c21d3ce6ae41b1d4f3fa2f0ad5ee23e75" dependencies = [ "zbus", ] @@ -1560,6 +1597,7 @@ dependencies = [ [[package]] name = "cosmic-settings-daemon-subscription" version = "1.0.7" +source = "git+https://github.com/pop-os/cosmic-settings#3639bafcfa3b27fd6a8a9bca7e77589b903975e8" dependencies = [ "futures", "iced_futures", @@ -1572,8 +1610,9 @@ dependencies = [ [[package]] name = "cosmic-settings-network-manager-subscription" version = "1.0.7" +source = "git+https://github.com/pop-os/cosmic-settings#3639bafcfa3b27fd6a8a9bca7e77589b903975e8" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cosmic-dbus-networkmanager", "futures", "iced_futures", @@ -1590,11 +1629,12 @@ dependencies = [ [[package]] name = "cosmic-settings-sound-subscription" version = "1.0.7" +source = "git+https://github.com/pop-os/cosmic-settings#3639bafcfa3b27fd6a8a9bca7e77589b903975e8" dependencies = [ "cosmic-pipewire", "futures", "intmap", - "libcosmic-yoda", + "libcosmic", "numtoa", "rustix 1.1.4", "tokio", @@ -1604,6 +1644,7 @@ dependencies = [ [[package]] name = "cosmic-settings-upower-subscription" version = "1.0.7" +source = "git+https://github.com/pop-os/cosmic-settings#3639bafcfa3b27fd6a8a9bca7e77589b903975e8" dependencies = [ "futures", "iced_futures", @@ -1616,9 +1657,10 @@ dependencies = [ [[package]] name = "cosmic-text" -version = "0.19.0" +version = "0.18.2" +source = "git+https://github.com/pop-os/cosmic-text.git#4d74f795cc771fdcc7ea0f9cacba63fcf036fad6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "fontdb", "harfrust", "linebender_resource_handle", @@ -1634,12 +1676,12 @@ dependencies = [ "unicode-linebreak", "unicode-script", "unicode-segmentation", - "unicode-width", ] [[package]] name = "cosmic-theme" version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "almost", "configparser", @@ -1686,6 +1728,7 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "cryoglyph" version = "0.1.0" +source = "git+https://github.com/pop-os/glyphon.git?tag=cosmic-0.14#c49de15bce4d8254ac136d1be9911960cc85ce12" dependencies = [ "cosmic-text", "etagere", @@ -1722,6 +1765,12 @@ dependencies = [ "uncased", ] +[[package]] +name = "ctor-lite" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e162d0c2e2068eb736b71e5597eff0b9944e6b973cd9f37b6a288ab9bf20e300" + [[package]] name = "cursor-icon" version = "1.2.0" @@ -1862,15 +1911,15 @@ checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" [[package]] name = "dbus" -version = "0.9.11" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b942602992bb7acfd1f51c49811c58a610ef9181b6e66f3e519d79b540a3bf73" +checksum = "21b3aa68d7e7abee336255bd7248ea965cc393f3e70411135a6f6a4b651345d4" dependencies = [ "futures-channel", "futures-util", "libc", "libdbus-sys", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -1995,7 +2044,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.6.2", "libc", "objc2 0.6.4", @@ -2024,8 +2073,9 @@ dependencies = [ [[package]] name = "dnd" version = "0.1.0" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "mime 0.1.0", "raw-window-handle", "smithay-client-toolkit", @@ -2050,6 +2100,20 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" version = "0.1.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" + +[[package]] +name = "drm" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0f8a69e60d75ae7dab4ef26a59ca99f2a89d4c142089b537775ae0c198bdcde" +dependencies = [ + "bitflags 2.11.0", + "bytemuck", + "drm-ffi 0.7.1", + "drm-fourcc", + "rustix 0.38.44", +] [[package]] name = "drm" @@ -2057,21 +2121,31 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80bc8c5c6c2941f70a55c15f8d9f00f9710ebda3ffda98075f996a0e6c92756f" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", - "drm-ffi", + "drm-ffi 0.9.1", "drm-fourcc", "libc", "rustix 0.38.44", ] +[[package]] +name = "drm-ffi" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41334f8405792483e32ad05fbb9c5680ff4e84491883d2947a4757dc54cb2ac6" +dependencies = [ + "drm-sys 0.6.1", + "rustix 0.38.44", +] + [[package]] name = "drm-ffi" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51a91c9b32ac4e8105dec255e849e0d66e27d7c34d184364fb93e469db08f690" dependencies = [ - "drm-sys", + "drm-sys 0.8.1", "rustix 1.1.4", ] @@ -2081,6 +2155,16 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" +[[package]] +name = "drm-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d09ff881f92f118b11105ba5e34ff8f4adf27b30dae8f12e28c193af1c83176" +dependencies = [ + "libc", + "linux-raw-sys 0.6.5", +] + [[package]] name = "drm-sys" version = "0.8.1" @@ -2099,9 +2183,9 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" -version = "1.16.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "endi" @@ -2200,9 +2284,9 @@ checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" [[package]] name = "fast_image_resize" -version = "6.0.0" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dd43e5011e8d8411a3215a0d57a2ec5c68282fb90eb5d7221fab0113442174" +checksum = "fbc7fe45cf92b43817ff62a3723e862b85bd1d06288f63007f7645d1d2f7a060" dependencies = [ "cfg-if", "document-features", @@ -2347,9 +2431,9 @@ checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "font-types" -version = "0.11.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" +checksum = "2d9237c6d82152100c691fb77ea18037b402bcc7257d2c876a4ffac81bc22a1c" dependencies = [ "bytemuck", ] @@ -2531,12 +2615,6 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" -[[package]] -name = "futures-timer" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" - [[package]] name = "futures-util" version = "0.3.32" @@ -2564,6 +2642,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.4", + "windows-link 0.2.1", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -2680,7 +2768,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "gpu-alloc-types", ] @@ -2690,7 +2778,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", ] [[package]] @@ -2711,7 +2799,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -2722,14 +2810,14 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", ] [[package]] name = "grid" -version = "1.0.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b40ca9252762c466af32d0b1002e91e4e1bc5398f77455e55474deb466355ff5" +checksum = "f9e2d4c0a8296178d8802098410ca05d86b17a10bb5ab559b3fb404c1f948220" [[package]] name = "guillotiere" @@ -2759,7 +2847,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", "core_maths", "read-fonts", @@ -2792,9 +2880,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.17.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "heck" @@ -2944,6 +3032,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "dnd", "iced_accessibility", @@ -2964,6 +3053,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "accesskit", "accesskit_winit", @@ -2972,8 +3062,9 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytes", "cosmic-client-toolkit", "dnd", @@ -2995,6 +3086,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "iced_core", "iced_futures", @@ -3004,6 +3096,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "futures", "iced_core", @@ -3017,8 +3110,9 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", "cosmic-text", "half", @@ -3037,6 +3131,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "iced_graphics", "iced_runtime", @@ -3045,6 +3140,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3056,6 +3152,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -3070,6 +3167,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "bytemuck", "cosmic-text", @@ -3086,8 +3184,10 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ - "bitflags 2.11.1", + "as-raw-xcb-connection", + "bitflags 2.11.0", "bytemuck", "cosmic-client-toolkit", "cryoglyph", @@ -3103,16 +3203,19 @@ dependencies = [ "rustc-hash 2.1.2", "rustix 0.38.44", "thiserror 2.0.18", + "tiny-xlib", "wayland-backend", "wayland-client", "wayland-protocols", "wayland-sys", "wgpu", + "x11rb", ] [[package]] name = "iced_widget" version = "0.14.2" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3130,6 +3233,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "cosmic-client-toolkit", "cursor-icon", @@ -3582,9 +3686,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -3605,15 +3709,6 @@ dependencies = [ "zune-jpeg 0.5.15", ] -[[package]] -name = "image-extras" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60d02eb2c9ccbbab470538fce34c7bc3be7b4e59268e65a3171367b296cdb842" -dependencies = [ - "image", -] - [[package]] name = "image-webp" version = "0.2.4" @@ -3648,7 +3743,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.17.1", + "hashbrown 0.17.0", "serde", "serde_core", ] @@ -3659,7 +3754,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "inotify-sys", "libc", ] @@ -3685,11 +3780,11 @@ dependencies = [ [[package]] name = "input" -version = "0.10.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9793345a65d71317763a33066b5d8351f8760dde8d4930fe9e39b5f14a7959d" +checksum = "fbdc09524a91f9cacd26f16734ff63d7dc650daffadd2b6f84d17a285bd875a9" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "input-sys", "libc", "log", @@ -3770,9 +3865,9 @@ checksum = "2ceaf4c6c48465bead8cb6a0b7c4ee0c86ecbb31239032b9c66ab9a08d2f3ee1" [[package]] name = "jiff" -version = "0.2.25" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6835eea34fb6321b9b3aa7b685c2b433948c09447e389dc017fdf687d5d11e65" +checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -3785,9 +3880,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.25" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c22e04db9c58f5136eb1757f3d5c49a7b187f49e52185228cbd2f5acdfcc08c" +checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" dependencies = [ "proc-macro2", "quote", @@ -3879,9 +3974,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.99" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" dependencies = [ "cfg-if", "futures-util", @@ -3904,7 +3999,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "serde", ] @@ -3946,11 +4041,11 @@ dependencies = [ [[package]] name = "kqueue-sys" -version = "1.1.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" dependencies = [ - "bitflags 2.11.1", + "bitflags 1.3.2", "libc", ] @@ -3989,13 +4084,14 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.186" +version = "0.2.184" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" [[package]] -name = "libcosmic-yoda" -version = "0.1.0-yoda.2" +name = "libcosmic" +version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "apply", "ashpd 0.12.3", @@ -4024,7 +4120,6 @@ dependencies = [ "iced_widget", "iced_winit", "image", - "image-extras", "jiff", "libc", "log", @@ -4078,10 +4173,10 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "libc", "plain", - "redox_syscall 0.7.5", + "redox_syscall 0.7.4", ] [[package]] @@ -4090,7 +4185,7 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6b8cfa2a7656627b4c92c6b9ef929433acd673d5ab3708cda1b18478ac00df4" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cc", "convert_case", "cookie-factory", @@ -4143,6 +4238,12 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +[[package]] +name = "linux-raw-sys" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" + [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -4191,9 +4292,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.30" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "logind-zbus" @@ -4207,9 +4308,9 @@ dependencies = [ [[package]] name = "lru" -version = "0.16.4" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" [[package]] name = "lyon" @@ -4223,9 +4324,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.20" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8575c0d003ae459399623c4def180c63b77f343b1a7fee64f249b349e7699a31" +checksum = "9815fac08e6fd96733a11dce4f9d15a3f338e96a2e2311ee21e1b738efc2bc0f" dependencies = [ "lyon_path", "num-traits", @@ -4326,7 +4427,7 @@ version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block", "core-graphics-types 0.2.0", "foreign-types", @@ -4338,6 +4439,7 @@ dependencies = [ [[package]] name = "mime" version = "0.1.0" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "smithay-clipboard", ] @@ -4389,6 +4491,7 @@ dependencies = [ [[package]] name = "mpris2-zbus" version = "0.1.0" +source = "git+https://github.com/pop-os/dbus-settings-bindings#507e342c21d3ce6ae41b1d4f3fa2f0ad5ee23e75" dependencies = [ "futures-util", "jiff", @@ -4412,7 +4515,7 @@ checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.11.1", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -4436,7 +4539,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "jni-sys 0.3.1", "log", "ndk-sys", @@ -4466,7 +4569,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "libc", @@ -4478,7 +4581,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "libc", @@ -4487,30 +4590,11 @@ dependencies = [ [[package]] name = "nm-secret-agent-manager" version = "0.1.0" +source = "git+https://github.com/pop-os/dbus-settings-bindings#507e342c21d3ce6ae41b1d4f3fa2f0ad5ee23e75" dependencies = [ "zbus", ] -[[package]] -name = "nmrs" -version = "3.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d907d6da103106d84189d3fd229d9aac921f9131b8ba38b40341c53d24409077" -dependencies = [ - "async-trait", - "base64", - "bitflags 2.11.1", - "futures", - "futures-timer", - "log", - "serde", - "thiserror 2.0.18", - "tokio", - "uuid", - "zbus", - "zvariant", -] - [[package]] name = "nom" version = "7.1.3" @@ -4536,7 +4620,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "fsevent-sys", "inotify", "kqueue", @@ -4554,7 +4638,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", ] [[package]] @@ -4601,9 +4685,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-derive" @@ -4736,7 +4820,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -4752,7 +4836,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", @@ -4765,7 +4849,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4777,7 +4861,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.6.2", "dispatch2", "objc2 0.6.4", @@ -4789,7 +4873,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "libc", "objc2-core-foundation", ] @@ -4812,7 +4896,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "objc2-core-foundation", "objc2-core-graphics", ] @@ -4829,7 +4913,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -4841,7 +4925,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", @@ -4853,7 +4937,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4865,7 +4949,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4878,7 +4962,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "objc2 0.6.4", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -4907,9 +4991,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "orbclient" -version = "0.3.55" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747" +checksum = "59aed3b33578edcfa1bc96a321d590d31832b6ad55a26f0313362ce687e9abd6" dependencies = [ "libc", "libredox", @@ -5061,7 +5145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared 0.11.3", - "rand 0.8.6", + "rand 0.8.5", ] [[package]] @@ -5128,18 +5212,18 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.13" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.13" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", @@ -5176,7 +5260,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9688b89abf11d756499f7c6190711d6dbe5a3acdb30c8fbf001d6596d06a8d44" dependencies = [ "anyhow", - "bitflags 2.11.1", + "bitflags 2.11.0", "libc", "libspa", "libspa-sys", @@ -5199,9 +5283,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.33" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plain" @@ -5228,7 +5312,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "crc32fast", "fdeflate", "flate2", @@ -5263,9 +5347,9 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.7" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" dependencies = [ "portable-atomic", ] @@ -5371,7 +5455,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25485360a54d6861439d60facef26de713b1e126bf015ec8f98239467a2b82f7" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "procfs-core", "rustix 1.1.4", ] @@ -5382,21 +5466,21 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6401bf7b6af22f78b563665d15a22e9aef27775b79b149a66ca022468a4e405" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "hex", ] [[package]] name = "profiling" -version = "1.0.18" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" [[package]] name = "pxfm" -version = "0.1.29" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" +checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" [[package]] name = "quick-error" @@ -5406,14 +5490,23 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.39.4" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" dependencies = [ "memchr", "serde", ] +[[package]] +name = "quick-xml" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.45" @@ -5437,18 +5530,18 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.6" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "rand_core 0.6.4", ] [[package]] name = "rand" -version = "0.9.4" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha", "rand_core 0.9.5", @@ -5514,16 +5607,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", ] [[package]] name = "redox_syscall" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4666a1a60d8412eab19d94f6d13dcc9cea0a5ef4fdf6a5db306537413c661b1b" +checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", ] [[package]] @@ -5649,7 +5742,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db09040cc89e461f1a265139777a2bde7f8d8c67c4936f700c63ce3e2904d468" dependencies = [ "base64", - "bitflags 2.11.1", + "bitflags 2.11.0", "serde", "serde_derive", "unicode-ident", @@ -5661,7 +5754,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4147b952f3f819eca0e99527022f7d6a8d05f111aeb0a62960c74eb283bec8fc" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "once_cell", "serde", "serde_derive", @@ -5736,7 +5829,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -5749,7 +5842,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys 0.12.1", @@ -5768,7 +5861,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", "core_maths", "log", @@ -5923,9 +6016,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "indexmap 2.14.0", "itoa", @@ -5957,12 +6050,11 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.20.0" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e72c1c2cb7b223fafb600a619537a871c2818583d619401b785e7c0b746ccde2" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" dependencies = [ "base64", - "bs58", "chrono", "hex", "indexmap 1.9.3", @@ -5977,9 +6069,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.20.0" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90c488738ecb4fb0262f41f43bc40efc5868d9fb744319ddf5f5317f417bfac" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" dependencies = [ "darling 0.23.0", "proc-macro2", @@ -5987,12 +6079,6 @@ dependencies = [ "syn", ] -[[package]] -name = "sha1_smol" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" - [[package]] name = "sha2" version = "0.10.9" @@ -6062,9 +6148,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "skrifa" @@ -6103,7 +6189,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", "calloop", "calloop-wayland-source", @@ -6130,6 +6216,7 @@ dependencies = [ [[package]] name = "smithay-clipboard" version = "0.8.0" +source = "git+https://github.com/pop-os/smithay-clipboard?tag=sctk-0.20#859b02c88f45c554049a67c6ddeec1692ce0e20b" dependencies = [ "libc", "raw-window-handle", @@ -6160,11 +6247,14 @@ dependencies = [ [[package]] name = "softbuffer" version = "0.4.1" +source = "git+https://github.com/pop-os/softbuffer?tag=cosmic-4.0#a3f77e251e7422803f693df6e3fc313c010c4dcb" dependencies = [ + "as-raw-xcb-connection", "bytemuck", "cfg_aliases", "cocoa", "core-graphics", + "drm 0.11.1", "fastrand", "foreign-types", "js-sys", @@ -6174,12 +6264,14 @@ dependencies = [ "raw-window-handle", "redox_syscall 0.5.18", "rustix 0.38.44", + "tiny-xlib", "wasm-bindgen", "wayland-backend", "wayland-client", "wayland-sys", "web-sys", "windows-sys 0.52.0", + "x11rb", ] [[package]] @@ -6188,7 +6280,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", ] [[package]] @@ -6276,6 +6368,7 @@ dependencies = [ [[package]] name = "switcheroo-control" version = "0.1.0" +source = "git+https://github.com/pop-os/dbus-settings-bindings#507e342c21d3ce6ae41b1d4f3fa2f0ad5ee23e75" dependencies = [ "zbus", ] @@ -6453,6 +6546,7 @@ dependencies = [ [[package]] name = "timedate-zbus" version = "0.1.0" +source = "git+https://github.com/pop-os/dbus-settings-bindings#507e342c21d3ce6ae41b1d4f3fa2f0ad5ee23e75" dependencies = [ "zbus", ] @@ -6483,6 +6577,19 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tiny-xlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" +dependencies = [ + "as-raw-xcb-connection", + "ctor-lite", + "libloading", + "pkg-config", + "tracing", +] + [[package]] name = "tinystr" version = "0.8.3" @@ -6517,9 +6624,9 @@ checksum = "b130bd8a58c163224b44e217b4239ca7b927d82bf6cc2fea1fc561d15056e3f7" [[package]] name = "tokio" -version = "1.52.3" +version = "1.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" dependencies = [ "bytes", "libc", @@ -6576,7 +6683,7 @@ dependencies = [ "toml_datetime", "toml_parser", "toml_writer", - "winnow", + "winnow 1.0.1", ] [[package]] @@ -6597,7 +6704,7 @@ dependencies = [ "indexmap 2.14.0", "toml_datetime", "toml_parser", - "winnow", + "winnow 1.0.1", ] [[package]] @@ -6606,7 +6713,7 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow", + "winnow 1.0.1", ] [[package]] @@ -6703,9 +6810,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.20.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "udev" @@ -6833,6 +6940,7 @@ checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "upower_dbus" version = "0.3.2" +source = "git+https://github.com/pop-os/dbus-settings-bindings#507e342c21d3ce6ae41b1d4f3fa2f0ad5ee23e75" dependencies = [ "serde", "serde_repr", @@ -6899,14 +7007,13 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.23.1" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" dependencies = [ "getrandom 0.4.2", "js-sys", "serde_core", - "sha1_smol", "wasm-bindgen", ] @@ -6946,11 +7053,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.3+wasi-0.2.9" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ - "wit-bindgen 0.57.1", + "wit-bindgen", ] [[package]] @@ -6959,14 +7066,14 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.122" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" dependencies = [ "cfg-if", "once_cell", @@ -6977,9 +7084,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.72" +version = "0.4.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" +checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" dependencies = [ "js-sys", "wasm-bindgen", @@ -6987,9 +7094,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.122" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6997,9 +7104,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.122" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" dependencies = [ "bumpalo", "proc-macro2", @@ -7010,9 +7117,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.122" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" dependencies = [ "unicode-ident", ] @@ -7045,7 +7152,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "hashbrown 0.15.5", "indexmap 2.14.0", "semver", @@ -7085,7 +7192,7 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "rustix 1.1.4", "wayland-backend", "wayland-scanner", @@ -7097,7 +7204,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cursor-icon", "wayland-backend", ] @@ -7119,7 +7226,7 @@ version = "0.32.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -7132,7 +7239,7 @@ version = "20250721.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7145,7 +7252,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7158,7 +7265,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7171,7 +7278,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7186,7 +7293,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" dependencies = [ "proc-macro2", - "quick-xml", + "quick-xml 0.39.2", "quote", ] @@ -7196,7 +7303,7 @@ version = "0.31.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc1846eb04c49182e04f4a099e2a830a2b745610bbc1d61246e206f29c7000a0" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "downcast-rs", "rustix 1.1.4", "wayland-backend", @@ -7217,9 +7324,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.99" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" dependencies = [ "js-sys", "wasm-bindgen", @@ -7248,7 +7355,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", - "bitflags 2.11.1", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "document-features", @@ -7279,7 +7386,7 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", "cfg_aliases", "document-features", @@ -7339,7 +7446,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.11.1", + "bitflags 2.11.0", "block", "bytemuck", "cfg-if", @@ -7384,7 +7491,7 @@ version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", "js-sys", "log", @@ -7426,10 +7533,12 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window_clipboard" version = "0.4.1" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "clipboard-win", "clipboard_macos", "clipboard_wayland", + "clipboard_x11", "dnd", "mime 0.1.0", "raw-window-handle", @@ -7882,8 +7991,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cfg_aliases", "cursor-icon", "dpi", @@ -7901,14 +8011,16 @@ dependencies = [ "winit-wayland", "winit-web", "winit-win32", + "winit-x11", ] [[package]] name = "winit-android" version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ "android-activity", - "bitflags 2.11.1", + "bitflags 2.11.0", "dpi", "ndk", "raw-window-handle", @@ -7920,8 +8032,9 @@ dependencies = [ [[package]] name = "winit-appkit" version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.6.2", "dispatch2", "dpi", @@ -7941,6 +8054,7 @@ dependencies = [ [[package]] name = "winit-common" version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ "memmap2 0.9.10", "objc2 0.6.4", @@ -7948,14 +8062,16 @@ dependencies = [ "smol_str", "tracing", "winit-core", + "x11-dl", "xkbcommon-dl", ] [[package]] name = "winit-core" version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cursor-icon", "dpi", "keyboard-types", @@ -7967,13 +8083,14 @@ dependencies = [ [[package]] name = "winit-orbital" version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "dpi", "libredox", "orbclient", "raw-window-handle", - "redox_syscall 0.7.5", + "redox_syscall 0.7.4", "smol_str", "tracing", "winit-core", @@ -7982,8 +8099,9 @@ dependencies = [ [[package]] name = "winit-uikit" version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.6.2", "dispatch2", "dpi", @@ -8001,9 +8119,10 @@ dependencies = [ [[package]] name = "winit-wayland" version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ "ahash", - "bitflags 2.11.1", + "bitflags 2.11.0", "calloop", "cursor-icon", "dpi", @@ -8026,9 +8145,10 @@ dependencies = [ [[package]] name = "winit-web" version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ "atomic-waker", - "bitflags 2.11.1", + "bitflags 2.11.0", "concurrent-queue", "cursor-icon", "dpi", @@ -8047,8 +8167,9 @@ dependencies = [ [[package]] name = "winit-win32" version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cursor-icon", "dpi", "raw-window-handle", @@ -8059,11 +8180,43 @@ dependencies = [ "winit-core", ] +[[package]] +name = "winit-x11" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +dependencies = [ + "bitflags 2.11.0", + "bytemuck", + "calloop", + "cursor-icon", + "dpi", + "libc", + "percent-encoding", + "raw-window-handle", + "rustix 1.1.4", + "smol_str", + "tracing", + "winit-common", + "winit-core", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + [[package]] name = "winnow" -version = "1.0.3" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" dependencies = [ "memchr", ] @@ -8077,12 +8230,6 @@ dependencies = [ "wit-bindgen-rust-macro", ] -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -8132,7 +8279,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.1", + "bitflags 2.11.0", "indexmap 2.14.0", "log", "serde", @@ -8177,6 +8324,39 @@ dependencies = [ "either", ] +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.4", + "x11rb-protocol", + "xcursor", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + [[package]] name = "xcursor" version = "0.3.10" @@ -8192,6 +8372,7 @@ checksum = "2fb433233f2df9344722454bc7e96465c9d03bff9d77c248f9e7523fe79585b5" [[package]] name = "xdg-shell-wrapper-config" version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-panel#d518c7d25ef96f1a9696aa8cce008656bf66ece4" dependencies = [ "serde", "wayland-protocols-wlr", @@ -8258,7 +8439,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "dlib", "log", "once_cell", @@ -8276,9 +8457,9 @@ dependencies = [ [[package]] name = "xml" -version = "1.3.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "636f85e5ca6488e96401b61eb7de54f4e44755c988af0f52cf90230c312a1a89" +checksum = "b8aa498d22c9bbaf482329839bc5620c46be275a19a812e9a22a2b07529a642a" [[package]] name = "xml-rs" @@ -8338,9 +8519,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.15.0" +version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bcbf15c8708d7fc1be0c993622e0a5cbd5e8b52bfa40afa4c3e0cd8d724ac1" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" dependencies = [ "async-broadcast", "async-executor", @@ -8366,7 +8547,7 @@ dependencies = [ "uds_windows", "uuid", "windows-sys 0.61.2", - "winnow", + "winnow 0.7.15", "zbus_macros", "zbus_names", "zvariant", @@ -8398,9 +8579,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.15.0" +version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51fa5406ad9175a8c825a931f8cf347116b531b3634fcb0b627c290f1f2516ff" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8413,22 +8594,22 @@ dependencies = [ [[package]] name = "zbus_names" -version = "4.3.2" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" dependencies = [ "serde", - "winnow", + "winnow 0.7.15", "zvariant", ] [[package]] name = "zbus_xml" -version = "5.1.1" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8067892e940ed1727dea64690378601603b31d62dfde019a5335fbb7c0e0ed9" +checksum = "441a0064125265655bccc3a6af6bef56814d9277ac83fce48b1cd7e160b80eac" dependencies = [ - "quick-xml", + "quick-xml 0.38.4", "serde", "zbus_names", "zvariant", @@ -8462,9 +8643,9 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.8" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] @@ -8560,24 +8741,24 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.11.0" +version = "5.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c1567a6ec68df868cbbfde844cfc6d81649fe5109a62b116b19fabd53e618ee" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" dependencies = [ "endi", "enumflags2", "serde", "url", - "winnow", + "winnow 0.7.15", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.11.0" +version = "5.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d5b780599bbde114e39d9a0799577fad1ced5105d38515745f7b3099d8ceda" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -8588,21 +8769,13 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "3.3.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d464f5733ffa07a3164d656f18533caace9d0638596721355d73256a410d691" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" dependencies = [ "proc-macro2", "quote", "serde", "syn", - "winnow", + "winnow 0.7.15", ] - -[[patch.unused]] -name = "cosmic-settings-airplane-mode-subscription" -version = "1.0.7" - -[[patch.unused]] -name = "winit-x11" -version = "0.31.0-beta.2" diff --git a/Cargo.toml b/Cargo.toml index 098b9507..5e6940de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,11 +25,11 @@ resolver = "3" [workspace.dependencies] anyhow = "1.0.102" -cctk = { package = "cosmic-client-toolkit", path = "../cosmic-protocols/client-toolkit" } +cctk = { git = "https://github.com/pop-os/cosmic-protocols", package = "cosmic-client-toolkit", rev = "d0e95be" } cosmic-applets-config = { path = "cosmic-applets-config" } -cosmic-protocols = { path = "../cosmic-protocols", default-features = false, features = [ +cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols", default-features = false, features = [ "client", -]} +], rev = "d0e95be" } futures = "0.3" futures-util = "0.3" @@ -38,7 +38,7 @@ i18n-embed = { version = "0.16.0", features = [ "desktop-requester", ] } i18n-embed-fl = "0.10" -cosmic = { package = "libcosmic-yoda", path = "../libcosmic", default-features = false, features = [ +libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = false, features = [ "applet", "applet-token", "dbus-config", @@ -48,7 +48,6 @@ cosmic = { package = "libcosmic-yoda", path = "../libcosmic", default-features = "desktop-systemd-scope", "winit", ] } -cosmic-comp-config = { path = "../cosmic-comp/cosmic-comp-config" } rust-embed = "8.11.0" rust-embed-utils = "8.11.0" rustc-hash = "2.1" @@ -59,13 +58,14 @@ tracing-subscriber = { version = "0.3.22", features = ["env-filter"] } tracing-log = "0.2.0" tokio = { version = "1.49.0", features = ["full"] } # cosmic-config = { path = "../libcosmic/cosmic-config" } -cosmic-config = { path = "../libcosmic/cosmic-config" } +cosmic-config = { git = "https://github.com/pop-os/libcosmic" } serde = { version = "1.0.228", features = ["derive"] } [profile.release] -opt-level = 3 -panic = "abort" -lto = "thin" +# opt-level = 3 +# panic = "abort" +# lto = "thin" +opt-level = 1 [workspace.metadata.cargo-machete] ignored = ["libcosmic"] @@ -82,51 +82,12 @@ ignored = ["libcosmic"] # winit = { git = "https://github.com/rust-windowing/winit.git", rev = "241b7a80bba96c91fa3901729cd5dec66abb9be4" } # winit = { path = "../winit" } -[patch."https://github.com/pop-os/libcosmic"] -cosmic-config = { path = "/home/lionel/Projets/COSMIC/libcosmic/cosmic-config" } -cosmic-theme = { path = "/home/lionel/Projets/COSMIC/libcosmic/cosmic-theme" } -iced = { path = "/home/lionel/Projets/COSMIC/libcosmic/iced" } -iced_accessibility = { path = "/home/lionel/Projets/COSMIC/libcosmic/iced/accessibility" } -iced_core = { path = "/home/lionel/Projets/COSMIC/libcosmic/iced/core" } -iced_futures = { path = "/home/lionel/Projets/COSMIC/libcosmic/iced/futures" } -iced_graphics = { path = "/home/lionel/Projets/COSMIC/libcosmic/iced/graphics" } -iced_renderer = { path = "/home/lionel/Projets/COSMIC/libcosmic/iced/renderer" } -iced_runtime = { path = "/home/lionel/Projets/COSMIC/libcosmic/iced/runtime" } -iced_tiny_skia = { path = "/home/lionel/Projets/COSMIC/libcosmic/iced/tiny_skia" } -iced_wgpu = { path = "/home/lionel/Projets/COSMIC/libcosmic/iced/wgpu" } -iced_widget = { path = "/home/lionel/Projets/COSMIC/libcosmic/iced/widget" } -iced_winit = { path = "/home/lionel/Projets/COSMIC/libcosmic/iced/winit" } - [patch."https://github.com/smithay/client-toolkit.git"] sctk = { package = "smithay-client-toolkit", version = "0.20.0" } [patch."https://github.com/pop-os/cosmic-protocols"] -cosmic-protocols = { path = "/home/lionel/Projets/COSMIC/cosmic-protocols" } -cosmic-client-toolkit = { path = "/home/lionel/Projets/COSMIC/cosmic-protocols/client-toolkit" } - -[patch."https://github.com/pop-os/cosmic-panel"] -cosmic-panel-config = { path = "/home/lionel/Projets/COSMIC/cosmic-panel/cosmic-panel-config" } -xdg-shell-wrapper-config = { path = "/home/lionel/Projets/COSMIC/cosmic-panel/xdg-shell-wrapper-config" } - -[patch."https://github.com/pop-os/cosmic-notifications"] -cosmic-notifications-config = { path = "/home/lionel/Projets/COSMIC/cosmic-notifications/cosmic-notifications-config" } -cosmic-notifications-util = { path = "/home/lionel/Projets/COSMIC/cosmic-notifications/cosmic-notifications-util" } - -[patch."https://github.com/pop-os/cosmic-settings"] -cosmic-settings-a11y-manager-subscription = { path = "/home/lionel/Projets/COSMIC/cosmic-settings/subscriptions/a11y-manager" } -cosmic-settings-accessibility-subscription = { path = "/home/lionel/Projets/COSMIC/cosmic-settings/subscriptions/accessibility" } -cosmic-settings-airplane-mode-subscription = { path = "/home/lionel/Projets/COSMIC/cosmic-settings/subscriptions/airplane-mode" } -cosmic-settings-daemon-subscription = { path = "/home/lionel/Projets/COSMIC/cosmic-settings/subscriptions/settings-daemon" } -cosmic-settings-network-manager-subscription = { path = "/home/lionel/Projets/COSMIC/cosmic-settings/subscriptions/network-manager" } -cosmic-settings-sound-subscription = { path = "/home/lionel/Projets/COSMIC/cosmic-settings/subscriptions/sound" } -cosmic-settings-upower-subscription = { path = "/home/lionel/Projets/COSMIC/cosmic-settings/subscriptions/upower" } - -[patch."https://github.com/pop-os/cosmic-settings/"] -cosmic-settings-airplane-mode-subscription = { path = "/home/lionel/Projets/COSMIC/cosmic-settings/subscriptions/airplane-mode" } -cosmic-settings-network-manager-subscription = { path = "/home/lionel/Projets/COSMIC/cosmic-settings/subscriptions/network-manager" } - -[patch."https://github.com/pop-os/cosmic-text.git"] -cosmic-text = { path = "../cosmic-text" } +cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols//", branch = "main" } +cosmic-client-toolkit = { git = "https://github.com/pop-os/cosmic-protocols//", branch = "main" } # [patch.'https://github.com/pop-os/dbus-settings-bindings'] # cosmic-dbus-networkmanager = { path = "../dbus-settings-bindings/networkmanager" } diff --git a/cosmic-app-list/Cargo.toml b/cosmic-app-list/Cargo.toml index 4fb3e699..7c398b97 100644 --- a/cosmic-app-list/Cargo.toml +++ b/cosmic-app-list/Cargo.toml @@ -13,13 +13,13 @@ futures.workspace = true i18n-embed.workspace = true i18n-embed-fl.workspace = true image = { version = "0.25.9", default-features = false } -cosmic.workspace = true +libcosmic.workspace = true memmap2 = "0.9.10" fastrand = "2.3.0" rust-embed.workspace = true rustix.workspace = true rustc-hash.workspace = true -switcheroo-control = { path = "../../dbus-settings-bindings/switcheroo-control" } +switcheroo-control = { git = "https://github.com/pop-os/dbus-settings-bindings" } tokio.workspace = true tracing-log.workspace = true tracing-subscriber.workspace = true diff --git a/cosmic-app-list/cosmic-app-list-config/Cargo.toml b/cosmic-app-list/cosmic-app-list-config/Cargo.toml index 49e940c5..08d87f2e 100644 --- a/cosmic-app-list/cosmic-app-list-config/Cargo.toml +++ b/cosmic-app-list/cosmic-app-list-config/Cargo.toml @@ -6,5 +6,5 @@ edition = "2024" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -cosmic.workspace = true +libcosmic.workspace = true serde = { workspace = true, features = ["derive"] } diff --git a/cosmic-app-list/i18n/ca/cosmic_app_list.ftl b/cosmic-app-list/i18n/ca/cosmic_app_list.ftl index 340e296c..e69de29b 100644 --- a/cosmic-app-list/i18n/ca/cosmic_app_list.ftl +++ b/cosmic-app-list/i18n/ca/cosmic_app_list.ftl @@ -1,8 +0,0 @@ -new-window = Nova Finestra -quit = Surt -run = Executa -run-on = Executa a { $gpu } -quit-all = Surt de totes -run-on-default = (Per defecte) -cosmic-app-list = Safata d'Aplicacions -pin = Ancora a la safata diff --git a/cosmic-app-list/i18n/el/cosmic_app_list.ftl b/cosmic-app-list/i18n/el/cosmic_app_list.ftl index e77f522a..6a425d48 100644 --- a/cosmic-app-list/i18n/el/cosmic_app_list.ftl +++ b/cosmic-app-list/i18n/el/cosmic_app_list.ftl @@ -1,8 +1 @@ new-window = Νέο παράθυρο -quit = Έξοδος -cosmic-app-list = Περιοχή εφαρμογών -run = Εκτέλεση -run-on = Εκτέλεση με { $gpu } -quit-all = Έξοδος από όλα -run-on-default = (Προεπιλογή) -pin = Καρφίτσωμα στην περιοχή εφαρμογών diff --git a/cosmic-app-list/i18n/en/cosmic_app_list.ftl b/cosmic-app-list/i18n/en/cosmic_app_list.ftl index 028a1558..c412cd51 100644 --- a/cosmic-app-list/i18n/en/cosmic_app_list.ftl +++ b/cosmic-app-list/i18n/en/cosmic_app_list.ftl @@ -5,15 +5,4 @@ quit-all = Quit All new-window = New Window run = Run run-on = Run on {$gpu} -run-on-default = (Default) -edit-launcher = Edit launcher -launcher-name = Name -launcher-command = Command -launcher-icon = Icon -launcher-icon-theme = Theme -launcher-icon-search = Search icons -launcher-icon-catalog-loading = Loading icons -launcher-icon-catalog-empty = No icons -launcher-icons = icons -save = Save -cancel = Cancel +run-on-default = (Default) \ No newline at end of file diff --git a/cosmic-app-list/i18n/fr/cosmic_app_list.ftl b/cosmic-app-list/i18n/fr/cosmic_app_list.ftl index 16bb7465..a065b203 100644 --- a/cosmic-app-list/i18n/fr/cosmic_app_list.ftl +++ b/cosmic-app-list/i18n/fr/cosmic_app_list.ftl @@ -3,17 +3,6 @@ pin = Épingler à la barre d'applis quit = Quitter quit-all = Tout quitter new-window = Nouvelle fenêtre -run = Exécuter +run = Lancer run-on = Lancer avec { $gpu } run-on-default = (Défaut) -edit-launcher = Modifier le lanceur -launcher-name = Nom -launcher-command = Commande -launcher-icon = Icône -launcher-icon-theme = Thème -launcher-icon-search = Rechercher une icône -launcher-icon-catalog-loading = Chargement des icônes -launcher-icon-catalog-empty = Aucune icône -launcher-icons = icônes -save = Enregistrer -cancel = Annuler diff --git a/cosmic-app-list/i18n/kk/cosmic_app_list.ftl b/cosmic-app-list/i18n/kk/cosmic_app_list.ftl index a1b070a2..c0e5a033 100644 --- a/cosmic-app-list/i18n/kk/cosmic_app_list.ftl +++ b/cosmic-app-list/i18n/kk/cosmic_app_list.ftl @@ -1,5 +1,5 @@ quit = Шығу -run = Орындау +run = Іске қосу run-on = { $gpu } арқылы іске қосу run-on-default = (Әдепкі) cosmic-app-list = Қолданбалар сөресі diff --git a/cosmic-app-list/i18n/lo/cosmic_app_list.ftl b/cosmic-app-list/i18n/lo/cosmic_app_list.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/cosmic-app-list/i18n/ru/cosmic_app_list.ftl b/cosmic-app-list/i18n/ru/cosmic_app_list.ftl index c1195520..a7d98a5b 100644 --- a/cosmic-app-list/i18n/ru/cosmic_app_list.ftl +++ b/cosmic-app-list/i18n/ru/cosmic_app_list.ftl @@ -3,6 +3,6 @@ pin = Закрепить на панели приложений quit = Выйти quit-all = Завершить все new-window = Новое окно -run = Выполнить +run = Запустить run-on = Запустить на { $gpu } run-on-default = (По умолчанию) diff --git a/cosmic-app-list/i18n/sr/cosmic_app_list.ftl b/cosmic-app-list/i18n/sr/cosmic_app_list.ftl index 4cf077b9..e69de29b 100644 --- a/cosmic-app-list/i18n/sr/cosmic_app_list.ftl +++ b/cosmic-app-list/i18n/sr/cosmic_app_list.ftl @@ -1,8 +0,0 @@ -new-window = Нови прозор -quit = Изађи -run = Покрени -run-on = Покрени на { $gpu } -quit-all = Изађи из свега -run-on-default = (подразумевано) -cosmic-app-list = Системска касета -pin = Закачи у системску касету diff --git a/cosmic-app-list/i18n/uk/cosmic_app_list.ftl b/cosmic-app-list/i18n/uk/cosmic_app_list.ftl index ec1833cd..aed01bf2 100644 --- a/cosmic-app-list/i18n/uk/cosmic_app_list.ftl +++ b/cosmic-app-list/i18n/uk/cosmic_app_list.ftl @@ -3,6 +3,6 @@ pin = Закріпити quit = Вийти quit-all = Закрити всі new-window = Нове вікно -run = Виконати +run = Запустити run-on = Запустити на { $gpu } run-on-default = (Основна) diff --git a/cosmic-app-list/src/app.rs b/cosmic-app-list/src/app.rs index 59e8ed83..932ffd6c 100755 --- a/cosmic-app-list/src/app.rs +++ b/cosmic-app-list/src/app.rs @@ -2,8 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only use crate::{ - fl, icon_catalog, - launcher_edit::{self, LauncherEditRequest}, + fl, wayland_subscription::{ OutputUpdate, ToplevelRequest, ToplevelUpdate, WaylandImage, WaylandRequest, WaylandUpdate, wayland_subscription, @@ -44,11 +43,11 @@ use cosmic::{ surface, theme::{self, Button, Container}, widget::{ - DndDestination, Image, button, container, divider, dnd_source, grid, + DndDestination, Image, button, container, divider, dnd_source, icon::{self, from_name}, image::Handle, rectangle_tracker::{RectangleTracker, RectangleUpdate, rectangle_tracker_subscription}, - scrollable, svg, text, text_input, + svg, text, }, }; use cosmic::{ @@ -65,8 +64,6 @@ use tokio::time::sleep; use url::Url; static MIME_TYPE: &str = "text/uri-list"; -const MAX_VISIBLE_ICON_CHOICES: usize = 120; -const ICON_CATALOG_COLUMNS: usize = 6; pub fn run() -> cosmic::iced::Result { cosmic::applet::run::(()) @@ -190,11 +187,6 @@ impl DockItem { dot_border_radius: [f32; 4], window_id: window::Id, filter: Option<&dyn Fn(&ToplevelInfo) -> bool>, - // Yoda: multiplier on the computed icon size (1.0 = default, - // >1.0 = magnified e.g. on hover for the macOS Tahoe effect). - // Applied to the icon's rendered width/height only — indicator - // dot and surrounding layout stay at base size. - icon_scale: f32, ) -> Element<'_, Message> { let Self { toplevels, @@ -213,35 +205,17 @@ impl DockItem { }; let toplevel_count = filtered_toplevels.len(); - // Cairo-like : pastille plus petite + atténuée quand toutes les fenêtres - // de cette app sont minimisées. - let all_minimized = toplevel_count > 0 - && filtered_toplevels - .iter() - .all(|(info, _)| info.state.contains(&State::Minimized)); - let app_icon = AppletIconData::new(applet); - // Yoda: scaled icon size for hover magnification. Clamped so - // tiny floats don't round to 0 and huge ones stay within u16. - let scaled_icon_size = ((f32::from(app_icon.icon_size) * icon_scale).round() as i32) - .clamp(1, u16::MAX as i32) as u16; let cosmic_icon = cosmic::widget::icon( fde::IconSource::from_unknown(desktop_info.icon().unwrap_or_default()).as_cosmic_icon(), ) // sets the preferred icon size variant .size(128) - .width(scaled_icon_size.into()) - .height(scaled_icon_size.into()); + .width(app_icon.icon_size.into()) + .height(app_icon.icon_size.into()); let indicator = { - // Padding réduit quand minimisée → pastille plus petite. - let effective_radius = if all_minimized { - (app_icon.dot_radius * 0.55).max(1.0) - } else { - app_icon.dot_radius - }; - let container = if toplevel_count <= 1 { vertical_space().height(Length::Fixed(0.0)) } else { @@ -255,34 +229,22 @@ impl DockItem { } } .apply(container) - .padding(effective_radius); + .padding(app_icon.dot_radius); if toplevel_count == 0 { container } else { - container.class(theme::Container::custom(move |theme| { - let cosmic = theme.cosmic(); - let accent: iced::Color = cosmic.accent_color().into(); - let on_bg: iced::Color = cosmic.on_bg_color().into(); - // Teinte neutre atténuée quand toutes les fenêtres sont minimisées. - let muted = iced::Color { a: 0.45, ..on_bg }; - - let fill = if all_minimized { - muted - } else if is_focused { - accent + container.class(theme::Container::custom(move |theme| container::Style { + background: if is_focused { + Some(Background::Color(theme.cosmic().accent_color().into())) } else { - on_bg - }; - - container::Style { - background: Some(Background::Color(fill)), - border: Border { - radius: dot_border_radius.into(), - ..Default::default() - }, + Some(Background::Color(theme.cosmic().on_bg_color().into())) + }, + border: Border { + radius: dot_border_radius.into(), ..Default::default() - } + }, + ..Default::default() })) } }; @@ -390,35 +352,10 @@ pub struct Popup { popup_type: PopupType, } -#[derive(Debug, Clone)] -struct LauncherEditState { - original_app_id: String, - source_path: PathBuf, - original_name: String, - original_exec: String, - name: String, - exec: String, - icon: String, - terminal: bool, - saving: bool, - error: Option, - icon_catalog: IconCatalogState, -} - -#[derive(Debug, Clone)] -struct IconCatalogState { - theme: String, - query: String, - entries: Vec, - loading: bool, - truncated: bool, -} - #[derive(Clone, Default)] struct CosmicAppList { core: cosmic::app::Core, popup: Option, - launcher_edit: Option, subscription_ctr: u32, item_ctr: u32, desktop_entries: Vec, @@ -437,21 +374,6 @@ struct CosmicAppList { output_list: FxHashMap, locales: Vec, hovered_toplevel: Option, - /// Yoda: which dock icon the pointer is currently over (for hover - /// magnification). None = no dock icon hovered. - hovered_dock_item: Option, - /// Yoda: animated "virtual cursor" center used by the fisheye - /// formula — lerps toward the real hovered icon's center on each - /// AnimTick, so the bell curve slides smoothly from one icon to the - /// next instead of snapping. - anim_hover_center: Option<(f32, f32)>, - /// Yoda: fade-in/out intensity of the magnification effect - /// (0.0 = icons flat, 1.0 = full fisheye). Targets 1.0 while the - /// pointer is over any dock icon, 0.0 otherwise. Lerped on AnimTick. - anim_hover_intensity: f32, - /// Yoda: timestamp of the last AnimTick, for dt-based exponential - /// smoothing. `None` on first tick. - anim_last_tick: Option, overflow_favorites_popup: Option, overflow_active_popup: Option, } @@ -460,33 +382,13 @@ struct CosmicAppList { pub enum PopupType { RightClickMenu, ToplevelList, - LauncherEditor, } #[derive(Debug, Clone)] -#[allow(dead_code)] enum Message { Wayland(WaylandUpdate), PinApp(u32), UnpinApp(u32), - EditLauncher(u32), - LauncherNameChanged(String), - LauncherExecChanged(String), - LauncherIconChanged(String), - LauncherIconSearchChanged(String), - LauncherIconSelected(String), - ReloadLauncherIconCatalog, - LauncherIconCatalogLoaded(icon_catalog::IconCatalog), - SaveLauncherEdit, - CancelLauncherEdit, - LauncherEditSaved(Result), - /// Yoda: pointer entered (Some) or left (None) a dock icon — drives - /// the macOS Tahoe-style hover magnification effect. - DockItemHover(Option), - /// Yoda: ticked at ~60fps by the animation subscription. Advances - /// anim_hover_center + anim_hover_intensity toward their targets so - /// the fisheye effect transitions smoothly instead of snapping. - AnimTick(std::time::Instant), Popup(u32, window::Id), Pressed(window::Id), ToplevelListPopup(u32, window::Id), @@ -724,143 +626,6 @@ pub fn menu_control_padding() -> Padding { [spacing.space_xxs, spacing.space_s].into() } -fn launcher_icon_editor(edit: &LauncherEditState) -> Element<'_, Message> { - let spacing = theme::spacing(); - let selected_icon = edit.icon.trim(); - let query = edit.icon_catalog.query.trim().to_ascii_lowercase(); - let mut total_matches = 0usize; - let mut visible_count = 0usize; - let mut icon_grid = grid() - .width(Length::Fill) - .column_spacing(spacing.space_xxs) - .row_spacing(spacing.space_xxs); - - for entry in edit.icon_catalog.entries.iter().filter(|entry| { - query.is_empty() || entry.name.to_ascii_lowercase().contains(query.as_str()) - }) { - total_matches += 1; - if visible_count >= MAX_VISIBLE_ICON_CHOICES { - continue; - } - - if visible_count > 0 && visible_count % ICON_CATALOG_COLUMNS == 0 { - icon_grid = icon_grid.insert_row(); - } - - let selected = selected_icon == entry.name; - let icon_preview = cosmic::widget::icon( - fde::IconSource::from_unknown(entry.name.as_str()).as_cosmic_icon(), - ) - .size(32) - .width(Length::Fixed(32.0)) - .height(Length::Fixed(32.0)); - - let label = text::caption(entry.name.as_str()) - .ellipsize(Ellipsize::End(EllipsizeHeightLimit::Lines(1))) - .width(Length::Fill) - .center(); - - let tile = column![icon_preview, label] - .align_x(Alignment::Center) - .spacing(4) - .width(Length::Fixed(70.0)); - - let tile_button = button::custom(tile) - .class(if selected { - Button::Suggested - } else { - Button::Image - }) - .selected(selected) - .on_press(Message::LauncherIconSelected(entry.name.clone())) - .padding(6) - .width(Length::Fixed(74.0)) - .height(Length::Fixed(76.0)); - - icon_grid = icon_grid.push(tile_button); - visible_count += 1; - } - - let current_icon = - cosmic::widget::icon(fde::IconSource::from_unknown(edit.icon.as_str()).as_cosmic_icon()) - .size(32) - .width(Length::Fixed(36.0)) - .height(Length::Fixed(36.0)); - - let icon_value = row![ - current_icon, - text_input("", edit.icon.as_str()) - .label(fl!("launcher-icon")) - .on_input(Message::LauncherIconChanged) - .on_submit(|_| Message::SaveLauncherEdit) - .width(Length::Fill) - .size(14), - button::icon(from_name("view-refresh-symbolic")) - .on_press(Message::ReloadLauncherIconCatalog) - .padding(spacing.space_xxs), - ] - .spacing(spacing.space_xs) - .align_y(Alignment::Center); - - let visible_total = if edit.icon_catalog.truncated { - format!( - "{}/{}+ {}", - visible_count, - total_matches, - fl!("launcher-icons") - ) - } else { - format!( - "{}/{} {}", - visible_count, - total_matches, - fl!("launcher-icons") - ) - }; - - let catalog_header = row![ - text::caption(format!( - "{}: {}", - fl!("launcher-icon-theme"), - edit.icon_catalog.theme - )), - horizontal_space(), - text::caption(visible_total), - ] - .align_y(Alignment::Center); - - let catalog_body: Element<_> = if edit.icon_catalog.loading { - container(text::body(fl!("launcher-icon-catalog-loading"))) - .center(Length::Fill) - .height(Length::Fixed(220.0)) - .into() - } else if total_matches == 0 { - container(text::body(fl!("launcher-icon-catalog-empty"))) - .center(Length::Fill) - .height(Length::Fixed(220.0)) - .into() - } else { - scrollable(icon_grid) - .height(Length::Fixed(240.0)) - .width(Length::Fill) - .into() - }; - - column![ - icon_value, - catalog_header, - text_input("", edit.icon_catalog.query.as_str()) - .label(fl!("launcher-icon-search")) - .on_input(Message::LauncherIconSearchChanged) - .width(Length::Fill) - .size(14), - catalog_body, - ] - .spacing(spacing.space_s) - .width(Length::Fill) - .into() -} - fn find_desktop_entries<'a>( desktop_entries: &'a [fde::DesktopEntry], app_ids: &'a [String], @@ -882,79 +647,6 @@ impl CosmicAppList { .collect::>(); } - /// Yoda: macOS-Tahoe fisheye-style magnification. Returns the - /// per-icon size multiplier based on the distance (in pixels) from - /// the currently hovered icon's center to this icon's center. - /// - /// Uses a gaussian bell curve so the hovered icon peaks at - /// 1.0 + PEAK, immediate neighbors still bulge noticeably, and icons - /// further away relax back to 1.0× — that's the smooth neighbour - /// deformation people associate with the macOS Dock. - /// - /// Falls back to binary 1.3×/1.0× when the rectangle tracker hasn't - /// populated yet (first render, or just after layout changes). - /// - /// Uses the animated hover center (anim_hover_center) and intensity - /// (anim_hover_intensity) so inter-icon transitions slide smoothly - /// and the whole effect fades in/out at the dock's edges. - fn icon_scale_for(&self, id: &DockItemId) -> f32 { - const PEAK: f32 = 0.35; - // sigma expressed in multiples of the hovered icon's size — - // 1.4 means the ±1 neighbors sit ~0.7σ away and still bulge - // visibly, while ±3+ has collapsed to ~1.0× (fisheye footprint - // close to 5 icons wide, Tahoe-ish). - const SIGMA_FACTOR: f32 = 1.4; - - // No intensity at all → skip the rest. - if self.anim_hover_intensity < 0.001 { - return 1.0; - } - - // Prefer the animated center (smooth); fall back to the real - // hovered icon's center (first render, before tick fires). - let hover_center = self.anim_hover_center.or_else(|| { - let hovered_id = self.hovered_dock_item.as_ref()?; - let r = self.rectangles.get(hovered_id)?; - Some((r.x + r.width / 2.0, r.y + r.height / 2.0)) - }); - let Some(hover_center) = hover_center else { - // No coords yet — visibly peak on the exact hovered id so - // the very first frame still responds. - return if self.hovered_dock_item.as_ref() == Some(id) { - 1.0 + PEAK * self.anim_hover_intensity - } else { - 1.0 - }; - }; - - let this_rect = match self.rectangles.get(id) { - Some(r) => r, - None => return 1.0, - }; - - let is_horizontal = matches!( - self.core.applet.anchor, - PanelAnchor::Top | PanelAnchor::Bottom - ); - let this_center = if is_horizontal { - this_rect.x + this_rect.width / 2.0 - } else { - this_rect.y + this_rect.height / 2.0 - }; - let hover_axis = if is_horizontal { hover_center.0 } else { hover_center.1 }; - let distance = (this_center - hover_axis).abs(); - let icon_extent = if is_horizontal { - this_rect.width - } else { - this_rect.height - } - .max(1.0); - let sigma = icon_extent * SIGMA_FACTOR; - // exp(-t²) bell curve, t = distance / sigma - let t = distance / sigma; - 1.0 + PEAK * self.anim_hover_intensity * (-t * t).exp() - } - fn is_on_current_monitor_and_workspace(&self, toplevel_info: &ToplevelInfo) -> bool { use cosmic_app_list_config::ToplevelFilter; @@ -999,45 +691,10 @@ impl CosmicAppList { .collect(); } - fn sync_pinned_list_from_config(&mut self) { - for item in self.pinned_list.drain(..) { - if !item.toplevels.is_empty() { - self.active_list.push(item); - } - } - - self.pinned_list = find_desktop_entries(&self.desktop_entries, &self.config.favorites) - .zip(&self.config.favorites) - .map(|(de, original_id)| { - if let Some(p) = self - .active_list - .iter() - .position(|dock_item| dock_item.desktop_info.id() == de.id()) - { - let mut d = self.active_list.remove(p); - d.desktop_info = de.clone(); - d.original_app_id.clone_from(original_id); - d - } else { - self.item_ctr += 1; - DockItem { - id: self.item_ctr, - toplevels: Vec::new(), - desktop_info: de.clone(), - original_app_id: original_id.clone(), - } - } - }) - .collect(); - } - /// Close any open popups. fn close_popups(&mut self) -> Task> { let mut commands = Vec::new(); if let Some(popup) = self.popup.take() { - if popup.popup_type == PopupType::LauncherEditor { - self.launcher_edit = None; - } commands.push(destroy_popup(popup.id)); } if let Some(popup) = self.overflow_active_popup.take() { @@ -1411,198 +1068,6 @@ impl cosmic::Application for CosmicAppList { return destroy_popup(popup_id); } } - Message::EditLauncher(id) => { - let Some(dock_item) = self.pinned_list.iter().find(|t| t.id == id).cloned() else { - return Task::none(); - }; - let Some(exec) = dock_item.desktop_info.exec() else { - return Task::none(); - }; - let Some(existing_popup) = self.popup.as_mut() else { - return Task::none(); - }; - - let original_name = dock_item - .desktop_info - .desktop_entry("Name") - .map(ToString::to_string) - .or_else(|| { - dock_item - .desktop_info - .name(&self.locales) - .map(Cow::into_owned) - }) - .unwrap_or_else(|| dock_item.original_app_id.clone()); - let original_exec = exec.to_string(); - let original_icon = dock_item - .desktop_info - .icon() - .unwrap_or_default() - .to_string(); - let icon_theme = cosmic::icon_theme::default(); - - self.launcher_edit = Some(LauncherEditState { - original_app_id: dock_item.original_app_id.clone(), - source_path: dock_item.desktop_info.path.clone(), - original_name: original_name.clone(), - original_exec: original_exec.clone(), - name: original_name, - exec: original_exec, - icon: original_icon.clone(), - terminal: dock_item.desktop_info.terminal(), - saving: false, - error: None, - icon_catalog: IconCatalogState { - theme: icon_theme.clone(), - query: String::new(), - entries: Vec::new(), - loading: true, - truncated: false, - }, - }); - - existing_popup.dock_item = dock_item; - existing_popup.popup_type = PopupType::LauncherEditor; - - return Task::perform( - icon_catalog::load_icon_catalog(icon_theme, original_icon), - |catalog| cosmic::Action::App(Message::LauncherIconCatalogLoaded(catalog)), - ); - } - Message::LauncherNameChanged(name) => { - if let Some(edit) = self.launcher_edit.as_mut() - && !edit.saving - { - edit.name = name; - edit.error = None; - } - } - Message::LauncherExecChanged(exec) => { - if let Some(edit) = self.launcher_edit.as_mut() - && !edit.saving - { - edit.exec = exec; - edit.error = None; - } - } - Message::LauncherIconChanged(icon) => { - if let Some(edit) = self.launcher_edit.as_mut() - && !edit.saving - { - edit.icon = icon; - edit.error = None; - } - } - Message::LauncherIconSearchChanged(query) => { - if let Some(edit) = self.launcher_edit.as_mut() { - edit.icon_catalog.query = query; - } - } - Message::LauncherIconSelected(icon) => { - if let Some(edit) = self.launcher_edit.as_mut() - && !edit.saving - { - edit.icon = icon; - edit.error = None; - } - } - Message::ReloadLauncherIconCatalog => { - if let Some(edit) = self.launcher_edit.as_mut() { - edit.icon_catalog.theme = cosmic::icon_theme::default(); - edit.icon_catalog.entries.clear(); - edit.icon_catalog.loading = true; - edit.icon_catalog.truncated = false; - - return Task::perform( - icon_catalog::load_icon_catalog( - edit.icon_catalog.theme.clone(), - edit.icon.clone(), - ), - |catalog| cosmic::Action::App(Message::LauncherIconCatalogLoaded(catalog)), - ); - } - } - Message::LauncherIconCatalogLoaded(catalog) => { - if let Some(edit) = self.launcher_edit.as_mut() - && edit.icon_catalog.theme == catalog.theme - { - edit.icon_catalog.entries = catalog.entries; - edit.icon_catalog.loading = false; - edit.icon_catalog.truncated = catalog.truncated; - } - } - Message::SaveLauncherEdit => { - let Some(edit) = self.launcher_edit.as_mut() else { - return Task::none(); - }; - if edit.saving { - return Task::none(); - } - if let Err(error) = - launcher_edit::validate_launcher_fields(&edit.name, &edit.exec, &edit.icon) - { - edit.error = Some(error); - return Task::none(); - } - - let request = LauncherEditRequest { - current_app_id: edit.original_app_id.clone(), - source_path: edit.source_path.clone(), - name: edit.name.clone(), - exec: edit.exec.clone(), - icon: edit.icon.clone(), - terminal: edit.terminal, - replace_localized_name: edit.name.trim() != edit.original_name.trim(), - disable_dbus_activation: edit.exec.trim() != edit.original_exec.trim(), - }; - - edit.saving = true; - edit.error = None; - - return Task::perform(launcher_edit::save_launcher_edit(request), |result| { - cosmic::Action::App(Message::LauncherEditSaved(result)) - }); - } - Message::CancelLauncherEdit => { - return self.close_popups(); - } - Message::LauncherEditSaved(result) => match result { - Ok(result) => { - tracing::info!( - app_id = result.new_app_id, - path = ?result.path, - "saved editable launcher" - ); - - let mut favorites = self.config.favorites.clone(); - let mut favorites_changed = false; - for favorite in &mut favorites { - if *favorite == result.old_app_id && *favorite != result.new_app_id { - *favorite = result.new_app_id.clone(); - favorites_changed = true; - } - } - - if favorites_changed { - self.config.update_pinned( - favorites.clone(), - &Config::new(APP_ID, AppListConfig::VERSION).unwrap(), - ); - self.config.favorites = favorites; - } - - self.update_desktop_entries(); - self.sync_pinned_list_from_config(); - self.launcher_edit = None; - return self.close_popups(); - } - Err(error) => { - if let Some(edit) = self.launcher_edit.as_mut() { - edit.saving = false; - edit.error = Some(error); - } - } - }, Message::Activate(handle) => { if let Some(tx) = self.wayland_sender.as_ref() { let _ = tx.send(WaylandRequest::Toplevel(ToplevelRequest::Activate(handle))); @@ -2055,9 +1520,6 @@ impl cosmic::Application for CosmicAppList { }, Message::ClosePopup => { if let Some(p) = self.popup.take() { - if p.popup_type == PopupType::LauncherEditor { - self.launcher_edit = None; - } return destroy_popup(p.id); } } @@ -2072,16 +1534,42 @@ impl cosmic::Application for CosmicAppList { } Message::ConfigUpdated(config) => { self.config = config; - self.update_desktop_entries(); - self.sync_pinned_list_from_config(); + // drain to active list + for item in self.pinned_list.drain(..) { + if !item.toplevels.is_empty() { + self.active_list.push(item); + } + } + + // pull back configured items into the favorites list + self.pinned_list = + find_desktop_entries(&self.desktop_entries, &self.config.favorites) + .zip(&self.config.favorites) + .map(|(de, original_id)| { + if let Some(p) = self + .active_list + .iter() + // match using heuristic id + .position(|dock_item| dock_item.desktop_info.id() == de.id()) + { + let mut d = self.active_list.remove(p); + // but use the id from the config + d.original_app_id.clone_from(original_id); + d + } else { + self.item_ctr += 1; + DockItem { + id: self.item_ctr, + toplevels: Vec::new(), + desktop_info: de.clone(), + original_app_id: original_id.clone(), + } + } + }) + .collect(); } Message::CloseRequested(id) => { - if let Some(popup) = &self.popup - && popup.id == id - { - if popup.popup_type == PopupType::LauncherEditor { - self.launcher_edit = None; - } + if Some(id) == self.popup.as_ref().map(|p| p.id) { self.popup = None; } if self.overflow_active_popup.is_some_and(|p| p == id) { @@ -2094,52 +1582,6 @@ impl cosmic::Application for CosmicAppList { Message::GpuRequest(gpus) => { self.gpus = gpus; } - Message::DockItemHover(id) => { - self.hovered_dock_item = id; - // Seed the animated center on the very first hover so - // the bell doesn't "fly in" from (0,0). - if self.anim_hover_center.is_none() - && let Some(hovered_id) = self.hovered_dock_item.as_ref() - && let Some(r) = self.rectangles.get(hovered_id) - { - self.anim_hover_center = Some(( - r.x + r.width / 2.0, - r.y + r.height / 2.0, - )); - } - } - Message::AnimTick(now) => { - // dt-based exponential smoothing: reach ~99% of the - // target in ~120ms at 60fps (about 7 ticks). - let dt = self - .anim_last_tick - .map(|prev| now.saturating_duration_since(prev).as_secs_f32()) - .unwrap_or(0.016) - .min(0.1); // clamp so a long pause doesn't snap - self.anim_last_tick = Some(now); - - // Intensity: target 1.0 when any icon is hovered, 0.0 else. - let intensity_target = if self.hovered_dock_item.is_some() { 1.0 } else { 0.0 }; - let tau = 0.060_f32; // time-constant (s); smaller = snappier - let alpha = 1.0 - (-dt / tau).exp(); - self.anim_hover_intensity += (intensity_target - self.anim_hover_intensity) * alpha; - - // Hovered-center smoothing: chase the real rect's center. - if let Some(hovered_id) = self.hovered_dock_item.as_ref() - && let Some(r) = self.rectangles.get(hovered_id) - { - let target = (r.x + r.width / 2.0, r.y + r.height / 2.0); - let current = self.anim_hover_center.unwrap_or(target); - self.anim_hover_center = Some(( - current.0 + (target.0 - current.0) * alpha, - current.1 + (target.1 - current.1) * alpha, - )); - } else if self.anim_hover_intensity < 0.01 { - // Nothing hovered + intensity faded out → forget the - // animated center so the next hover seeds fresh. - self.anim_hover_center = None; - } - } Message::OpenActive => { let create_new = self.overflow_active_popup.is_none(); let mut cmds = vec![self.close_popups()]; @@ -2321,9 +1763,7 @@ impl cosmic::Application for CosmicAppList { .filter(|(info, _)| self.is_on_current_monitor_and_workspace(info)) .any(|y| focused_item.contains(&y.0.foreign_toplevel)); - let dock_id = dock_item.id; - let icon_scale = self.icon_scale_for(&DockItemId::from(dock_id)); - let tooltip = self.core + self.core .applet .applet_tooltip::( dock_item.as_icon( @@ -2336,7 +1776,6 @@ impl cosmic::Application for CosmicAppList { dot_radius, self.core.main_window_id().unwrap(), Some(&|info| self.is_on_current_monitor_and_workspace(info)), - icon_scale, ), dock_item .desktop_info @@ -2346,10 +1785,7 @@ impl cosmic::Application for CosmicAppList { self.popup.is_some(), Message::Surface, None, - ); - cosmic::widget::mouse_area(tooltip) - .on_enter(Message::DockItemHover(Some(DockItemId::from(dock_id)))) - .on_exit(Message::DockItemHover(None)) + ) .into() }) .collect(); @@ -2400,10 +1836,6 @@ impl cosmic::Application for CosmicAppList { dot_radius, self.core.main_window_id().unwrap(), Some(&|info| self.is_on_current_monitor_and_workspace(info)), - // Yoda: no magnification on DnD-preview icons — these - // float around as the user drags, so static 1.0 is - // less visually confusing. - 1.0, ), ); } else if self.is_listening_for_dnd && self.pinned_list.is_empty() { @@ -2443,10 +1875,8 @@ impl cosmic::Application for CosmicAppList { .iter() .filter(|(info, _)| self.is_on_current_monitor_and_workspace(info)) .any(|y| focused_item.contains(&y.0.foreign_toplevel)); - let dock_id = dock_item.id; - let icon_scale = self.icon_scale_for(&DockItemId::from(dock_id)); - let tooltip = self.core + self.core .applet .applet_tooltip( dock_item.as_icon( @@ -2459,7 +1889,6 @@ impl cosmic::Application for CosmicAppList { dot_radius, self.core.main_window_id().unwrap(), Some(&|info| self.is_on_current_monitor_and_workspace(info)), - icon_scale, ), dock_item .desktop_info @@ -2469,10 +1898,7 @@ impl cosmic::Application for CosmicAppList { self.popup.is_some(), Message::Surface, None, - ); - cosmic::widget::mouse_area(tooltip) - .on_enter(Message::DockItemHover(Some(DockItemId::from(dock_id)))) - .on_exit(Message::DockItemHover(None)) + ) .into() }) .collect(); @@ -2753,19 +2179,6 @@ impl cosmic::Application for CosmicAppList { }), ); - if is_pinned && desktop_info.exec().is_some() { - content = content.push( - menu_button( - row![ - icon::icon(from_name("edit-symbolic").into()).size(16), - text::body(fl!("edit-launcher")) - ] - .spacing(8), - ) - .on_press(Message::EditLauncher(*id)), - ); - } - if !toplevels.is_empty() { content = content.push(divider::horizontal::light()); content = match toplevels.len() { @@ -2812,84 +2225,6 @@ impl cosmic::Application for CosmicAppList { ) .into() } - PopupType::LauncherEditor => { - let Some(edit) = self.launcher_edit.as_ref() else { - return text::body("").into(); - }; - - let spacing = theme::spacing(); - let can_save = !edit.saving - && launcher_edit::validate_launcher_fields( - &edit.name, &edit.exec, &edit.icon, - ) - .is_ok(); - - let mut form = column![ - text::title4(fl!("edit-launcher")), - text_input("", edit.name.as_str()) - .label(fl!("launcher-name")) - .on_input(Message::LauncherNameChanged) - .on_submit(|_| Message::SaveLauncherEdit) - .width(Length::Fill) - .size(14), - text_input("", edit.exec.as_str()) - .label(fl!("launcher-command")) - .on_input(Message::LauncherExecChanged) - .on_submit(|_| Message::SaveLauncherEdit) - .width(Length::Fill) - .size(14), - launcher_icon_editor(edit), - ] - .spacing(spacing.space_s) - .width(Length::Fill); - - if let Some(error) = edit.error.as_ref() { - form = form.push(text::caption(error.as_str()).class( - cosmic::theme::Text::Color(theme.cosmic().destructive_color().into()), - )); - } - - let cancel = - button::custom(text::body(fl!("cancel")).center().width(Length::Fill)) - .on_press_maybe(if edit.saving { - None - } else { - Some(Message::CancelLauncherEdit) - }) - .padding([spacing.space_xxs, spacing.space_s]) - .width(142); - - let save = button::custom(text::body(fl!("save")).center().width(Length::Fill)) - .class(Button::Suggested) - .on_press_maybe(if can_save { - Some(Message::SaveLauncherEdit) - } else { - None - }) - .padding([spacing.space_xxs, spacing.space_s]) - .width(142); - - let actions = row![horizontal_space(), cancel, save] - .spacing(spacing.space_xxs) - .align_y(Alignment::Center); - - let content = column![form, actions] - .spacing(spacing.space_m) - .padding(spacing.space_m) - .width(Length::Fill); - - self.core - .applet - .popup_container(container(content).width(Length::Fill)) - .limits( - Limits::NONE - .min_width(480.) - .min_height(1.) - .max_width(520.) - .max_height(1000.), - ) - .into() - } PopupType::ToplevelList => match self.core.applet.anchor { PanelAnchor::Left | PanelAnchor::Right => { let mut content = @@ -2978,10 +2313,6 @@ impl cosmic::Application for CosmicAppList { dot_radius, id, Some(&|info| self.is_on_current_monitor_and_workspace(info)), - // Yoda: icons in the overflow popup are - // already smaller-grid — keep them at 1.0 - // so the popup doesn't reshuffle on hover. - 1.0, ), dock_item .desktop_info @@ -3090,10 +2421,6 @@ impl cosmic::Application for CosmicAppList { dot_radius, id, Some(&|info| self.is_on_current_monitor_and_workspace(info)), - // Yoda: popup icons stay at 1.0 (hover - // magnification is applied to the main - // dock row only). - 1.0, ), dock_item .desktop_info @@ -3152,21 +2479,7 @@ impl cosmic::Application for CosmicAppList { } fn subscription(&self) -> Subscription { - // Yoda: ~60fps animation ticks for the fisheye magnification. - // Only emitted when an animation is actually in progress (hover - // intensity >0 OR still fading out) — keeps the panel idle when - // the pointer is nowhere near the dock. - let anim_active = self.hovered_dock_item.is_some() - || self.anim_hover_intensity > 0.001; - let anim_subscription = if anim_active { - cosmic::iced::time::every(std::time::Duration::from_millis(16)) - .map(Message::AnimTick) - } else { - Subscription::none() - }; - Subscription::batch([ - anim_subscription, wayland_subscription().map(Message::Wayland), listen_with(|e, _, id| match e { cosmic::iced::core::Event::PlatformSpecific(event::PlatformSpecific::Wayland( diff --git a/cosmic-app-list/src/icon_catalog.rs b/cosmic-app-list/src/icon_catalog.rs deleted file mode 100644 index 2cb05e1a..00000000 --- a/cosmic-app-list/src/icon_catalog.rs +++ /dev/null @@ -1,440 +0,0 @@ -use std::{ - cmp::Ordering, - collections::{HashMap, HashSet, VecDeque}, - fs, - path::{Component, Path, PathBuf}, -}; - -const FALLBACK_THEMES: &[&str] = &["Cosmic", "hicolor", "gnome", "Yaru"]; -const MAX_THEME_CHAIN: usize = 24; -const MAX_SCAN_DEPTH: usize = 5; -const MAX_CATALOG_ENTRIES: usize = 2_500; - -#[derive(Debug, Clone)] -pub struct IconCatalog { - pub theme: String, - pub entries: Vec, - pub truncated: bool, -} - -#[derive(Debug, Clone)] -pub struct IconCatalogEntry { - pub name: String, -} - -#[derive(Debug, Clone, Eq, PartialEq)] -struct CandidateRank { - preferred: u8, - category: u8, - symbolic: u8, - theme_depth: usize, - extension: u8, -} - -impl Ord for CandidateRank { - fn cmp(&self, other: &Self) -> Ordering { - ( - self.preferred, - self.category, - self.symbolic, - self.theme_depth, - self.extension, - ) - .cmp(&( - other.preferred, - other.category, - other.symbolic, - other.theme_depth, - other.extension, - )) - } -} - -impl PartialOrd for CandidateRank { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -#[derive(Debug, Clone)] -struct Candidate { - name: String, - rank: CandidateRank, -} - -pub async fn load_icon_catalog(theme: String, preferred_icon: String) -> IconCatalog { - build_icon_catalog(theme, preferred_icon) -} - -fn build_icon_catalog(theme: String, preferred_icon: String) -> IconCatalog { - let theme = if theme.trim().is_empty() { - "Cosmic".to_string() - } else { - theme - }; - let preferred_name = icon_name_from_value(preferred_icon.trim()); - let theme_chain = theme_chain(&theme); - let mut candidates = HashMap::new(); - - for (theme_depth, theme_name) in theme_chain.iter().enumerate() { - for theme_dir in theme_dirs(theme_name) { - scan_icon_tree( - &theme_dir, - theme_depth, - preferred_name.as_deref(), - &mut candidates, - ); - } - } - - for pixmap_dir in pixmap_dirs() { - scan_icon_tree( - &pixmap_dir, - theme_chain.len() + 1, - preferred_name.as_deref(), - &mut candidates, - ); - } - - let mut entries = candidates.into_values().collect::>(); - entries.sort_by(|a, b| a.rank.cmp(&b.rank).then_with(|| a.name.cmp(&b.name))); - - let truncated = entries.len() > MAX_CATALOG_ENTRIES; - entries.truncate(MAX_CATALOG_ENTRIES); - - IconCatalog { - theme, - entries: entries - .into_iter() - .map(|candidate| IconCatalogEntry { - name: candidate.name, - }) - .collect(), - truncated, - } -} - -fn theme_chain(theme: &str) -> Vec { - let mut queue = VecDeque::from([theme.to_string()]); - let mut seen = HashSet::new(); - let mut chain = Vec::new(); - - while let Some(theme_name) = queue.pop_front() { - let key = theme_name.to_ascii_lowercase(); - if !seen.insert(key) { - continue; - } - - chain.push(theme_name.clone()); - if chain.len() >= MAX_THEME_CHAIN { - break; - } - - for parent in read_theme_inherits(&theme_name) { - queue.push_back(parent); - } - } - - for fallback in FALLBACK_THEMES { - if chain.len() >= MAX_THEME_CHAIN { - break; - } - let key = fallback.to_ascii_lowercase(); - if seen.insert(key) { - chain.push((*fallback).to_string()); - } - } - - chain -} - -fn read_theme_inherits(theme: &str) -> Vec { - theme_dirs(theme) - .into_iter() - .find_map(|dir| fs::read_to_string(dir.join("index.theme")).ok()) - .map(|contents| parse_inherits(&contents)) - .unwrap_or_default() -} - -fn parse_inherits(contents: &str) -> Vec { - let mut in_icon_theme = false; - - for raw_line in contents.lines() { - let line = raw_line.trim(); - if line.is_empty() || line.starts_with('#') { - continue; - } - - if line.starts_with('[') && line.ends_with(']') { - in_icon_theme = line == "[Icon Theme]"; - continue; - } - - if in_icon_theme && let Some(value) = line.strip_prefix("Inherits=") { - return value - .split(',') - .map(str::trim) - .filter(|value| !value.is_empty()) - .map(ToOwned::to_owned) - .collect(); - } - } - - Vec::new() -} - -fn scan_icon_tree( - root: &Path, - theme_depth: usize, - preferred_name: Option<&str>, - candidates: &mut HashMap, -) { - let mut stack = vec![(root.to_path_buf(), 0usize)]; - - while let Some((dir, depth)) = stack.pop() { - if depth > MAX_SCAN_DEPTH { - continue; - } - - let Ok(entries) = fs::read_dir(&dir) else { - continue; - }; - - for entry in entries.filter_map(Result::ok) { - let path = entry.path(); - let Ok(file_type) = entry.file_type() else { - continue; - }; - - if file_type.is_dir() { - stack.push((path, depth + 1)); - } else if (file_type.is_file() || file_type.is_symlink()) - && let Some(candidate) = candidate_from_path(&path, theme_depth, preferred_name) - { - insert_candidate(candidates, candidate); - } - } - } -} - -fn insert_candidate(candidates: &mut HashMap, candidate: Candidate) { - let key = candidate.name.to_ascii_lowercase(); - match candidates.get_mut(&key) { - Some(existing) if candidate.rank < existing.rank => { - *existing = candidate; - } - None => { - candidates.insert(key, candidate); - } - _ => {} - } -} - -fn candidate_from_path( - path: &Path, - theme_depth: usize, - preferred_name: Option<&str>, -) -> Option { - let extension = extension_rank(path)?; - let name = path.file_stem()?.to_str()?.trim(); - if name.is_empty() { - return None; - } - - let symbolic = u8::from(name.ends_with("-symbolic") || path_has_component(path, "symbolic")); - let preferred = u8::from(preferred_name != Some(name)); - - Some(Candidate { - name: name.to_string(), - rank: CandidateRank { - preferred, - category: category_rank(path), - symbolic, - theme_depth, - extension, - }, - }) -} - -fn extension_rank(path: &Path) -> Option { - match path.extension()?.to_str()?.to_ascii_lowercase().as_str() { - "svg" => Some(0), - "png" => Some(1), - "xpm" => Some(2), - _ => None, - } -} - -fn category_rank(path: &Path) -> u8 { - for component in path.components().filter_map(component_str) { - match component { - "apps" | "applications" => return 0, - "categories" => return 1, - "places" => return 2, - "devices" => return 3, - "mimetypes" => return 4, - "actions" => return 5, - "status" => return 6, - _ => {} - } - } - - 7 -} - -fn path_has_component(path: &Path, needle: &str) -> bool { - path.components() - .filter_map(component_str) - .any(|component| component == needle) -} - -fn component_str(component: Component<'_>) -> Option<&str> { - component.as_os_str().to_str() -} - -fn icon_name_from_value(value: &str) -> Option { - if value.is_empty() { - return None; - } - - let path = Path::new(value); - if value.contains('/') { - return path - .file_stem() - .and_then(|name| name.to_str()) - .map(ToOwned::to_owned); - } - - path.file_stem() - .and_then(|name| name.to_str()) - .map(ToOwned::to_owned) - .or_else(|| Some(value.to_string())) -} - -fn theme_dirs(theme: &str) -> Vec { - icon_base_dirs() - .into_iter() - .map(|base| base.join(theme)) - .filter(|path| path.is_dir()) - .collect() -} - -fn icon_base_dirs() -> Vec { - let mut dirs = Vec::new(); - - if let Some(home) = std::env::home_dir() { - push_existing_unique(&mut dirs, home.join(".icons")); - } - - if let Some(data_home) = xdg_data_home() { - push_existing_unique(&mut dirs, data_home.join("icons")); - } - - for data_dir in xdg_data_dirs() { - push_existing_unique(&mut dirs, data_dir.join("icons")); - } - - dirs -} - -fn pixmap_dirs() -> Vec { - let mut dirs = Vec::new(); - - if let Some(data_home) = xdg_data_home() { - push_existing_unique(&mut dirs, data_home.join("pixmaps")); - } - - for data_dir in xdg_data_dirs() { - push_existing_unique(&mut dirs, data_dir.join("pixmaps")); - } - - push_existing_unique(&mut dirs, PathBuf::from("/usr/share/pixmaps")); - dirs -} - -fn xdg_data_home() -> Option { - std::env::var_os("XDG_DATA_HOME") - .filter(|value| !value.is_empty()) - .map(PathBuf::from) - .or_else(|| std::env::home_dir().map(|home| home.join(".local/share"))) -} - -fn xdg_data_dirs() -> Vec { - std::env::var_os("XDG_DATA_DIRS") - .filter(|value| !value.is_empty()) - .map(|value| std::env::split_paths(&value).collect()) - .unwrap_or_else(|| { - vec![ - PathBuf::from("/usr/local/share"), - PathBuf::from("/usr/share"), - ] - }) -} - -fn push_existing_unique(dirs: &mut Vec, path: PathBuf) { - if path.exists() && !dirs.iter().any(|existing| existing == &path) { - dirs.push(path); - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn parses_inherits_only_from_icon_theme_section() { - let contents = r#" -[Other] -Inherits=Wrong - -[Icon Theme] -Name=Demo -Inherits=Cosmic, hicolor , Adwaita -"#; - - assert_eq!(parse_inherits(contents), ["Cosmic", "hicolor", "Adwaita"]); - } - - #[test] - fn normalizes_icon_names_from_plain_names_and_paths() { - assert_eq!(icon_name_from_value("firefox").as_deref(), Some("firefox")); - assert_eq!( - icon_name_from_value("/usr/share/icons/hicolor/scalable/apps/firefox.svg").as_deref(), - Some("firefox") - ); - } - - #[test] - fn keeps_the_best_duplicate_candidate() { - let mut candidates = HashMap::new(); - insert_candidate( - &mut candidates, - Candidate { - name: "demo".to_string(), - rank: CandidateRank { - preferred: 1, - category: 7, - symbolic: 1, - theme_depth: 4, - extension: 2, - }, - }, - ); - insert_candidate( - &mut candidates, - Candidate { - name: "demo".to_string(), - rank: CandidateRank { - preferred: 0, - category: 0, - symbolic: 0, - theme_depth: 0, - extension: 0, - }, - }, - ); - - assert_eq!(candidates["demo"].rank.preferred, 0); - assert_eq!(candidates["demo"].rank.category, 0); - } -} diff --git a/cosmic-app-list/src/launcher_edit.rs b/cosmic-app-list/src/launcher_edit.rs deleted file mode 100644 index c354e1e6..00000000 --- a/cosmic-app-list/src/launcher_edit.rs +++ /dev/null @@ -1,378 +0,0 @@ -// Copyright 2026 System76 -// SPDX-License-Identifier: GPL-3.0-only - -use std::{ - env, - ffi::OsString, - io::ErrorKind, - path::{Path, PathBuf}, -}; - -use tokio::fs; - -#[derive(Clone, Debug)] -pub struct LauncherEditRequest { - pub current_app_id: String, - pub source_path: PathBuf, - pub name: String, - pub exec: String, - pub icon: String, - pub terminal: bool, - pub replace_localized_name: bool, - pub disable_dbus_activation: bool, -} - -#[derive(Clone, Debug)] -pub struct LauncherEditResult { - pub old_app_id: String, - pub new_app_id: String, - pub path: PathBuf, -} - -#[derive(Clone, Debug)] -struct ValidLauncherEdit { - current_app_id: String, - source_path: PathBuf, - name: String, - exec: String, - icon: String, - terminal: bool, - replace_localized_name: bool, - disable_dbus_activation: bool, -} - -pub fn validate_launcher_fields(name: &str, exec: &str, icon: &str) -> Result<(), String> { - validate_required("Name", name)?; - validate_required("Command", exec)?; - validate_optional("Icon", icon)?; - Ok(()) -} - -pub async fn save_launcher_edit( - request: LauncherEditRequest, -) -> Result { - let request = validate_request(request)?; - let (new_app_id, target_path) = - target_launcher_path(&request.current_app_id, &request.source_path)?; - - let source = read_source_desktop_entry(&request).await?; - let rendered = render_editable_desktop_entry(&source, &request); - - let Some(parent) = target_path.parent() else { - return Err("Desktop file target has no parent directory".to_string()); - }; - - fs::create_dir_all(parent) - .await - .map_err(|err| format!("Could not create applications directory: {err}"))?; - - let tmp_path = temporary_path(&target_path)?; - fs::write(&tmp_path, rendered) - .await - .map_err(|err| format!("Could not write temporary desktop file: {err}"))?; - - if let Err(err) = fs::rename(&tmp_path, &target_path).await { - let _ = fs::remove_file(&tmp_path).await; - return Err(format!("Could not install desktop file: {err}")); - } - - Ok(LauncherEditResult { - old_app_id: request.current_app_id, - new_app_id, - path: target_path, - }) -} - -fn validate_request(request: LauncherEditRequest) -> Result { - let name = validate_required("Name", &request.name)?; - let exec = validate_required("Command", &request.exec)?; - let icon = validate_optional("Icon", &request.icon)?; - - Ok(ValidLauncherEdit { - current_app_id: request.current_app_id, - source_path: request.source_path, - name, - exec, - icon, - terminal: request.terminal, - replace_localized_name: request.replace_localized_name, - disable_dbus_activation: request.disable_dbus_activation, - }) -} - -fn validate_required(label: &str, value: &str) -> Result { - let value = validate_optional(label, value)?; - if value.is_empty() { - return Err(format!("{label} cannot be empty")); - } - Ok(value) -} - -fn validate_optional(label: &str, value: &str) -> Result { - if value.contains('\0') || value.contains('\n') || value.contains('\r') { - return Err(format!("{label} cannot contain line breaks")); - } - Ok(value.trim().to_string()) -} - -async fn read_source_desktop_entry(request: &ValidLauncherEdit) -> Result { - if request.source_path.as_os_str().is_empty() { - return Ok(minimal_desktop_entry()); - } - - match fs::read_to_string(&request.source_path).await { - Ok(source) => Ok(source), - Err(err) if err.kind() == ErrorKind::NotFound => Ok(minimal_desktop_entry()), - Err(err) => Err(format!("Could not read source desktop file: {err}")), - } -} - -fn minimal_desktop_entry() -> String { - "[Desktop Entry]\nType=Application\n".to_string() -} - -fn user_applications_dir() -> Result { - if let Some(xdg_data_home) = env::var_os("XDG_DATA_HOME").filter(|value| !value.is_empty()) { - return Ok(PathBuf::from(xdg_data_home).join("applications")); - } - - let Some(home) = env::var_os("HOME").filter(|value| !value.is_empty()) else { - return Err("Neither XDG_DATA_HOME nor HOME is set".to_string()); - }; - - Ok(PathBuf::from(home).join(".local/share/applications")) -} - -fn target_launcher_path(app_id: &str, source_path: &Path) -> Result<(String, PathBuf), String> { - let applications_dir = user_applications_dir()?; - if source_path.starts_with(&applications_dir) { - return Ok((app_id.to_string(), source_path.to_path_buf())); - } - - let desktop_id = normalize_desktop_id(app_id)?; - Ok(( - desktop_id.clone(), - applications_dir.join(format!("{desktop_id}.desktop")), - )) -} - -fn normalize_desktop_id(app_id: &str) -> Result { - if app_id.contains('\0') || app_id.contains('\n') || app_id.contains('\r') { - return Err("Desktop ID cannot contain line breaks".to_string()); - } - - let desktop_id = app_id - .chars() - .map(|c| if c == '/' { '-' } else { c }) - .collect::(); - - if desktop_id.trim().is_empty() { - return Err("Desktop ID cannot be empty".to_string()); - } - - Ok(desktop_id) -} - -fn temporary_path(target_path: &Path) -> Result { - let Some(file_name) = target_path.file_name() else { - return Err("Desktop file target has no filename".to_string()); - }; - - let mut tmp_file_name = OsString::from("."); - tmp_file_name.push(file_name); - tmp_file_name.push(format!(".tmp-{}", std::process::id())); - - Ok(target_path.with_file_name(tmp_file_name)) -} - -fn render_editable_desktop_entry(source: &str, request: &ValidLauncherEdit) -> String { - let mut updates = vec![ - ("Type", "Application".to_string()), - ("Name", request.name.clone()), - ("Exec", request.exec.clone()), - ("Icon", request.icon.clone()), - ( - "Terminal", - if request.terminal { "true" } else { "false" }.to_string(), - ), - ("X-COSMIC-UserEditable", "true".to_string()), - ("X-COSMIC-SourceDesktopId", request.current_app_id.clone()), - ]; - - if !request.source_path.as_os_str().is_empty() { - updates.push(( - "X-COSMIC-SourceDesktopPath", - request.source_path.to_string_lossy().to_string(), - )); - } - - if request.disable_dbus_activation { - updates.push(("DBusActivatable", "false".to_string())); - } - - set_desktop_entry_keys( - source, - &updates, - request.replace_localized_name, - request.disable_dbus_activation, - ) -} - -fn set_desktop_entry_keys( - source: &str, - updates: &[(&str, String)], - replace_localized_name: bool, - remove_try_exec: bool, -) -> String { - let mut out = Vec::new(); - let mut seen = vec![false; updates.len()]; - let mut in_desktop_entry = false; - let mut saw_desktop_entry = false; - - for line in source.lines() { - if let Some(section) = section_name(line) { - if in_desktop_entry { - insert_missing_keys(&mut out, updates, &seen); - } - - in_desktop_entry = section == "Desktop Entry"; - saw_desktop_entry |= in_desktop_entry; - if in_desktop_entry { - seen.fill(false); - } - - out.push(line.to_string()); - continue; - } - - if in_desktop_entry && let Some(key) = desktop_entry_key(line) { - if replace_localized_name && key.starts_with("Name[") { - continue; - } - - if remove_try_exec && key == "TryExec" { - continue; - } - - if let Some(index) = updates - .iter() - .position(|(update_key, _)| *update_key == key) - { - out.push(format!("{}={}", updates[index].0, updates[index].1)); - seen[index] = true; - continue; - } - } - - out.push(line.to_string()); - } - - if in_desktop_entry { - insert_missing_keys(&mut out, updates, &seen); - } - - if !saw_desktop_entry { - let mut with_desktop_entry = Vec::with_capacity(out.len() + updates.len() + 2); - with_desktop_entry.push("[Desktop Entry]".to_string()); - insert_missing_keys( - &mut with_desktop_entry, - updates, - &vec![false; updates.len()], - ); - if !out.is_empty() { - with_desktop_entry.push(String::new()); - with_desktop_entry.extend(out); - } - out = with_desktop_entry; - } - - let mut rendered = out.join("\n"); - rendered.push('\n'); - rendered -} - -fn insert_missing_keys(out: &mut Vec, updates: &[(&str, String)], seen: &[bool]) { - for (index, (key, value)) in updates.iter().enumerate() { - if !seen[index] { - out.push(format!("{key}={value}")); - } - } -} - -fn section_name(line: &str) -> Option<&str> { - let trimmed = line.trim(); - trimmed - .strip_prefix('[') - .and_then(|value| value.strip_suffix(']')) -} - -fn desktop_entry_key(line: &str) -> Option<&str> { - let line = line.trim_start(); - if line.starts_with('#') || line.starts_with(';') { - return None; - } - - line.split_once('=').map(|(key, _)| key.trim_end()) -} - -#[cfg(test)] -mod tests { - use super::*; - - fn request() -> ValidLauncherEdit { - ValidLauncherEdit { - current_app_id: "org.example.App".to_string(), - source_path: PathBuf::from("/usr/share/applications/org.example.App.desktop"), - name: "Example".to_string(), - exec: "example --new".to_string(), - icon: "example-custom".to_string(), - terminal: false, - replace_localized_name: true, - disable_dbus_activation: true, - } - } - - #[test] - fn updates_desktop_entry_without_dropping_action_groups() { - let source = "\ -[Desktop Entry] -Type=Application -Name=Old -Name[fr]=Ancien -Exec=old -TryExec=old -Icon=old -DBusActivatable=true -Actions=new-window; - -[Desktop Action new-window] -Name=New Window -Exec=old --new-window -"; - - let rendered = render_editable_desktop_entry(source, &request()); - - assert!(rendered.contains("Name=Example\n")); - assert!(!rendered.contains("Name[fr]=")); - assert!(rendered.contains("Exec=example --new\n")); - assert!(rendered.contains("Icon=example-custom\n")); - assert!(rendered.contains("DBusActivatable=false\n")); - assert!(!rendered.contains("TryExec=")); - assert!(rendered.contains("[Desktop Action new-window]\n")); - assert!(rendered.contains("Exec=old --new-window\n")); - } - - #[test] - fn preserves_localized_names_when_name_is_unchanged() { - let mut edit = request(); - edit.replace_localized_name = false; - - let rendered = render_editable_desktop_entry( - "[Desktop Entry]\nName=Example\nName[fr]=Exemple\nExec=old\n", - &edit, - ); - - assert!(rendered.contains("Name=Example\n")); - assert!(rendered.contains("Name[fr]=Exemple\n")); - } -} diff --git a/cosmic-app-list/src/lib.rs b/cosmic-app-list/src/lib.rs index f6893335..51079cc4 100644 --- a/cosmic-app-list/src/lib.rs +++ b/cosmic-app-list/src/lib.rs @@ -2,8 +2,6 @@ // SPDX-License-Identifier: GPL-3.0-only mod app; -mod icon_catalog; -mod launcher_edit; mod localize; mod wayland_handler; mod wayland_subscription; diff --git a/cosmic-app-list/src/wayland_handler.rs b/cosmic-app-list/src/wayland_handler.rs index d27409dc..03c16973 100644 --- a/cosmic-app-list/src/wayland_handler.rs +++ b/cosmic-app-list/src/wayland_handler.rs @@ -388,10 +388,7 @@ impl CaptureData { }, ) .unwrap(); - if let Err(err) = self.conn.flush() { - tracing::error!("Wayland flush failed during screencopy session create: {err}"); - return None; - } + self.conn.flush().unwrap(); let formats = session .wait_while(|data| data.formats.is_none()) @@ -440,10 +437,7 @@ impl CaptureData { session: capture_session.clone(), }, ); - if let Err(err) = self.conn.flush() { - tracing::error!("Wayland flush failed during screencopy capture: {err}"); - return None; - } + self.conn.flush().unwrap(); // TODO: wait for server to release buffer? let res = session @@ -715,10 +709,7 @@ pub(crate) fn wayland_handler( if app_data.exit { break; } - if let Err(err) = event_loop.dispatch(None, &mut app_data) { - tracing::error!("Wayland event loop terminated: {err}"); - break; - } + event_loop.dispatch(None, &mut app_data).unwrap(); } } diff --git a/cosmic-applet-a11y/Cargo.toml b/cosmic-applet-a11y/Cargo.toml index d3550f60..a5bb12b4 100644 --- a/cosmic-applet-a11y/Cargo.toml +++ b/cosmic-applet-a11y/Cargo.toml @@ -9,7 +9,7 @@ cctk.workspace = true cosmic-protocols.workspace = true i18n-embed-fl.workspace = true i18n-embed.workspace = true -cosmic.workspace = true +libcosmic.workspace = true rust-embed.workspace = true tokio.workspace = true tracing-log.workspace = true @@ -17,7 +17,9 @@ tracing-subscriber.workspace = true tracing.workspace = true [dependencies.cosmic-settings-a11y-manager-subscription] -path = "../../cosmic-settings/subscriptions/a11y-manager" +git = "https://github.com/pop-os/cosmic-settings" +# path = "../../cosmic-settings/subscriptions/a11y-manager" [dependencies.cosmic-settings-accessibility-subscription] -path = "../../cosmic-settings/subscriptions/accessibility" +git = "https://github.com/pop-os/cosmic-settings" +# path = "../../cosmic-settings/subscriptions/accessibility" diff --git a/cosmic-applet-a11y/i18n/el/cosmic_applet_a11y.ftl b/cosmic-applet-a11y/i18n/el/cosmic_applet_a11y.ftl index 609965b5..e69de29b 100644 --- a/cosmic-applet-a11y/i18n/el/cosmic_applet_a11y.ftl +++ b/cosmic-applet-a11y/i18n/el/cosmic_applet_a11y.ftl @@ -1,6 +0,0 @@ -screen-reader = Ανάγνωση οθόνης -invert-colors = Αναστροφή χρωμάτων -high-contrast = Υψηλή αντίθεση -settings = Ρυθμίσεις προσβασιμότητας... -magnifier = Μεγεθυντικός φακός -filter-colors = Φίλτρο χρωμάτων diff --git a/cosmic-applet-a11y/i18n/lo/cosmic_applet_a11y.ftl b/cosmic-applet-a11y/i18n/lo/cosmic_applet_a11y.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/cosmic-applet-a11y/i18n/sr/cosmic_applet_a11y.ftl b/cosmic-applet-a11y/i18n/sr/cosmic_applet_a11y.ftl index 76d163eb..e69de29b 100644 --- a/cosmic-applet-a11y/i18n/sr/cosmic_applet_a11y.ftl +++ b/cosmic-applet-a11y/i18n/sr/cosmic_applet_a11y.ftl @@ -1,6 +0,0 @@ -screen-reader = Читач екрана -invert-colors = Обрни боје -high-contrast = Високи контраст -filter-colors = Филтрирај боје -settings = Подешавања приступачности... -magnifier = Увеличавач diff --git a/cosmic-applet-a11y/src/app.rs b/cosmic-applet-a11y/src/app.rs index 6a328339..ad5f2a1e 100644 --- a/cosmic-applet-a11y/src/app.rs +++ b/cosmic-applet-a11y/src/app.rs @@ -26,9 +26,10 @@ use cosmic::{ }; use cosmic_settings_a11y_manager_subscription::{ - AccessibilityEvent, AccessibilityRequest, ColorFilter, + self as cosmic_a11y_manager, AccessibilityEvent, AccessibilityRequest, ColorFilter, }; use cosmic_settings_accessibility_subscription::{self as accessibility}; +use std::sync::LazyLock; use tokio::sync::mpsc::UnboundedSender; pub fn run() -> cosmic::iced::Result { @@ -51,7 +52,6 @@ struct CosmicA11yApplet { } #[derive(Debug, Clone)] -#[allow(dead_code)] enum Message { TogglePopup, CloseRequested(window::Id), diff --git a/cosmic-applet-a11y/src/backend/wayland/mod.rs b/cosmic-applet-a11y/src/backend/wayland/mod.rs index 12340588..fa9796f0 100644 --- a/cosmic-applet-a11y/src/backend/wayland/mod.rs +++ b/cosmic-applet-a11y/src/backend/wayland/mod.rs @@ -2,12 +2,13 @@ // SPDX-License-Identifier: GPL-3.0-only use anyhow; -use cctk::sctk::reexports::calloop::{self}; +use cctk::sctk::reexports::calloop::{self, channel::SyncSender}; use cosmic::iced::{ self, Subscription, - futures::{self, SinkExt}, + futures::{self, SinkExt, StreamExt, channel::mpsc}, stream, }; +use cosmic_protocols::a11y::v1::client::cosmic_a11y_manager_v1::Filter; use cosmic_settings_a11y_manager_subscription::{ self as thread, AccessibilityEvent, AccessibilityRequest, }; diff --git a/cosmic-applet-audio/Cargo.toml b/cosmic-applet-audio/Cargo.toml index c0554ebe..96d37cad 100644 --- a/cosmic-applet-audio/Cargo.toml +++ b/cosmic-applet-audio/Cargo.toml @@ -7,8 +7,9 @@ license = "GPL-3.0-only" [dependencies] i18n-embed-fl.workspace = true i18n-embed.workspace = true -cosmic.workspace = true -mpris2-zbus = { path = "../../dbus-settings-bindings/mpris2" } +libcosmic.workspace = true +mpris2-zbus = { git = "https://github.com/pop-os/dbus-settings-bindings" } +# mpris2-zbus = { path = "../../dbus-settings-bindings/mpris2" } rust-embed.workspace = true serde.workspace = true tokio.workspace = true @@ -20,4 +21,5 @@ urlencoding = "2.1.3" zbus.workspace = true [dependencies.cosmic-settings-sound-subscription] -path = "../../cosmic-settings/subscriptions/sound" +git = "https://github.com/pop-os/cosmic-settings" +# path = "../../cosmic-settings/subscriptions/sound" diff --git a/cosmic-applet-audio/i18n/el/cosmic_applet_audio.ftl b/cosmic-applet-audio/i18n/el/cosmic_applet_audio.ftl index 1bdfccf1..e69de29b 100644 --- a/cosmic-applet-audio/i18n/el/cosmic_applet_audio.ftl +++ b/cosmic-applet-audio/i18n/el/cosmic_applet_audio.ftl @@ -1,7 +0,0 @@ -output = Έξοδος -show-media-controls = Εμφάνιση στοιχείων ελέγχου πολυμέσων στη γραμμή συστήματος -disconnected = Το PulseAudio αποσυνδέθηκε -no-device = Καμία επιλεγμένη συσκευή -input = Είσοδος -unknown-artist = Άγνωστος -sound-settings = Ρυθμίσεις ήχου... diff --git a/cosmic-applet-audio/i18n/lo/cosmic_applet_audio.ftl b/cosmic-applet-audio/i18n/lo/cosmic_applet_audio.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/cosmic-applet-audio/i18n/sr/cosmic_applet_audio.ftl b/cosmic-applet-audio/i18n/sr/cosmic_applet_audio.ftl index 9ddf8185..e69de29b 100644 --- a/cosmic-applet-audio/i18n/sr/cosmic_applet_audio.ftl +++ b/cosmic-applet-audio/i18n/sr/cosmic_applet_audio.ftl @@ -1,7 +0,0 @@ -show-media-controls = Прикажи управљања медијима на траци -disconnected = Пулс-аудио откачен -no-device = Ниједан уређај није изабран -input = Улаз -output = Излаз -unknown-artist = Непознато -sound-settings = Подешавања звука... diff --git a/cosmic-applet-audio/src/lib.rs b/cosmic-applet-audio/src/lib.rs index 78667f5f..5f49d0f9 100644 --- a/cosmic-applet-audio/src/lib.rs +++ b/cosmic-applet-audio/src/lib.rs @@ -487,31 +487,11 @@ impl cosmic::Application for Audio { .icon_button(self.output_icon_name()) .on_press_down(Message::TogglePopup); - const WHEEL_STEP: f32 = 5.0; // 5% par cran logique - // Wayland axis_v120 envoie un cran physique en rafale de plusieurs - // ScrollDelta::Pixels (5–8 events ~15–20px), pour ~120px par cran. On - // accumule ces sub-events dans un thread_local et on n'émet qu'au - // passage d'un seuil — sinon `signum()` faisait croire que chaque - // sub-event = un cran, et un seul cran physique faisait chuter le - // volume jusqu'à 0 ("coupe le son"). - const PIXEL_THRESHOLD: f32 = 15.0; // px par cran logique - std::thread_local! { - static PIXEL_ACC: std::cell::Cell = const { std::cell::Cell::new(0.0) }; - } + const WHEEL_STEP: f32 = 5.0; // 5% per wheel event let btn = crate::mouse_area::MouseArea::new(btn).on_mouse_wheel(|delta| { let scroll_vector = match delta { - iced::mouse::ScrollDelta::Lines { y, .. } => { - PIXEL_ACC.with(|a| a.set(0.0)); - y * WHEEL_STEP - } - iced::mouse::ScrollDelta::Pixels { y, .. } => { - PIXEL_ACC.with(|acc_cell| { - let acc = acc_cell.get() + y; - let steps = (acc / PIXEL_THRESHOLD).trunc(); - acc_cell.set(acc - steps * PIXEL_THRESHOLD); - steps * WHEEL_STEP - }) - } + iced::mouse::ScrollDelta::Lines { y, .. } => y.signum() * WHEEL_STEP, // -1/0/1 + iced::mouse::ScrollDelta::Pixels { y, .. } => y.signum(), // -1/0/1 }; if scroll_vector == 0.0 { return Message::Ignore; @@ -519,7 +499,7 @@ impl cosmic::Application for Audio { let new_volume = (self.model.sink_volume as f64 + (scroll_vector as f64)) .clamp(0.0, self.max_sink_volume as f64); - Message::SetSinkVolume(new_volume.round() as u32) + Message::SetSinkVolume(new_volume as u32) }); let playback_buttons = (!self.core.applet.suggested_bounds.as_ref().is_some_and(|c| { diff --git a/cosmic-applet-audio/src/mouse_area.rs b/cosmic-applet-audio/src/mouse_area.rs index 38306e45..6ae8547a 100644 --- a/cosmic-applet-audio/src/mouse_area.rs +++ b/cosmic-applet-audio/src/mouse_area.rs @@ -5,7 +5,7 @@ use cosmic::iced::core::Point; use cosmic::iced::core::{ Clipboard, Element, Layout, Length, Rectangle, Shell, Size, Widget, - event::Event, + event::{self, Event}, layout, mouse, overlay, renderer, touch, widget::{Operation, Tree, tree}, }; diff --git a/cosmic-applet-battery/Cargo.toml b/cosmic-applet-battery/Cargo.toml index fdee2ce1..2218f638 100644 --- a/cosmic-applet-battery/Cargo.toml +++ b/cosmic-applet-battery/Cargo.toml @@ -12,7 +12,7 @@ drm = "0.14.1" futures.workspace = true i18n-embed-fl.workspace = true i18n-embed.workspace = true -cosmic.workspace = true +libcosmic.workspace = true rust-embed.workspace = true rustc-hash.workspace = true tokio.workspace = true @@ -24,7 +24,9 @@ zbus.workspace = true serde.workspace = true [dependencies.cosmic-settings-upower-subscription] -path = "../../cosmic-settings/subscriptions/upower" +git = "https://github.com/pop-os/cosmic-settings" +# path = "../../cosmic-settings/subscriptions/upower" [dependencies.cosmic-settings-daemon-subscription] -path = "../../cosmic-settings/subscriptions/settings-daemon" +git = "https://github.com/pop-os/cosmic-settings" +# path = "../../cosmic-settings/subscriptions/settings-daemon" diff --git a/cosmic-applet-battery/i18n/el/cosmic_applet_battery.ftl b/cosmic-applet-battery/i18n/el/cosmic_applet_battery.ftl index 06eca770..e69de29b 100644 --- a/cosmic-applet-battery/i18n/el/cosmic_applet_battery.ftl +++ b/cosmic-applet-battery/i18n/el/cosmic_applet_battery.ftl @@ -1,14 +0,0 @@ -battery = Μπαταρία -power-settings = Ρυθμίσεις ενέργειας και μπαταρίας... -hours = ώ -until-empty = μέχρι την αποφόρτιση -battery-desc = Μειωμένη χρήση ενέργειας και επιδόσεις. -max-charge = Επεκτείνετε τη διάρκεια ζωής της μπαταρίας σας ορίζοντας ως μέγιστη τιμή φόρτισης το 80% -balanced = Ισορροπημένη -seconds = δ -dgpu-running = Η ανεξάρτητη GPU είναι ενεργή και μπορεί να μειώσει τη διάρκεια ζωής της μπαταρίας -performance = Υψηλές επιδόσεις -performance-desc = Υψηλές επιδόσεις και χρήση ενέργειας. -minutes = λ -balanced-desc = Τυπικές επιδόσεις και χρήση μπαταρίας. -dgpu-applications = Εφαρμογές που χρησιμοποιούν την ανεξάρτητη GPU { $gpu_name } diff --git a/cosmic-applet-battery/i18n/lo/cosmic_applet_battery.ftl b/cosmic-applet-battery/i18n/lo/cosmic_applet_battery.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/cosmic-applet-battery/i18n/sr/cosmic_applet_battery.ftl b/cosmic-applet-battery/i18n/sr/cosmic_applet_battery.ftl index 3d242270..e69de29b 100644 --- a/cosmic-applet-battery/i18n/sr/cosmic_applet_battery.ftl +++ b/cosmic-applet-battery/i18n/sr/cosmic_applet_battery.ftl @@ -1,14 +0,0 @@ -power-settings = Подешавања напајања и батерије... -hours = ч -until-empty = до празне -battery-desc = Смањен учинак и употреба струје. -balanced = Уравнотежено -battery = Батерија -seconds = с -performance = Најбрже -performance-desc = Висок учинак и употреба струје. -minutes = м -balanced-desc = Уобичајени учинак и употреба батерије. -max-charge = Повећајте век трајања батерије подешавањем највише вредности пуњења на 80% -dgpu-running = Засебна графичка је покренута и може умањити век трајања батерије -dgpu-applications = Програми који користе засебну графичку { $gpu_name } diff --git a/cosmic-applet-battery/i18n/zh-TW/cosmic_applet_battery.ftl b/cosmic-applet-battery/i18n/zh-TW/cosmic_applet_battery.ftl index f5378e27..33c18ba3 100644 --- a/cosmic-applet-battery/i18n/zh-TW/cosmic_applet_battery.ftl +++ b/cosmic-applet-battery/i18n/zh-TW/cosmic_applet_battery.ftl @@ -1,4 +1,4 @@ -battery = 電池 +battery = 省電 battery-desc = 降低效能與耗電量。 balanced = 平衡 balanced-desc = 標準效能與耗電量。 diff --git a/cosmic-applet-battery/src/app.rs b/cosmic-applet-battery/src/app.rs index f927bde3..67e513c3 100644 --- a/cosmic-applet-battery/src/app.rs +++ b/cosmic-applet-battery/src/app.rs @@ -40,7 +40,7 @@ use cosmic_settings_upower_subscription::{ }; use rustc_hash::FxHashMap; -use std::{path::PathBuf, time::Duration}; +use std::{path::PathBuf, sync::LazyLock, time::Duration}; use tokio::sync::mpsc::UnboundedSender; // XXX improve @@ -172,7 +172,6 @@ impl CosmicBatteryApplet { } #[derive(Debug, Clone)] -#[allow(dead_code)] enum Message { TogglePopup, CloseRequested(window::Id), @@ -369,10 +368,6 @@ impl cosmic::Application for CosmicBatteryApplet { let _ = tx.send(()); } let mut tasks = vec![get_popup(popup_settings)]; - if let Some(tx) = &self.settings_daemon_sender { - let _ = tx.send(settings_daemon::Request::GetDisplayBrightness); - let _ = tx.send(settings_daemon::Request::GetMaxDisplayBrightness); - } // Try again every time a popup is opened if self.charging_limit.is_none() { tasks.push(Task::perform(get_charging_limit(), |limit| { @@ -512,7 +507,7 @@ impl cosmic::Application for CosmicBatteryApplet { Task::none() } - fn view(&self) -> Element<'_, Message> { + fn view(&self) -> Element { let is_horizontal = match self.core.applet.anchor { PanelAnchor::Top | PanelAnchor::Bottom => true, PanelAnchor::Left | PanelAnchor::Right => false, diff --git a/cosmic-applet-bluetooth/Cargo.toml b/cosmic-applet-bluetooth/Cargo.toml index f3a8c179..03b67388 100644 --- a/cosmic-applet-bluetooth/Cargo.toml +++ b/cosmic-applet-bluetooth/Cargo.toml @@ -10,7 +10,7 @@ bluer = { version = "0.17", features = ["bluetoothd", "id"] } futures.workspace = true i18n-embed-fl.workspace = true i18n-embed.workspace = true -cosmic.workspace = true +libcosmic.workspace = true fastrand = "2.3.0" rust-embed.workspace = true rustc-hash.workspace = true diff --git a/cosmic-applet-bluetooth/i18n/ca/cosmic_applet_bluetooth.ftl b/cosmic-applet-bluetooth/i18n/ca/cosmic_applet_bluetooth.ftl index b069b4bf..e69de29b 100644 --- a/cosmic-applet-bluetooth/i18n/ca/cosmic_applet_bluetooth.ftl +++ b/cosmic-applet-bluetooth/i18n/ca/cosmic_applet_bluetooth.ftl @@ -1,12 +0,0 @@ -confirm-pin = Si us plau, verifiqueu que el següent PIN coincideix amb el mostrat a { $deviceName } -bluetooth = Bluetooth -unsuccessful = Error d'Emparellament -pairable = Emparellable -try-again = Reintentar -check-device = Si us plau, verifiqueu que { $deviceName } estigui encès, a l'abast i llest per emparellar-se. -other-devices = Altres dispositius Bluetooth -cancel = Cancel·lar -connected = Connectat -confirm = Confirmar -settings = Configuració del Bluetooth... -discoverable = Descobrible diff --git a/cosmic-applet-bluetooth/i18n/el/cosmic_applet_bluetooth.ftl b/cosmic-applet-bluetooth/i18n/el/cosmic_applet_bluetooth.ftl index 84134b90..98df71af 100644 --- a/cosmic-applet-bluetooth/i18n/el/cosmic_applet_bluetooth.ftl +++ b/cosmic-applet-bluetooth/i18n/el/cosmic_applet_bluetooth.ftl @@ -1,12 +1,2 @@ cancel = Ακύρωση confirm = Επιβεβαίωση -bluetooth = Bluetooth -confirm-pin = Επιβεβαιώστε ότι το ακόλουθο PIN είναι ίδιο με αυτό που εμφανίζεται στο { $deviceName } -unsuccessful = Ανεπιτυχής σύζευξη -pairable = Συνδέσιμο -try-again = Δοκιμή ξανά -check-device = Βεβαιωθείτε ότι το { $deviceName } είναι ενεργοποιημένο, βρίσκεται εντός εμβέλειας και είναι έτοιμο για σύζευξη. -other-devices = Άλλες συσκευές Bluetooth -connected = Συνδέθηκε -settings = Ρυθμίσεις Bluetooth... -discoverable = Ορατό diff --git a/cosmic-applet-bluetooth/i18n/lo/cosmic_applet_bluetooth.ftl b/cosmic-applet-bluetooth/i18n/lo/cosmic_applet_bluetooth.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/cosmic-applet-bluetooth/i18n/sr/cosmic_applet_bluetooth.ftl b/cosmic-applet-bluetooth/i18n/sr/cosmic_applet_bluetooth.ftl index b6515b52..e69de29b 100644 --- a/cosmic-applet-bluetooth/i18n/sr/cosmic_applet_bluetooth.ftl +++ b/cosmic-applet-bluetooth/i18n/sr/cosmic_applet_bluetooth.ftl @@ -1,12 +0,0 @@ -confirm-pin = Потврдите да се овај ПИН подудара са оним приказаним на { $deviceName } -bluetooth = Блутут -unsuccessful = Неуспешно упаривање -pairable = Упарив -try-again = Покушај поново -check-device = Постарајте се да је { $deviceName } укључен, у домету и спреман за упаривање. -other-devices = Други блутут уређаји -cancel = Откажи -connected = Повезано -confirm = Потврди -settings = Подешавања блутута... -discoverable = Откривљив diff --git a/cosmic-applet-bluetooth/src/app.rs b/cosmic-applet-bluetooth/src/app.rs index d1d31022..2ca95ec5 100644 --- a/cosmic-applet-bluetooth/src/app.rs +++ b/cosmic-applet-bluetooth/src/app.rs @@ -24,7 +24,7 @@ use cosmic::{ widget::{button, divider, icon, scrollable, text}, }; use futures::FutureExt; -use std::{collections::HashMap, time::Duration}; +use std::{collections::HashMap, sync::LazyLock, time::Duration}; use tokio::sync::mpsc::Sender; use crate::{ @@ -63,7 +63,6 @@ impl CosmicBluetoothApplet { } #[derive(Debug, Clone)] -#[allow(dead_code)] enum Message { TogglePopup, CloseRequested(window::Id), @@ -146,7 +145,7 @@ impl cosmic::Application for CosmicBluetoothApplet { } Message::BluetoothEvent(e) => match e { BluerEvent::RequestResponse { - req: _, + req, state, err_msg, } => { diff --git a/cosmic-applet-bluetooth/src/bluetooth.rs b/cosmic-applet-bluetooth/src/bluetooth.rs index 0083568f..b3648acd 100644 --- a/cosmic-applet-bluetooth/src/bluetooth.rs +++ b/cosmic-applet-bluetooth/src/bluetooth.rs @@ -149,6 +149,8 @@ pub fn bluetooth_subscription( }, BluerSessionEvent::AgentEvent(e) => BluerEvent::AgentEvent(e), + + _ => return, }; _ = output.send(message).await; @@ -197,7 +199,6 @@ pub enum BluerRequest { } #[derive(Debug, Clone)] -#[allow(dead_code)] pub enum BluerEvent { RequestResponse { req: BluerRequest, diff --git a/cosmic-applet-input-sources/Cargo.toml b/cosmic-applet-input-sources/Cargo.toml index 046a3bfb..92a7daf3 100644 --- a/cosmic-applet-input-sources/Cargo.toml +++ b/cosmic-applet-input-sources/Cargo.toml @@ -5,10 +5,10 @@ edition = "2024" license = "GPL-3.0-only" [dependencies] -cosmic-comp-config.workspace = true +cosmic-comp-config = { git = "https://github.com/pop-os/cosmic-comp.git", rev = "5eb5af4" } i18n-embed-fl.workspace = true i18n-embed.workspace = true -cosmic.workspace = true +libcosmic.workspace = true rust-embed.workspace = true tokio.workspace = true tracing-log.workspace = true diff --git a/cosmic-applet-input-sources/i18n/el/cosmic_applet_input_sources.ftl b/cosmic-applet-input-sources/i18n/el/cosmic_applet_input_sources.ftl index 546be28d..e69de29b 100644 --- a/cosmic-applet-input-sources/i18n/el/cosmic_applet_input_sources.ftl +++ b/cosmic-applet-input-sources/i18n/el/cosmic_applet_input_sources.ftl @@ -1,2 +0,0 @@ -show-keyboard-layout = Εμφάνιση διάταξης πληκτρολογίου... -keyboard-settings = Ρυθμίσεις πληκτρολογίου... diff --git a/cosmic-applet-input-sources/i18n/lo/cosmic_applet_input_sources.ftl b/cosmic-applet-input-sources/i18n/lo/cosmic_applet_input_sources.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/cosmic-applet-input-sources/i18n/sr/cosmic_applet_input_sources.ftl b/cosmic-applet-input-sources/i18n/sr/cosmic_applet_input_sources.ftl index 4d552b47..e69de29b 100644 --- a/cosmic-applet-input-sources/i18n/sr/cosmic_applet_input_sources.ftl +++ b/cosmic-applet-input-sources/i18n/sr/cosmic_applet_input_sources.ftl @@ -1,2 +0,0 @@ -show-keyboard-layout = Прикажи распоред тастатуре... -keyboard-settings = Подешавања тастатуре... diff --git a/cosmic-applet-input-sources/src/lib.rs b/cosmic-applet-input-sources/src/lib.rs index 2c845de1..93e84283 100644 --- a/cosmic-applet-input-sources/src/lib.rs +++ b/cosmic-applet-input-sources/src/lib.rs @@ -3,6 +3,7 @@ mod localize; +use cosmic::iced::{Alignment, Length}; use cosmic::{ app, app::Core, @@ -13,14 +14,16 @@ use cosmic::{ iced::{ Rectangle, Task, platform_specific::shell::commands::popup::{destroy_popup, get_popup}, + widget::{column, row}, window::Id, }, - iced::core::window, + iced::{core::window, runtime::Appearance}, prelude::*, surface, theme, widget::{ self, autosize, rectangle_tracker::{RectangleTracker, RectangleUpdate, rectangle_tracker_subscription}, + space, }, }; use cosmic_comp_config::CosmicCompConfig; diff --git a/cosmic-applet-minimize/Cargo.toml b/cosmic-applet-minimize/Cargo.toml index 5fd35bd2..783be11b 100644 --- a/cosmic-applet-minimize/Cargo.toml +++ b/cosmic-applet-minimize/Cargo.toml @@ -9,7 +9,7 @@ anyhow.workspace = true i18n-embed-fl.workspace = true i18n-embed.workspace = true image = { version = "0.25.9", default-features = false } -cosmic.workspace = true +libcosmic.workspace = true memmap2 = "0.9.10" rust-embed.workspace = true rustix.workspace = true diff --git a/cosmic-applet-minimize/src/lib.rs b/cosmic-applet-minimize/src/lib.rs index 307762b5..e40a7551 100644 --- a/cosmic-applet-minimize/src/lib.rs +++ b/cosmic-applet-minimize/src/lib.rs @@ -316,7 +316,7 @@ impl cosmic::Application for Minimize { } else { (cross_padding, major_padding) }; - let _theme = self.core.system_theme().cosmic(); + let theme = self.core.system_theme().cosmic(); let icon_buttons = self.apps[..max_icon_count].iter().map(|app| { self.core .applet @@ -420,7 +420,7 @@ impl cosmic::Application for Minimize { (cross_padding, major_padding) }; let theme = self.core.system_theme().cosmic(); - let _space_xxs = theme.space_xxs(); + let space_xxs = theme.space_xxs(); let icon_buttons = self.apps[max_icon_count..].iter().map(|app| { tooltip( Element::from(crate::window_image::WindowImage::new( diff --git a/cosmic-applet-network/Cargo.toml b/cosmic-applet-network/Cargo.toml index ea265d4e..659dd076 100644 --- a/cosmic-applet-network/Cargo.toml +++ b/cosmic-applet-network/Cargo.toml @@ -7,12 +7,12 @@ license = "GPL-3.0-or-later" [dependencies] anyhow.workspace = true async-fn-stream = "0.3" -cosmic-dbus-networkmanager = { path = "../../dbus-settings-bindings/networkmanager" } +cosmic-dbus-networkmanager = { git = "https://github.com/pop-os/dbus-settings-bindings" } futures.workspace = true futures-util.workspace = true i18n-embed-fl.workspace = true i18n-embed.workspace = true -cosmic = { workspace = true, features = [ +libcosmic = { workspace = true, features = [ "applet", "applet-token", "tokio", @@ -26,12 +26,16 @@ tracing-log.workspace = true tracing-subscriber.workspace = true tracing.workspace = true zbus.workspace = true +nm-secret-agent-manager = { git = "https://github.com/pop-os/dbus-settings-bindings/" } indexmap = "2.13.0" secure-string = "0.3.0" uuid = { version = "1.21.0", features = ["v4"] } -nmrs = "3.1.3" - [dependencies.cosmic-settings-network-manager-subscription] -path = "../../cosmic-settings/subscriptions/network-manager" +git = "https://github.com/pop-os/cosmic-settings/" +# path = "../../cosmic-settings/subscriptions/network-manager" + +[dependencies.cosmic-settings-airplane-mode-subscription] +git = "https://github.com/pop-os/cosmic-settings/" +# path = "../../cosmic-settings/subscriptions/airplane-mode" diff --git a/cosmic-applet-network/i18n/ca/cosmic_applet_network.ftl b/cosmic-applet-network/i18n/ca/cosmic_applet_network.ftl index ae3bd5dd..e69de29b 100644 --- a/cosmic-applet-network/i18n/ca/cosmic_applet_network.ftl +++ b/cosmic-applet-network/i18n/ca/cosmic_applet_network.ftl @@ -1,4 +0,0 @@ -cancel = Cancel·lar -connected = Connectat -wifi = Wi-Fi -identity = Identitat diff --git a/cosmic-applet-network/i18n/el/cosmic_applet_network.ftl b/cosmic-applet-network/i18n/el/cosmic_applet_network.ftl index 8eac3a7a..c7ed802d 100644 --- a/cosmic-applet-network/i18n/el/cosmic_applet_network.ftl +++ b/cosmic-applet-network/i18n/el/cosmic_applet_network.ftl @@ -1,24 +1 @@ cancel = Ακύρωση -connect = Σύνδεση -network = Δίκτυο -check-wifi-connection = Βεβαιωθείτε ότι το Wi-Fi είναι συνδεδεμένο στο διαδίκτυο και ότι ο κωδικός πρόσβασης είναι σωστός -reset = Επαναφορά -visible-wireless-networks = Ορατά ασύρματα δίκτυα -enter-password = Εισαγάγετε τον κωδικό πρόσβασης ή το κλειδί κρυπτογράφησης -ipv6 = Διεύθυνση IPv6 -airplane-mode-on = Η λειτουργία πτήσης είναι ενεργή -connecting = Σύνδεση -airplane-mode = Λειτουργία πτήσης -wifi = Wi-Fi -ipv4 = Διεύθυνση IPv4 -identity = Ταυτότητα -unable-to-connect = Δεν είναι δυνατή η σύνδεση στο δίκτυο -turn-off-airplane-mode = Απενεργοποιήστε τη για ενεργοποίηση του Wi-Fi, του Bluetooth και της κινητής ευρυζωνικής σύνδεσης. -connected = Συνδέθηκε -vpn-connections = Συνδέσεις VPN -mac = MAC -router-wps-button = Μπορείτε επίσης να συνδεθείτε πατώντας το κουμπί «WPS» του δρομολογητή -settings = Ρυθμίσεις δικτύου... -megabits-per-second = Mbps -gigabits-per-second = Gbps -terabits-per-second = Tbps diff --git a/cosmic-applet-network/i18n/lo/cosmic_applet_network.ftl b/cosmic-applet-network/i18n/lo/cosmic_applet_network.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/cosmic-applet-network/i18n/sr/cosmic_applet_network.ftl b/cosmic-applet-network/i18n/sr/cosmic_applet_network.ftl index b79b0ddd..e69de29b 100644 --- a/cosmic-applet-network/i18n/sr/cosmic_applet_network.ftl +++ b/cosmic-applet-network/i18n/sr/cosmic_applet_network.ftl @@ -1,24 +0,0 @@ -cancel = Откажи -connected = Повезано -connect = Повежи -identity = Идентитет -wifi = Бежична -check-wifi-connection = Уверите се да је бежична мрежа повезана са интернетом и да је лозинка тачна -reset = Врати -visible-wireless-networks = Видљиве бежичне мреже -enter-password = Унесите лозинку или кључ за шифровање -ipv6 = ИПв6 адреса -airplane-mode-on = Авионски режим је укључен -connecting = Повезује се -airplane-mode = Авио режим -ipv4 = ИПв4 адреса -unable-to-connect = Немогуће повезати се са мрежом -turn-off-airplane-mode = Искључите да бисте омогућили Блутут, бежичну и мобилни интернет. -network = Мрежа -vpn-connections = ВПН везе -mac = МАК -router-wps-button = Такође се можете повезати притиском на дугме „WPS“ на рутеру -settings = Подешавања мреже... -megabits-per-second = Mbps -gigabits-per-second = Gbps -terabits-per-second = Tbps diff --git a/cosmic-applet-network/i18n/uk/cosmic_applet_network.ftl b/cosmic-applet-network/i18n/uk/cosmic_applet_network.ftl index cebc8087..687539ca 100644 --- a/cosmic-applet-network/i18n/uk/cosmic_applet_network.ftl +++ b/cosmic-applet-network/i18n/uk/cosmic_applet_network.ftl @@ -8,15 +8,15 @@ ipv6 = IPv6-адреса mac = MAC megabits-per-second = Мбіт/с connected = З'єднано -connecting = З’єднання -connect = З’єднати +connecting = Підключення +connect = З'єднати cancel = Скасувати settings = Налаштування мережі... visible-wireless-networks = Видимі бездротові мережі enter-password = Введіть пароль або ключ шифрування -router-wps-button = Також можна під’єднатися, натиснувши кнопку «WPS» на маршрутизаторі -unable-to-connect = Не вдалося під’єднатися до мережі -check-wifi-connection = Переконайтеся, що Wi-Fi під’єднано до Інтернету, а пароль — правильний +router-wps-button = Також можна підключитися, натиснувши кнопку «WPS» на маршрутизаторі +unable-to-connect = Не вдалося підключитися до мережі +check-wifi-connection = Переконайтеся, що Wi-Fi підключено до Інтернету, а пароль — правильний reset = Скинути identity = Ідентичність vpn-connections = VPN-з'єднання diff --git a/cosmic-applet-network/src/app.rs b/cosmic-applet-network/src/app.rs index 6939f5e3..727d9b10 100644 --- a/cosmic-applet-network/src/app.rs +++ b/cosmic-applet-network/src/app.rs @@ -1,21 +1,21 @@ use anyhow::Context; +use cosmic_dbus_networkmanager::settings::{NetworkManagerSettings, connection::Settings}; use cosmic_settings_network_manager_subscription::{ self as network_manager, NetworkManagerState, UUID, + active_conns::active_conns_subscription, available_wifi::{AccessPoint, NetworkType}, current_networks::ActiveConnectionInfo, hw_address::HwAddress, + nm_secret_agent::{self, PasswordFlag, SecretSender}, }; use indexmap::IndexMap; -use nmrs::{ - NetworkManager as NmrsManager, SettingsSummary, - agent::{SecretAgent, SecretAgentCapabilities, SecretRequest, SecretResponder, SecretSetting}, -}; use rustc_hash::FxHashSet; use secure_string::SecureString; use std::{ borrow::Cow, - collections::{BTreeMap, HashMap}, + collections::{BTreeMap, BTreeSet}, sync::{Arc, LazyLock}, + time::Duration, }; use cosmic::{ @@ -33,17 +33,18 @@ use cosmic::{ }, surface, theme, widget::{ - Id, button, column, container, divider, + Column, Id, Row, button, column, container, divider, icon::{self, from_name}, row, scrollable, secure_input, text, text_input, toggler, }, }; -use cosmic_dbus_networkmanager::interface::enums::{ - ActiveConnectionState, DeviceState, NmConnectivityState, +use cosmic_dbus_networkmanager::interface::{ + access_point, + enums::{ActiveConnectionState, DeviceState, NmConnectivityState, NmState}, }; -use futures::{StreamExt, lock::Mutex as AsyncMutex}; -use zbus::Connection; +use futures::{StreamExt, channel::mpsc::TrySendError}; +use zbus::{Connection, zvariant::ObjectPath}; use crate::{config, fl}; @@ -73,6 +74,14 @@ impl NewConnectionState { } .ssid } + pub fn hw_address(&self) -> HwAddress { + match self { + Self::EnterPassword { access_point, .. } => access_point, + Self::Waiting(ap) => ap, + Self::Failure(ap) => ap, + } + .hw_address + } } impl From for AccessPoint { @@ -92,53 +101,51 @@ pub struct MyNetworkState { pub known_vpns: IndexMap, pub ssid_to_uuid: BTreeMap, Box>, pub devices: Vec>, + pub password: Option, + pub connecting: BTreeSet, pub nm_state: NetworkManagerState, pub requested_vpn: Option, } -/// Shared, take-once handle to an `nmrs` [`SecretResponder`]. Cloned freely -/// across `Message` boundaries; the first consumer to `lock().take()` it owns -/// the reply to NetworkManager. -pub type SecretResponderHandle = Arc>>; - #[derive(Debug, Clone)] pub struct RequestedVpn { + name: String, uuid: Arc, description: Option, password: SecureString, password_hidden: bool, - responder: SecretResponderHandle, - /// VPN secret keys NM hinted as needed (e.g. `["password"]`). When empty, - /// `"password"` is used as a fallback. - secret_keys: Vec, + tx: SecretSender, } #[derive(Clone, Debug)] pub enum ConnectionSettings { - Vpn { id: String }, + Vpn(VpnConnectionSettings), Wireguard { id: String }, } -/// Local mirror of the secret-agent events the applet cares about. Sourced -/// from `nmrs::agent` instead of the previous `nm_secret_agent` subscription. -#[derive(Debug, Clone)] -pub enum NmAgentEvent { - RequestSecret { - connection_uuid: String, - connection_id: String, - setting: AgentSetting, - responder: SecretResponderHandle, - }, - CancelGetSecrets, - Failed(String), +#[derive(Clone, Debug, Default)] +pub struct VpnConnectionSettings { + id: String, + username: Option, + connection_type: Option, + password_flag: Option, } -#[derive(Debug, Clone)] -pub enum AgentSetting { - WifiPsk { ssid: String }, - WifiEap, - Vpn { secret_keys: Vec }, - Other, +#[derive(Clone, Debug, Eq, PartialEq)] +enum ConnectionType { + Password, +} + +impl VpnConnectionSettings { + fn password_flag(&self) -> Option { + self.connection_type + .as_ref() + .is_some_and(|ct| match ct { + ConnectionType::Password => true, + }) + .then_some(self.password_flag) + .flatten() + } } #[derive(Default)] @@ -150,6 +157,7 @@ struct CosmicNetworkApplet { // NM state nm_sender: Option>, nm_task: Option>, + secret_tx: Option>, nm_state: MyNetworkState, // UI state @@ -256,9 +264,8 @@ fn vpn_section<'a>( if show_available_vpns { for (uuid, connection) in &nm_state.known_vpns { let id = match connection { - ConnectionSettings::Vpn { id } | ConnectionSettings::Wireguard { id } => { - id.as_str() - } + ConnectionSettings::Vpn(connection) => connection.id.as_str(), + ConnectionSettings::Wireguard { id } => id.as_str(), }; // Check if this VPN is currently active let is_active = nm_state.nm_state.active_conns.iter().any( @@ -359,12 +366,15 @@ impl CosmicNetworkApplet { } fn update_togglers(&mut self, state: &NetworkManagerState) { + let mut changed = false; if self.nm_state.nm_state.wifi_enabled != state.wifi_enabled { self.nm_state.nm_state.wifi_enabled = state.wifi_enabled; + changed = true; } if self.nm_state.nm_state.airplane_mode != state.airplane_mode { self.nm_state.nm_state.airplane_mode = state.airplane_mode; + changed = true; } } @@ -387,90 +397,55 @@ impl CosmicNetworkApplet { } fn connect_vpn(&mut self, uuid: Arc) -> Task> { - cosmic::task::future(async move { - match NmrsManager::new().await { - Ok(nm) => match nm.connect_vpn_by_uuid(&uuid).await { - Ok(()) => Message::Refresh, - Err(e) => Message::Error(format!("activate VPN {uuid}: {e}")), - }, - Err(e) => Message::Error(format!("nmrs init: {e}")), - } - }) - } -} + if let Some((tx, conn)) = self.nm_sender.clone().zip(self.conn.clone()) { + cosmic::task::future(async move { + // Find the connection by UUID + if let Ok(nm_settings) = NetworkManagerSettings::new(&conn).await { + if let Ok(connections) = nm_settings.list_connections().await { + for connection in connections { + if let Ok(settings) = connection.get_settings().await { + let settings = Settings::new(settings); + if let Some(conn_settings) = &settings.connection { + if conn_settings.uuid.as_ref().is_some_and(|conn_uuid| { + conn_uuid.as_str() == uuid.as_ref() + }) { + let path = connection.inner().path().clone().to_owned(); + if let Err(err) = + tx.unbounded_send(network_manager::Request::Activate( + ObjectPath::try_from("/").unwrap(), + path, + )) + { + if err.is_disconnected() { + return zbus::Connection::system() + .await + .context( + "failed to create system dbus connection", + ) + .map_or_else( + |why| Message::Error(why.to_string()), + Message::NetworkManagerConnect, + ); + } -/// Registers an `nmrs` secret agent on the system bus and yields its -/// requests + cancellations as [`NmAgentEvent`] for the applet to handle. -fn secret_agent_task(identifier: String) -> Task { - cosmic::Task::stream(async_fn_stream::fn_stream(move |emitter| async move { - let registration = SecretAgent::builder() - .with_identifier(identifier) - .with_capabilities(SecretAgentCapabilities::VPN_HINTS) - .register() - .await; - - let (mut handle, mut requests) = match registration { - Ok(pair) => pair, - Err(e) => { - let _ = emitter.emit(NmAgentEvent::Failed(e.to_string())).await; - return; - } - }; - - loop { - tokio::select! { - req = requests.next() => match req { - Some(req) => { - let event = secret_request_to_event(req); - let _ = emitter.emit(event).await; + tracing::error!("{err:?}"); + } + break; + } + } + } + } } - None => break, - }, - cancel = handle.cancellations().next() => match cancel { - Some(_reason) => { - let _ = emitter.emit(NmAgentEvent::CancelGetSecrets).await; - } - None => break, - }, - } + } + Message::Refresh + }) + } else { + tracing::warn!("No sender available to activate VPN."); + Task::none() } - - if let Err(e) = handle.unregister().await { - tracing::warn!("failed to unregister secret agent: {e}"); - } - })) -} - -fn secret_request_to_event(req: SecretRequest) -> NmAgentEvent { - let setting = match req.setting { - SecretSetting::WifiPsk { ssid } => AgentSetting::WifiPsk { ssid }, - SecretSetting::WifiEap { .. } => AgentSetting::WifiEap, - SecretSetting::Vpn { .. } => AgentSetting::Vpn { - secret_keys: req.hints.clone(), - }, - _ => AgentSetting::Other, - }; - - NmAgentEvent::RequestSecret { - connection_uuid: req.connection_uuid, - connection_id: req.connection_id, - setting, - responder: Arc::new(AsyncMutex::new(Some(req.responder))), } } -/// Reply with [`NoSecrets`](nmrs::agent::SecretResponder::no_secrets) to free -/// NetworkManager when the applet decides not to use the responder. Dropping -/// it would also auto-reply, but doing it explicitly keeps the log clean. -fn release_responder(responder: SecretResponderHandle) -> Task> { - cosmic::task::future(async move { - if let Some(r) = responder.lock().await.take() { - let _ = r.no_secrets().await; - } - Message::NoOp - }) -} - #[derive(Debug, Clone)] pub(crate) enum Message { TogglePopup, @@ -485,13 +460,12 @@ pub(crate) enum Message { TogglePasswordVisibility, FocusSecureInput, NoOp, - #[allow(dead_code)] // required by `cosmic::applet` surface path; not always emitted Surface(surface::Action), ActivateVpn(Arc), // UUID of VPN to activate DeactivateVpn(Arc), // UUID of VPN to deactivate ToggleVpnList, // Show/hide available VPNs /// An update from the secret agent - SecretAgent(NmAgentEvent), + SecretAgent(network_manager::nm_secret_agent::Event), /// Connect to a WiFi network access point. Connect(network_manager::SSID, HwAddress), /// Connect with a password @@ -527,6 +501,16 @@ pub(crate) enum Message { SelectDevice(Option>), } +#[derive(Debug, Clone)] +struct Password { + ssid: network_manager::SSID, + hw_address: HwAddress, + identity: Option, + password: SecureString, + password_hidden: bool, + tx: SecretSender, +} + fn connection_settings(conn: zbus::Connection) -> Task { let settings = async move { let settings = network_manager::dbus::settings::NetworkManagerSettings::new(&conn).await?; @@ -650,30 +634,109 @@ impl CosmicNetworkApplet { } } -fn load_vpns(_conn: zbus::Connection) -> Task { +fn load_vpns(conn: zbus::Connection) -> Task { + let settings = async move { + let settings = network_manager::dbus::settings::NetworkManagerSettings::new(&conn).await?; + + _ = settings.load_connections(&[]).await; + + let settings = settings + // Get a list of known connections. + .list_connections() + .await? + // Prepare for wrapping in a concurrent stream. + .into_iter() + .map(|conn| async move { conn }) + // Create a concurrent stream for each connection. + .apply(futures::stream::FuturesOrdered::from_iter) + // Concurrently fetch settings for each connection, and filter for VPN. + .filter_map(|conn| async move { + let settings = conn.get_settings().await.ok()?; + + let connection = settings.get("connection")?; + + match connection + .get("type")? + .downcast_ref::() + .ok()? + .as_str() + { + "vpn" => (), + + "wireguard" => { + let id = connection.get("id")?.downcast_ref::().ok()?; + let uuid = connection.get("uuid")?.downcast_ref::().ok()?; + return Some((Arc::from(uuid), ConnectionSettings::Wireguard { id })); + } + + _ => return None, + } + + let vpn = settings.get("vpn")?; + let id = connection.get("id")?.downcast_ref::().ok()?; + let uuid = connection.get("uuid")?.downcast_ref::().ok()?; + + let (connection_type, username, password_flag) = vpn + .get("data") + .and_then(|data| data.downcast_ref::().ok()) + .map(|dict| { + let (mut connection_type, mut password_flag) = (None, None); + let mut username = vpn + .get("user-name") + .and_then(|u| u.downcast_ref::().ok()); + if dict + .get::(&String::from("connection-type")) + .ok() + .flatten() + .as_deref() + // may be "password" or "password-tls" + .is_some_and(|p| p.starts_with("password")) + { + connection_type = Some(ConnectionType::Password); + username = Some(username.unwrap_or_default()); + + password_flag = dict + .get::(&String::from("password-flags")) + .ok() + .flatten() + .and_then(|value| match value.as_str() { + "0" => Some(PasswordFlag::None), + "1" => Some(PasswordFlag::AgentOwned), + "2" => Some(PasswordFlag::NotSaved), + "4" => Some(PasswordFlag::NotRequired), + _ => None, + }); + } + + (connection_type, username, password_flag) + }) + .unwrap_or_default(); + + Some(( + Arc::from(uuid), + ConnectionSettings::Vpn(VpnConnectionSettings { + id, + connection_type, + password_flag, + username, + }), + )) + }) + // Reduce the settings list into + .fold(IndexMap::new(), |mut set, (uuid, data)| async move { + set.insert(uuid, data); + set + }) + .await; + + Ok::<_, zbus::Error>(settings) + }; + cosmic::task::future(async move { - let nm = match NmrsManager::new().await { - Ok(nm) => nm, - Err(e) => return Message::Error(format!("nmrs init: {e}")), - }; - - let saved = match nm.list_saved_connections().await { - Ok(saved) => saved, - Err(e) => return Message::Error(format!("list saved connections: {e}")), - }; - - let mut map: IndexMap = IndexMap::new(); - for c in saved { - let uuid: UUID = Arc::from(c.uuid.as_str()); - let entry = match c.summary { - SettingsSummary::WireGuard { .. } => ConnectionSettings::Wireguard { id: c.id }, - SettingsSummary::Vpn { .. } => ConnectionSettings::Vpn { id: c.id }, - _ => continue, - }; - map.insert(uuid, entry); - } - - Message::KnownConnections(map) + settings.await.map_or_else( + |why| Message::Error(why.to_string()), + Message::KnownConnections, + ) }) } @@ -696,7 +759,7 @@ impl cosmic::Application for CosmicNetworkApplet { const APP_ID: &'static str = config::APP_ID; fn init(core: cosmic::app::Core, _flags: ()) -> (Self, app::Task) { - let applet = Self { + let mut applet = Self { core, icon_name: "network-wired-disconnected-symbolic".to_string(), token_tx: None, @@ -726,11 +789,19 @@ impl cosmic::Application for CosmicNetworkApplet { tasks.push(update_state(conn.clone())); tasks.push(update_devices(conn.clone())); tasks.push(load_vpns(conn)); + let (tx, rx) = tokio::sync::mpsc::channel(4); + self.secret_tx = Some(tx); let my_id = format!( "com.system76.CosmicSettings.Applet.{}.NetworkManager.SecretAgent", uuid::Uuid::new_v4() ); - tasks.push(secret_agent_task(my_id).map(Message::SecretAgent)); + tasks.push( + cosmic::Task::stream(nm_secret_agent::secret_agent_stream( + my_id.clone(), + rx, + )) + .map(Message::SecretAgent), + ); } // TODO request update of state maybe let new_id = window::Id::unique(); @@ -752,20 +823,17 @@ impl cosmic::Application for CosmicNetworkApplet { } Message::ToggleAirplaneMode(enabled) => { self.toggle_wifi_ctr += 1; - self.nm_state.nm_state.airplane_mode = enabled; - return cosmic::task::future(async move { - match NmrsManager::new().await { - Ok(nm) => match nm.set_airplane_mode(enabled).await { - Ok(()) => Message::Refresh, - Err(e) => { - tracing::warn!("set_airplane_mode partial failure: {e}"); - Message::Refresh - } - }, - Err(e) => Message::Error(format!("nmrs init: {e}")), + if let Some(tx) = self.nm_sender.as_mut() { + if let Err(err) = + tx.unbounded_send(network_manager::Request::SetAirplaneMode(enabled)) + { + if err.is_disconnected() { + return system_conn().map(cosmic::Action::App); + } + + tracing::error!("{err:?}"); } - }) - .map(cosmic::Action::App); + } } Message::SelectWirelessAccessPoint(access_point) => { let Some(tx) = self.nm_sender.as_ref() else { @@ -777,7 +845,7 @@ impl cosmic::Application for CosmicNetworkApplet { tx.unbounded_send(network_manager::Request::SelectAccessPoint( access_point.ssid.clone(), access_point.network_type, - None, + self.secret_tx.clone(), self.active_device.as_ref().map(|d| d.interface.clone()), )) { @@ -794,19 +862,21 @@ impl cosmic::Application for CosmicNetworkApplet { .nm_state .known_access_points .contains(&access_point) - && let Err(err) = + { + if let Err(err) = tx.unbounded_send(network_manager::Request::SelectAccessPoint( access_point.ssid.clone(), access_point.network_type, - None, + self.secret_tx.clone(), self.active_device.as_ref().map(|d| d.interface.clone()), )) - { - if err.is_disconnected() { - return system_conn().map(cosmic::Action::App); - } + { + if err.is_disconnected() { + return system_conn().map(cosmic::Action::App); + } - tracing::error!("{err:?}"); + tracing::error!("{err:?}"); + } } self.new_connection = Some(NewConnectionState::EnterPassword { access_point, @@ -845,6 +915,7 @@ impl cosmic::Application for CosmicNetworkApplet { _ = cancel.send(()); } + self.secret_tx = None; return system_conn().map(cosmic::Action::App); } } @@ -910,23 +981,19 @@ impl cosmic::Application for CosmicNetworkApplet { tracing::warn!("Failed to find known access point with ssid: {}", ssid); return Task::none(); }; - self.show_visible_networks = true; - let ssid_for_task = ssid.clone(); - let forget_task = cosmic::task::future(async move { - match NmrsManager::new().await { - Ok(nm) => match nm.forget(&ssid_for_task).await { - Ok(()) => Message::Refresh, - Err(e) => { - tracing::warn!("forget {ssid_for_task} failed: {e}"); - Message::Refresh - } - }, - Err(e) => Message::Error(format!("nmrs init: {e}")), + if let Some(tx) = self.nm_sender.as_ref() { + if let Err(err) = + tx.unbounded_send(network_manager::Request::Forget(ssid.into())) + { + if err.is_disconnected() { + return system_conn().map(cosmic::Action::App); + } + + tracing::error!("{err:?}"); } - }) - .map(cosmic::Action::App); - let reconnect_task = self.update(Message::SelectWirelessAccessPoint(ap)); - return Task::batch(vec![forget_task, reconnect_task]); + self.show_visible_networks = true; + return self.update(Message::SelectWirelessAccessPoint(ap)); + } } Message::Surface(a) => { return cosmic::task::message(cosmic::Action::Cosmic( @@ -936,17 +1003,17 @@ impl cosmic::Application for CosmicNetworkApplet { Message::ActivateVpn(uuid) => { return self.connect_vpn(uuid.clone()); } - Message::DeactivateVpn(uuid) => { - return cosmic::task::future(async move { - match NmrsManager::new().await { - Ok(nm) => match nm.disconnect_vpn_by_uuid(&uuid).await { - Ok(()) => Message::Refresh, - Err(e) => Message::Error(format!("disconnect VPN {uuid}: {e}")), - }, - Err(e) => Message::Error(format!("nmrs init: {e}")), + Message::DeactivateVpn(name) => { + if let Some(tx) = self.nm_sender.as_ref() { + if let Err(err) = tx.unbounded_send(network_manager::Request::Deactivate(name)) + { + if err.is_disconnected() { + return system_conn().map(cosmic::Action::App); + } + + tracing::error!("{err:?}"); } - }) - .map(cosmic::Action::App); + } } Message::ToggleVpnList => { self.show_available_vpns = !self.show_available_vpns; @@ -971,7 +1038,7 @@ impl cosmic::Application for CosmicNetworkApplet { if let Err(err) = tx.unbounded_send(network_manager::Request::SelectAccessPoint( ssid, network_type, - None, + self.secret_tx.clone(), self.active_device.as_ref().map(|d| d.interface.clone()), )) { if err.is_disconnected() { @@ -1000,7 +1067,7 @@ impl cosmic::Application for CosmicNetworkApplet { ssid: access_point.ssid.to_string(), identity: is_enterprise.then(|| identity.clone()), password, - secret_tx: None, + secret_tx: self.secret_tx.clone(), interface: self.active_device.as_ref().map(|d| d.interface.clone()), }) { if err.is_disconnected() { @@ -1086,9 +1153,9 @@ impl cosmic::Application for CosmicNetworkApplet { } => { if let network_manager::Request::SelectAccessPoint( ssid, - _hw_address, + hw_address, _network_type, - _secret_tx, + secret_tx, ) = &req { let conn_match = self @@ -1100,7 +1167,15 @@ impl cosmic::Application for CosmicNetworkApplet { if let Some(ActiveConnectionInfo::WiFi { state, .. }) = state .active_conns .iter_mut() - .find(|ap| ap.name().as_str() == ssid.as_ref()) + .find(|ap| { + let ap_hw_address = match ap { + ActiveConnectionInfo::Wired { hw_address, .. } + | ActiveConnectionInfo::WiFi { hw_address, .. } => { + HwAddress::from_str(&hw_address).unwrap() + } + ActiveConnectionInfo::Vpn { .. } => HwAddress::default(), + }; + ap.name().as_str() == ssid.as_ref()}) { *state = ActiveConnectionState::Activated; } @@ -1117,8 +1192,8 @@ impl cosmic::Application for CosmicNetworkApplet { ssid, identity: _, password: _, - secret_tx: _, - interface: _, + secret_tx, + interface } = &req { if let Some(NewConnectionState::Waiting(access_point)) = @@ -1132,13 +1207,14 @@ impl cosmic::Application for CosmicNetworkApplet { } else { self.show_visible_networks = false; } - } else if let Some(NewConnectionState::EnterPassword { access_point, .. }) = - self.new_connection.as_ref() - && success - && ssid.as_str() == access_point.ssid.as_ref() + } else if let Some(NewConnectionState::EnterPassword { + access_point, .. + }) = self.new_connection.as_ref() { - self.new_connection = None; - self.show_visible_networks = false; + if success && ssid.as_str() == access_point.ssid.as_ref() { + self.new_connection = None; + self.show_visible_networks = false; + } } } else if self .new_connection @@ -1170,9 +1246,9 @@ impl cosmic::Application for CosmicNetworkApplet { } } cosmic_settings_network_manager_subscription::Event::WiFiCredentials { - ssid: _, - password: _, - security_type: _, + ssid, + password, + security_type, } => {} }, Message::NetworkManagerConnect(connection) => { @@ -1195,91 +1271,72 @@ impl cosmic::Application for CosmicNetworkApplet { self.nm_state.devices = device_infos.into_iter().map(Arc::new).collect(); } Message::WiFiEnable(enable) => { - self.nm_state.nm_state.wifi_enabled = enable; - return cosmic::task::future(async move { - match NmrsManager::new().await { - Ok(nm) => match nm.set_wireless_enabled(enable).await { - Ok(()) => Message::Refresh, - Err(e) => Message::Error(format!("set_wireless_enabled: {e}")), - }, - Err(e) => Message::Error(format!("nmrs init: {e}")), + if let Some(sender) = self.nm_sender.as_mut() { + if let Err(err) = + sender.unbounded_send(network_manager::Request::SetWiFi(enable)) + { + if err.is_disconnected() { + return system_conn().map(cosmic::Action::App); + } + + tracing::error!("{err:?}"); } - }) - .map(cosmic::Action::App); + if let Err(err) = sender.unbounded_send(network_manager::Request::Reload) { + if err.is_disconnected() { + return system_conn().map(cosmic::Action::App); + } + + tracing::error!("{err:?}"); + } + } } Message::SecretAgent(agent_event) => match agent_event { - NmAgentEvent::RequestSecret { - connection_uuid, - connection_id, - setting, - responder, + nm_secret_agent::Event::RequestSecret { + uuid, + name, + description, + previous, + tx, + .. } => { - let description = (!connection_id.is_empty()).then_some(connection_id); - let known_vpn = self - .nm_state - .known_vpns - .contains_key(connection_uuid.as_str()); - - let mut consumed = false; - if let Some(state) = self.new_connection.as_mut() { match state { NewConnectionState::EnterPassword { access_point, .. } | NewConnectionState::Waiting(access_point) | NewConnectionState::Failure(access_point) => { - let matches_ssid = matches!( - &setting, - AgentSetting::WifiPsk { ssid } - if ssid == access_point.ssid.as_ref() - ); - let matches_uuid = self + if self .nm_state .ssid_to_uuid .get(access_point.ssid.as_ref()) - .is_some_and(|ap_uuid| { - ap_uuid.as_ref() == connection_uuid.as_str() - }); - - if matches_ssid || matches_uuid { + .is_some_and(|ap_uuid| ap_uuid.as_ref() == uuid.as_str()) + { *state = NewConnectionState::EnterPassword { access_point: access_point.clone(), - description: description.clone(), + description, identity: String::new(), password: String::new().into(), password_hidden: true, - }; + } } } } - } else if known_vpn { - let secret_keys = match &setting { - AgentSetting::Vpn { secret_keys } => secret_keys.clone(), - _ => Vec::new(), - }; + } else if self.nm_state.known_vpns.contains_key(uuid.as_str()) { self.nm_state.requested_vpn = Some(RequestedVpn { - uuid: connection_uuid.into(), + name, + uuid: uuid.into(), description, - password: SecureString::from(String::new()), + password: previous, password_hidden: true, - responder: responder.clone(), - secret_keys, + tx, }); - consumed = true; - } - - // The applet's Wi-Fi flow re-issues the password through - // `Authenticate` rather than the agent. Free NM with - // `NoSecrets` so it doesn't sit on a stalled GetSecrets call. - if !consumed { - return release_responder(responder); } } - NmAgentEvent::CancelGetSecrets => { + nm_secret_agent::Event::CancelGetSecrets { .. } => { self.new_connection = None; self.nm_state.requested_vpn = None; } - NmAgentEvent::Failed(error) => { - tracing::error!("Error from secret agent: {error}"); + nm_secret_agent::Event::Failed(error) => { + tracing::error!("Error from secret agent: {error:?}"); } }, Message::KnownConnections(index_map) => { @@ -1301,30 +1358,12 @@ impl cosmic::Application for CosmicNetworkApplet { } } Message::ConnectVPNWithPassword => { - if let Some(RequestedVpn { - password, - responder, - secret_keys, - .. - }) = self.nm_state.requested_vpn.take() + if let Some(RequestedVpn { password, tx, .. }) = self.nm_state.requested_vpn.take() { return Task::future(async move { - let Some(responder) = responder.lock().await.take() else { - return Message::Refresh; - }; - - let mut secrets: HashMap = HashMap::new(); - let value = password.unsecure().to_owned(); - if secret_keys.is_empty() { - secrets.insert("password".to_owned(), value); - } else { - for key in secret_keys { - secrets.insert(key, value.clone()); - } - } - - if let Err(e) = responder.vpn_secrets(secrets).await { - tracing::error!("vpn secret reply failed: {e}"); + let mut guard = tx.lock().await; + if let Some(tx) = guard.take() { + let _ = tx.send(password); } Message::Refresh }) @@ -1337,15 +1376,7 @@ impl cosmic::Application for CosmicNetworkApplet { } } Message::CancelVPNConnection => { - if let Some(req) = self.nm_state.requested_vpn.take() { - return Task::future(async move { - if let Some(responder) = req.responder.lock().await.take() { - let _ = responder.cancel().await; - } - Message::NoOp - }) - .map(cosmic::Action::App); - } + self.nm_state.requested_vpn = None; } } Task::none() @@ -1410,7 +1441,7 @@ impl cosmic::Application for CosmicNetworkApplet { } ActiveConnectionInfo::Wired { name, - hw_address: _, + hw_address, speed, ip_addresses, } => { @@ -1530,7 +1561,7 @@ impl cosmic::Application for CosmicNetworkApplet { .icon_size(16) .on_press(Message::ResetFailedKnownSsid( name.clone(), - HwAddress::from_str(hw_address).unwrap(), + HwAddress::from_str(&hw_address).unwrap(), )) .into(), ); @@ -1545,7 +1576,7 @@ impl cosmic::Application for CosmicNetworkApplet { ) .on_press(Message::Disconnect( Arc::from(name.as_str()), - HwAddress::from_str(hw_address).unwrap(), + HwAddress::from_str(&hw_address).unwrap(), )), )]) .align_x(Alignment::Center), @@ -1702,13 +1733,14 @@ impl cosmic::Application for CosmicNetworkApplet { } for known in &self.nm_state.nm_state.known_access_points { - if let Some(active_device) = self.active_device.as_ref() - && active_device + if let Some(active_device) = self.active_device.as_ref() { + if active_device .known_connections .iter() - .all(|c| c.id != *known.ssid) - { - continue; + .all(|c| &c.id != known.ssid.as_ref()) + { + continue; + } } let mut btn_content = Vec::with_capacity(2); let ssid = text::body(known.ssid.as_ref()).width(Length::Fill); @@ -1840,43 +1872,43 @@ impl cosmic::Application for CosmicNetworkApplet { content = content.push(id); let is_enterprise = matches!(access_point.network_type, NetworkType::EAP); - let enter_password_col = cosmic::widget::column::with_capacity(4) - .push_maybe(is_enterprise.then(|| text::body(fl!("identity")))) - .push_maybe(is_enterprise.then(|| { - text_input::text_input("", identity).on_input(Message::IdentityUpdate) - })) - .push(text::body(fl!("enter-password"))) - .push_maybe(description.as_ref().map(|d| text::body(d.clone()))) - .push( - text_input::secure_input( - "", - password.unsecure(), - Some(Message::TogglePasswordVisibility), - *password_hidden, + let enter_password_col = + cosmic::widget::column::with_capacity(4) + .push_maybe(is_enterprise.then(|| text::body(fl!("identity")))) + .push_maybe(is_enterprise.then(|| { + text_input::text_input("", identity) + .on_input(|i| Message::IdentityUpdate(i)) + })) + .push(text::body(fl!("enter-password"))) + .push_maybe(description.as_ref().map(|d| text::body(d.clone()))) + .push( + text_input::secure_input( + "", + password.unsecure(), + Some(Message::TogglePasswordVisibility), + *password_hidden, + ) + .id(SECURE_INPUT_WIFI.clone()) + .on_input(|s| Message::PasswordUpdate(SecureString::from(s))) + .on_paste(|s| Message::PasswordUpdate(SecureString::from(s))) + .on_submit(|_| Message::ConnectWithPassword), ) - .id(SECURE_INPUT_WIFI.clone()) - .on_input(|s| Message::PasswordUpdate(SecureString::from(s))) - .on_paste(|s| Message::PasswordUpdate(SecureString::from(s))) - .on_submit(|_| Message::ConnectWithPassword), - ) - .push_maybe( - access_point.wps_push.then(|| { + .push_maybe(access_point.wps_push.then(|| { container(text::body(fl!("router-wps-button"))).padding(8) - }), - ) - .push( - row::with_children([ - Element::from( - button::standard(fl!("cancel")) - .on_press(Message::CancelNewConnection), - ), - Element::from( - button::suggested(fl!("connect")) - .on_press(Message::ConnectWithPassword), - ), - ]) - .spacing(24), - ); + })) + .push( + row::with_children([ + Element::from( + button::standard(fl!("cancel")) + .on_press(Message::CancelNewConnection), + ), + Element::from( + button::suggested(fl!("connect")) + .on_press(Message::ConnectWithPassword), + ), + ]) + .spacing(24), + ); let col = padded_control(enter_password_col.spacing(8).align_x(Alignment::Center)) .align_x(Alignment::Center); @@ -1955,7 +1987,7 @@ impl cosmic::Application for CosmicNetworkApplet { .filter(|ap| { let among_active = self.nm_state.nm_state.active_conns.iter().any(|a| { let hw_address = active_conn_hw_address(a); - ap.ssid.as_ref() == a.name() && ap.hw_address == hw_address + ap.ssid.as_ref() == &a.name() && ap.hw_address == hw_address }); let among_known = self.nm_state diff --git a/cosmic-applet-notifications/Cargo.toml b/cosmic-applet-notifications/Cargo.toml index fbfc8ad5..094cfa14 100644 --- a/cosmic-applet-notifications/Cargo.toml +++ b/cosmic-applet-notifications/Cargo.toml @@ -8,7 +8,7 @@ license = "GPL-3.0-only" cosmic-notifications-util = { git = "https://github.com/pop-os/cosmic-notifications" } cosmic-notifications-config = { git = "https://github.com/pop-os/cosmic-notifications" } anyhow.workspace = true -cosmic.workspace = true +libcosmic.workspace = true tokio.workspace = true # cosmic-notifications-util = { path = "../../cosmic-notifications-daemon/cosmic-notifications-util" } # cosmic-notifications-config = { path = "../../cosmic-notifications-daemon/cosmic-notifications-config" } diff --git a/cosmic-applet-notifications/i18n/el/cosmic_applet_notifications.ftl b/cosmic-applet-notifications/i18n/el/cosmic_applet_notifications.ftl index 56feb284..e69de29b 100644 --- a/cosmic-applet-notifications/i18n/el/cosmic_applet_notifications.ftl +++ b/cosmic-applet-notifications/i18n/el/cosmic_applet_notifications.ftl @@ -1,19 +0,0 @@ -hours-ago = - { $duration -> - [0] Μόλις τώρα - [one] Πριν από 1 ώρα - *[other] Πριν από { $duration } ώρες - } -show-more = Εμφάνιση { $more } ακόμη -clear-all = Απαλοιφή όλων των ειδοποιήσεων -notification-settings = Ρυθμίσεις ειδοποιήσεων... -no-notifications = Καμία ειδοποίηση -do-not-disturb = Μην ενοχλείτε -show-less = Εμφάνιση λιγότερων -clear-group = Απαλοιφή ομάδας -minutes-ago = - { $duration -> - [0] Μόλις τώρα - [one] Πριν από 1 λεπτό - *[other] Πριν από { $duration } λεπτά - } diff --git a/cosmic-applet-notifications/i18n/lo/cosmic_applet_notifications.ftl b/cosmic-applet-notifications/i18n/lo/cosmic_applet_notifications.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/cosmic-applet-notifications/i18n/sr/cosmic_applet_notifications.ftl b/cosmic-applet-notifications/i18n/sr/cosmic_applet_notifications.ftl index 39408d17..e69de29b 100644 --- a/cosmic-applet-notifications/i18n/sr/cosmic_applet_notifications.ftl +++ b/cosmic-applet-notifications/i18n/sr/cosmic_applet_notifications.ftl @@ -1,19 +0,0 @@ -show-more = Прикажи још { $more } -clear-all = Очисти сва обавештења -notification-settings = Подешавања обавештења... -no-notifications = Без обавештења -do-not-disturb = Не узнемиравај -show-less = Прикажи мање -clear-group = Очисти групу -hours-ago = - { $duration -> - [0] Управо сада - [one] Пре 1 сата - *[other] Пре { $duration } сати - } -minutes-ago = - { $duration -> - [0] Управо сада - [one] Пре 1 минута - *[other] Пре { $duration } минута - } diff --git a/cosmic-applet-power/Cargo.toml b/cosmic-applet-power/Cargo.toml index d6fae301..041c0474 100644 --- a/cosmic-applet-power/Cargo.toml +++ b/cosmic-applet-power/Cargo.toml @@ -7,7 +7,7 @@ license = "GPL-3.0-only" [dependencies] i18n-embed-fl.workspace = true i18n-embed.workspace = true -cosmic.workspace = true +libcosmic.workspace = true logind-zbus = "5.3.2" rust-embed.workspace = true rustix.workspace = true diff --git a/cosmic-applet-power/i18n/ca/cosmic_applet_power.ftl b/cosmic-applet-power/i18n/ca/cosmic_applet_power.ftl index 2c45ddba..e69de29b 100644 --- a/cosmic-applet-power/i18n/ca/cosmic_applet_power.ftl +++ b/cosmic-applet-power/i18n/ca/cosmic_applet_power.ftl @@ -1,2 +0,0 @@ -cancel = Cancel·lar -confirm = Confirmar diff --git a/cosmic-applet-power/i18n/el/cosmic_applet_power.ftl b/cosmic-applet-power/i18n/el/cosmic_applet_power.ftl index bc5a945c..41e6b281 100644 --- a/cosmic-applet-power/i18n/el/cosmic_applet_power.ftl +++ b/cosmic-applet-power/i18n/el/cosmic_applet_power.ftl @@ -4,33 +4,3 @@ log-out = Αποσύνδεση restart = Επανεκκίνηση suspend = Αναστολή confirm = Επιβεβαίωση -confirm-button = - { $action -> - [restart] { restart } - [suspend] { suspend } - [shutdown] Τερματισμός - [log-out] { log-out } - *[other] { confirm } - } -power = Ενέργεια -confirm-body = - Θα εκτελεστεί αυτόματα { $action -> - [restart] επανεκκίνηση - [suspend] αναστολή - [shutdown] τερματισμός - [lock-screen] κλείδωμα της οθόνης - [log-out] αποσύνδεση - *[other] η επιλεγμένη ενέργεια - } του συστήματος σε { $countdown } δευτερόλεπτα. -lock-screen = Κλείδωμα οθόνης -log-out-shortcut = Super + Shift + Escape -settings = Ρυθμίσεις... -lock-screen-shortcut = Super + Escape -confirm-title = - { $action -> - [restart] { restart } - [suspend] { suspend } - [shutdown] { shutdown } - [log-out] Έξοδος από όλες τις εφαρμογές και αποσύνδεση - *[other] Εφαρμογή της επιλεγμένης ενέργειας - } τώρα; diff --git a/cosmic-applet-power/i18n/lo/cosmic_applet_power.ftl b/cosmic-applet-power/i18n/lo/cosmic_applet_power.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/cosmic-applet-power/i18n/sr/cosmic_applet_power.ftl b/cosmic-applet-power/i18n/sr/cosmic_applet_power.ftl index 800b2900..e69de29b 100644 --- a/cosmic-applet-power/i18n/sr/cosmic_applet_power.ftl +++ b/cosmic-applet-power/i18n/sr/cosmic_applet_power.ftl @@ -1,36 +0,0 @@ -power = Напајање -lock-screen = Закључај екран -shutdown = Угаси -log-out = Одјава -restart = Поново покрени -log-out-shortcut = Супер + Shift + Esc -cancel = Откажи -suspend = Обустави -confirm = Потврди -settings = Подешавања... -lock-screen-shortcut = Супер + Esc -confirm-button = - { $action -> - [restart] { restart } - [suspend] { suspend } - [shutdown] Искључи - [log-out] { log-out } - *[other] { confirm } - } -confirm-body = - Систем ће { $action -> - [restart] поново покренути - [suspend] обуставити - [shutdown] искључити - [lock-screen] закључати екран - [log-out] одјавити се - *[other] применити изабрану радњу - } самостално за { $countdown } секунде. -confirm-title = - { $action -> - [restart] { restart } - [suspend] { suspend } - [shutdown] { shutdown } - [log-out] Затвори све програме и одјави се - *[other] Примени изабрану радњу - } сада? diff --git a/cosmic-applet-power/src/lib.rs b/cosmic-applet-power/src/lib.rs index 4a5829df..67725fbc 100644 --- a/cosmic-applet-power/src/lib.rs +++ b/cosmic-applet-power/src/lib.rs @@ -16,8 +16,9 @@ use cosmic::{ window, }, surface, theme, - widget::{button, divider, icon, space, text}, + widget::{Space, button, divider, icon, space, text}, }; +use std::sync::LazyLock; use logind_zbus::{ manager::ManagerProxy, @@ -34,6 +35,9 @@ pub mod session_manager; use crate::{cosmic_session::CosmicSessionProxy, session_manager::SessionManagerProxy}; +static SUBSURFACE_ID: LazyLock = + LazyLock::new(|| cosmic::widget::Id::new("subsurface")); + pub fn run() -> cosmic::iced::Result { localize::localize(); @@ -45,6 +49,7 @@ struct Power { icon_name: String, popup: Option, token_tx: Option>, + subsurface_id: window::Id, } #[derive(Debug, Clone, Copy)] @@ -70,7 +75,6 @@ impl PowerAction { } #[derive(Debug, Clone)] -#[allow(dead_code)] enum Message { Action(PowerAction), TogglePopup, @@ -100,6 +104,7 @@ impl cosmic::Application for Power { Self { core, icon_name: "system-shutdown-symbolic".to_string(), + subsurface_id: window::Id::unique(), token_tx: None, popup: Option::default(), }, diff --git a/cosmic-applet-status-area/Cargo.toml b/cosmic-applet-status-area/Cargo.toml index b222166a..fe85ad48 100644 --- a/cosmic-applet-status-area/Cargo.toml +++ b/cosmic-applet-status-area/Cargo.toml @@ -6,7 +6,7 @@ license = "GPL-3.0-only" [dependencies] futures.workspace = true -cosmic.workspace = true +libcosmic.workspace = true serde.workspace = true rustc-hash.workspace = true tokio.workspace = true diff --git a/cosmic-applet-status-area/src/components/app.rs b/cosmic-applet-status-area/src/components/app.rs index 506d3602..1071d7ac 100644 --- a/cosmic-applet-status-area/src/components/app.rs +++ b/cosmic-applet-status-area/src/components/app.rs @@ -11,6 +11,7 @@ use cosmic::{ iced::{ self, Length, Subscription, platform_specific::shell::commands::popup::{destroy_popup, get_popup}, + theme::Style, window, }, surface, @@ -24,7 +25,6 @@ use crate::{ }; #[derive(Clone, Debug)] -#[allow(dead_code)] pub enum Msg { None, Activate(usize), @@ -577,7 +577,7 @@ fn menu_icon_button<'a>( let icon = menu.icon_handle().clone(); let theme = cosmic::theme::active(); - let _theme = theme.cosmic(); + let theme = theme.cosmic(); let suggested = applet.suggested_size(true); let padding = applet.suggested_padding(true).1; diff --git a/cosmic-applet-status-area/src/components/status_menu.rs b/cosmic-applet-status-area/src/components/status_menu.rs index 0ab1f317..fedd79e4 100644 --- a/cosmic-applet-status-area/src/components/status_menu.rs +++ b/cosmic-applet-status-area/src/components/status_menu.rs @@ -8,7 +8,7 @@ use cosmic::{ iced, widget::icon::{self, IconFallback}, }; -use std::path::Path; +use std::path::{Path, PathBuf}; use crate::subscriptions::status_notifier_item::{IconUpdate, Layout, StatusNotifierItem}; diff --git a/cosmic-applet-status-area/src/status_notifier_watcher.rs b/cosmic-applet-status-area/src/status_notifier_watcher.rs index 5c8b6175..1bb75d79 100644 --- a/cosmic-applet-status-area/src/status_notifier_watcher.rs +++ b/cosmic-applet-status-area/src/status_notifier_watcher.rs @@ -10,18 +10,21 @@ //! can be socket-activated and not conflict with anything else running as a status notifier //! watcher. //! -//! The daemon runs as long as there is at least one client still connected. +//! The daemon runs as long as as there is at least one client still connected. Which it checks +//! for every `REFRESH_INTERVAL`. use crate::subscriptions::status_notifier_watcher::server::create_service; use crate::unique_names::UniqueNames; use futures::StreamExt; -use std::collections::HashSet; +use std::{collections::HashSet, time::Duration}; use zbus::fdo; use zbus::message::Header; const DBUS_NAME: &str = "com.system76.CosmicStatusNotifierWatcher"; const OBJECT_PATH: &str = "/CosmicStatusNotifierWatcher"; +const REFRESH_INTERVAL: Duration = Duration::from_secs(60); + /// Run daemon pub fn run() -> cosmic::iced::Result { if let Err(err) = run_inner() { @@ -39,7 +42,7 @@ pub async fn cosmic_register(conn: &zbus::Connection) -> zbus::Result<()> { tokio::spawn(async move { while let Some(value) = stream.next().await { if let Some(_unique_name) = value { - // Register with new owner. + /// Register with new owner let _ = cosmic_watcher.register_applet().await; } } diff --git a/cosmic-applet-tiling/Cargo.toml b/cosmic-applet-tiling/Cargo.toml index 894be7d4..23e689e0 100644 --- a/cosmic-applet-tiling/Cargo.toml +++ b/cosmic-applet-tiling/Cargo.toml @@ -5,10 +5,10 @@ edition = "2024" license = "GPL-3.0-only" [dependencies] -cosmic.workspace = true +libcosmic.workspace = true anyhow.workspace = true cctk.workspace = true -cosmic-comp-config.workspace = true +cosmic-comp-config = { git = "https://github.com/pop-os/cosmic-comp.git", rev = "5eb5af4" } cosmic-protocols.workspace = true i18n-embed-fl.workspace = true i18n-embed.workspace = true diff --git a/cosmic-applet-tiling/i18n/el/cosmic_applet_tiling.ftl b/cosmic-applet-tiling/i18n/el/cosmic_applet_tiling.ftl index 9c9d7e68..e69de29b 100644 --- a/cosmic-applet-tiling/i18n/el/cosmic_applet_tiling.ftl +++ b/cosmic-applet-tiling/i18n/el/cosmic_applet_tiling.ftl @@ -1,20 +0,0 @@ -arrow-keys = βέλη -move-window = Μετακίνηση παραθύρου -shift = Shift -super = Super -new-workspace = Συμπεριφορά νέων χώρων εργασίας -tiled = Παράθεση -active-hint = Ένδειξη ενεργού παραθύρου -navigate-windows = Πλοήγηση στα παράθυρα -toggle-floating-window = Εναλλαγή αιώρησης παραθύρων -all-workspaces = Όλοι οι χώροι εργασίας -per-workspace = Ανά χώρο εργασίας -autotile-behavior = Παράθεση παραθύρων στους χώρους εργασίας -tile-current = Παράθεση στον τρέχοντα χώρο εργασίας -floating = Αιώρηση -gaps = Κενά -tile-windows = Αυτόματη παράθεση παραθύρων -view-all-shortcuts = Προβολή όλων των συντομεύσεων... -shortcuts = Συντομεύσεις -floating-window-exceptions = Εξαιρέσεις αιωρούμενων παραθύρων... -window-management-settings = Ρυθμίσεις διαχείρισης παραθύρων... diff --git a/cosmic-applet-tiling/i18n/lo/cosmic_applet_tiling.ftl b/cosmic-applet-tiling/i18n/lo/cosmic_applet_tiling.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/cosmic-applet-tiling/i18n/sr/cosmic_applet_tiling.ftl b/cosmic-applet-tiling/i18n/sr/cosmic_applet_tiling.ftl index 394e8fd9..e69de29b 100644 --- a/cosmic-applet-tiling/i18n/sr/cosmic_applet_tiling.ftl +++ b/cosmic-applet-tiling/i18n/sr/cosmic_applet_tiling.ftl @@ -1,20 +0,0 @@ -arrow-keys = стрелице -tiled = Поплочано -active-hint = Активна помоћ -navigate-windows = Крећите се прозорима -toggle-floating-window = Окини пловни прозор -all-workspaces = Сви радни простори -per-workspace = По радном простору -autotile-behavior = Поплочај прозоре на радним просторима -tile-current = Поплочај тренутни радни простор -floating = Плутајуће -gaps = Размаци -move-window = Премести прозор -tile-windows = Самостално поплочај прозоре -view-all-shortcuts = Прикажи све пречице... -shortcuts = Пречице -shift = Shift -floating-window-exceptions = Изузеци за пловне прозоре... -super = Супер -window-management-settings = Подешавања за управљање прозорима... -new-workspace = Понашање новог радног простора diff --git a/cosmic-applet-tiling/src/window.rs b/cosmic-applet-tiling/src/window.rs index 7da430e3..327d5d75 100644 --- a/cosmic-applet-tiling/src/window.rs +++ b/cosmic-applet-tiling/src/window.rs @@ -26,7 +26,7 @@ use cosmic::{ }; use cosmic_comp_config::{CosmicCompConfig, TileBehavior}; use cosmic_protocols::workspace::v2::client::zcosmic_workspace_handle_v2::TilingState; -use std::thread; +use std::{thread, time::Instant}; use tracing::error; const ID: &str = "com.system76.CosmicAppletTiling"; @@ -46,7 +46,6 @@ pub struct Window { } #[derive(Clone, Debug)] -#[allow(dead_code)] pub enum Message { TogglePopup, PopupClosed(Id), diff --git a/cosmic-applet-time/Cargo.toml b/cosmic-applet-time/Cargo.toml index bfa73bcb..ff5e6298 100644 --- a/cosmic-applet-time/Cargo.toml +++ b/cosmic-applet-time/Cargo.toml @@ -9,7 +9,7 @@ cosmic-applets-config.workspace = true jiff = "0.2" i18n-embed-fl.workspace = true i18n-embed.workspace = true -cosmic.workspace = true +libcosmic.workspace = true rust-embed.workspace = true tokio.workspace = true tracing-log.workspace = true @@ -17,5 +17,5 @@ tracing-subscriber.workspace = true tracing.workspace = true icu = { version = "2.1.1", features = ["compiled_data"] } zbus.workspace = true -timedate-zbus = { path = "../../dbus-settings-bindings/timedate" } +timedate-zbus = { git = "https://github.com/pop-os/dbus-settings-bindings" } logind-zbus = "5.3.2" diff --git a/cosmic-applet-time/i18n/el/cosmic_applet_time.ftl b/cosmic-applet-time/i18n/el/cosmic_applet_time.ftl index 1e7405f3..e69de29b 100644 --- a/cosmic-applet-time/i18n/el/cosmic_applet_time.ftl +++ b/cosmic-applet-time/i18n/el/cosmic_applet_time.ftl @@ -1 +0,0 @@ -datetime-settings = Ρυθμίσεις ημερομηνίας, ώρας και ημερολογίου... diff --git a/cosmic-applet-time/i18n/lo/cosmic_applet_time.ftl b/cosmic-applet-time/i18n/lo/cosmic_applet_time.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/cosmic-applet-time/i18n/sr/cosmic_applet_time.ftl b/cosmic-applet-time/i18n/sr/cosmic_applet_time.ftl index 014ee726..e69de29b 100644 --- a/cosmic-applet-time/i18n/sr/cosmic_applet_time.ftl +++ b/cosmic-applet-time/i18n/sr/cosmic_applet_time.ftl @@ -1 +0,0 @@ -datetime-settings = Датум, време и подешавања календара... diff --git a/cosmic-applet-time/src/window.rs b/cosmic-applet-time/src/window.rs index ddd37d31..a44d81ee 100644 --- a/cosmic-applet-time/src/window.rs +++ b/cosmic-applet-time/src/window.rs @@ -94,7 +94,6 @@ pub struct Window { } #[derive(Debug, Clone)] -#[allow(dead_code)] pub enum Message { TogglePopup, CloseRequested(window::Id), @@ -362,7 +361,7 @@ impl cosmic::Application for Window { } fn subscription(&self) -> Subscription { - fn time_subscription(show_seconds: watch::Receiver) -> Subscription { + fn time_subscription(mut show_seconds: watch::Receiver) -> Subscription { struct Wrapper { inner: watch::Receiver, id: &'static str, @@ -377,7 +376,7 @@ impl cosmic::Application for Window { inner: show_seconds, id: "time-sub", }, - |Wrapper { inner, id: _ }| { + |Wrapper { inner, id }| { let mut show_seconds = inner.clone(); stream::channel(1, move |mut output: mpsc::Sender| async move { // Mark this receiver's state as changed so that it always receives an initial diff --git a/cosmic-applet-workspaces/Cargo.toml b/cosmic-applet-workspaces/Cargo.toml index 9d1b7bb9..ee9e04db 100644 --- a/cosmic-applet-workspaces/Cargo.toml +++ b/cosmic-applet-workspaces/Cargo.toml @@ -6,7 +6,7 @@ edition = "2024" license = "GPL-3.0-only" [dependencies] -cosmic.workspace = true +libcosmic.workspace = true cctk.workspace = true tracing.workspace = true tracing-subscriber.workspace = true diff --git a/cosmic-applet-workspaces/i18n/el/cosmic_applet_workspaces.ftl b/cosmic-applet-workspaces/i18n/el/cosmic_applet_workspaces.ftl index 84c57d03..e69de29b 100644 --- a/cosmic-applet-workspaces/i18n/el/cosmic_applet_workspaces.ftl +++ b/cosmic-applet-workspaces/i18n/el/cosmic_applet_workspaces.ftl @@ -1 +0,0 @@ -cosmic-applet-workspaces = Χώροι εργασίας COSMIC diff --git a/cosmic-applet-workspaces/i18n/lo/cosmic_applet_workspaces.ftl b/cosmic-applet-workspaces/i18n/lo/cosmic_applet_workspaces.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/cosmic-applet-workspaces/i18n/sr/cosmic_applet_workspaces.ftl b/cosmic-applet-workspaces/i18n/sr/cosmic_applet_workspaces.ftl index 98c21cf2..e69de29b 100644 --- a/cosmic-applet-workspaces/i18n/sr/cosmic_applet_workspaces.ftl +++ b/cosmic-applet-workspaces/i18n/sr/cosmic_applet_workspaces.ftl @@ -1 +0,0 @@ -cosmic-applet-workspaces = КОСМИК радни простори diff --git a/cosmic-applet-workspaces/src/components/app.rs b/cosmic-applet-workspaces/src/components/app.rs index a9bafb79..dc4ccdc4 100644 --- a/cosmic-applet-workspaces/src/components/app.rs +++ b/cosmic-applet-workspaces/src/components/app.rs @@ -84,7 +84,6 @@ impl IcedWorkspacesApplet { } #[derive(Debug, Clone)] -#[allow(dead_code)] enum Message { WorkspaceUpdate(WorkspacesUpdate), WorkspacePressed(ExtWorkspaceHandleV1), diff --git a/cosmic-applets/Cargo.toml b/cosmic-applets/Cargo.toml index 97755af8..2d950afc 100644 --- a/cosmic-applets/Cargo.toml +++ b/cosmic-applets/Cargo.toml @@ -23,7 +23,7 @@ cosmic-applet-time = { path = "../cosmic-applet-time" } cosmic-applet-workspaces = { path = "../cosmic-applet-workspaces" } cosmic-applet-input-sources = { path = "../cosmic-applet-input-sources" } cosmic-panel-button = { path = "../cosmic-panel-button" } -cosmic.workspace = true +libcosmic.workspace = true tracing.workspace = true tracing-subscriber.workspace = true tracing-log.workspace = true diff --git a/cosmic-applets/src/main.rs b/cosmic-applets/src/main.rs index dfd541d1..f62bbf21 100644 --- a/cosmic-applets/src/main.rs +++ b/cosmic-applets/src/main.rs @@ -12,44 +12,26 @@ fn main() -> cosmic::iced::Result { }; let start = applet.rfind('/').map_or(0, |v| v + 1); - let cmd = applet.as_str()[start..].to_string(); + let cmd = &applet.as_str()[start..]; tracing::info!("Starting `{cmd}` with version {VERSION}"); - let cmd_for_run = cmd.clone(); - let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(move || { - match cmd_for_run.as_str() { - "cosmic-app-list" => cosmic_app_list::run(), - "cosmic-applet-a11y" => cosmic_applet_a11y::run(), - "cosmic-applet-audio" => cosmic_applet_audio::run(), - "cosmic-applet-battery" => cosmic_applet_battery::run(), - "cosmic-applet-bluetooth" => cosmic_applet_bluetooth::run(), - "cosmic-applet-minimize" => cosmic_applet_minimize::run(), - "cosmic-applet-network" => cosmic_applet_network::run(), - "cosmic-applet-notifications" => cosmic_applet_notifications::run(), - "cosmic-applet-power" => cosmic_applet_power::run(), - "cosmic-applet-status-area" => cosmic_applet_status_area::run(), - "cosmic-applet-tiling" => cosmic_applet_tiling::run(), - "cosmic-applet-time" => cosmic_applet_time::run(), - "cosmic-applet-workspaces" => cosmic_applet_workspaces::run(), - "cosmic-applet-input-sources" => cosmic_applet_input_sources::run(), - "cosmic-panel-button" => cosmic_panel_button::run(), - _ => Ok(()), - } - })); - - match result { - Ok(r) => r, - Err(payload) => { - let msg = payload - .downcast_ref::<&str>() - .map(|s| s.to_string()) - .or_else(|| payload.downcast_ref::().cloned()) - .unwrap_or_else(|| "".to_string()); - tracing::error!( - "`{cmd}` panicked (likely compositor disconnect), exiting cleanly: {msg}" - ); - Ok(()) - } + match cmd { + "cosmic-app-list" => cosmic_app_list::run(), + "cosmic-applet-a11y" => cosmic_applet_a11y::run(), + "cosmic-applet-audio" => cosmic_applet_audio::run(), + "cosmic-applet-battery" => cosmic_applet_battery::run(), + "cosmic-applet-bluetooth" => cosmic_applet_bluetooth::run(), + "cosmic-applet-minimize" => cosmic_applet_minimize::run(), + "cosmic-applet-network" => cosmic_applet_network::run(), + "cosmic-applet-notifications" => cosmic_applet_notifications::run(), + "cosmic-applet-power" => cosmic_applet_power::run(), + "cosmic-applet-status-area" => cosmic_applet_status_area::run(), + "cosmic-applet-tiling" => cosmic_applet_tiling::run(), + "cosmic-applet-time" => cosmic_applet_time::run(), + "cosmic-applet-workspaces" => cosmic_applet_workspaces::run(), + "cosmic-applet-input-sources" => cosmic_applet_input_sources::run(), + "cosmic-panel-button" => cosmic_panel_button::run(), + _ => Ok(()), } } diff --git a/cosmic-panel-button/Cargo.toml b/cosmic-panel-button/Cargo.toml index 6719e131..dc6ffd9a 100644 --- a/cosmic-panel-button/Cargo.toml +++ b/cosmic-panel-button/Cargo.toml @@ -5,7 +5,7 @@ edition = "2024" license = "GPL-3.0-only" [dependencies] -cosmic.workspace = true +libcosmic.workspace = true rustc-hash.workspace = true tracing.workspace = true tracing-subscriber.workspace = true diff --git a/cosmic-panel-button/src/lib.rs b/cosmic-panel-button/src/lib.rs index 132e5dd5..718744b0 100644 --- a/cosmic-panel-button/src/lib.rs +++ b/cosmic-panel-button/src/lib.rs @@ -48,7 +48,7 @@ impl Button { icon: cosmic::widget::icon::Handle, ) -> cosmic::widget::Button<'a, Message> { let theme = cosmic::theme::active(); - let _theme = theme.cosmic(); + let theme = theme.cosmic(); let suggested = self.core.applet.suggested_size(icon.symbolic); let (major_padding, applet_padding_minor_axis) = @@ -123,15 +123,11 @@ impl cosmic::Application for Button { fn update(&mut self, message: Msg) -> app::Task { match message { Msg::Press => { - if let Ok(mut child) = Command::new("sh") + let _ = Command::new("sh") .arg("-c") - .arg(format!("exec {}", self.desktop.exec)) + .arg(&self.desktop.exec) .spawn() - { - std::thread::spawn(move || { - let _ = child.wait(); - }); - } + .unwrap(); } Msg::ConfigUpdated(conf) => { self.config = conf diff --git a/debian/changelog b/debian/changelog index 147363a2..e3d8e02e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,9 +1,3 @@ -cosmic-applets (1.0.12) noble; urgency=medium - - * Update changelog - - -- Michael Murphy Tue, 28 Apr 2026 15:11:17 +0200 - cosmic-applets (1.0.2) noble; urgency=medium [ Ashley Wulber ] diff --git a/i18n/ca/desktop_entries.ftl b/i18n/ca/desktop_entries.ftl index 8e680471..e69de29b 100644 --- a/i18n/ca/desktop_entries.ftl +++ b/i18n/ca/desktop_entries.ftl @@ -1 +0,0 @@ -cosmic-app-list = Safata d'Aplicacions diff --git a/i18n/el/desktop_entries.ftl b/i18n/el/desktop_entries.ftl index d5257105..e69de29b 100644 --- a/i18n/el/desktop_entries.ftl +++ b/i18n/el/desktop_entries.ftl @@ -1,51 +0,0 @@ -cosmic-app-list = Περιοχή εφαρμογών -cosmic-app-list-comment = Εκκίνηση καρφιτσωμένων εφαρμογών και διαχείριση ανοικτών παραθύρων -cosmic-applet-a11y = Προσβασιμότητα -cosmic-applet-audio = Ήχος -cosmic-applet-bluetooth = Bluetooth -cosmic-applet-bluetooth-comment = Διαχείριση συσκευών Bluetooth -cosmic-applet-minimize = Ελαχιστοποιημένα παράθυρα -cosmic-applet-minimize-comment = Διαχείριση ελαχιστοποιημένων παραθύρων -cosmic-applet-network = Δίκτυο -cosmic-applet-network-comment = Διαχείριση συνδέσεων δικτύου -cosmic-applet-time = Ημερομηνία, ώρα και ημερολόγιο -cosmic-applet-workspaces = Αριθμημένοι χώροι εργασίας -cosmic-panel-workspaces-button = Κουμπί χώρων εργασίας -cosmic-applet-audio-comment = Επιλογή συσκευής ήχου, έλεγχος έντασης και στοιχεία ελέγχου πολυμέσων MPRIS -cosmic-applet-audio-keywords = Μικροεφαρμογή;Ήχος;COSMIC;Applet;Sound;Audio;MPRIS; -cosmic-applet-bluetooth-keywords = Μικροεφαρμογή;COSMIC;Applet;Bluetooth; -cosmic-applet-input-sources = Πηγές εισόδου -cosmic-applet-input-sources-comment = Εναλλαγή μεταξύ πηγών εισόδου -cosmic-applet-input-sources-keywords = Μικροεφαρμογή;Πηγή;Είσοδος;COSMIC;Applet;Input;Source; -cosmic-applet-minimize-keywords = Μικροεφαρμογή;Ελαχιστοποίηση;COSMIC;Applet;Minimize; -cosmic-applet-network-keywords = Μικροεφαρμογή;Δίκτυο;COSMIC;Applet;Network; -cosmic-applet-notifications = Κέντρο ειδοποιήσεων -cosmic-applet-notifications-comment = Διαχείριση ειδοποιήσεων και λειτουργία «Μην ενοχλείτε» -cosmic-applet-notifications-keywords = Μικροεφαρμογή;Ειδοποίηση;COSMIC;Applet;Notification; -cosmic-applet-power = Συνεδρία χρήστη -cosmic-applet-power-comment = Κλείδωμα οθόνης, αποσύνδεση, αναστολή, επανεκκίνηση και τερματισμός -cosmic-applet-power-keywords = Μικροεφαρμογή;Χρήστης;Συνεδρία;Κλείδωμα;Αποσύνδεση;Επανεκκίνηση;Τερματισμός;Αναστολή;COSMIC;Applet;User;Session;Lock;Log;Reboot;Shutdown;Suspend; -cosmic-applet-status-area = Περιοχή ειδοποιήσεων -cosmic-applet-workspaces-keywords = Μικροεφαρμογή;Χώρος;Εργασίας;COSMIC;Applet;Workspace; -cosmic-panel-app-button = Κουμπί βιβλιοθήκης εφαρμογών -cosmic-panel-workspaces-button-keywords = Μικροεφαρμογή;Χώρος;Εργασίας;Επισκόπηση;COSMIC;Applet;Workspace;Overview; -cosmic-app-list-keywords = Μικροεφαρμογή;Εφαρμογή;Περιοχή;Λίστα;Εργασία;Γραμμή;COSMIC;Applet;App;Tray;List;Task;Bar; -cosmic-applet-a11y-keywords = Μικροεφαρμογή;Προσβασιμότητα;Προσιτότητα;Οθόνη;Ανάγνωση;Αναγνώστης;Μεγεθυντικός;Φακός;Αντίθεση;Χρώμα;COSMIC;Applet;Accessibility;A11y;Screen;Reader;Magnifier;Contrast;Color; -cosmic-applet-battery = Ενέργεια και μπαταρία -cosmic-applet-battery-comment = Λειτουργίες ενέργειας και επιλογές εξοικονόμησης ενέργειας -cosmic-applet-battery-keywords = Μικροεφαρμογή;Ενέργεια;Ισχύς;Μπαταρία;COSMIC;Applet;Power;Battery; -cosmic-applet-status-area-keywords = Μικροεφαρμογή;Εφαρμογή;Ένδειξη;Ειδοποίηση;Περιοχή;Κατάσταση;COSMIC;Applet;App;Indicator;Notification;Tray;Status; -cosmic-applet-time-keywords = Μικροεφαρμογή;Ημερομηνία;Ώρα;Ημερολόγιο;COSMIC;Applet;Date;Time;Calendar; -cosmic-panel-app-button-comment = Άνοιγμα της βιβλιοθήκης εφαρμογών για εκκίνηση εγκατεστημένων εφαρμογών -cosmic-panel-app-button-keywords = Μικροεφαρμογή;Εφαρμογή;Βιβλιοθήκη;Περιοχή;COSMIC;Applet;App;Library;Tray; -cosmic-applet-a11y-comment = Διαμόρφωση των ρυθμίσεων προσβασιμότητας από τη γραμμή συστήματος -cosmic-applet-status-area-comment = Ενδείξεις εφαρμογών που ενδέχεται να εξάγουν μενού στη γραμμή συστήματος -cosmic-applet-tiling = Παράθεση -cosmic-applet-tiling-comment = Διαχείριση της ένδειξης ενεργού παραθύρου, αυτόματη παράθεση παραθύρων στον τρέχοντα χώρο εργασίας και ανά χώρο εργασίας -cosmic-applet-tiling-keywords = Μικροεφαρμογή;Παράθεση;Ένδειξη;Χώρος;Εργασίας;COSMIC;Applet;Tiling;Hint;Workspace; -cosmic-applet-time-comment = Προβολή της τρέχουσας ώρας στη γραμμή συστήματος με αναδυόμενο ημερολόγιο -cosmic-applet-workspaces-comment = Εναλλαγή μεταξύ των αριθμημένων χώρων εργασίας στη γραμμή συστήματος -cosmic-panel-launcher-button = Κουμπί μενού εκκίνησης -cosmic-panel-launcher-button-comment = Άνοιγμα του μενού εκκίνησης για αναζήτηση εφαρμογών και εκτέλεση εντολών -cosmic-panel-launcher-button-keywords = Μικροεφαρμογή;Μενού;Εκκίνηση;Εκτέλεση;COSMIC;Applet;Launcher;Runner; -cosmic-panel-workspaces-button-comment = Άνοιγμα των χώρων εργασίας για διαχείριση και εναλλαγή χώρων εργασίας diff --git a/i18n/hu/desktop_entries.ftl b/i18n/hu/desktop_entries.ftl index 637e262e..8dd220f7 100644 --- a/i18n/hu/desktop_entries.ftl +++ b/i18n/hu/desktop_entries.ftl @@ -15,20 +15,20 @@ cosmic-applet-workspaces = Számozott Munkaterületek cosmic-panel-app-button = Alkalmazáskönyvtár gomb cosmic-panel-launcher-button = Indító gomb cosmic-panel-workspaces-button = Munkaterületek gomb -cosmic-app-list-keywords = COSMIC;kisalkalmazás;alkalmazás;app;tálca;lista;sáv; -cosmic-applet-a11y-keywords = COSMIC;kisalkalmazás;akadálymentesség;akadálymentesítés;képernyő;olvasó;nagyító;szín; -cosmic-applet-audio-keywords = COSMIC;kisalkalmazás;hang;MPRIS; -cosmic-applet-battery-keywords = COSMIC;kisalkalmazás;energia;akkumulátor; +cosmic-app-list-keywords = COSMIC;Kisalkalmazás;Alkalmazás;App;Tálca;Lista;Sáv; +cosmic-applet-a11y-keywords = COSMIC;Kisalkalmazás;Akadálymentesség;Akadálymentesítés;Képernyő;Olvasó;Nagyító;Szín; +cosmic-applet-audio-keywords = COSMIC;Kisalkalmazás;Hang;MPRIS; +cosmic-applet-battery-keywords = COSMIC;Kisalkalmazás;Energia;Akkumulátor; cosmic-applet-bluetooth-comment = Bluetooth-eszközök kezelése -cosmic-applet-bluetooth-keywords = COSMIC;kisalkalmazás;bluetooth; -cosmic-applet-input-sources-keywords = COSMIC;kisalkalmazás;beviteli forrás; -cosmic-applet-minimize-keywords = COSMIC;kisalkalmazás;minimizálás; -cosmic-applet-network-keywords = COSMIC;kisalkalmazás;hálózat;internet; -cosmic-applet-notifications-keywords = COSMIC;kisalkalmazás;értesítések; -cosmic-applet-power-keywords = COSMIC;kisalkalmazás;felhasználói munkamenet;zárolás;kijelentkezés;újraindítás;leállítás;felfüggesztés; -cosmic-panel-app-button-keywords = COSMIC;kisalkalmazás;alkalmazás;könyvtár;tálca; -cosmic-panel-launcher-button-keywords = COSMIC;kisalkalmazás;indító;futtató; -cosmic-panel-workspaces-button-keywords = COSMIC;kisalkalmazás;munkaterületek;áttekintés; +cosmic-applet-bluetooth-keywords = COSMIC;Kisalkalmazás;Bluetooth; +cosmic-applet-input-sources-keywords = COSMIC;Kisalkalmazás;Beviteli;Forrás; +cosmic-applet-minimize-keywords = COSMIC;Kisalkalmazás;Minimizálás; +cosmic-applet-network-keywords = COSMIC;Kisalkalmazás;Hálózat;Internet; +cosmic-applet-notifications-keywords = COSMIC;Kisalkalmazás;Értesítések; +cosmic-applet-power-keywords = COSMIC;Kisalkalmazás;Felhasználói munkamenet;Zárolás;Kijelentkezés;Újraindítás;Leállítás;Felfüggesztés; +cosmic-panel-app-button-keywords = COSMIC;Kisalkalmazás;Alkalmazás;Könyvtár;Tálca; +cosmic-panel-launcher-button-keywords = COSMIC;Kisalkalmazás;Indító;Futtató; +cosmic-panel-workspaces-button-keywords = COSMIC;Kisalkalmazás;Munkaterületek;Áttekintés; cosmic-applet-a11y-comment = Akadálymentességi beállítások kezelése a panelen cosmic-applet-audio-comment = Hangeszköz kiválasztása, hangerőszabályozás és MPRIS médiavezérlés cosmic-applet-battery-comment = Energiamódok és energiagazdálkodási beállítások @@ -39,13 +39,13 @@ cosmic-applet-notifications-comment = Értesítések és a Ne zavarjanak kezelé cosmic-applet-power-comment = Képernyő zárolása, kijelentkezés, felfüggesztés, újraindítás és leállítás cosmic-app-list-comment = Rögzített alkalmazások indítása és a megnyitott ablakok kezelése cosmic-applet-status-area-comment = Alkalmazásjelzők, melyek menüt is megjeleníthetnek a panelen -cosmic-applet-status-area-keywords = COSMIC;kisalkalmazás;alkalmazás;app;jelző;értesítések;tálca;állapot; +cosmic-applet-status-area-keywords = COSMIC;Kisalkalmazás;Alkalmazás;App;Jelző;Értesítések;Tálca;Állapot; cosmic-applet-tiling-comment = Az aktív ablak kiemelésének, valamint az aktuális és munkaterületenkénti automatikus csempézés kezelése -cosmic-applet-tiling-keywords = COSMIC;kisalkalmazás;csempézés;kiemelés;munkaterületek; +cosmic-applet-tiling-keywords = COSMIC;Kisalkalmazás;Csempézés;Kiemelés;Munkaterületek; cosmic-applet-time-comment = Az aktuális idő megjelenítése a panelen, felugró naptárral -cosmic-applet-time-keywords = COSMIC;kisalkalmazás;dátum;idő;naptár; +cosmic-applet-time-keywords = COSMIC;Kisalkalmazás;Dátum;Idő;Naptár; cosmic-applet-workspaces-comment = Váltás számozott munkaterületek között a panelen -cosmic-applet-workspaces-keywords = COSMIC;kisalkalmazás;munkaterületek; +cosmic-applet-workspaces-keywords = COSMIC;Kisalkalmazás;Munkaterületek; cosmic-panel-app-button-comment = Az alkalmazáskönyvtár megnyitása a telepített alkalmazások indításához cosmic-panel-launcher-button-comment = Az indító megnyitása alkalmazások kereséséhez és parancsok futtatásához cosmic-panel-workspaces-button-comment = A munkaterületek áttekintőjének megnyitása munkaterületek kezeléséhez és váltásához diff --git a/i18n/lo/desktop_entries.ftl b/i18n/lo/desktop_entries.ftl deleted file mode 100644 index e69de29b..00000000 diff --git a/i18n/sr/desktop_entries.ftl b/i18n/sr/desktop_entries.ftl index 10c8d1eb..e69de29b 100644 --- a/i18n/sr/desktop_entries.ftl +++ b/i18n/sr/desktop_entries.ftl @@ -1,51 +0,0 @@ -cosmic-app-list = Системска касета -cosmic-app-list-comment = Покрени закачене програме и управљај отвореним прозорима -cosmic-app-list-keywords = COSMIC;Applet;App;Tray;List;Task;Bar;Космик;Програмчић;Програм;Касета;Списак;Задатак;Трака;kosmik;programčić;program;kaseta;spisak;zadatak;traka; -cosmic-applet-a11y = Приступачност -cosmic-applet-a11y-comment = Подеси подешавања приступачности из траке -cosmic-applet-a11y-keywords = COSMIC;Applet;Accessibility;A11y;Screen;Reader;Magnifier;Contrast;Color;Космик;Програмчић;Приступачност;А11ј;Екран;Читач;Лупа;Контраст;Боја;kosmik;programčić;pristupačnost;a11j;ekran;čitač;lupa;kontrast;boja; -cosmic-applet-audio = Звук -cosmic-applet-audio-comment = Избор уређаја звука, управљање јачином звука и MPRIS контроле медија -cosmic-applet-audio-keywords = COSMIC;Applet;Sound;Audio;MPRIS;Космик;Програмчић;Аудио;Звук;Јачина звука;МПРИС;Медија;kosmik;programčić;audio;zvuk;jačina zvuka;medija; -cosmic-applet-battery = Напајање и батерија -cosmic-applet-battery-comment = Режими напајања и могућности уштеде енергије -cosmic-applet-battery-keywords = COSMIC;Applet;Power;Battery;Космик;Програмчић;Напајање;Батерија;kosmik;programčić;napajanje;baterija; -cosmic-applet-bluetooth = Блутут -cosmic-applet-bluetooth-comment = Управљај Блутут уређајима -cosmic-applet-bluetooth-keywords = COSMIC;Applet;Bluetooth;Космик;Програмчић;Блутут;kosmik;programčić;blutut; -cosmic-applet-input-sources = Извори уноса -cosmic-applet-input-sources-comment = Пребацивање између извора уноса -cosmic-applet-input-sources-keywords = COSMIC;Applet;Input;Source;Космик;Програмчић;Унос;Извор;kosmik;programčić;unos;izvor; -cosmic-applet-minimize = Умањени прозори -cosmic-applet-minimize-comment = Управљај умањеним прозорима -cosmic-applet-minimize-keywords = COSMIC;Applet;Minimize;Космик;Програмчић;Умањи;kosmik;programčić;umanji; -cosmic-applet-network = Мрежа -cosmic-applet-network-comment = Управљај мрежним везама -cosmic-applet-network-keywords = COSMIC;Applet;Network;Космик;Програмчић;Мрежа;kosmik;programčić;mreža; -cosmic-applet-notifications = Центар за обавештења -cosmic-applet-notifications-comment = Управљај обавештењима и режимом „Не узнемиравај“ -cosmic-applet-notifications-keywords = COSMIC;Applet;Notification;Космик;Програмчић;Обавештење;kosmik;programčić;obaveštenje; -cosmic-applet-power = Корисничка сесија -cosmic-applet-power-comment = Закључај екран, одјави се, обустави, поново покрени и искључи -cosmic-applet-power-keywords = COSMIC;Applet;User;Session;Lock;Log;Reboot;Shutdown;Suspend;Космик;Програмчић;Корисник;Сесија;Закључавање;Одјава;Поновно покретање;Искључивање;Обустава;kosmik;programčić;korisnik;sesija;zaključavanje;odjava;ponovno pokretanje;isključivanje;obustava; -cosmic-applet-status-area = Обавештајна касета -cosmic-applet-status-area-comment = Показивачи програма који могу извести изборнике у површ -cosmic-applet-status-area-keywords = COSMIC;Applet;App;Indicator;Notification;Tray;Status;Космик;Програмчић;Програм;Показатељ;Обавештење;Пољце;Статус;kosmik;programčić;program;pokazatelj;obaveštenje;poljce;status; -cosmic-applet-tiling = Поплочавање -cosmic-applet-tiling-comment = Управљај активним саветом, тренутним и самопоплочавањем по радном простору -cosmic-applet-tiling-keywords = COSMIC;Applet;Tiling;Hint;Workspace;Космик;Програмчић;Поплочавање;Помоћ;Радни простор;kosmik;programčić;popločavanje;pomoć;radni prostor; -cosmic-applet-time = Датум, време и календар -cosmic-applet-time-comment = Приказује тренутно време у површи са искакућим календаром -cosmic-applet-time-keywords = COSMIC;Applet;Date;Time;Calendar;Космик;Програмчић;Датум;Време;Календар;kosmik;programčić;datum;vreme;kalendar; -cosmic-applet-workspaces = Радни простори обележени бројевима -cosmic-applet-workspaces-comment = Пребаците између радних простора обележених бројевима у траци -cosmic-applet-workspaces-keywords = COSMIC;Applet;Workspace;Космик;Програмчић;радни простор;kosmik;programčić;radni prostor; -cosmic-panel-app-button = Дугме за библиотеку програма -cosmic-panel-app-button-comment = Отвори библиотеку програма за покретање инсталираних програма -cosmic-panel-app-button-keywords = COSMIC;Applet;App;Library;Tray;Космик;Програмчић;Програм;Библиотека;Касета;kosmik;programčić;program;biblioteka;kaseta; -cosmic-panel-launcher-button = Дугме покретача -cosmic-panel-launcher-button-comment = Отвори покретач да бисте претражили програме и покренули наредбе -cosmic-panel-launcher-button-keywords = COSMIC;Applet;Launcher;Runner;Космик;Програмчић;Покретач;Покретач;kosmik;programčić;pokretač;pokretač; -cosmic-panel-workspaces-button = Дугме радних простора -cosmic-panel-workspaces-button-comment = Отвори преглед радних простора за управљање и пребацивање радних простора -cosmic-panel-workspaces-button-keywords = COSMIC;Applet;Workspace;Overview;Космик;Програмчић;радни простор;Преглед;kosmik;programčić;radni prostor;pregled; diff --git a/i18n/uk/desktop_entries.ftl b/i18n/uk/desktop_entries.ftl index c6088440..b6b177b5 100644 --- a/i18n/uk/desktop_entries.ftl +++ b/i18n/uk/desktop_entries.ftl @@ -30,9 +30,9 @@ cosmic-applet-input-sources-comment = Перемикання джерел вве cosmic-applet-input-sources-keywords = COSMIC;КОСМІК;КОСМОС;КОСМІЧНЕ;Віджет;Віджети;Джерело;Введення;Розкладка;Клавіатура; cosmic-applet-minimize-comment = Керування згорнутими вікнами cosmic-applet-minimize-keywords = COSMIC;КОСМІК;КОСМОС;КОСМІЧНЕ;Віджет;Віджети;Згорнути;Згорнуті;Вікна;Вікно; -cosmic-applet-network-comment = Керування мережевими з’єднаннями +cosmic-applet-network-comment = Керування мережевими підключеннями cosmic-applet-network-keywords = COSMIC;КОСМІК;КОСМОС;КОСМІЧНЕ;Віджет;Віджети;Мережа;Інтернет; -cosmic-applet-notifications-comment = Керування сповіщеннями та режимом «Не турбувати» +cosmic-applet-notifications-comment = Керування сповіщеннями та режимом Не турбувати cosmic-applet-notifications-keywords = COSMIC;КОСМІК;КОСМОС;КОСМІЧНЕ;Віджет;Віджети;Сповіщення; cosmic-applet-power-comment = Блокування екрана, вихід із сеансу, призупинення, перезапуск і вимкнення cosmic-applet-power-keywords = COSMIC;КОСМІК;КОСМОС;КОСМІЧНЕ;Віджет;Віджети;Сеанс;Користувач;Блокування;Вихід;Перезапуск;Вимкнення;Призупинення;Сон; diff --git a/redeploy.sh b/redeploy.sh deleted file mode 100755 index 686bf3cb..00000000 --- a/redeploy.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bash -# Recompile et déploie le fork local cosmic-applets (multiplexor cosmic-applets + -# binaire séparé cosmic-app-list). -# -# Cibles : /usr/local/bin/cosmic-applets et /usr/local/bin/cosmic-app-list -# (binaires compilés manuellement, hors pacman, qui priment sur ceux du paquet -# via $PATH /usr/local/bin avant /usr/bin). -# -# Branche de déploiement : yoda-dock-magnification (contient les commits -# magnification + le fix Wayland error handling). - -set -euo pipefail - -REPO="/home/lionel/Projets/COSMIC/cosmic-applets" -TARGETS=( - "cosmic-applets" - "cosmic-app-list" - "cosmic-panel-button" -) -BIN_DIR="/usr/local/bin" - -cd "$REPO" - -echo "==> Branche actuelle : $(git branch --show-current)" -echo "==> Build release (workspace)..." -cargo build --release --workspace - -STAMP=$(date +%Y%m%d-%H%M%S) -for bin in "${TARGETS[@]}"; do - src="$REPO/target/release/$bin" - dst="$BIN_DIR/$bin" - - if [[ ! -f "$src" ]]; then - echo "!! Binaire absent après build : $src" >&2 - exit 1 - fi - - if [[ -f "$dst" ]]; then - echo "==> Backup $dst" - sudo cp -a "$dst" "${dst}.bak.${STAMP}" - fi - - echo "==> Install $src -> $dst" - sudo install -m755 "$src" "$dst" -done - -echo "==> Kill des process applet en cours (cosmic-panel relancera à la demande)" -pkill -u "$USER" -f "/usr/local/bin/cosmic-applet" || true -pkill -u "$USER" -f "/usr/local/bin/cosmic-app-list" || true -pkill -u "$USER" -f "/usr/local/bin/cosmic-panel-button" || true - -echo "==> Vérif" -for bin in "${TARGETS[@]}"; do - file "$BIN_DIR/$bin" -done -echo "OK — relogin recommandé pour repartir sur des process applet propres." diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 075062e5..ff100edc 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.93.0" +channel = "1.90.0"