From 8223c76361c88b6ed3dfec81a8e677e53b0ee092 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Mon, 12 Dec 2022 19:48:31 -0500 Subject: [PATCH] feat: app list is displayed and updated --- Cargo.lock | 97 - Cargo.toml | 2 +- applets/cosmic-app-list/Cargo.lock | 3677 +++++++++++++++++ applets/cosmic-app-list/Cargo.toml | 52 +- applets/cosmic-app-list/build.rs | 7 - .../com.system76.CosmicAppList.gschema.xml | 20 - .../data/resources/resources.gresource.xml | 6 - applets/cosmic-app-list/src/app.rs | 363 ++ applets/cosmic-app-list/src/config.rs | 26 +- applets/cosmic-app-list/src/localize.rs | 9 + applets/cosmic-app-list/src/main.rs | 290 +- .../cosmic-app-list/src/toplevel_handler.rs | 124 + .../src/toplevel_subscription.rs | 71 + applets/cosmic-app-list/src/wayland.rs | 597 --- applets/cosmic-app-list/src/wayland_source.rs | 219 - debian/rules | 7 + justfile | 6 +- 17 files changed, 4317 insertions(+), 1256 deletions(-) create mode 100644 applets/cosmic-app-list/Cargo.lock delete mode 100644 applets/cosmic-app-list/build.rs delete mode 100644 applets/cosmic-app-list/data/com.system76.CosmicAppList.gschema.xml delete mode 100644 applets/cosmic-app-list/data/resources/resources.gresource.xml create mode 100644 applets/cosmic-app-list/src/app.rs create mode 100644 applets/cosmic-app-list/src/toplevel_handler.rs create mode 100644 applets/cosmic-app-list/src/toplevel_subscription.rs delete mode 100644 applets/cosmic-app-list/src/wayland.rs delete mode 100644 applets/cosmic-app-list/src/wayland_source.rs diff --git a/Cargo.lock b/Cargo.lock index b6a6f6d0..412b1db5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -230,19 +230,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "calloop" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a22a6a8f622f797120d452c630b0ab12e1331a1a753e2039ce7868d4ac77b4ee" -dependencies = [ - "log", - "nix 0.24.2", - "slotmap", - "thiserror", - "vec_map", -] - [[package]] name = "cascade" version = "1.0.0" @@ -300,39 +287,6 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" -[[package]] -name = "cosmic-app-list" -version = "0.1.0" -dependencies = [ - "anyhow", - "calloop", - "cascade", - "cosmic-panel-config", - "cosmic-protocols", - "futures", - "futures-util", - "gio", - "glib-build-tools", - "gsk4", - "gtk4", - "i18n-embed", - "i18n-embed-fl", - "libadwaita", - "libcosmic", - "log", - "nix 0.25.0", - "once_cell", - "pretty_env_logger", - "relm4-macros", - "ron 0.8.0", - "rust-embed", - "serde", - "serde_json", - "wayland-backend", - "wayland-client", - "xdg", -] - [[package]] name = "cosmic-applet-notifications" version = "0.1.0" @@ -420,18 +374,6 @@ dependencies = [ "xdg-shell-wrapper-config", ] -[[package]] -name = "cosmic-protocols" -version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-protocols#3ff11df30ef551e1ccbdcb091930fe0d72266195" -dependencies = [ - "bitflags", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - [[package]] name = "cpufeatures" version = "0.2.2" @@ -1148,12 +1090,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "itoa" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" - [[package]] name = "js-sys" version = "0.3.59" @@ -1331,7 +1267,6 @@ dependencies = [ "cfg-if", "libc", "memoffset", - "pin-utils", ] [[package]] @@ -1806,12 +1741,6 @@ dependencies = [ "semver", ] -[[package]] -name = "ryu" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" - [[package]] name = "same-file" version = "1.0.6" @@ -1877,17 +1806,6 @@ dependencies = [ "syn", ] -[[package]] -name = "serde_json" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7" -dependencies = [ - "itoa", - "ryu", - "serde", -] - [[package]] name = "serde_repr" version = "0.1.9" @@ -1948,15 +1866,6 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" -[[package]] -name = "slotmap" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" -dependencies = [ - "version_check", -] - [[package]] name = "smallvec" version = "1.9.0" @@ -2166,12 +2075,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version-compare" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 370425b9..2023004f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,6 @@ members = [ "applets/cosmic-applet-notifications", "applets/cosmic-applet-status-area", - "applets/cosmic-app-list", "applets/cosmic-panel-button", "libcosmic-applet", ] @@ -14,6 +13,7 @@ exclude = [ "applets/cosmic-applet-audio", "applets/cosmic-applet-power", "applets/cosmic-applet-time", + "applets/cosmic-app-list", ] [patch.crates-io] diff --git a/applets/cosmic-app-list/Cargo.lock b/applets/cosmic-app-list/Cargo.lock new file mode 100644 index 00000000..0c2c40b7 --- /dev/null +++ b/applets/cosmic-app-list/Cargo.lock @@ -0,0 +1,3677 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" + +[[package]] +name = "ab_glyph" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcdbc68024b653943864d436fe8a24b028095bc1cf91a8926f8241e4aaffe59" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330223a1aecc308757b9926e9391c9b47f8ef2dbd8aea9df88312aea18c5e8d6" + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" + +[[package]] +name = "appendlist" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e149dc73cd30538307e7ffa2acd3d2221148eaeed4871f246657b1c3eaa1cbd2" + +[[package]] +name = "apply" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f47b57fc4521e3cae26a4d45b5227f8fadee4c345be0fefd8d5d1711afb8aeb9" + +[[package]] +name = "approx" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +dependencies = [ + "num-traits", +] + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arc-swap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "983cd8b9d4b02a6dc6ffa557262eb5858a27a0038ffffe21a0f133eaa819a164" + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "ash" +version = "0.37.1+1.3.235" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911015c962d56e2e4052f40182ca5462ba60a3d2ff04e827c365a0ab3d65726d" +dependencies = [ + "libloading", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bit_field" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" + +[[package]] +name = "bytemuck" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaa3a8d9a1ca92e282c96a32d6511b695d7d994d1d102ba85d279f9b2756947f" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fe233b960f12f8007e3db2d136e3cb1c291bfd7396e384ee76025fc1a3932b4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "calloop" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19457a0da465234abd76134a5c2a910c14bd3c5558463e4396ab9a37a328e465" +dependencies = [ + "log", + "nix 0.25.1", + "slotmap", + "thiserror", + "vec_map", +] + +[[package]] +name = "cc" +version = "1.0.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "cgmath" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317" +dependencies = [ + "approx 0.4.0", + "num-traits", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" +dependencies = [ + "bitflags", + "block", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "const_panic" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58baae561b85ca19b3122a9ddd35c8ec40c3bcd14fe89921824eae73f7baffbf" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +dependencies = [ + "bitflags", + "core-foundation", + "foreign-types", + "libc", +] + +[[package]] +name = "cosmic-app-list" +version = "0.1.0" +dependencies = [ + "anyhow", + "calloop", + "cosmic-client-toolkit", + "cosmic-panel-config", + "cosmic-protocols", + "freedesktop-desktop-entry", + "freedesktop-icons", + "futures", + "futures-util", + "i18n-embed", + "i18n-embed-fl", + "iced", + "itertools", + "libcosmic", + "log", + "nix 0.26.1", + "once_cell", + "pretty_env_logger", + "ron", + "rust-embed", + "serde", + "tokio", + "xdg", +] + +[[package]] +name = "cosmic-client-toolkit" +version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-protocols#85afc5b7e3358b15a35b794c7d482b776c1a3ce4" +dependencies = [ + "cosmic-protocols", + "gl_generator", + "smithay", + "smithay-client-toolkit 0.16.0 (git+https://github.com/Smithay/client-toolkit?rev=45a2ea5)", + "wayland-client", +] + +[[package]] +name = "cosmic-panel-config" +version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-panel#35d61a3a617b2ef552931645ec35c545a3a688f6" +dependencies = [ + "anyhow", + "ron", + "serde", + "slog", + "wayland-protocols-wlr", + "xdg", + "xdg-shell-wrapper-config", +] + +[[package]] +name = "cosmic-protocols" +version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-protocols#85afc5b7e3358b15a35b794c7d482b776c1a3ce4" +dependencies = [ + "bitflags", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", + "wayland-server", +] + +[[package]] +name = "cosmic-theme" +version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-theme.git#896b228e4462c2fdeea0e89d1a657458b4a0a144" +dependencies = [ + "anyhow", + "csscolorparser", + "lazy_static", + "palette", + "ron", + "serde", + "xdg", +] + +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset 0.7.1", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csscolorparser" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" +dependencies = [ + "phf", + "serde", +] + +[[package]] +name = "cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" + +[[package]] +name = "d3d12" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "827914e1f53b1e0e025ecd3d967a7836b7bcb54520f90e21ef8df7b4d88a2759" +dependencies = [ + "bitflags", + "libloading", + "winapi", +] + +[[package]] +name = "darling" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.9.3", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core 0.9.5", +] + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] + +[[package]] +name = "derive_setters" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1cf41b4580a37cca5ef2ada2cc43cf5d6be3983f4522e83010d67ab6925e84b" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dlib" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" +dependencies = [ + "libloading", +] + +[[package]] +name = "dlv-list" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "drm" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01406fcc6bf5180bf107c2922c8f37a875440c56a4d436b4c4cc8c09f433cc2d" +dependencies = [ + "bitflags", + "bytemuck", + "drm-ffi", + "drm-fourcc", + "nix 0.24.3", +] + +[[package]] +name = "drm-ffi" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e538131f5ca07f76483b6bcdb18f540fdfe4bb0c95742f64e7d2c5649c61bca5" +dependencies = [ + "drm-sys", + "nix 0.24.3", +] + +[[package]] +name = "drm-fourcc" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" + +[[package]] +name = "drm-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe573f73b81a2127a5d5989e12a4ea4a4dab7800e53c73c663494d6c342a338" +dependencies = [ + "libc", +] + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "encase" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a516181e9a36e8982cb37933c5e7dba638c42938cacde46ee4e5b4156f881b9" +dependencies = [ + "const_panic", + "encase_derive", + "glam", + "thiserror", +] + +[[package]] +name = "encase_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5b802412eea315f29f2bb2da3a5963cd6121f56eaa06aebcdc0c54eea578f22" +dependencies = [ + "encase_derive_impl", +] + +[[package]] +name = "encase_derive_impl" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2f4de457d974f548d2c2a16f709ebd81013579e543bd1a9b19ced88132c2cf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "enum-repr" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad30c9c0fa1aaf1ae5010dab11f1117b15d35faf62cda4bbbc53b9987950f18" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "env_logger" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "euclid" +version = "0.22.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b52c2ef4a78da0ba68fbe1fd920627411096d2ac478f7f4c9f3a54ba6705bade" +dependencies = [ + "num-traits", +] + +[[package]] +name = "exr" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb5f255b5980bb0c8cf676b675d1a99be40f316881444f44e0462eaf5df5ded" +dependencies = [ + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide", + "smallvec", + "threadpool", +] + +[[package]] +name = "find-crate" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a98bbaacea1c0eb6a0876280051b892eb73594fd90cf3b20e9c817029c57d2" +dependencies = [ + "toml", +] + +[[package]] +name = "flate2" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + +[[package]] +name = "fluent" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61f69378194459db76abd2ce3952b790db103ceb003008d3d50d97c41ff847a7" +dependencies = [ + "fluent-bundle", + "unic-langid", +] + +[[package]] +name = "fluent-bundle" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e242c601dec9711505f6d5bbff5bedd4b61b2469f2e8bb8e57ee7c9747a87ffd" +dependencies = [ + "fluent-langneg", + "fluent-syntax", + "intl-memoizer", + "intl_pluralrules", + "rustc-hash", + "self_cell", + "smallvec", + "unic-langid", +] + +[[package]] +name = "fluent-langneg" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94" +dependencies = [ + "unic-langid", +] + +[[package]] +name = "fluent-syntax" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0abed97648395c902868fee9026de96483933faa54ea3b40d652f7dfe61ca78" +dependencies = [ + "thiserror", +] + +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "pin-project", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fontdb" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d66551cc28351f0bc6a73da86459ee7765caaad03ce284f2dc36472dbf539cd" +dependencies = [ + "log", + "memmap2 0.3.1", + "ttf-parser 0.12.3", +] + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "freedesktop-desktop-entry" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45157175a725e81f3f594382430b6b78af5f8f72db9bd51b94f0785f80fc6d29" +dependencies = [ + "dirs 3.0.2", + "gettext-rs", + "memchr", + "thiserror", + "xdg", +] + +[[package]] +name = "freedesktop-icons" +version = "0.2.1" +source = "git+https://github.com/wash2/freedestkop-icons#ac6343d76f1d2b3b666771b5ec0d22aa571a912e" +dependencies = [ + "dirs 4.0.0", + "once_cell", + "rust-ini", + "thiserror", + "xdg", +] + +[[package]] +name = "futures" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" + +[[package]] +name = "futures-executor" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" + +[[package]] +name = "futures-macro" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" + +[[package]] +name = "futures-task" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" + +[[package]] +name = "futures-util" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gettext-rs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e49ea8a8fad198aaa1f9655a2524b64b70eb06b2f3ff37da407566c93054f364" +dependencies = [ + "gettext-sys", + "locale_config", +] + +[[package]] +name = "gettext-sys" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c63ce2e00f56a206778276704bbe38564c8695249fdc8f354b4ef71c57c3839d" +dependencies = [ + "cc", + "temp-dir", +] + +[[package]] +name = "gif" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3edd93c6756b4dfaf2709eafcc345ba2636565295c198a9cfbf75fa5e3e00b06" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815" + +[[package]] +name = "glow" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glow_glyph" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f4e62c64947b9a24fe20e2bba9ad819ecb506ef5c8df7ffc4737464c6df9510" +dependencies = [ + "bytemuck", + "glow", + "glyph_brush", + "log", +] + +[[package]] +name = "glutin" +version = "0.30.0-beta.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8ad8ba6f4be6b573f2da485715baaae46a6fae00ba1ae683117f58f1da29c09" +dependencies = [ + "bitflags", + "cfg_aliases", + "cgl", + "cocoa", + "core-foundation", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading", + "objc", + "once_cell", + "raw-window-handle", + "wayland-sys", + "windows-sys 0.36.1", + "x11-dl", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3adbb8fec0e18e340f990c78f79f5f0e142d0d83f46b10909aaa7d251c00afdf" +dependencies = [ + "gl_generator", + "windows-sys 0.36.1", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "947c4850c58211c9627969c2b4e2674764b81ae5b47bab2c9a477d7942f96e0f" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c33975a6c9d49d72c8f032a60079bf8df536954fbf9e4cee90396ace815c57" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "glyph_brush" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac02497410cdb5062cc056a33f2e1e19ff69fbf26a4be9a02bf29d6e17ea105b" +dependencies = [ + "glyph_brush_draw_cache", + "glyph_brush_layout", + "log", + "ordered-float", + "rustc-hash", + "twox-hash", +] + +[[package]] +name = "glyph_brush_draw_cache" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6010675390f6889e09a21e2c8b575b3ee25667ea8237a8d59423f73cb8c28610" +dependencies = [ + "ab_glyph", + "crossbeam-channel", + "crossbeam-deque", + "linked-hash-map", + "rayon", + "rustc-hash", +] + +[[package]] +name = "glyph_brush_layout" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38" +dependencies = [ + "ab_glyph", + "approx 0.5.1", + "xi-unicode", +] + +[[package]] +name = "gpu-alloc" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc59e5f710e310e76e6707f86c561dd646f69a8876da9131703b2f717de818d" +dependencies = [ + "bitflags", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5" +dependencies = [ + "bitflags", +] + +[[package]] +name = "gpu-descriptor" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b0c02e1ba0bdb14e965058ca34e09c020f8e507a760df1121728e0aef68d57a" +dependencies = [ + "bitflags", + "gpu-descriptor-types", + "hashbrown", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "363e3677e55ad168fef68cf9de3a4a310b53124c5e784c53a1d70e92d23f2126" +dependencies = [ + "bitflags", +] + +[[package]] +name = "guillotiere" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "half" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad6a9459c9c30b177b925162351f97e7d967c7ea8bab3b8352805327daf45554" +dependencies = [ + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + +[[package]] +name = "i18n-config" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62affcd43abfb51f3cbd8736f9407908dc5b44fc558a9be07460bbfd104d983" +dependencies = [ + "log", + "serde", + "serde_derive", + "thiserror", + "toml", + "unic-langid", +] + +[[package]] +name = "i18n-embed" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f21ed76e44de8ac3dfa36bb37ab2e6480be0dc75c612474949be1f3cb2c253" +dependencies = [ + "fluent", + "fluent-langneg", + "fluent-syntax", + "i18n-embed-impl", + "intl-memoizer", + "lazy_static", + "locale_config", + "log", + "parking_lot 0.12.1", + "rust-embed", + "thiserror", + "unic-langid", + "walkdir", +] + +[[package]] +name = "i18n-embed-fl" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9420a9718ef9d0ab727840a398e25408ea0daff9ba3c681707ba05485face98e" +dependencies = [ + "dashmap", + "find-crate", + "fluent", + "fluent-syntax", + "i18n-config", + "i18n-embed", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn", + "unic-langid", +] + +[[package]] +name = "i18n-embed-impl" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0db2330e035808eb064afb67e6743ddce353763af3e0f2bdfc2476e00ce76136" +dependencies = [ + "find-crate", + "i18n-config", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "iced" +version = "0.5.2" +source = "git+https://github.com/pop-os/iced.git?branch=sctk-cosmic#91f51e94ed906deada8462a1cb8a6dfdf43e558c" +dependencies = [ + "iced_core", + "iced_futures", + "iced_glow", + "iced_graphics", + "iced_native", + "iced_sctk", + "iced_wgpu", + "image", + "thiserror", +] + +[[package]] +name = "iced_core" +version = "0.6.1" +source = "git+https://github.com/pop-os/iced.git?branch=sctk-cosmic#91f51e94ed906deada8462a1cb8a6dfdf43e558c" +dependencies = [ + "bitflags", + "palette", + "wasm-timer", +] + +[[package]] +name = "iced_futures" +version = "0.5.1" +source = "git+https://github.com/pop-os/iced.git?branch=sctk-cosmic#91f51e94ed906deada8462a1cb8a6dfdf43e558c" +dependencies = [ + "futures", + "log", + "tokio", + "wasm-bindgen-futures", + "wasm-timer", +] + +[[package]] +name = "iced_glow" +version = "0.4.1" +source = "git+https://github.com/pop-os/iced.git?branch=sctk-cosmic#91f51e94ed906deada8462a1cb8a6dfdf43e558c" +dependencies = [ + "bytemuck", + "euclid", + "glow", + "glow_glyph", + "glyph_brush", + "iced_graphics", + "iced_native", + "log", +] + +[[package]] +name = "iced_graphics" +version = "0.4.0" +source = "git+https://github.com/pop-os/iced.git?branch=sctk-cosmic#91f51e94ed906deada8462a1cb8a6dfdf43e558c" +dependencies = [ + "bitflags", + "bytemuck", + "glam", + "iced_native", + "iced_style", + "image", + "kamadak-exif", + "log", + "raw-window-handle", + "resvg", + "thiserror", + "tiny-skia", + "usvg", +] + +[[package]] +name = "iced_lazy" +version = "0.2.0" +source = "git+https://github.com/pop-os/iced.git?branch=sctk-cosmic#91f51e94ed906deada8462a1cb8a6dfdf43e558c" +dependencies = [ + "iced_native", + "ouroboros", +] + +[[package]] +name = "iced_native" +version = "0.6.1" +source = "git+https://github.com/pop-os/iced.git?branch=sctk-cosmic#91f51e94ed906deada8462a1cb8a6dfdf43e558c" +dependencies = [ + "iced_core", + "iced_futures", + "iced_style", + "num-traits", + "smithay-client-toolkit 0.16.0 (git+https://github.com/Smithay/client-toolkit)", + "twox-hash", + "unicode-segmentation", +] + +[[package]] +name = "iced_sctk" +version = "0.1.0" +source = "git+https://github.com/pop-os/iced-sctk#d126b62ef1001b22dc946db91928395890ff8d9f" +dependencies = [ + "enum-repr", + "futures", + "glow", + "glutin", + "iced_futures", + "iced_graphics", + "iced_native", + "log", + "raw-window-handle", + "smithay-client-toolkit 0.16.0 (git+https://github.com/Smithay/client-toolkit)", + "thiserror", + "wayland-backend", +] + +[[package]] +name = "iced_style" +version = "0.5.0" +source = "git+https://github.com/pop-os/iced.git?branch=sctk-cosmic#91f51e94ed906deada8462a1cb8a6dfdf43e558c" +dependencies = [ + "iced_core", + "once_cell", + "palette", +] + +[[package]] +name = "iced_wgpu" +version = "0.6.1" +source = "git+https://github.com/pop-os/iced.git?branch=sctk-cosmic#91f51e94ed906deada8462a1cb8a6dfdf43e558c" +dependencies = [ + "bitflags", + "bytemuck", + "encase", + "futures", + "glam", + "glyph_brush", + "guillotiere", + "iced_graphics", + "iced_native", + "log", + "raw-window-handle", + "wgpu", + "wgpu_glyph", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "image" +version = "0.24.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b7ea949b537b0fd0af141fff8c77690f2ce96f4f41f042ccb6c69c6c965945" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "jpeg-decoder 0.3.0", + "num-rational", + "num-traits", + "png", + "scoped_threadpool", + "tiff", +] + +[[package]] +name = "indexmap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "intl-memoizer" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c310433e4a310918d6ed9243542a6b83ec1183df95dff8f23f87bb88a264a66f" +dependencies = [ + "type-map", + "unic-langid", +] + +[[package]] +name = "intl_pluralrules" +version = "7.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972" +dependencies = [ + "unic-langid", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.0-rc1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f65dae1d3aa98e6877917ab4e6fdbfdfb00e95885ea7c4f4f29e3a5dfc08fdf" +dependencies = [ + "libc", + "windows-sys 0.36.1", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "jpeg-decoder" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" + +[[package]] +name = "jpeg-decoder" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" +dependencies = [ + "rayon", +] + +[[package]] +name = "js-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kamadak-exif" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4fc70d0ab7e5b6bafa30216a6b48705ea964cdfc29c050f2412295eba58077" +dependencies = [ + "mutate_once", +] + +[[package]] +name = "khronos-egl" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "kurbo" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb348d766edbac91ba1eb83020d96f4f8867924d194393083c15a51f185e6a82" +dependencies = [ + "arrayvec 0.5.2", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + +[[package]] +name = "libc" +version = "0.2.138" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" + +[[package]] +name = "libcosmic" +version = "0.1.0" +source = "git+https://github.com/pop-os/libcosmic/?branch=master#91e826d8eacd03d8e7ef5b1a767b2164f8719ed0" +dependencies = [ + "apply", + "cosmic-panel-config", + "cosmic-theme", + "derive_setters", + "freedesktop-icons", + "iced", + "iced_core", + "iced_lazy", + "iced_native", + "iced_style", + "iced_wgpu", + "lazy_static", + "palette", + "smithay-client-toolkit 0.16.0 (git+https://github.com/Smithay/client-toolkit)", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "locale_config" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" +dependencies = [ + "lazy_static", + "objc", + "objc-foundation", + "regex", + "winapi", +] + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memmap2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b182332558b18d807c4ce1ca8ca983b34c3ee32765e47b3f0f69b90355cc1dc" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metal" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de11355d1f6781482d027a3b4d4de7825dcedb197bf573e0596d00008402d060" +dependencies = [ + "bitflags", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + +[[package]] +name = "mutate_once" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b" + +[[package]] +name = "naga" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "262d2840e72dbe250e8cf2f522d080988dfca624c4112c096238a4845f591707" +dependencies = [ + "bit-set", + "bitflags", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "num-traits", + "rustc-hash", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +dependencies = [ + "autocfg", + "bitflags", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a58d1d356c6597d08cde02c2f09d785b09e28711837b1ed667dc652c08a694" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "memoffset 0.7.1", + "pin-utils", + "static_assertions", +] + +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "once_cell" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" + +[[package]] +name = "ordered-float" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d84eb1409416d254e4a9c8fa56cc24701755025b458f0fcd8e59e1f5f40c23bf" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-multimap" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" +dependencies = [ + "dlv-list", + "hashbrown", +] + +[[package]] +name = "ouroboros" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f357ef82d1b4db66fbed0b8d542cbd3c22d0bf5b393b3c257b9ba4568e70c9c3" +dependencies = [ + "aliasable", + "ouroboros_macro", + "stable_deref_trait", +] + +[[package]] +name = "ouroboros_macro" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44a0b52c2cbaef7dffa5fec1a43274afe8bd2a644fa9fc50a9ef4ff0269b1257" +dependencies = [ + "Inflector", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18904d3c65493a9f0d7542293d1a7f69bfdc309a6b9ef4f46dc3e58b0577edc5" +dependencies = [ + "ttf-parser 0.17.1", +] + +[[package]] +name = "palette" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f9cd68f7112581033f157e56c77ac4a5538ec5836a2e39284e65bd7d7275e49" +dependencies = [ + "approx 0.5.1", + "num-traits", + "palette_derive", + "phf", + "serde", +] + +[[package]] +name = "palette_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05eedf46a8e7c27f74af0c9cfcdb004ceca158cb1b918c6f68f8d7a549b3e427" +dependencies = [ + "find-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.5", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.42.0", +] + +[[package]] +name = "phf" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92aacdc5f16768709a569e913f7451034034178b05bdc8acda226659a3dccc66" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pico-args" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468" + +[[package]] +name = "pin-project" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + +[[package]] +name = "png" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638" +dependencies = [ + "bitflags", + "crc32fast", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "pretty_env_logger" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" +dependencies = [ + "env_logger", + "log", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74605f360ce573babfe43964cbe520294dcb081afbf8c108fc6e23036b4da2df" + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-xml" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11bafc859c6815fbaffbbbf4229ecb767ac913fecb27f9ad4343662e9ef099ea" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "range-alloc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6" + +[[package]] +name = "raw-window-handle" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" +dependencies = [ + "cty", +] + +[[package]] +name = "rayon" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "rctree" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae028b272a6e99d9f8260ceefa3caa09300a8d6c8d2b2001316474bc52122e9" + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" + +[[package]] +name = "renderdoc-sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157" + +[[package]] +name = "resvg" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608c6e8aa6fb2c13bc06e4184d7c7b2cc1b7c138f88a539da8be55c3c033d7f4" +dependencies = [ + "jpeg-decoder 0.1.22", + "log", + "pico-args", + "png", + "rgb", + "svgfilters", + "tiny-skia", + "usvg", +] + +[[package]] +name = "rgb" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3603b7d71ca82644f79b5a06d1220e9a58ede60bd32255f698cb1af8838b8db3" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "ron" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300a51053b1cb55c80b7a9fde4120726ddf25ca241a1cbb926626f62fb136bff" +dependencies = [ + "base64", + "bitflags", + "serde", +] + +[[package]] +name = "roxmltree" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "rust-embed" +version = "6.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "283ffe2f866869428c92e0d61c2f35dfb4355293cdfdc48f49e895c15f1333d1" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "6.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ab23d42d71fb9be1b643fe6765d292c5e14d46912d13f3ae2815ca048ea04d" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "7.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1669d81dfabd1b5f8e2856b8bbe146c6192b0ba22162edc738ac0a5de18f054" +dependencies = [ + "sha2", + "walkdir", +] + +[[package]] +name = "rust-ini" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustybuzz" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44561062e583c4873162861261f16fd1d85fe927c4904d71329a4fe43dc355ef" +dependencies = [ + "bitflags", + "bytemuck", + "smallvec", + "ttf-parser 0.12.3", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-general-category", + "unicode-script", +] + +[[package]] +name = "safe_arch" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ff3d6d9696af502cc3110dacce942840fb06ff4514cad92236ecc455f2ce05" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scan_fmt" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b53b0a5db882a8e2fdaae0a43f7b39e7e9082389e978398bdf223a55b581248" + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scoped_threadpool" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "self_cell" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ef965a420fe14fdac7dd018862966a4c14094f900e1650bbc71ddd7d580c8af" + +[[package]] +name = "serde" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e326c9ec8042f1b5da33252c8a37e9ffbd2c9bef0155215b6e6c80c790e05f91" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a3df25b0713732468deadad63ab9da1f1fd75a48a15024b50363f128db627e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "simplecss" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d" +dependencies = [ + "log", +] + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "slab" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slog" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" + +[[package]] +name = "slog-scope" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f95a4b4c3274cd2869549da82b57ccc930859bdbf5bcea0424bc5f140b3c786" +dependencies = [ + "arc-swap", + "lazy_static", + "slog", +] + +[[package]] +name = "slog-stdlog" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6706b2ace5bbae7291d3f8d2473e2bfab073ccd7d03670946197aec98471fa3e" +dependencies = [ + "log", + "slog", + "slog-scope", +] + +[[package]] +name = "slotmap" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "smithay" +version = "0.3.0" +source = "git+https://github.com/Smithay/smithay?rev=3f3c0c7#3f3c0c7457a20ba3d301b61576daa1b234dcc78e" +dependencies = [ + "appendlist", + "bitflags", + "calloop", + "cgmath", + "downcast-rs", + "drm", + "drm-ffi", + "drm-fourcc", + "gl_generator", + "indexmap", + "io-lifetimes", + "lazy_static", + "libc", + "libloading", + "nix 0.24.3", + "once_cell", + "rand", + "scan_fmt", + "slog", + "slog-stdlog", + "thiserror", + "wayland-protocols-misc", + "wayland-protocols-wlr", + "xkbcommon", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.16.0" +source = "git+https://github.com/Smithay/client-toolkit?rev=45a2ea5#45a2ea56ed17883fa6f99df4d87fbc3fc8d8170a" +dependencies = [ + "bitflags", + "calloop", + "dlib", + "lazy_static", + "log", + "memmap2 0.5.8", + "nix 0.24.3", + "pkg-config", + "thiserror", + "wayland-backend", + "wayland-client", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkbcommon", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.16.0" +source = "git+https://github.com/Smithay/client-toolkit#f1d9c3ef9cfbd508d986f7f98b2fc267fcc39b84" +dependencies = [ + "bitflags", + "calloop", + "dlib", + "lazy_static", + "log", + "memmap2 0.5.8", + "nix 0.25.1", + "pkg-config", + "thiserror", + "wayland-backend", + "wayland-client", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkbcommon", +] + +[[package]] +name = "spin" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spirv" +version = "0.2.0+1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" +dependencies = [ + "bitflags", + "num-traits", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "svg_fmt" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2" + +[[package]] +name = "svgfilters" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "639abcebc15fdc2df179f37d6f5463d660c1c79cd552c12343a4600827a04bce" +dependencies = [ + "float-cmp", + "rgb", +] + +[[package]] +name = "svgtypes" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22975e8a2bac6a76bb54f898a6b18764633b00e780330f0b689f65afb3975564" +dependencies = [ + "siphasher", +] + +[[package]] +name = "syn" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "temp-dir" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af547b166dd1ea4b472165569fc456cfb6818116f854690b0ff205e636523dab" + +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "tiff" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7449334f9ff2baf290d55d73983a7d6fa15e01198faef72af07e2a8db851e471" +dependencies = [ + "flate2", + "jpeg-decoder 0.3.0", + "weezl", +] + +[[package]] +name = "tiny-skia" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d049bfef0eaa2521e75d9ffb5ce86ad54480932ae19b85f78bec6f52c4d30d78" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "bytemuck", + "cfg-if", + "png", + "safe_arch", +] + +[[package]] +name = "tinystr" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aeafdfd935e4a7fe16a91ab711fa52d54df84f9c8f7ca5837a9d1d902ef4c2" +dependencies = [ + "displaydoc", +] + +[[package]] +name = "tokio" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab6d665857cc6ca78d6e80303a02cea7a7851e85dfbd77cbdc09bd129f1ef46" +dependencies = [ + "autocfg", + "num_cpus", + "pin-project-lite", + "tokio-macros", + "windows-sys 0.42.0", +] + +[[package]] +name = "tokio-macros" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "ttf-parser" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ae2f58a822f08abdaf668897e96a5656fe72f5a9ce66422423e8849384872e6" + +[[package]] +name = "ttf-parser" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375812fa44dab6df41c195cd2f7fecb488f6c09fbaafb62807488cefab642bff" + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "rand", + "static_assertions", +] + +[[package]] +name = "type-map" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d3364c5e96cb2ad1603037ab253ddd34d7fb72a58bdddf4b7350760fc69a46" +dependencies = [ + "rustc-hash", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "unic-langid" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "398f9ad7239db44fd0f80fe068d12ff22d78354080332a5077dc6f52f14dcf2f" +dependencies = [ + "unic-langid-impl", +] + +[[package]] +name = "unic-langid-impl" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35bfd2f2b8796545b55d7d3fd3e89a0613f68a0d1c8bc28cb7ff96b411a35ff" +dependencies = [ + "serde", + "tinystr", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694" + +[[package]] +name = "unicode-ccc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1" + +[[package]] +name = "unicode-general-category" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07547e3ee45e28326cc23faac56d44f58f16ab23e413db526debce3b0bfd2742" + +[[package]] +name = "unicode-ident" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" + +[[package]] +name = "unicode-script" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d817255e1bed6dfd4ca47258685d14d2bdcfbc64fdc9e3819bd5848057b8ecc" + +[[package]] +name = "unicode-segmentation" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" + +[[package]] +name = "unicode-vo" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "usvg" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4058e0bd091a56f905e6963e40776ce6880b271275f0b493bff951433e303071" +dependencies = [ + "base64", + "data-url", + "flate2", + "float-cmp", + "fontdb", + "kurbo", + "log", + "pico-args", + "rctree", + "roxmltree", + "rustybuzz", + "simplecss", + "siphasher", + "svgtypes", + "ttf-parser 0.12.3", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", +] + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" + +[[package]] +name = "wasm-timer" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.11.2", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wayland-backend" +version = "0.1.0-beta.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f96c52ca34b33e6bb55497327428be54dad648973aa5d3d1e02982d2fcc298" +dependencies = [ + "cc", + "downcast-rs", + "io-lifetimes", + "nix 0.25.1", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.30.0-beta.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f6ab5911cc8a28e9d781933c1afe0f97ffa6885ad8941294784d025f06e5ad9" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "nix 0.25.1", + "thiserror", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-cursor" +version = "0.30.0-beta.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa5ce1bbc13a3d806648974cba1d53481fea2ac29483eb147e4cce1250fc5263" +dependencies = [ + "nix 0.25.1", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.30.0-beta.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e32104ba51988754f4429dbb59c7b7fd2ccf1feaa0009bb59e49a5e2f91e985d" +dependencies = [ + "bitflags", + "wayland-backend", + "wayland-client", + "wayland-scanner", + "wayland-server", +] + +[[package]] +name = "wayland-protocols-misc" +version = "0.1.0-beta.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6d0be545a3b35869060efa6e19622f6b071a9ee8d09da5ffa48f072524fddaa" +dependencies = [ + "bitflags", + "wayland-backend", + "wayland-protocols", + "wayland-scanner", + "wayland-server", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.1.0-beta.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "130613a48629204e4ab50ea4b5de2efa2e17c58f71a5af15b39535f99421f8c3" +dependencies = [ + "bitflags", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", + "wayland-server", +] + +[[package]] +name = "wayland-scanner" +version = "0.30.0-beta.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb55ca28710dcc155078db4e2bd29aacf24bd311261c48750f38c6c5430bf1f" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", + "syn", +] + +[[package]] +name = "wayland-server" +version = "0.30.0-beta.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5ed6de3d02e0bcfee03cf23b8f8e923fb3707d826bcb1ef10ef34647778e20" +dependencies = [ + "bitflags", + "downcast-rs", + "nix 0.25.1", + "thiserror", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-sys" +version = "0.30.0-beta.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882bda56e8397384ad66ec0ebe763e0b3b53153a6327344f7d74b85981a271e1" +dependencies = [ + "dlib", + "lazy_static", + "log", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "weezl" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" + +[[package]] +name = "wgpu" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f643110d228fd62a60c5ed2ab56c4d5b3704520bd50561174ec4ec74932937" +dependencies = [ + "arrayvec 0.7.2", + "js-sys", + "log", + "naga", + "parking_lot 0.12.1", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6000d1284ef8eec6076fd5544a73125fd7eb9b635f18dceeb829d826f41724ca" +dependencies = [ + "arrayvec 0.7.2", + "bit-vec", + "bitflags", + "cfg_aliases", + "codespan-reporting", + "fxhash", + "log", + "naga", + "parking_lot 0.12.1", + "profiling", + "raw-window-handle", + "smallvec", + "thiserror", + "web-sys", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cc320a61acb26be4f549c9b1b53405c10a223fbfea363ec39474c32c348d12f" +dependencies = [ + "android_system_properties", + "arrayvec 0.7.2", + "ash", + "bit-set", + "bitflags", + "block", + "core-graphics-types", + "d3d12", + "foreign-types", + "fxhash", + "glow", + "gpu-alloc", + "gpu-descriptor", + "js-sys", + "khronos-egl", + "libloading", + "log", + "metal", + "naga", + "objc", + "parking_lot 0.12.1", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "winapi", +] + +[[package]] +name = "wgpu-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb6b28ef22cac17b9109b25b3bf8c9a103eeb293d7c5f78653979b09140375f6" +dependencies = [ + "bitflags", +] + +[[package]] +name = "wgpu_glyph" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cafb82773e0f124a33674dab5de4dff73175aeb921949047ab014efb58fb446" +dependencies = [ + "bytemuck", + "glyph_brush", + "log", + "wgpu", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.0", + "windows_i686_gnu 0.42.0", + "windows_i686_msvc 0.42.0", + "windows_x86_64_gnu 0.42.0", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" + +[[package]] +name = "x11-dl" +version = "2.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1536d6965a5d4e573c7ef73a2c15ebcd0b2de3347bdf526c34c297c00ac40f0" +dependencies = [ + "lazy_static", + "libc", + "pkg-config", +] + +[[package]] +name = "xcursor" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" +dependencies = [ + "nom", +] + +[[package]] +name = "xdg" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4583db5cbd4c4c0303df2d15af80f0539db703fa1c68802d4cbbd2dd0f88f6" +dependencies = [ + "dirs 4.0.0", +] + +[[package]] +name = "xdg-shell-wrapper-config" +version = "0.1.0" +source = "git+https://github.com/pop-os/xdg-shell-wrapper?branch=space-refactor#737b1043a1be34d1e56832f51f2a2b084926a356" +dependencies = [ + "serde", + "wayland-protocols-wlr", +] + +[[package]] +name = "xi-unicode" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" + +[[package]] +name = "xkbcommon" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbee136714379ab22da0280207fdb7f47e0bb940adea97731b65598b8c7a92e" +dependencies = [ + "libc", + "memmap2 0.5.8", +] + +[[package]] +name = "xml-rs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" + +[[package]] +name = "xmlparser" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd" + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" diff --git a/applets/cosmic-app-list/Cargo.toml b/applets/cosmic-app-list/Cargo.toml index c90d57bf..0464bafe 100644 --- a/applets/cosmic-app-list/Cargo.toml +++ b/applets/cosmic-app-list/Cargo.toml @@ -5,33 +5,33 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -cosmic-panel-config = {git = "https://github.com/pop-os/cosmic-panel", features = ["gtk4"] } +cctk = {git = "https://github.com/pop-os/cosmic-protocols", package = "cosmic-client-toolkit"} cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols", default-features = false, features = ["client"] } -cascade = "1.0.0" -gtk4 = { git = "https://github.com/gtk-rs/gtk4-rs", features = ["v4_4"] } -adw = { git = "https://gitlab.gnome.org/World/Rust/libadwaita-rs", package = "libadwaita"} -libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = false } -gio = { git = "https://github.com/gtk-rs/gtk-rs-core" } -relm4-macros = { git = "https://github.com/Relm4/Relm4.git", branch = "next" } -serde_json = "1.0.78" -futures = "0.3.19" -futures-util = "0.3.19" -once_cell = "1.9.0" -xdg = "2.4.0" -gsk4 = { git = "https://github.com/gtk-rs/gtk4-rs" } +libcosmic = { git = "https://github.com/pop-os/libcosmic/", branch = "master", default-features = false, features = ["wayland", "applet"] } +ron = "0.8" +futures = "0.3" +futures-util = "0.3" +once_cell = "1.9" +xdg = "2.4" pretty_env_logger = "0.4" -i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } -i18n-embed-fl = "0.6.4" -rust-embed = "6.3.0" -calloop = "0.10.1" -wayland-backend = { git = "https://github.com/Smithay/wayland-rs", version = "0.1.0-beta.9"} -wayland-client = { git = "https://github.com/Smithay/wayland-rs", version = "0.30.0-beta.9"} -nix = "0.25" -# config -anyhow = "1.0.53" -ron = "0.8.0" -serde = { version = "1.0.136", features = ["derive"] } +calloop = "0.10" +nix = "0.26" +anyhow = "1.0" +serde = { version = "1.0", features = ["derive"] } log = "0.4" +tokio = { version = "1.17.0", features = ["sync", "rt", "rt-multi-thread", "macros"] } +itertools = "*" +cosmic-panel-config = {git = "https://github.com/pop-os/cosmic-panel", no-default-features = true} +freedesktop-desktop-entry = "0.5.0" +freedesktop-icons = {git = "https://github.com/wash2/freedestkop-icons"} +i18n-embed = { version = "0.13", features = ["fluent-system", "desktop-requester"] } +i18n-embed-fl = "0.6" +rust-embed = "6.3" -[build-dependencies] -glib-build-tools = { git = "https://github.com/gtk-rs/gtk-rs-core" } + +[dependencies.iced] +git = "https://github.com/pop-os/iced.git" +branch = "sctk-cosmic" +# path = "../iced" +default-features = false +features = ["image", "svg", "tokio", "wayland"] \ No newline at end of file diff --git a/applets/cosmic-app-list/build.rs b/applets/cosmic-app-list/build.rs deleted file mode 100644 index 534daf98..00000000 --- a/applets/cosmic-app-list/build.rs +++ /dev/null @@ -1,7 +0,0 @@ -fn main() { - glib_build_tools::compile_resources( - "data/resources", - "data/resources/resources.gresource.xml", - "compiled.gresource", - ); -} diff --git a/applets/cosmic-app-list/data/com.system76.CosmicAppList.gschema.xml b/applets/cosmic-app-list/data/com.system76.CosmicAppList.gschema.xml deleted file mode 100644 index 848380ea..00000000 --- a/applets/cosmic-app-list/data/com.system76.CosmicAppList.gschema.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - 600 - Default window width - Default window width - - - 400 - Default window height - Default window height - - - false - Default window maximized behaviour - - - - diff --git a/applets/cosmic-app-list/data/resources/resources.gresource.xml b/applets/cosmic-app-list/data/resources/resources.gresource.xml deleted file mode 100644 index cf813c6c..00000000 --- a/applets/cosmic-app-list/data/resources/resources.gresource.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/applets/cosmic-app-list/src/app.rs b/applets/cosmic-app-list/src/app.rs new file mode 100644 index 00000000..848ac5cd --- /dev/null +++ b/applets/cosmic-app-list/src/app.rs @@ -0,0 +1,363 @@ +use std::ffi::OsStr; +use std::path::PathBuf; + +use crate::config; +use crate::config::AppListConfig; +use crate::toplevel_subscription::toplevel_subscription; +use crate::toplevel_subscription::ToplevelRequest; +use crate::toplevel_subscription::ToplevelUpdate; +use calloop::channel::Sender; +use cctk::toplevel_info::ToplevelInfo; +use cosmic::applet::CosmicAppletHelper; +use cosmic::iced::wayland::popup::destroy_popup; +use cosmic::iced::wayland::popup::get_popup; +use cosmic::iced::wayland::SurfaceIdWrapper; +use cosmic::iced::widget::{column, row}; +use cosmic::iced::{executor, window, Application, Command, Subscription}; +use cosmic::iced_style::application::{self, Appearance}; +use cosmic::iced_style::Color; +use cosmic::theme::Button; +use cosmic::widget::{horizontal_rule, vertical_rule}; +use cosmic::{Element, Theme}; +use cosmic_panel_config::PanelAnchor; +use cosmic_protocols::toplevel_info::v1::client::zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1; +use freedesktop_desktop_entry::DesktopEntry; +use iced::Alignment; +use iced::Background; +use iced::wayland::window::resize_window; +use iced::widget::container; +use iced::widget::horizontal_space; +use iced::widget::svg; +use iced::widget::Image; +use iced::Length; +use itertools::Itertools; + +pub fn run() -> cosmic::iced::Result { + let helper = CosmicAppletHelper::default(); + CosmicAppList::run(helper.window_settings()) +} + +#[derive(Debug, Clone, Default)] +struct Toplevel { + toplevels: Vec<(ZcosmicToplevelHandleV1, ToplevelInfo)>, + app_id: String, + icon_path: PathBuf, +} + +#[derive(Clone, Default)] +struct CosmicAppList { + theme: Theme, + popup: Option, + id_ctr: u32, + subscription_ctr: u32, + toplevel_list: Vec, + config: AppListConfig, + toplevel_sender: Option>, + applet_helper: CosmicAppletHelper, +} + +// TODO DnD after sctk merges DnD +#[derive(Debug, Clone)] +enum Message { + Toplevel(ToplevelUpdate), + Favorite(String), + UnFavorite(String), + TogglePopup(usize), + Activate(Option), + Quit(ZcosmicToplevelHandleV1), + Errored(String), + Ignore, +} +fn icon_for_app_ids(mut app_ids: Vec) -> Vec<(String, PathBuf)> { + let mut ret = freedesktop_desktop_entry::Iter::new(freedesktop_desktop_entry::default_paths()) + .filter_map(|path| { + std::fs::read_to_string(&path).ok().and_then(|input| { + DesktopEntry::decode(&path, &input).ok().and_then(|de| { + if let Some(i) = app_ids.iter().position(|s| s == de.appid) { + let id = app_ids.remove(i); + freedesktop_icons::lookup(de.icon().unwrap_or(de.appid)) + .with_size(128) + .with_cache() + .find() + .map(|buf| (id, buf)) + } else { + None + } + }) + }) + }) + .collect_vec(); + ret.append( + &mut app_ids + .into_iter() + .map(|id| (id, Default::default())) + .collect_vec(), + ); + ret +} + +impl Application for CosmicAppList { + type Message = Message; + type Theme = Theme; + type Executor = executor::Default; + type Flags = (); + + fn new(_flags: ()) -> (Self, Command) { + let config = config::AppListConfig::load().unwrap_or_default(); + ( + CosmicAppList { + toplevel_list: icon_for_app_ids(config.favorites.clone()) + .into_iter() + .map(|e| Toplevel { + toplevels: Default::default(), + app_id: e.0, + icon_path: e.1, + }) + .collect(), + config, + ..Default::default() + }, + Command::none(), + ) + } + + fn title(&self) -> String { + config::APP_ID.to_string() + } + + fn update(&mut self, message: Message) -> Command { + match message { + Message::Errored(_) => { + // TODO log errors + } + Message::TogglePopup(_) => { + if let Some(p) = self.popup.take() { + return destroy_popup(p); + } else { + self.id_ctr += 1; + let new_id = window::Id::new(self.id_ctr); + self.popup.replace(new_id); + + let popup_settings = self.applet_helper.get_popup_settings( + window::Id::new(0), + new_id, + (400, 240), + None, + None, + ); + return get_popup(popup_settings); + } + } + Message::Favorite(id) => { + let _ = self.config.add_favorite(id); + } + Message::UnFavorite(id) => { + let _ = self.config.remove_favorite(id); + } + Message::Activate(handle) => { + if let (Some(tx), Some(handle)) = (self.toplevel_sender.as_ref(), handle) { + let _ = tx.send(ToplevelRequest::Activate(handle)); + } + } + Message::Quit(handle) => { + if let Some(tx) = self.toplevel_sender.as_ref() { + let _ = tx.send(ToplevelRequest::Quit(handle)); + } + } + Message::Toplevel(event) => { + // dbg!(&self.toplevel_list); + match event { + ToplevelUpdate::AddToplevel(handle, info) => { + if let Some(i) = self + .toplevel_list + .iter() + .position(|Toplevel { app_id, .. }| app_id == &info.app_id) + { + self.toplevel_list[i].toplevels.push((handle, info)); + } else { + let (app_id, icon_name) = + icon_for_app_ids(vec![info.app_id.clone()]).remove(0); + + self.toplevel_list.push(Toplevel { + toplevels: vec![(handle, info)], + app_id, + icon_path: icon_name, + }); + // TODO better way of setting window size? + let pixel_size = self.applet_helper.suggested_icon_size(); + let padding = 8; + let dot_size = 4; + let spacing = 4; + let length = self.toplevel_list.iter().map(|t| (pixel_size + 2 * padding).max((dot_size + spacing) * t.toplevels.len() as u16) as u32 + spacing as u32).sum(); + let thickness = (pixel_size + 2 * padding + dot_size + spacing) as u32; + let (w, h) = match self.applet_helper.anchor { + PanelAnchor::Left | PanelAnchor::Right => (thickness, length), + PanelAnchor::Top | PanelAnchor::Bottom => (length, thickness), + }; + return resize_window(window::Id::new(0), w, h); + } + } + ToplevelUpdate::Init(tx) => { + self.toplevel_sender.replace(tx); + } + ToplevelUpdate::Finished => { + self.subscription_ctr += 1; + } + ToplevelUpdate::RemoveToplevel(handle) => { + if let Some(i) = self.toplevel_list.iter_mut().position( + |Toplevel { + toplevels, app_id, .. + }| { + if let Some(ret) = toplevels.iter().position(|t| &t.0 == &handle) { + toplevels.remove(ret); + toplevels.is_empty() && self.config.favorites.contains(app_id) + } else { + false + } + }, + ) { + self.toplevel_list.remove(i); + } + // TODO better way of setting window size? + let pixel_size = self.applet_helper.suggested_icon_size(); + let padding = 8; + let dot_size = 4; + let spacing = 4; + let length = self.toplevel_list.iter().map(|t| (pixel_size + 2 * padding).max((dot_size + spacing) * t.toplevels.len() as u16) as u32 + spacing as u32).sum(); + let thickness = (pixel_size + 2 * padding + dot_size + spacing) as u32; + let (w, h) = match self.applet_helper.anchor { + PanelAnchor::Left | PanelAnchor::Right => (thickness, length), + PanelAnchor::Top | PanelAnchor::Bottom => (length, thickness), + }; + return resize_window(window::Id::new(0), w, h); + } + ToplevelUpdate::UpdateToplevel(handle, info) => { + 'toplevel_loop: for toplevel_list in &mut self.toplevel_list { + for (t_handle, t_info) in &mut toplevel_list.toplevels { + if &handle == t_handle { + *t_info = info; + break 'toplevel_loop; + } + } + } + // TODO better way of setting window size? + let pixel_size = self.applet_helper.suggested_icon_size(); + let padding = 8; + let dot_size = 4; + let spacing = 4; + let length = self.toplevel_list.iter().map(|t| (pixel_size + 2 * padding).max((dot_size + spacing) * t.toplevels.len() as u16) as u32 + spacing as u32).sum(); + let thickness = (pixel_size + 2 * padding + dot_size + spacing) as u32; + let (w, h) = match self.applet_helper.anchor { + PanelAnchor::Left | PanelAnchor::Right => (thickness, length), + PanelAnchor::Top | PanelAnchor::Bottom => (length, thickness), + }; + return resize_window(window::Id::new(0), w, h); + } + } + } + Message::Ignore => {} + } + Command::none() + } + + fn view(&self, id: SurfaceIdWrapper) -> Element { + match id { + SurfaceIdWrapper::LayerSurface(_) => unimplemented!(), + SurfaceIdWrapper::Window(_) => { + let (favorites, running) = self.toplevel_list.iter().enumerate().fold( + (Vec::new(), Vec::new()), + |(mut favorites, mut running), + ( + i, + Toplevel { + toplevels, + app_id, + icon_path, + }, + )| { + let icon = if icon_path.extension() == Some(&OsStr::new("svg")) { + let handle = svg::Handle::from_path(icon_path); + svg::Svg::new(handle) + .width(Length::Units(self.applet_helper.suggested_icon_size())) + .height(Length::Units(self.applet_helper.suggested_icon_size())) + .into() + } else { + Image::new(icon_path) + .width(Length::Units(self.applet_helper.suggested_icon_size())) + .height(Length::Units(self.applet_helper.suggested_icon_size())) + .into() + }; + let dot_size = (self.applet_helper.suggested_icon_size() / 8).max(2); + let dots = (0..toplevels.len()) + .into_iter() + .map(|_| { + container(horizontal_space(Length::Units(0))) + .padding(dot_size) + .style(::Style::Custom( + |theme| container::Appearance { + text_color: Some(Color::TRANSPARENT), + background: Some(Background::Color(theme.cosmic().on_bg_color().into())), + border_radius: 4.0, + border_width: 0.0, + border_color: Color::TRANSPARENT, + }, + )) + .into() + }) + .collect_vec(); + + let icon_wrapper = match &self.applet_helper.anchor { + PanelAnchor::Left => row(vec![column(dots).spacing(2).into(), icon]).align_items(iced::Alignment::Center).spacing(2).into(), + PanelAnchor::Right => row(vec![icon, column(dots).spacing(2).into()]).align_items(iced::Alignment::Center).spacing(2).into(), + PanelAnchor::Top => column(vec![row(dots).spacing(2).into(), icon]).align_items(iced::Alignment::Center).spacing(2).into(), + PanelAnchor::Bottom => column(vec![icon, row(dots).spacing(2).into()]).align_items(iced::Alignment::Center).spacing(2).into(), + }; + // TODO tooltip on hover + let icon_button = cosmic::widget::button(Button::Text) + .custom(vec![icon_wrapper]) + .on_press(Message::Activate(toplevels.first().map(|t| t.0.clone()))) + .padding(8).into(); + if self.config.favorites.contains(&app_id) { + favorites.push(icon_button) + } else { + running.push(icon_button); + } + (favorites, running) + }, + ); + match &self.applet_helper.anchor { + PanelAnchor::Left | PanelAnchor::Right => { + column![column(favorites), horizontal_rule(1), column(running)].spacing(4).align_items(Alignment::Center).height(Length::Fill).width(Length::Fill).into() + } + PanelAnchor::Top | PanelAnchor::Bottom => { + row![row(favorites), vertical_rule(1), row(running)].spacing(4).align_items(Alignment::Center).height(Length::Fill).width(Length::Fill).into() + } + } + } + SurfaceIdWrapper::Popup(_) => { + todo!(); + } + } + } + + fn subscription(&self) -> Subscription { + Subscription::batch(vec![ + toplevel_subscription(self.subscription_ctr).map(|(_, event)| Message::Toplevel(event)) + ]) + } + + fn theme(&self) -> Theme { + self.theme + } + + fn close_requested(&self, _id: SurfaceIdWrapper) -> Self::Message { + Message::Ignore + } + + fn style(&self) -> ::Style { + ::Style::Custom(|theme| Appearance { + background_color: Color::from_rgba(0.0, 0.0, 0.0, 0.0), + text_color: theme.cosmic().on_bg_color().into(), + }) + } +} diff --git a/applets/cosmic-app-list/src/config.rs b/applets/cosmic-app-list/src/config.rs index f255159d..17a67829 100644 --- a/applets/cosmic-app-list/src/config.rs +++ b/applets/cosmic-app-list/src/config.rs @@ -1,12 +1,15 @@ -use crate::ID; use anyhow::anyhow; use serde::Deserialize; use std::fmt::Debug; use std::fs::File; use xdg::BaseDirectories; -#[derive(Debug, Clone, Deserialize)] +pub const APP_ID: &str = "com.system76.CosmicAppList"; +pub const VERSION: &str = "0.1.0"; + +#[derive(Debug, Clone, Deserialize, Default)] pub enum TopLevelFilter { + #[default] ActiveWorkspace, ConfiguredOutput, } @@ -14,6 +17,7 @@ pub enum TopLevelFilter { #[derive(Debug, Clone, Default, Deserialize)] pub struct AppListConfig { pub filter_top_levels: Option, + pub favorites: Vec, } impl AppListConfig { @@ -21,7 +25,7 @@ impl AppListConfig { pub fn load() -> anyhow::Result { let file = match BaseDirectories::new() .ok() - .and_then(|dirs| dirs.find_config_file(format!("{ID}/config.ron"))) + .and_then(|dirs| dirs.find_config_file(format!("{APP_ID}/config.ron"))) .and_then(|p| File::open(p).ok()) { Some(path) => path, @@ -33,4 +37,20 @@ impl AppListConfig { ron::de::from_reader::<_, AppListConfig>(file) .map_err(|err| anyhow!("Failed to parse config file: {}", err)) } + + pub fn add_favorite(&mut self, id: String) -> anyhow::Result<()> { + if !self.favorites.contains(&id) { + self.favorites.push(id); + } + todo!() + } + + pub fn remove_favorite(&mut self, id: String) -> anyhow::Result<()> { + self.favorites.retain(|e| e != &id); + todo!() + } + + pub fn save() -> anyhow::Result<()> { + todo!() + } } diff --git a/applets/cosmic-app-list/src/localize.rs b/applets/cosmic-app-list/src/localize.rs index efb92aa4..2606aecd 100644 --- a/applets/cosmic-app-list/src/localize.rs +++ b/applets/cosmic-app-list/src/localize.rs @@ -36,3 +36,12 @@ macro_rules! fl { pub fn localizer() -> Box { Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations)) } + +pub fn localize() { + let localizer = crate::localize::localizer(); + let requested_languages = i18n_embed::DesktopLanguageRequester::requested_languages(); + + if let Err(error) = localizer.select(&requested_languages) { + eprintln!("Error while loading language for App List {}", error); + } +} diff --git a/applets/cosmic-app-list/src/main.rs b/applets/cosmic-app-list/src/main.rs index 4c4b6cde..d5473778 100644 --- a/applets/cosmic-app-list/src/main.rs +++ b/applets/cosmic-app-list/src/main.rs @@ -1,292 +1,24 @@ // SPDX-License-Identifier: MPL-2.0-only - -use apps_window::CosmicAppListWindow; -use calloop::channel::SyncSender; -use dock_list::DockListType; -use dock_object::DockObject; -use gio::{ApplicationFlags, DesktopAppInfo}; -use gtk4::gdk::Display; -use gtk4::{glib, prelude::*, CssProvider, StyleContext}; -use once_cell::sync::OnceCell; -use std::collections::BTreeMap; -use utils::{AppListEvent, BoxedWindowList}; -use wayland::{Toplevel, ToplevelEvent}; - -mod apps_container; -mod apps_window; +mod app; mod config; -mod dock_item; -mod dock_list; -mod dock_object; -mod dock_popover; mod localize; -mod utils; -mod wayland; -mod wayland_source; +mod toplevel_handler; +mod toplevel_subscription; -const ID: &str = "com.system76.CosmicAppList"; -static TX: OnceCell> = OnceCell::new(); -static WAYLAND_TX: OnceCell> = OnceCell::new(); +use log::info; -pub fn localize() { - let localizer = crate::localize::localizer(); - let requested_languages = i18n_embed::DesktopLanguageRequester::requested_languages(); +use localize::localize; - if let Err(error) = localizer.select(&requested_languages) { - eprintln!("Error while loading language for App List {}", error); - } -} - -fn load_css() { - let provider = CssProvider::new(); - provider.load_from_data(include_bytes!("style.css")); - - StyleContext::add_provider_for_display( - &Display::default().unwrap(), - &provider, - gtk4::STYLE_PROVIDER_PRIORITY_APPLICATION, - ); -} - -fn main() { - let _monitors = libcosmic::init(); +use crate::config::{APP_ID, VERSION}; +fn main() -> cosmic::iced::Result { // Initialize logger pretty_env_logger::init(); - glib::set_application_name("Cosmic Dock App List"); + info!("Iced Workspaces Applet ({})", APP_ID); + info!("Version: {}", VERSION); + // Prepare i18n localize(); - gio::resources_register_include!("compiled.gresource").unwrap(); - let app = gtk4::Application::new(None, ApplicationFlags::default()); - - app.connect_activate(|app| { - load_css(); - let (tx, rx) = glib::MainContext::channel(glib::Priority::default()); - - let window = CosmicAppListWindow::new(app); - let wayland_tx = wayland::spawn_toplevels(); - - WAYLAND_TX.set(wayland_tx).unwrap(); - - - - let mut cached_results = Vec::new(); - // let zbus_conn = spawn_zbus(tx.clone(), Arc::clone(&cached_results)); - TX.set(tx.clone()).unwrap(); - - rx.attach(None, glib::clone!(@weak window => @default-return glib::prelude::Continue(true), move |event| { - let apps_container = window.apps_container(); - let should_apply_changes = match event { - AppListEvent::Favorite((name, should_favorite)) => { - let saved_app_model = apps_container.model(DockListType::Saved); - let active_app_model = apps_container.model(DockListType::Active); - if should_favorite { - let mut cur: u32 = 0; - let mut index: Option = None; - while let Some(item) = active_app_model.item(cur) { - if let Ok(cur_dock_object) = item.downcast::() { - if cur_dock_object.get_name() == Some(name.clone()) { - cur_dock_object.set_saved(true); - index = Some(cur); - } - } - cur += 1; - } - if let Some(index) = index { - let object = active_app_model.item(index).unwrap(); - active_app_model.remove(index); - saved_app_model.append(&object); - } - } else { - let mut cur: u32 = 0; - let mut index: Option = None; - while let Some(item) = saved_app_model.item(cur) { - if let Ok(cur_dock_object) = item.downcast::() { - if cur_dock_object.get_name() == Some(name.clone()) { - cur_dock_object.set_saved(false); - index = Some(cur); - } - } - cur += 1; - } - if let Some(index) = index { - let object = saved_app_model.item(index).unwrap(); - saved_app_model.remove(index); - active_app_model.append(&object); - } - } - let _ = tx.send(AppListEvent::Refresh); - false - } - AppListEvent::Refresh => { - // println!("refreshing model from cache"); - let stack_active = cached_results.iter().fold( - BTreeMap::new(), - |mut acc: BTreeMap, elem: &Toplevel| { - if let Some(v) = acc.get_mut(&elem.app_id) { - v.0.push(elem.clone()); - } else { - acc.insert( - elem.app_id.clone(), - BoxedWindowList(vec![elem.clone()]), - ); - } - acc - }, - ); - let mut stack_active: Vec = - stack_active.into_values().collect(); - - // update active app stacks for saved apps into the saved app model - // then put the rest in the active app model (which doesn't include saved apps) - let saved_app_model = apps_container.model(DockListType::Saved); - - let mut saved_i: u32 = 0; - while let Some(item) = saved_app_model.item(saved_i) { - if let Ok(dock_obj) = item.downcast::() { - if let Some(cur_app_info) = - dock_obj.property::>("appinfo") - { - if let Some((i, _s)) = stack_active - .iter() - .enumerate() - .find(|(_i, s)| Some(&s.0[0].app_id) == cur_app_info.filename().and_then(|p| p - .file_stem() - .and_then(|s| s.to_str().map(|s| s.to_string()))).as_ref()) - { - // println!( - // "found active saved app {} at {}", - // _s.0[0].name, i - // ); - let active = stack_active.remove(i); - dock_obj.set_property("active", active.to_value()); - saved_app_model.items_changed(saved_i, 0, 0); - } else if cached_results - .iter() - .any(|s| Some(&s.app_id) == cur_app_info.filename().and_then(|p| p - .file_stem() - .and_then(|s| s.to_str().map(|s| s.to_string()))).as_ref()) - { - dock_obj.set_property( - "active", - BoxedWindowList(Vec::new()).to_value(), - ); - saved_app_model.items_changed(saved_i, 0, 0); - } - } - } - saved_i += 1; - } - - let active_app_model = apps_container.model(DockListType::Active); - let model_len = active_app_model.n_items(); - let new_results: Vec = stack_active - .into_iter() - .filter_map(|v| DockObject::from_window_list(v).map(|o| o.upcast())) - .collect(); - active_app_model.splice(0, model_len, &new_results[..]); - true - } - AppListEvent::WindowList(toplevels) => { - cached_results = toplevels; - true - } - AppListEvent::Remove(top_level) => { - if let Some(i) = cached_results.iter().position(|t| t.toplevel_handle == top_level.toplevel_handle) { - cached_results.swap_remove(i); - } - - true - } - AppListEvent::Add(top_level) => { - // sort to make comparison with cache easier - if let Some(i) = cached_results.iter().position(|t| t.toplevel_handle == top_level.toplevel_handle) { - cached_results[i] = top_level; - } else { - cached_results.push(top_level); - } - true - } - }; - if should_apply_changes { - // dbg!(&cached_results); - // build active app stacks for each app - let stack_active = cached_results.iter().fold( - BTreeMap::new(), - |mut acc: BTreeMap, elem| { - if let Some(v) = acc.get_mut(&elem.app_id) { - v.0.push(elem.clone()); - } else { - acc.insert( - elem.app_id.clone(), - BoxedWindowList(vec![elem.clone()]), - ); - } - acc - }, - ); - let mut stack_active: Vec = - stack_active.into_values().collect(); - - // update active app stacks for saved apps into the saved app model - // then put the rest in the active app model (which doesn't include saved apps) - let saved_app_model = apps_container.model(DockListType::Saved); - - let mut saved_i: u32 = 0; - while let Some(item) = saved_app_model.item(saved_i) { - if let Ok(dock_obj) = item.downcast::() { - // clear active if it has some, they will be updated back if they still exist - let prev_active: BoxedWindowList = dock_obj.property("active"); - if !prev_active.0.is_empty() { - dock_obj.set_property("active", BoxedWindowList::default().to_value()); - saved_app_model.items_changed(saved_i, 0, 0); - } - - if let Some(cur_app_info) = - dock_obj.property::>("appinfo") - { - if let Some((i, _s)) = stack_active - .iter() - .enumerate() - .find(|(_i, s)| Some(&s.0[0].app_id) == cur_app_info.filename().and_then(|p| p - .file_stem() - .and_then(|s| s.to_str().map(|s| s.to_string()))).as_ref()) - { - // println!("found active saved app {} at {}", s.0[0].name, i); - let active = stack_active.remove(i); - dock_obj.set_property("active", active.to_value()); - saved_app_model.items_changed(saved_i, 0, 0); - } else if cached_results - .iter() - .any(|s| Some(&s.app_id) == cur_app_info.filename().and_then(|p| p - .file_stem() - .and_then(|s| s.to_str().map(|s| s.to_string()))).as_ref()) - { - dock_obj.set_property( - "active", - BoxedWindowList(Vec::new()).to_value(), - ); - saved_app_model.items_changed(saved_i, 0, 0); - } - } - } - saved_i += 1; - } - - let active_app_model = apps_container.model(DockListType::Active); - let model_len = active_app_model.n_items(); - let new_results: Vec = stack_active - .into_iter() - .filter_map(|v| DockObject::from_window_list(v).map(|o| o.upcast())) - .collect(); - - active_app_model.splice(0, model_len, &new_results[..]); - } - glib::prelude::Continue(true) - })); - - window.show(); - }); - app.run(); + app::run() } diff --git a/applets/cosmic-app-list/src/toplevel_handler.rs b/applets/cosmic-app-list/src/toplevel_handler.rs new file mode 100644 index 00000000..373f295d --- /dev/null +++ b/applets/cosmic-app-list/src/toplevel_handler.rs @@ -0,0 +1,124 @@ +use cctk::{ + sctk::{self, event_loop::WaylandSource}, + toplevel_info::{ToplevelInfoHandler, ToplevelInfoState}, + wayland_client, +}; +use cosmic_protocols::toplevel_info::v1::client::zcosmic_toplevel_handle_v1; +use futures::channel::mpsc::UnboundedSender; +use sctk::registry::{ProvidesRegistryState, RegistryState}; +use wayland_client::{globals::registry_queue_init, Connection, QueueHandle}; + +use crate::toplevel_subscription::{ToplevelRequest, ToplevelUpdate}; + +struct AppData { + exit: bool, + tx: UnboundedSender, + registry_state: RegistryState, + toplevel_info_state: ToplevelInfoState, +} + +impl ProvidesRegistryState for AppData { + fn registry(&mut self) -> &mut RegistryState { + &mut self.registry_state + } + + sctk::registry_handlers!(); +} + +impl ToplevelInfoHandler for AppData { + fn toplevel_info_state(&mut self) -> &mut ToplevelInfoState { + &mut self.toplevel_info_state + } + + fn new_toplevel( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + toplevel: &zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1, + ) { + if let Some(info) = self.toplevel_info_state.info(toplevel) { + let _ = self + .tx + .unbounded_send(ToplevelUpdate::AddToplevel(toplevel.clone(), info.clone())); + } + } + + fn update_toplevel( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + toplevel: &zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1, + ) { + if let Some(info) = self.toplevel_info_state.info(toplevel) { + let _ = self.tx.unbounded_send(ToplevelUpdate::UpdateToplevel( + toplevel.clone(), + info.clone(), + )); + } + } + + fn toplevel_closed( + &mut self, + _conn: &Connection, + _qh: &QueueHandle, + toplevel: &zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1, + ) { + let _ = self + .tx + .unbounded_send(ToplevelUpdate::RemoveToplevel(toplevel.clone())); + } +} + +pub(crate) fn toplevel_handler( + tx: UnboundedSender, + rx: calloop::channel::Channel, +) { + let conn = Connection::connect_to_env().unwrap(); + let (globals, event_queue) = registry_queue_init(&conn).unwrap(); + let mut event_loop = calloop::EventLoop::::try_new().unwrap(); + let qh = event_queue.handle(); + let wayland_source = WaylandSource::new(event_queue).unwrap(); + let handle = event_loop.handle(); + + if handle + .insert_source(wayland_source, |_, q, state| q.dispatch_pending(state)) + .is_err() + { + return; + }; + + if handle + .insert_source(rx, |event, _, state| match event { + calloop::channel::Event::Msg(req) => match req { + ToplevelRequest::Activate(_) => {} // TODO + ToplevelRequest::Quit(_) => {} // TODO + ToplevelRequest::Exit => { + state.exit = true; + } + }, + calloop::channel::Event::Closed => { + state.exit = true; + } + }) + .is_err() + { + return; + } + let registry_state = RegistryState::new(&globals); + let mut app_data = AppData { + exit: false, + tx, + toplevel_info_state: ToplevelInfoState::new(®istry_state, &qh), + registry_state, + }; + + loop { + if app_data.exit { + break; + } + event_loop.dispatch(None, &mut app_data).unwrap(); + } +} + +sctk::delegate_registry!(AppData); +cctk::delegate_toplevel_info!(AppData); diff --git a/applets/cosmic-app-list/src/toplevel_subscription.rs b/applets/cosmic-app-list/src/toplevel_subscription.rs new file mode 100644 index 00000000..4d37ef43 --- /dev/null +++ b/applets/cosmic-app-list/src/toplevel_subscription.rs @@ -0,0 +1,71 @@ +//! # DBus interface proxy for: `org.freedesktop.UPower.KbdBacklight` +//! +//! This code was generated by `zbus-xmlgen` `2.0.1` from DBus introspection data. +//! Source: `Interface '/org/freedesktop/UPower/KbdBacklight' from service 'org.freedesktop.UPower' on system bus`. + +use cctk::toplevel_info::ToplevelInfo; +use cosmic::iced; +use cosmic_protocols::toplevel_info::v1::client::zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1; +use futures::{ + channel::mpsc::{unbounded, UnboundedReceiver}, + StreamExt, +}; +use iced::subscription; +use std::{fmt::Debug, hash::Hash}; + +use crate::toplevel_handler::toplevel_handler; + +pub fn toplevel_subscription( + id: I, +) -> iced::Subscription<(I, ToplevelUpdate)> { + subscription::unfold(id, State::Ready, move |state| start_listening(id, state)) +} + +pub enum State { + Ready, + Waiting( + UnboundedReceiver, + calloop::channel::Sender, + ), + Finished, +} + +async fn start_listening(id: I, state: State) -> (Option<(I, ToplevelUpdate)>, State) { + match state { + State::Ready => { + let (calloop_tx, calloop_rx) = calloop::channel::channel(); + let (toplevel_tx, toplevel_rx) = unbounded(); + std::thread::spawn(move || { + toplevel_handler(toplevel_tx, calloop_rx); + }); + return ( + Some((id, ToplevelUpdate::Init(calloop_tx.clone()))), + State::Waiting(toplevel_rx, calloop_tx), + ); + } + State::Waiting(mut rx, tx) => match rx.next().await { + Some(u) => (Some((id, u)), State::Waiting(rx, tx)), + None => { + let _ = tx.send(ToplevelRequest::Exit); + (Some((id, ToplevelUpdate::Finished)), State::Finished) + } + }, + State::Finished => iced::futures::future::pending().await, + } +} + +#[derive(Clone, Debug)] +pub enum ToplevelUpdate { + Finished, + AddToplevel(ZcosmicToplevelHandleV1, ToplevelInfo), + UpdateToplevel(ZcosmicToplevelHandleV1, ToplevelInfo), + RemoveToplevel(ZcosmicToplevelHandleV1), + Init(calloop::channel::Sender), +} + +#[derive(Debug, Clone)] +pub enum ToplevelRequest { + Activate(ZcosmicToplevelHandleV1), + Quit(ZcosmicToplevelHandleV1), + Exit, +} diff --git a/applets/cosmic-app-list/src/wayland.rs b/applets/cosmic-app-list/src/wayland.rs deleted file mode 100644 index d565ada2..00000000 --- a/applets/cosmic-app-list/src/wayland.rs +++ /dev/null @@ -1,597 +0,0 @@ -use crate::config::AppListConfig; -use crate::{config::TopLevelFilter, utils::AppListEvent, wayland_source::WaylandSource, TX}; -use calloop::channel::*; -use cosmic_panel_config::CosmicPanelOuput; -use cosmic_protocols::{ - toplevel_info::v1::client::{ - zcosmic_toplevel_handle_v1::{self, ZcosmicToplevelHandleV1}, - zcosmic_toplevel_info_v1::{self, ZcosmicToplevelInfoV1}, - }, - toplevel_management::v1::client::zcosmic_toplevel_manager_v1::{ - self, ZcosmicToplevelManagerV1, - }, - workspace::v1::client::{ - zcosmic_workspace_group_handle_v1::{self, ZcosmicWorkspaceGroupHandleV1}, - zcosmic_workspace_handle_v1::{self, ZcosmicWorkspaceHandleV1}, - zcosmic_workspace_manager_v1::{self, ZcosmicWorkspaceManagerV1}, - }, -}; -use std::{env, os::unix::net::UnixStream, path::PathBuf, time::Duration}; -use wayland_client::protocol::wl_seat::{self, WlSeat}; -use wayland_client::{ - event_created_child, - protocol::{ - wl_output::{self, WlOutput}, - wl_registry, - }, - ConnectError, Proxy, -}; -use wayland_client::{Connection, Dispatch, QueueHandle}; - -#[derive(Debug, Clone)] -pub enum ToplevelEvent { - Activate(ZcosmicToplevelHandleV1), - Close(ZcosmicToplevelHandleV1), -} - -pub fn spawn_toplevels() -> SyncSender { - let config = AppListConfig::load().unwrap_or_default(); - - let (workspaces_tx, workspaces_rx) = calloop::channel::sync_channel(100); - - if let Ok(Ok(conn)) = std::env::var("WAYLAND_DISPLAY") - .map_err(anyhow::Error::msg) - .map(|display_str| { - let mut socket_path = env::var_os("XDG_RUNTIME_DIR") - .map(Into::::into) - .ok_or(ConnectError::NoCompositor)?; - socket_path.push(display_str); - - Ok(UnixStream::connect(socket_path).map_err(|_| ConnectError::NoCompositor)?) - }) - .and_then(|s| s.map(|s| Connection::from_socket(s).map_err(anyhow::Error::msg))) - { - std::thread::spawn(move || { - let output = std::env::var("COSMIC_PANEL_OUTPUT").ok().and_then(|size| { - match size.parse::() { - Ok(CosmicPanelOuput::Name(n)) => Some(n), - // TODO handle Active & panic if the space is still configured for All instead of being assigned a named output - _ => None, - } - }); - - let mut event_loop = calloop::EventLoop::::try_new().unwrap(); - let loop_handle = event_loop.handle(); - let event_queue = conn.new_event_queue::(); - let qhandle = event_queue.handle(); - - WaylandSource::new(event_queue) - .expect("Failed to create wayland source") - .insert(loop_handle) - .unwrap(); - - let display = conn.display(); - display.get_registry(&qhandle, ()); - - let mut state = State { - workspace_manager: None, - workspace_groups: Vec::new(), - toplevel_info: None, - toplevel_manager: None, - config, - configured_output: output, - expected_output: None, - running: true, - toplevels: vec![], - seats: vec![], - }; - let loop_handle = event_loop.handle(); - loop_handle - .insert_source(workspaces_rx, |e, _, state| match e { - Event::Msg(ToplevelEvent::Activate(toplevel)) => { - if let Some(manager) = &state.toplevel_manager { - for seat in &state.seats { - manager.activate(&toplevel, seat) - } - } - } - Event::Msg(ToplevelEvent::Close(t)) => { - if let Some(manager) = &state.toplevel_manager { - manager.close(&t); - } - } - Event::Closed => { - if let Some(workspace_manager) = &mut state.workspace_manager { - for g in &mut state.workspace_groups { - g.workspace_group_handle.destroy(); - } - workspace_manager.stop(); - } - if let Some(toplevel_manager) = &mut state.toplevel_manager { - toplevel_manager.destroy(); - } - if let Some(toplevel_info) = &mut state.toplevel_info { - for toplevel in &state.toplevels { - toplevel.toplevel_handle.destroy(); - } - toplevel_info.stop(); - } - } - }) - .unwrap(); - while state.running { - event_loop - .dispatch(Duration::from_millis(16), &mut state) - .unwrap(); - } - }); - } else { - eprintln!("ENV variable WAYLAND_DISPLAY is missing. Exiting..."); - std::process::exit(1); - } - - workspaces_tx -} - -#[derive(Debug, Clone)] -pub struct State { - running: bool, - config: AppListConfig, - configured_output: Option, - expected_output: Option, - workspace_manager: Option, - workspace_groups: Vec, - toplevel_info: Option, - toplevel_manager: Option, - toplevels: Vec, - seats: Vec, -} - -#[derive(Debug, Clone)] -pub struct Toplevel { - pub name: String, - pub app_id: String, - pub toplevel_handle: ZcosmicToplevelHandleV1, - pub states: Vec, - pub output: Option, - pub workspace: Option, -} - -#[derive(Debug, Clone)] -struct WorkspaceGroup { - workspace_group_handle: ZcosmicWorkspaceGroupHandleV1, - output: Option, - workspaces: Vec, -} - -#[derive(Debug, Clone)] -struct Workspace { - workspace_handle: ZcosmicWorkspaceHandleV1, - name: String, - coordinates: Vec, - states: Vec, -} - -impl Dispatch for State { - fn event( - state: &mut Self, - registry: &wl_registry::WlRegistry, - event: wl_registry::Event, - _: &(), - _: &Connection, - qh: &QueueHandle, - ) { - if let wl_registry::Event::Global { - name, - interface, - version, - } = event - { - match &interface[..] { - "zcosmic_toplevel_info_v1" => { - let ti = registry - .bind::(name, 1, qh, ()); - state.toplevel_info = Some(ti); - } - "zcosmic_toplevel_manager_v1" => { - let tm = registry - .bind::(name, 1, qh, ()); - state.toplevel_manager = Some(tm); - } - "zcosmic_workspace_manager_v1" => { - let workspace_manager = registry - .bind::(name, 1, qh, ()); - state.workspace_manager = Some(workspace_manager); - } - "wl_seat" => { - registry.bind::(name, 1, qh, ()); - } - "wl_output" => { - registry.bind::(name, 1, qh, ()); - } - _ => {} - } - } - } -} - -impl Dispatch for State { - fn event( - state: &mut Self, - _: &ZcosmicToplevelInfoV1, - event: ::Event, - _: &(), - _: &Connection, - _: &QueueHandle, - ) { - match event { - zcosmic_toplevel_info_v1::Event::Toplevel { toplevel } => { - state.toplevels.push(Toplevel { - name: "".into(), - app_id: "".into(), - toplevel_handle: toplevel, - states: vec![], - output: None, - workspace: None, - }); - } - zcosmic_toplevel_info_v1::Event::Finished => { - todo!() - } - _ => {} - } - } - - event_created_child!(State, ZcosmicWorkspaceManagerV1, [ - 0 => (ZcosmicToplevelHandleV1, ()) - ]); -} - -impl Dispatch for State { - fn event( - _: &mut Self, - _: &ZcosmicToplevelManagerV1, - event: ::Event, - _: &(), - _: &Connection, - _: &QueueHandle, - ) { - match event { - zcosmic_toplevel_manager_v1::Event::Capabilities { .. } => { - // TODO capabilities affect what is shown to user in applet - } - _ => {} - } - } -} - -impl Dispatch for State { - fn event( - state: &mut Self, - p: &ZcosmicToplevelHandleV1, - event: ::Event, - _: &(), - _: &Connection, - _: &QueueHandle, - ) { - match event { - zcosmic_toplevel_handle_v1::Event::Closed => { - if let Some(i) = state.toplevels.iter().position(|t| &t.toplevel_handle == p) { - let removed_toplevel = state.toplevels.remove(i); - if match state.config.filter_top_levels { - Some(TopLevelFilter::ActiveWorkspace) => state - .workspace_groups - .iter() - .find(|g| { - g.workspaces - .iter() - .find(|w| { - w.states - .contains(&zcosmic_workspace_handle_v1::State::Active) - && Some(&w.workspace_handle) - == removed_toplevel.workspace.as_ref() - }) - .is_some() - }) - .is_some(), - Some(TopLevelFilter::ConfiguredOutput) => { - state.expected_output == removed_toplevel.output - } - _ => true, - } { - let tx = TX.get().unwrap().clone(); - let _ = tx.send(AppListEvent::Remove(removed_toplevel)); - } - } - } - zcosmic_toplevel_handle_v1::Event::Done => { - let to_send = match state.config.filter_top_levels { - Some(TopLevelFilter::ActiveWorkspace) => state.toplevels.iter_mut().find(|t| { - if &t.toplevel_handle == p { - state - .workspace_groups - .iter() - .find(|g| { - g.workspaces - .iter() - .find(|w| { - w.states.contains( - &zcosmic_workspace_handle_v1::State::Active, - ) && Some(&w.workspace_handle) == t.workspace.as_ref() - }) - .is_some() - }) - .is_some() - } else { - false - } - }), - Some(TopLevelFilter::ConfiguredOutput) => state - .toplevels - .iter_mut() - .find(|t| &t.toplevel_handle == p && state.expected_output == t.output), - _ => state.toplevels.iter_mut().find(|t| &t.toplevel_handle == p), - }; - - if let Some(toplevel) = to_send.cloned() { - let tx = TX.get().unwrap().clone(); - - let _ = tx.send(AppListEvent::Add(toplevel)); - } - } - zcosmic_toplevel_handle_v1::Event::Title { title } => { - if let Some(i) = state.toplevels.iter_mut().find(|t| &t.toplevel_handle == p) { - i.name = title; - } - } - zcosmic_toplevel_handle_v1::Event::AppId { app_id } => { - if let Some(i) = state.toplevels.iter_mut().find(|t| &t.toplevel_handle == p) { - i.app_id = app_id; - } - } - zcosmic_toplevel_handle_v1::Event::OutputEnter { output } => { - if let Some(i) = state.toplevels.iter_mut().find(|t| &t.toplevel_handle == p) { - i.output.replace(output); - } - } - zcosmic_toplevel_handle_v1::Event::OutputLeave { output } => { - if let Some(i) = state - .toplevels - .iter_mut() - .find(|t| &t.toplevel_handle == p && t.output.as_ref() == Some(&output)) - { - i.output.take(); - } - } - zcosmic_toplevel_handle_v1::Event::WorkspaceEnter { workspace } => { - if let Some(i) = state.toplevels.iter_mut().find(|t| &t.toplevel_handle == p) { - i.workspace.replace(workspace); - } - } - zcosmic_toplevel_handle_v1::Event::WorkspaceLeave { workspace } => { - if let Some(i) = state - .toplevels - .iter_mut() - .find(|t| &t.toplevel_handle == p && t.workspace.as_ref() == Some(&workspace)) - { - i.workspace.take(); - } - } - zcosmic_toplevel_handle_v1::Event::State { state: t_state } => { - if let Some(i) = state.toplevels.iter_mut().find(|t| &t.toplevel_handle == p) { - i.states = t_state - .chunks(4) - .map(|chunk| { - zcosmic_toplevel_handle_v1::State::try_from(u32::from_ne_bytes( - chunk.try_into().unwrap(), - )) - .unwrap() - }) - .collect(); - } - } - _ => todo!(), - } - } -} - -impl Dispatch for State { - fn event( - state: &mut Self, - _: &ZcosmicWorkspaceManagerV1, - event: zcosmic_workspace_manager_v1::Event, - _: &(), - _: &Connection, - _: &QueueHandle, - ) { - match event { - zcosmic_workspace_manager_v1::Event::WorkspaceGroup { workspace_group } => { - state.workspace_groups.push(WorkspaceGroup { - workspace_group_handle: workspace_group, - output: None, - workspaces: Vec::new(), - }); - } - zcosmic_workspace_manager_v1::Event::Done => { - for group in &mut state.workspace_groups { - group.workspaces.sort_by(|w1, w2| { - w1.coordinates - .iter() - .zip(w2.coordinates.iter()) - .skip_while(|(coord1, coord2)| coord1 == coord2) - .next() - .map(|(coord1, coord2)| coord1.cmp(coord2)) - .unwrap_or(std::cmp::Ordering::Equal) - }); - } - } - zcosmic_workspace_manager_v1::Event::Finished => { - state.workspace_manager.take(); - } - _ => {} - } - } - - event_created_child!(State, ZcosmicWorkspaceManagerV1, [ - 0 => (ZcosmicWorkspaceGroupHandleV1, ()) - ]); -} - -impl Dispatch for State { - fn event( - state: &mut Self, - group: &ZcosmicWorkspaceGroupHandleV1, - event: zcosmic_workspace_group_handle_v1::Event, - _: &(), - _: &Connection, - _: &QueueHandle, - ) { - match event { - zcosmic_workspace_group_handle_v1::Event::OutputEnter { output } => { - if let Some(group) = state - .workspace_groups - .iter_mut() - .find(|g| &g.workspace_group_handle == group) - { - group.output = Some(output); - } - } - zcosmic_workspace_group_handle_v1::Event::OutputLeave { output } => { - if let Some(group) = state.workspace_groups.iter_mut().find(|g| { - &g.workspace_group_handle == group && g.output.as_ref() == Some(&output) - }) { - group.output = None; - } - } - zcosmic_workspace_group_handle_v1::Event::Workspace { workspace } => { - if let Some(group) = state - .workspace_groups - .iter_mut() - .find(|g| &g.workspace_group_handle == group) - { - group.workspaces.push(Workspace { - workspace_handle: workspace, - name: String::new(), - coordinates: Vec::new(), - states: Vec::new(), - }) - } - } - zcosmic_workspace_group_handle_v1::Event::Remove => { - if let Some(group) = state - .workspace_groups - .iter() - .position(|g| &g.workspace_group_handle == group) - { - state.workspace_groups.remove(group); - } - } - _ => {} - } - } - - event_created_child!(State, ZcosmicWorkspaceGroupHandleV1, [ - 3 => (ZcosmicWorkspaceHandleV1, ()) - ]); -} - -impl Dispatch for State { - fn event( - state: &mut Self, - workspace: &ZcosmicWorkspaceHandleV1, - event: zcosmic_workspace_handle_v1::Event, - _: &(), - _: &Connection, - _: &QueueHandle, - ) { - match event { - zcosmic_workspace_handle_v1::Event::Name { name } => { - if let Some(w) = state.workspace_groups.iter_mut().find_map(|g| { - g.workspaces - .iter_mut() - .find(|w| &w.workspace_handle == workspace) - }) { - w.name = name; - } - } - zcosmic_workspace_handle_v1::Event::Coordinates { coordinates } => { - if let Some(w) = state.workspace_groups.iter_mut().find_map(|g| { - g.workspaces - .iter_mut() - .find(|w| &w.workspace_handle == workspace) - }) { - // wayland is host byte order - w.coordinates = coordinates - .chunks(4) - .map(|chunk| u32::from_ne_bytes(chunk.try_into().unwrap())) - .collect(); - } - } - zcosmic_workspace_handle_v1::Event::State { - state: workspace_state, - } => { - if let Some(w) = state.workspace_groups.iter_mut().find_map(|g| { - g.workspaces - .iter_mut() - .find(|w| &w.workspace_handle == workspace) - }) { - // wayland is host byte order - w.states = workspace_state - .chunks(4) - .map(|chunk| { - zcosmic_workspace_handle_v1::State::try_from(u32::from_ne_bytes( - chunk.try_into().unwrap(), - )) - .unwrap() - }) - .collect(); - // TODO if workspace active status changes while configured to only show active workspace, clear the list - } - } - zcosmic_workspace_handle_v1::Event::Remove => { - if let Some((g, w_i)) = state.workspace_groups.iter_mut().find_map(|g| { - g.workspaces - .iter_mut() - .position(|w| &w.workspace_handle == workspace) - .map(|p| (g, p)) - }) { - g.workspaces.remove(w_i); - } - } - _ => {} - } - } -} - -impl Dispatch for State { - fn event( - state: &mut Self, - o: &WlOutput, - e: wl_output::Event, - _: &(), - _: &Connection, - _: &QueueHandle, - ) { - match e { - wl_output::Event::Name { name } if Some(&name) == state.configured_output.as_ref() => { - state.expected_output.replace(o.clone()); - } - _ => {} // ignored - } - } -} - -impl Dispatch for State { - fn event( - state: &mut Self, - seat: &WlSeat, - _: wl_seat::Event, - _: &(), - _: &Connection, - _: &QueueHandle, - ) { - if state.seats.iter().find(|s| s == &seat).is_none() { - state.seats.push(seat.clone()); - } - } -} diff --git a/applets/cosmic-app-list/src/wayland_source.rs b/applets/cosmic-app-list/src/wayland_source.rs deleted file mode 100644 index c085517c..00000000 --- a/applets/cosmic-app-list/src/wayland_source.rs +++ /dev/null @@ -1,219 +0,0 @@ -//! Utilities for using an [`EventQueue`] from wayland-client with an event loop that performs polling with -//! [`calloop`](https://crates.io/crates/calloop). - -use std::{io, os::unix::prelude::{RawFd, AsRawFd}}; - -use calloop::{ - generic::Generic, EventSource, InsertError, Interest, LoopHandle, Mode, Poll, PostAction, - Readiness, RegistrationToken, Token, TokenFactory, -}; -use nix::errno::Errno; -use wayland_backend::client::{ReadEventsGuard, WaylandError}; -use wayland_client::{DispatchError, EventQueue}; - -/// An adapter to insert an [`EventQueue`] into a calloop [`EventLoop`](calloop::EventLoop). -/// -/// This type implements [`EventSource`] which generates an event whenever events on the display need to be -/// dispatched. The event queue available in the callback calloop registers may be used to dispatch pending -/// events using [`EventQueue::dispatch_pending`]. -/// -/// [`WaylandSource::insert`] can be used to insert this source into an event loop and automatically dispatch -/// pending events on the display. -#[derive(Debug)] -pub struct WaylandSource { - queue: EventQueue, - fd: Generic, - read_guard: Option, -} - -impl WaylandSource { - /// Wrap an [`EventQueue`] as a [`WaylandSource`]. - pub fn new(queue: EventQueue) -> Result, WaylandError> { - let guard = queue.prepare_read()?; - let fd = Generic::new(guard.connection_fd().as_raw_fd(), Interest::READ, Mode::Level); - drop(guard); - - Ok(WaylandSource { - queue, - fd, - read_guard: None, - }) - } - - /// Access the underlying event queue - /// - /// Note that you should be careful when interacting with it if you invoke methods that - /// interact with the wayland socket (such as `dispatch()` or `prepare_read()`). These may - /// interfere with the proper waking up of this event source in the event loop. - pub fn queue(&mut self) -> &mut EventQueue { - &mut self.queue - } - - /// Insert this source into the given event loop. - /// - /// This adapter will pass the event loop's shared data as the `D` type for the event loop. - pub fn insert(self, handle: LoopHandle) -> Result> - where - D: 'static, - { - handle.insert_source(self, |_, queue, data| queue.dispatch_pending(data)) - } -} - -impl EventSource for WaylandSource { - type Event = (); - - /// The underlying event queue. - /// - /// You should call [`EventQueue::dispatch_pending`] inside your callback using this queue. - type Metadata = EventQueue; - type Ret = Result; - type Error = calloop::Error; - - fn process_events( - &mut self, - readiness: Readiness, - token: Token, - mut callback: F, - ) -> Result - where - F: FnMut(Self::Event, &mut Self::Metadata) -> Self::Ret, - { - let queue = &mut self.queue; - let read_guard = &mut self.read_guard; - - let action = self.fd.process_events(readiness, token, |_, _| { - // 1. read events from the socket if any are available - if let Some(guard) = read_guard.take() { - // might be None if some other thread read events before us, concurrently - if let Err(WaylandError::Io(err)) = guard.read() { - if err.kind() != io::ErrorKind::WouldBlock { - return Err(err); - } - } - } - - // 2. dispatch any pending events in the queue - // This is done to ensure we are not waiting for messages that are already in the buffer. - Self::loop_callback_pending(queue, &mut callback)?; - *read_guard = Some(Self::prepare_read(queue)?); - - // 3. Once dispatching is finished, flush the responses to the compositor - if let Err(WaylandError::Io(e)) = queue.flush() { - if e.kind() != io::ErrorKind::WouldBlock { - // in case of error, forward it and fast-exit - return Err(e); - } - // WouldBlock error means the compositor could not process all our messages - // quickly. Either it is slowed down or we are a spammer. - // Should not really happen, if it does we do nothing and will flush again later - } - - Ok(PostAction::Continue) - })?; - - Ok(action) - } - - fn register( - &mut self, - poll: &mut Poll, - token_factory: &mut TokenFactory, - ) -> calloop::Result<()> { - self.fd.register(poll, token_factory) - } - - fn reregister( - &mut self, - poll: &mut Poll, - token_factory: &mut TokenFactory, - ) -> calloop::Result<()> { - self.fd.reregister(poll, token_factory) - } - - fn unregister(&mut self, poll: &mut Poll) -> calloop::Result<()> { - self.fd.unregister(poll) - } - - fn pre_run(&mut self, mut callback: F) -> calloop::Result<()> - where - F: FnMut((), &mut Self::Metadata) -> Self::Ret, - { - debug_assert!(self.read_guard.is_none()); - - // flush the display before starting to poll - if let Err(WaylandError::Io(err)) = self.queue.flush() { - if err.kind() != io::ErrorKind::WouldBlock { - // in case of error, don't prepare a read, if the error is persistent, it'll trigger in other - // wayland methods anyway - log::error!("Error trying to flush the wayland display: {}", err); - return Err(err.into()); - } - } - - // ensure we are not waiting for messages that are already in the buffer. - Self::loop_callback_pending(&mut self.queue, &mut callback)?; - self.read_guard = Some(Self::prepare_read(&mut self.queue)?); - - Ok(()) - } - - fn post_run(&mut self, _: F) -> calloop::Result<()> - where - F: FnMut((), &mut Self::Metadata) -> Self::Ret, - { - // Drop implementation of ReadEventsGuard will do cleanup - self.read_guard.take(); - Ok(()) - } -} - -impl WaylandSource { - /// Loop over the callback until all pending messages have been dispatched. - fn loop_callback_pending(queue: &mut EventQueue, callback: &mut F) -> io::Result<()> - where - F: FnMut((), &mut EventQueue) -> Result, - { - // Loop on the callback until no pending events are left. - loop { - match callback((), queue) { - // No more pending events. - Ok(0) => break Ok(()), - - Ok(_) => continue, - - Err(DispatchError::Backend(WaylandError::Io(err))) => { - return Err(err); - } - - Err(DispatchError::Backend(WaylandError::Protocol(err))) => { - log::error!("Protocol error received on display: {}", err); - - break Err(Errno::EPROTO.into()); - } - - Err(DispatchError::BadMessage { sender_id, interface, opcode }) => { - log::error!( - "Bad message on interface \"{}\": (opcode: {}, sender_id: {:?})", - interface, - opcode, - sender_id, - ); - - break Err(Errno::EPROTO.into()); - } - } - } - } - - fn prepare_read(queue: &mut EventQueue) -> io::Result { - queue.prepare_read().map_err(|err| match err { - WaylandError::Io(err) => err, - - WaylandError::Protocol(err) => { - log::error!("Protocol error received on display: {}", err); - Errno::EPROTO.into() - } - }) - } -} diff --git a/debian/rules b/debian/rules index 82423136..9d5b9b93 100755 --- a/debian/rules +++ b/debian/rules @@ -71,6 +71,13 @@ override_dh_auto_clean: echo 'directory = "vendor"' >> .cargo/config; \ tar pcf vendor.tar vendor; \ rm -rf vendor; \ + cd ../..; \ + cd applets/cosmic-app-list/; \ + mkdir -p .cargo; \ + cargo vendor --sync Cargo.toml | head -n -1 > .cargo/config; \ + echo 'directory = "vendor"' >> .cargo/config; \ + tar pcf vendor.tar vendor; \ + rm -rf vendor; \ fi override_dh_auto_build: diff --git a/justfile b/justfile index 15a3c5ab..206d5b15 100644 --- a/justfile +++ b/justfile @@ -28,6 +28,9 @@ workspaces_button_id := 'com.system76.CosmicPanelWorkspacesButton' build: _extract_vendor #!/usr/bin/env bash + pushd applets/cosmic-app-list/ + cargo build {{cargo_args}} + popd pushd applets/cosmic-applet-audio/ cargo build {{cargo_args}} popd @@ -63,7 +66,7 @@ install: install -Dm0644 applets/cosmic-app-list/data/icons/{{app_list_id}}.Devel.svg {{iconsdir}}/{{app_list_id}}.Devel.svg install -Dm0644 applets/cosmic-app-list/data/icons/{{app_list_id}}.svg {{iconsdir}}/{{app_list_id}}.svg install -Dm0644 applets/cosmic-app-list/data/{{app_list_id}}.desktop {{sharedir}}/applications/{{app_list_id}}.desktop - install -Dm0755 target/release/cosmic-app-list {{bindir}}/cosmic-app-list + install -Dm0755 applets/cosmic-app-list/target/release/cosmic-app-list {{bindir}}/cosmic-app-list # network install -Dm0644 applets/cosmic-applet-network/data/icons/{{network_id}}.svg {{iconsdir}}/{{network_id}}.svg @@ -128,4 +131,5 @@ _extract_vendor: rm -rf applets/cosmic-applet-power/vendor; tar xf applets/cosmic-applet-power/vendor.tar --directory applets/cosmic-applet-power rm -rf applets/cosmic-applet-time/vendor; tar xf applets/cosmic-applet-time/vendor.tar --directory applets/cosmic-applet-time rm -rf applets/cosmic-applet-network/vendor; tar xf applets/cosmic-applet-network/vendor.tar --directory applets/cosmic-applet-network + rm -rf applets/cosmic-app-list/vendor; tar xf applets/cosmic-app-list/vendor.tar --directory applets/cosmic-app-list fi