From 9eb4053d310cec2df70daa23ae298a4a5990e3f6 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Fri, 2 May 2025 16:37:24 -0400 Subject: [PATCH] feat(accessiblity): high contrast and color filter toggles --- Cargo.lock | 379 +++++++++--------- Cargo.toml | 3 +- cosmic-applet-a11y/Cargo.toml | 1 + .../i18n/en/cosmic_applet_a11y.ftl | 4 +- cosmic-applet-a11y/src/app.rs | 131 +++++- cosmic-applet-a11y/src/backend/wayland/mod.rs | 33 +- .../src/backend/wayland/thread.rs | 161 -------- 7 files changed, 317 insertions(+), 395 deletions(-) delete mode 100644 cosmic-applet-a11y/src/backend/wayland/thread.rs diff --git a/Cargo.lock b/Cargo.lock index ff026f93..e5a11bf8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -120,7 +120,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "version_check", "zerocopy 0.7.35", @@ -191,9 +191,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.97" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "apply" @@ -316,14 +316,15 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" dependencies = [ "async-task", "concurrent-queue", "fastrand 2.3.0", "futures-lite 2.6.0", + "pin-project-lite", "slab", ] @@ -441,7 +442,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -476,7 +477,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -552,7 +553,7 @@ dependencies = [ "derive_utils", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -718,9 +719,9 @@ checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" dependencies = [ "bytemuck_derive", ] @@ -733,7 +734,7 @@ checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -792,9 +793,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.17" +version = "1.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" dependencies = [ "jobserver", "libc", @@ -827,9 +828,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1059,7 +1060,7 @@ dependencies = [ "libcosmic", "memmap2 0.9.5", "once_cell", - "rand 0.9.0", + "rand 0.9.1", "rust-embed", "rustix 0.38.44", "serde", @@ -1156,7 +1157,7 @@ dependencies = [ "i18n-embed-fl", "libcosmic", "once_cell", - "rand 0.9.0", + "rand 0.9.1", "rust-embed", "tokio", "tracing", @@ -1367,7 +1368,7 @@ dependencies = [ [[package]] name = "cosmic-client-toolkit" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-protocols//?branch=main#ee0d46f4b7e1508011a98225f14c4a0528ab2914" +source = "git+https://github.com/pop-os/cosmic-protocols//?branch=main#1425bd44ed2b318a552201cc752ae11f2f483ef5" dependencies = [ "bitflags 2.9.0", "cosmic-protocols", @@ -1456,7 +1457,7 @@ dependencies = [ [[package]] name = "cosmic-notifications-config" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-notifications#326ad6800ab5e237761844b0897084d6628531e3" +source = "git+https://github.com/pop-os/cosmic-notifications#ba66c2b7e2a8245ef2d5ae37e6b9d8d81fe5b631" dependencies = [ "cosmic-config", "serde", @@ -1465,7 +1466,7 @@ dependencies = [ [[package]] name = "cosmic-notifications-util" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-notifications#326ad6800ab5e237761844b0897084d6628531e3" +source = "git+https://github.com/pop-os/cosmic-notifications#ba66c2b7e2a8245ef2d5ae37e6b9d8d81fe5b631" dependencies = [ "fast_image_resize", "serde", @@ -1505,7 +1506,7 @@ dependencies = [ [[package]] name = "cosmic-protocols" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-protocols//?branch=main#ee0d46f4b7e1508011a98225f14c4a0528ab2914" +source = "git+https://github.com/pop-os/cosmic-protocols//?branch=main#1425bd44ed2b318a552201cc752ae11f2f483ef5" dependencies = [ "bitflags 2.9.0", "wayland-backend", @@ -1527,18 +1528,22 @@ dependencies = [ [[package]] name = "cosmic-settings-subscriptions" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-settings-subscriptions#650f0bc1dbfdce2e541c104674257d1621b2de4c" +source = "git+https://github.com/pop-os/cosmic-settings-subscriptions#1730a69c095e7502afeb0cc44198152be83208b7" dependencies = [ "bluez-zbus", "cosmic-dbus-a11y", "cosmic-dbus-networkmanager", + "cosmic-protocols", "futures", "iced_futures", "itertools", "libpulse-binding", "log", - "rustix 1.0.5", + "num-derive", + "num-traits", + "rustix 1.0.7", "secure-string", + "smithay-client-toolkit", "thiserror 2.0.12", "tokio", "tokio-stream", @@ -1558,7 +1563,7 @@ dependencies = [ "rangemap", "rustc-hash 1.1.0", "rustybuzz", - "self_cell 1.1.0", + "self_cell 1.2.0", "smol_str", "swash", "sys-locale", @@ -1682,7 +1687,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "synstructure", ] @@ -1742,7 +1747,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1764,21 +1769,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.100", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core 0.9.10", + "syn 2.0.101", ] [[package]] @@ -1822,9 +1813,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", ] @@ -1880,7 +1871,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1891,7 +1882,7 @@ checksum = "ccfae181bab5ab6c5478b2ccb69e4c68a02f8c3ec72f6616bfec9dbc599d2ee0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -1960,7 +1951,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2107,7 +2098,7 @@ checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2118,9 +2109,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", @@ -2197,9 +2188,9 @@ checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" [[package]] name = "fast_image_resize" -version = "5.1.2" +version = "5.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55264ccc579fc127eebf6c6c1841d0c160d79a44c8f6f97047b7bc4a9c0d1a5" +checksum = "e146c782f75f50995dae9ecf9ec189fc9d0d2906318cc6826ea9451717fe52ec" dependencies = [ "cfg-if", "document-features", @@ -2408,7 +2399,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2534,7 +2525,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2589,9 +2580,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", @@ -2724,7 +2715,7 @@ checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" dependencies = [ "bitflags 2.9.0", "gpu-descriptor-types", - "hashbrown 0.15.2", + "hashbrown", ] [[package]] @@ -2754,9 +2745,9 @@ dependencies = [ [[package]] name = "half" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", @@ -2764,15 +2755,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "foldhash", ] @@ -2844,9 +2829,9 @@ dependencies = [ [[package]] name = "i18n-embed" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0454970a5853f498e686cbd7bf9391aac2244928194780cb7a0af0f41937db6" +checksum = "669ffc2c93f97e6ddf06ddbe999fcd6782e3342978bb85f7d3c087c7978404c4" dependencies = [ "arc-swap", "fluent", @@ -2865,11 +2850,10 @@ dependencies = [ [[package]] name = "i18n-embed-fl" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7578cee2940492a648bd60fb49ca85ee8c821a63790e0ef5b604cfed353b2a" +checksum = "04b2969d0b3fc6143776c535184c19722032b43e6a642d710fa3f88faec53c2d" dependencies = [ - "dashmap", "find-crate", "fluent", "fluent-syntax", @@ -2879,7 +2863,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.100", + "syn 2.0.101", "unic-langid", ] @@ -2893,7 +2877,7 @@ dependencies = [ "i18n-config", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3488,7 +3472,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3592,12 +3576,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown", ] [[package]] @@ -3817,9 +3801,9 @@ dependencies = [ [[package]] name = "kurbo" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89234b2cc610a7dd927ebde6b41dd1a5d4214cffaef4cf1fb2195d592f92518f" +checksum = "1077d333efea6170d9ccb96d3c3026f300ca0773da4938cc4c811daa6df68b0c" dependencies = [ "arrayvec", "smallvec", @@ -3833,9 +3817,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.171" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libcosmic" @@ -3871,7 +3855,7 @@ dependencies = [ "palette", "rfd", "ron 0.9.0", - "rustix 1.0.5", + "rustix 1.0.7", "serde", "shlex", "slotmap", @@ -3905,15 +3889,15 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72" [[package]] name = "libpulse-binding" -version = "2.29.0" +version = "2.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "441092fb2d05962d74246a00c1b2f8c87c60fb6b38a5cc42227c229a702c0ce5" +checksum = "909eb3049e16e373680fe65afe6e2a722ace06b671250cc4849557bc57d6a397" dependencies = [ "bitflags 2.9.0", "libc", @@ -3925,9 +3909,9 @@ dependencies = [ [[package]] name = "libpulse-sys" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8febf45075a6ac7e36d0c7aa62536217f476f24456854cdad296952852b5cd2" +checksum = "d74371848b22e989f829cc1621d2ebd74960711557d8b45cfe740f60d0a05e61" dependencies = [ "libc", "num-derive", @@ -3944,7 +3928,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.9.0", "libc", - "redox_syscall 0.5.10", + "redox_syscall 0.5.11", ] [[package]] @@ -3977,9 +3961,9 @@ checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" [[package]] name = "linux-raw-sys" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" @@ -4187,9 +4171,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff70ce3e48ae43fa075863cef62e8b43b71a4f2382229920e0df362592919430" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", "simd-adler32", @@ -4370,7 +4354,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4431,7 +4415,7 @@ dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4727,7 +4711,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4767,7 +4751,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4819,7 +4803,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.10", + "redox_syscall 0.5.11", "smallvec", "windows-targets 0.52.6", ] @@ -4885,7 +4869,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4920,7 +4904,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5014,7 +4998,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.24", + "zerocopy 0.8.25", ] [[package]] @@ -5039,7 +5023,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit 0.22.24", + "toml_edit 0.22.26", ] [[package]] @@ -5061,14 +5045,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -5081,7 +5065,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "version_check", "yansi", ] @@ -5117,9 +5101,9 @@ checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" [[package]] name = "quick-xml" -version = "0.37.4" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4ce8c88de324ff838700f36fb6ab86c96df0e3c4ab6ef3a9b2044465cce1369" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" dependencies = [ "memchr", ] @@ -5152,13 +5136,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy 0.8.24", ] [[package]] @@ -5187,7 +5170,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -5247,9 +5230,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" dependencies = [ "bitflags 2.9.0", ] @@ -5260,7 +5243,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 1.0.69", ] @@ -5271,7 +5254,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 2.0.12", ] @@ -5416,9 +5399,9 @@ checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" [[package]] name = "rust-embed" -version = "8.6.0" +version = "8.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b3aba5104622db5c9fc61098de54708feb732e7763d7faa2fa625899f00bf6f" +checksum = "e5fbc0ee50fcb99af7cebb442e5df7b5b45e9460ffa3f8f549cd26b862bec49d" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -5427,22 +5410,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.6.0" +version = "8.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f198c73be048d2c5aa8e12f7960ad08443e56fd39cc26336719fdb4ea0ebaae" +checksum = "6bf418c9a2e3f6663ca38b8a7134cc2c2167c9d69688860e8961e3faa731702e" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.100", + "syn 2.0.101", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.6.0" +version = "8.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a2fcdc9f40c8dc2922842ca9add611ad19f332227fc651d015881ad1552bd9a" +checksum = "08d55b95147fe01265d06b3955db798bdaed52e60e2211c41137701b3aba8e21" dependencies = [ "sha2", "walkdir", @@ -5495,14 +5478,14 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.5" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys 0.9.3", + "linux-raw-sys 0.9.4", "windows-sys 0.59.0", ] @@ -5585,20 +5568,20 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d" dependencies = [ - "self_cell 1.1.0", + "self_cell 1.2.0", ] [[package]] name = "self_cell" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" +checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" [[package]] name = "sendfd" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604b71b8fc267e13bb3023a2c901126c8f349393666a6d98ac1ae5729b701798" +checksum = "b183bfd5b1bc64ab0c1ef3ee06b008a9ef1b68a7d3a99ba566fbfe7a7c6d745b" dependencies = [ "libc", "tokio", @@ -5633,7 +5616,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5657,7 +5640,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5673,9 +5656,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -5699,9 +5682,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -5757,9 +5740,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "smithay-client-toolkit" @@ -5920,14 +5903,14 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "svg_fmt" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce5d813d71d82c4cbc1742135004e4a79fd870214c155443451c139c9470a0aa" +checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" [[package]] name = "svgtypes" @@ -5935,7 +5918,7 @@ version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" dependencies = [ - "kurbo 0.11.1", + "kurbo 0.11.2", "siphasher", ] @@ -5971,9 +5954,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -5982,13 +5965,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6026,7 +6009,7 @@ dependencies = [ "fastrand 2.3.0", "getrandom 0.3.2", "once_cell", - "rustix 1.0.5", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -6065,7 +6048,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6076,7 +6059,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6193,9 +6176,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.1" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", @@ -6218,7 +6201,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6243,9 +6226,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" [[package]] name = "toml_edit" @@ -6260,13 +6243,13 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap", "toml_datetime", - "winnow 0.7.4", + "winnow 0.7.9", ] [[package]] @@ -6288,7 +6271,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6513,7 +6496,7 @@ dependencies = [ "flate2", "fontdb 0.18.0", "imagesize", - "kurbo 0.11.1", + "kurbo 0.11.2", "log", "pico-args", "roxmltree", @@ -6615,7 +6598,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -6650,7 +6633,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6681,9 +6664,9 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" +checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" dependencies = [ "cc", "downcast-rs", @@ -6695,9 +6678,9 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.8" +version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" +checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" dependencies = [ "bitflags 2.9.0", "rustix 0.38.44", @@ -6718,9 +6701,9 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.31.8" +version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" +checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182" dependencies = [ "rustix 0.38.44", "wayland-client", @@ -6729,9 +6712,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.6" +version = "0.32.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" +checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" dependencies = [ "bitflags 2.9.0", "wayland-backend", @@ -6742,9 +6725,9 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" +checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175" dependencies = [ "bitflags 2.9.0", "wayland-backend", @@ -6755,9 +6738,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" +checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" dependencies = [ "bitflags 2.9.0", "wayland-backend", @@ -6780,9 +6763,9 @@ dependencies = [ [[package]] name = "wayland-server" -version = "0.31.7" +version = "0.31.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fabd7ed68cff8e7657b8a8a1fbe90cb4a3f0c30d90da4bf179a7a23008a4cb" +checksum = "485dfb8ccf0daa0d34625d34e6ac15f99e550a7999b6fd88a0835ccd37655785" dependencies = [ "bitflags 2.9.0", "downcast-rs", @@ -7049,7 +7032,7 @@ checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7060,7 +7043,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7071,7 +7054,7 @@ checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7082,7 +7065,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7394,9 +7377,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.4" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" dependencies = [ "memchr", ] @@ -7533,9 +7516,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" +checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" [[package]] name = "xmlwriter" @@ -7575,7 +7558,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "synstructure", ] @@ -7677,7 +7660,7 @@ dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "zvariant_utils 2.1.0", ] @@ -7720,11 +7703,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.8.24", + "zerocopy-derive 0.8.25", ] [[package]] @@ -7735,18 +7718,18 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7766,7 +7749,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "synstructure", ] @@ -7806,7 +7789,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -7874,7 +7857,7 @@ dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "zvariant_utils 2.1.0", ] @@ -7897,5 +7880,5 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] diff --git a/Cargo.toml b/Cargo.toml index e9c7b3e1..10ecb1cb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,9 +27,8 @@ anyhow = "1.0.95" cctk = { git = "https://github.com/pop-os/cosmic-protocols", package = "cosmic-client-toolkit", rev = "178eb0b" } cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols", default-features = false, features = [ "client", -], rev = "178eb0b" } +], rev = "1425bd4" } cosmic-settings-subscriptions = { git = "https://github.com/pop-os/cosmic-settings-subscriptions" } -# cosmic-settings-subscriptions = { path = "../cosmic-settings-subscriptions" } cosmic-time = { git = "https://github.com/pop-os/cosmic-time", default-features = false, features = [ "once_cell", diff --git a/cosmic-applet-a11y/Cargo.toml b/cosmic-applet-a11y/Cargo.toml index 2f14ab65..a6c67663 100644 --- a/cosmic-applet-a11y/Cargo.toml +++ b/cosmic-applet-a11y/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" cosmic-settings-subscriptions.workspace = true cosmic-settings-subscriptions.default_features = false cosmic-settings-subscriptions.accessibility = true +cosmic-settings-subscriptions.cosmic_a11y_manager = true anyhow.workspace = true cctk.workspace = true cosmic-protocols.workspace = true diff --git a/cosmic-applet-a11y/i18n/en/cosmic_applet_a11y.ftl b/cosmic-applet-a11y/i18n/en/cosmic_applet_a11y.ftl index f9db0dd6..ce387467 100644 --- a/cosmic-applet-a11y/i18n/en/cosmic_applet_a11y.ftl +++ b/cosmic-applet-a11y/i18n/en/cosmic_applet_a11y.ftl @@ -1,4 +1,6 @@ screen-reader = Screen reader magnifier = Magnifier invert-colors = Invert colors -settings = Accessibility settings... \ No newline at end of file +settings = Accessibility settings... +filter-colors = Filter colors +high-contrast = High contrast diff --git a/cosmic-applet-a11y/src/app.rs b/cosmic-applet-a11y/src/app.rs index 250f90b5..0e18294e 100644 --- a/cosmic-applet-a11y/src/app.rs +++ b/cosmic-applet-a11y/src/app.rs @@ -2,12 +2,10 @@ // SPDX-License-Identifier: GPL-3.0-only use crate::{ - backend::{ - self, - wayland::{AccessibilityEvent, AccessibilityRequest, WaylandUpdate}, - }, + backend::{self, wayland::WaylandUpdate}, fl, }; +use cctk::sctk::reexports::calloop; use cosmic::{ app, applet::{ @@ -15,21 +13,27 @@ use cosmic::{ token::subscription::{activation_token_subscription, TokenRequest, TokenUpdate}, }, cctk::sctk::reexports::calloop::channel, - cosmic_theme::Spacing, + cosmic_config::{self, CosmicConfigEntry}, + cosmic_theme::{CosmicPalette, Spacing, ThemeBuilder}, iced::{ platform_specific::shell::wayland::commands::popup::{destroy_popup, get_popup}, window, Length, Subscription, }, - surface, theme, + surface, + theme::{self, CosmicTheme}, widget::{divider, text, Column}, Element, Task, }; -use cosmic_protocols::a11y::v1::client::cosmic_a11y_manager_v1::Filter; -use cosmic_settings_subscriptions::accessibility::{self, DBusRequest, DBusUpdate}; +use cosmic_settings_subscriptions::{ + accessibility::{self, DBusRequest, DBusUpdate}, + cosmic_a11y_manager::{AccessibilityEvent, AccessibilityRequest, ColorFilter}, +}; use cosmic_time::{anim, chain, id, once_cell::sync::Lazy, Instant, Timeline}; use tokio::sync::mpsc::UnboundedSender; static READER_TOGGLE: Lazy = Lazy::new(id::Toggler::unique); +static FILTER_TOGGLE: Lazy = Lazy::new(id::Toggler::unique); +static HC_TOGGLE: Lazy = Lazy::new(id::Toggler::unique); static MAGNIFIER_TOGGLE: Lazy = Lazy::new(id::Toggler::unique); static INVERT_COLORS_TOGGLE: Lazy = Lazy::new(id::Toggler::unique); @@ -40,24 +44,28 @@ pub fn run() -> cosmic::iced::Result { #[derive(Clone, Default)] struct CosmicA11yApplet { core: cosmic::app::Core, + high_contrast: Option, reader_enabled: bool, magnifier_enabled: bool, inverted_colors_enabled: bool, popup: Option, dbus_sender: Option>, - wayland_sender: Option>, + wayland_sender: Option>, wayland_protocol_version: Option, timeline: Timeline, token_tx: Option>, + screen_filter_active: bool, } #[derive(Debug, Clone)] enum Message { TogglePopup, CloseRequested(window::Id), + HighContrastEnabled(chain::Toggler, bool), ScreenReaderEnabled(chain::Toggler, bool), MagnifierEnabled(chain::Toggler, bool), InvertedColorsEnabled(chain::Toggler, bool), + FilterColorsEnabled(chain::Toggler, bool), Frame(Instant), Token(TokenUpdate), OpenSettings, @@ -119,12 +127,22 @@ impl cosmic::Application for CosmicA11yApplet { self.inverted_colors_enabled = enabled; let _ = tx.send(AccessibilityRequest::ScreenFilter { inverted: enabled, - filter: Filter::Unknown, + filter: None, }); } else { self.inverted_colors_enabled = false; } } + Message::FilterColorsEnabled(chain, enabled) => { + if let Some(sender) = self.wayland_sender.as_ref() { + self.timeline.set_chain(chain).start(); + self.screen_filter_active = enabled; + let _ = sender.send(AccessibilityRequest::ScreenFilter { + inverted: self.inverted_colors_enabled, + filter: enabled.then_some(ColorFilter::Unknown), + }); + } + } Message::TogglePopup => { if let Some(p) = self.popup.take() { return destroy_popup(p); @@ -150,6 +168,63 @@ impl cosmic::Application for CosmicA11yApplet { self.popup = None; } } + Message::HighContrastEnabled(chain, enabled) => { + if self.core.system_theme().cosmic().is_high_contrast == enabled + || self.high_contrast.is_some_and(|hc| hc == enabled) + { + return Task::none(); + } + self.timeline.set_chain(chain).start(); + self.high_contrast = Some(enabled); + + _ = std::thread::spawn(move || { + let set_hc = |is_dark: bool| { + let builder_config = if is_dark { + ThemeBuilder::dark_config()? + } else { + ThemeBuilder::light_config()? + }; + let mut builder = match ThemeBuilder::get_entry(&builder_config) { + Ok(b) => b, + Err((errs, b)) => { + tracing::warn!("{errs:?}"); + b + } + }; + + builder.palette = if is_dark { + if enabled { + CosmicPalette::HighContrastDark(builder.palette.inner()) + } else { + CosmicPalette::Dark(builder.palette.inner()) + } + } else if enabled { + CosmicPalette::HighContrastLight(builder.palette.inner()) + } else { + CosmicPalette::Light(builder.palette.inner()) + }; + builder.write_entry(&builder_config)?; + + let new_theme = builder.build(); + + let theme_config = if is_dark { + CosmicTheme::dark_config()? + } else { + CosmicTheme::light_config()? + }; + + new_theme.write_entry(&theme_config)?; + + Result::<(), cosmic_config::Error>::Ok(()) + }; + if let Err(err) = set_hc(true) { + tracing::warn!("{err:?}"); + } + if let Err(err) = set_hc(false) { + tracing::warn!("{err:?}"); + } + }); + } Message::OpenSettings => { let exec = "cosmic-settings accessibility".to_string(); if let Some(tx) = self.token_tx.as_ref() { @@ -209,6 +284,11 @@ impl cosmic::Application for CosmicA11yApplet { WaylandUpdate::State(AccessibilityEvent::ScreenFilter { inverted, .. }) => { self.inverted_colors_enabled = inverted; } + WaylandUpdate::State(AccessibilityEvent::Closed) => { + self.screen_filter_active = false; + self.wayland_sender = None; + self.wayland_protocol_version = None; + } WaylandUpdate::Started(tx) => { self.wayland_sender = Some(tx); } @@ -269,6 +349,31 @@ impl cosmic::Application for CosmicA11yApplet { .width(Length::Fill), ); + let hc_colors_toggle = padded_control( + anim!( + HC_TOGGLE, + &self.timeline, + fl!("high-contrast"), + self.high_contrast + .unwrap_or(self.core.system_theme().cosmic().is_high_contrast), + Message::HighContrastEnabled, + ) + .text_size(14) + .width(Length::Fill), + ); + + let filter_colors_toggle = padded_control( + anim!( + FILTER_TOGGLE, + &self.timeline, + fl!("filter-colors"), + self.screen_filter_active, + Message::FilterColorsEnabled, + ) + .text_size(14) + .width(Length::Fill), + ); + let content_list = Column::with_capacity(5) .push(reader_toggle) .push_maybe( @@ -281,6 +386,12 @@ impl cosmic::Application for CosmicA11yApplet { .is_some_and(|ver| ver >= 2) .then_some(invert_colors_toggle), ) + .push_maybe( + self.wayland_protocol_version + .is_some_and(|ver| ver >= 3) + .then_some(filter_colors_toggle), + ) + .push(hc_colors_toggle) .push(padded_control(divider::horizontal::default()).padding([space_xxs, space_s])) .push(menu_button(text::body(fl!("settings"))).on_press(Message::OpenSettings)) .padding([8, 0]); diff --git a/cosmic-applet-a11y/src/backend/wayland/mod.rs b/cosmic-applet-a11y/src/backend/wayland/mod.rs index c27afae0..b26fd09c 100644 --- a/cosmic-applet-a11y/src/backend/wayland/mod.rs +++ b/cosmic-applet-a11y/src/backend/wayland/mod.rs @@ -2,41 +2,29 @@ // SPDX-License-Identifier: GPL-3.0-only use anyhow; -use cctk::sctk::reexports::calloop::channel::SyncSender; +use cctk::sctk::reexports::calloop::{self, channel::SyncSender}; use cosmic::iced::{ self, futures::{self, channel::mpsc, SinkExt, StreamExt}, stream, Subscription, }; use cosmic_protocols::a11y::v1::client::cosmic_a11y_manager_v1::Filter; +use cosmic_settings_subscriptions::cosmic_a11y_manager::{ + self as thread, AccessibilityEvent, AccessibilityRequest, +}; use once_cell::sync::Lazy; use tokio::sync::Mutex; -mod thread; - -pub static WAYLAND_RX: Lazy>>> = +pub static WAYLAND_RX: Lazy>>> = Lazy::new(|| Mutex::new(None)); #[derive(Debug, Clone)] pub enum WaylandUpdate { State(AccessibilityEvent), - Started(SyncSender), + Started(calloop::channel::Sender), Errored, } -#[derive(Debug, Clone, Copy)] -pub enum AccessibilityEvent { - Bound(u32), - Magnifier(bool), - ScreenFilter { inverted: bool, filter: Filter }, -} - -#[derive(Debug, Clone, Copy)] -pub enum AccessibilityRequest { - Magnifier(bool), - ScreenFilter { inverted: bool, filter: Filter }, -} - pub fn a11y_subscription() -> iced::Subscription { Subscription::run_with_id( std::any::TypeId::of::(), @@ -69,7 +57,7 @@ async fn start_listening( } guard.as_mut().unwrap() }; - if let Some(w) = rx.next().await { + if let Some(w) = rx.recv().await { _ = output.send(WaylandUpdate::State(w)).await; State::Waiting } else { @@ -87,14 +75,13 @@ pub enum State { } pub struct WaylandWatcher { - rx: mpsc::Receiver, - tx: SyncSender, + rx: tokio::sync::mpsc::Receiver, + tx: calloop::channel::Sender, } impl WaylandWatcher { pub fn new() -> anyhow::Result { - let (tx, rx) = mpsc::channel(20); - let tx = thread::spawn_a11y(tx)?; + let (tx, rx) = thread::spawn_wayland_connection(1)?; Ok(Self { tx, rx }) } } diff --git a/cosmic-applet-a11y/src/backend/wayland/thread.rs b/cosmic-applet-a11y/src/backend/wayland/thread.rs deleted file mode 100644 index 9427c4ee..00000000 --- a/cosmic-applet-a11y/src/backend/wayland/thread.rs +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2025 System76 -// SPDX-License-Identifier: GPL-3.0-only - -use calloop::channel::*; -use cctk::{ - sctk::{ - self, - reexports::{ - calloop::{self, channel}, - calloop_wayland_source::WaylandSource, - }, - registry::RegistryState, - }, - wayland_client::{self, globals::GlobalListContents, protocol::wl_registry, Dispatch, Proxy}, -}; -use cosmic::iced::futures::{self, SinkExt}; -use cosmic_protocols::a11y::v1::client::cosmic_a11y_manager_v1::{self, Filter}; -use futures::{channel::mpsc, executor::block_on}; -use wayland_client::{globals::registry_queue_init, Connection}; - -use super::{AccessibilityEvent, AccessibilityRequest}; - -pub fn spawn_a11y( - mut tx: mpsc::Sender, -) -> anyhow::Result> { - let (a11y_tx, a11y_rx) = calloop::channel::sync_channel(100); - let conn = Connection::connect_to_env()?; - - std::thread::spawn(move || { - struct State { - loop_signal: calloop::LoopSignal, - tx: mpsc::Sender, - global: cosmic_a11y_manager_v1::CosmicA11yManagerV1, - - magnifier: bool, - screen_inverted: bool, - screen_filter: Filter, - } - - impl Dispatch for State { - fn event( - state: &mut Self, - _proxy: &cosmic_a11y_manager_v1::CosmicA11yManagerV1, - event: ::Event, - _data: &(), - _conn: &Connection, - _qhandle: &sctk::reexports::client::QueueHandle, - ) { - match event { - cosmic_a11y_manager_v1::Event::Magnifier { active } => { - let magnifier = active - .into_result() - .unwrap_or(cosmic_a11y_manager_v1::ActiveState::Disabled) - == cosmic_a11y_manager_v1::ActiveState::Enabled; - if magnifier != state.magnifier { - if block_on(state.tx.send(AccessibilityEvent::Magnifier(magnifier))) - .is_err() - { - state.loop_signal.stop(); - state.loop_signal.wakeup(); - }; - state.magnifier = magnifier; - } - } - cosmic_a11y_manager_v1::Event::ScreenFilter { inverted, filter } => { - let inverted = inverted - .into_result() - .unwrap_or(cosmic_a11y_manager_v1::ActiveState::Disabled) - == cosmic_a11y_manager_v1::ActiveState::Enabled; - let filter = filter.into_result().unwrap_or(Filter::Unknown); - - if inverted != state.screen_inverted || filter != state.screen_filter { - if block_on( - state - .tx - .send(AccessibilityEvent::ScreenFilter { inverted, filter }), - ) - .is_err() - { - state.loop_signal.stop(); - state.loop_signal.wakeup(); - }; - state.screen_inverted = inverted; - state.screen_filter = filter; - } - } - _ => unreachable!(), - } - } - } - impl Dispatch for State { - fn event( - _state: &mut Self, - _proxy: &wl_registry::WlRegistry, - _event: ::Event, - _data: &GlobalListContents, - _conn: &Connection, - _qhandle: &sctk::reexports::client::QueueHandle, - ) { - // We don't care about any dynamic globals - } - } - - let mut event_loop = calloop::EventLoop::::try_new().unwrap(); - - let loop_handle = event_loop.handle(); - let (globals, event_queue) = registry_queue_init(&conn).unwrap(); - let qhandle = event_queue.handle(); - - WaylandSource::new(conn, event_queue) - .insert(loop_handle.clone()) - .unwrap(); - - let registry_state = RegistryState::new(&globals); - let global = registry_state - .bind_one::(&qhandle, 1..=2, ()) - .unwrap(); - - let _ = block_on(tx.send(AccessibilityEvent::Bound(global.version()))); - - loop_handle - .insert_source(a11y_rx, |request, _, state| match request { - channel::Event::Msg(AccessibilityRequest::Magnifier(val)) => { - state.global.set_magnifier(if val { - cosmic_a11y_manager_v1::ActiveState::Enabled - } else { - cosmic_a11y_manager_v1::ActiveState::Disabled - }); - } - channel::Event::Msg(AccessibilityRequest::ScreenFilter { inverted, filter }) => { - state.global.set_screen_filter( - if inverted { - cosmic_a11y_manager_v1::ActiveState::Enabled - } else { - cosmic_a11y_manager_v1::ActiveState::Disabled - }, - filter, - ); - } - channel::Event::Closed => { - state.loop_signal.stop(); - state.loop_signal.wakeup(); - } - }) - .unwrap(); - - let mut state = State { - loop_signal: event_loop.get_signal(), - tx, - global, - - magnifier: false, - screen_inverted: false, - screen_filter: Filter::Unknown, - }; - - event_loop.run(None, &mut state, |_| {}).unwrap(); - }); - - Ok(a11y_tx) -}