diff --git a/.gitignore b/.gitignore index 2c25f66..10de4bd 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,4 @@ /debian/files /target/ /vendor/ -!/vendor/ -/vendor/* -!/vendor/iced_video_player/ -!/vendor/iced_video_player/** /vendor.tar diff --git a/.zed/settings.json b/.zed/settings.json deleted file mode 100644 index 2cc7b98..0000000 --- a/.zed/settings.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "format_on_save": "on", - "lsp": { - "rust-analyzer": { - "initialization_options": { - "check": { - "command": "clippy", - }, - "rustfmt": { - "extraArgs": ["+nightly"], - }, - }, - }, - }, -} diff --git a/Cargo.lock b/Cargo.lock index 61b931e..a0025b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,7 +35,7 @@ dependencies = [ "accesskit_consumer", "atspi-common", "serde", - "zvariant", + "zvariant 5.10.0", ] [[package]] @@ -72,7 +72,7 @@ dependencies = [ "serde", "tokio", "tokio-stream", - "zbus", + "zbus 5.14.0", ] [[package]] @@ -135,24 +135,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" -[[package]] -name = "aligned" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" -dependencies = [ - "as-slice", -] - -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - [[package]] name = "almost" version = "0.2.0" @@ -166,7 +148,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" dependencies = [ "android-properties", - "bitflags 2.11.1", + "bitflags 2.11.0", "cc", "jni", "libc", @@ -193,56 +175,6 @@ dependencies = [ "libc", ] -[[package]] -name = "anstream" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" - -[[package]] -name = "anstyle-parse" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.61.2", -] - [[package]] name = "anyhow" version = "1.0.102" @@ -264,12 +196,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" - [[package]] name = "arc-swap" version = "1.9.1" @@ -279,17 +205,6 @@ dependencies = [ "rustversion", ] -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "arrayref" version = "0.3.9" @@ -303,13 +218,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] -name = "as-slice" -version = "0.2.1" +name = "as-raw-xcb-connection" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" -dependencies = [ - "stable_deref_trait", -] +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" [[package]] name = "ash" @@ -329,13 +241,13 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.4", + "rand 0.9.2", "raw-window-handle", "serde", "serde_repr", "tokio", "url", - "zbus", + "zbus 5.14.0", ] [[package]] @@ -347,7 +259,7 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.4", + "rand 0.9.2", "serde", "serde_repr", "tokio", @@ -355,7 +267,7 @@ dependencies = [ "wayland-backend", "wayland-client", "wayland-protocols", - "zbus", + "zbus 5.14.0", ] [[package]] @@ -396,6 +308,17 @@ dependencies = [ "slab", ] +[[package]] +name = "async-fs" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + [[package]] name = "async-io" version = "2.6.0" @@ -451,7 +374,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -486,7 +409,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -497,9 +420,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "atomic_refcell" -version = "0.1.14" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e4227379beff4205943696e6c3e0cd809bacdf3f0edd6e3dd153e2269571a4" +checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" [[package]] name = "atomicwrites" @@ -530,11 +453,11 @@ dependencies = [ "enumflags2", "serde", "static_assertions", - "zbus", + "zbus 5.14.0", "zbus-lockstep", "zbus-lockstep-macros", - "zbus_names", - "zvariant", + "zbus_names 4.3.1", + "zvariant 5.10.0", ] [[package]] @@ -545,7 +468,7 @@ checksum = "2230e48787ed3eb4088996eab66a32ca20c0b67bbd4fd6cdfe79f04f1f04c9fc" dependencies = [ "atspi-common", "serde", - "zbus", + "zbus 5.14.0", ] [[package]] @@ -557,7 +480,7 @@ dependencies = [ "derive_utils", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -566,49 +489,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "av-scenechange" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" -dependencies = [ - "aligned", - "anyhow", - "arg_enum_proc_macro", - "arrayvec", - "log", - "num-rational", - "num-traits", - "pastey 0.1.1", - "rayon", - "thiserror 2.0.18", - "v_frame", - "y4m", -] - -[[package]] -name = "av1-grain" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" -dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom", - "num-rational", - "v_frame", -] - -[[package]] -name = "avif-serialize" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" -dependencies = [ - "arrayvec", -] - [[package]] name = "base64" version = "0.22.1" @@ -653,22 +533,13 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" dependencies = [ "serde_core", ] -[[package]] -name = "bitstream-io" -version = "4.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" -dependencies = [ - "no_std_io2", -] - [[package]] name = "block" version = "0.1.6" @@ -745,12 +616,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "built" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" - [[package]] name = "bumpalo" version = "3.20.2" @@ -780,9 +645,15 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "byteorder-lite" version = "0.1.0" @@ -801,7 +672,7 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "polling", "rustix 1.1.4", "slab", @@ -822,9 +693,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.62" +version = "1.2.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" dependencies = [ "find-msvc-tools", "jobserver", @@ -856,9 +727,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "clap_lex" -version = "1.1.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" [[package]] name = "clipboard-win" @@ -872,7 +743,7 @@ dependencies = [ [[package]] name = "clipboard_macos" version = "0.1.0" -source = "git+https://forge.aditua.com/leyoda/window_clipboard.git?branch=yoda-x11-optional#319db02e5219c557c8f03b0e33a8eb4075cabb85" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "objc", "objc-foundation", @@ -882,13 +753,22 @@ dependencies = [ [[package]] name = "clipboard_wayland" version = "0.2.2" -source = "git+https://forge.aditua.com/leyoda/window_clipboard.git?branch=yoda-x11-optional#319db02e5219c557c8f03b0e33a8eb4075cabb85" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "dnd", "mime", "smithay-clipboard", ] +[[package]] +name = "clipboard_x11" +version = "0.4.2" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" +dependencies = [ + "thiserror 1.0.69", + "x11rb", +] + [[package]] name = "cocoa" version = "0.25.0" @@ -936,12 +816,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" -[[package]] -name = "colorchoice" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" - [[package]] name = "combine" version = "4.6.7" @@ -1023,7 +897,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "core-foundation 0.10.1", "libc", ] @@ -1042,7 +916,7 @@ name = "cosmic-client-toolkit" version = "0.2.0" source = "git+https://github.com/pop-os/cosmic-protocols?rev=160b086#160b086abe03cd34a8a375d7fbe47b24308d1f38" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cosmic-protocols", "libc", "smithay-client-toolkit", @@ -1053,6 +927,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1067,21 +942,22 @@ dependencies = [ "tokio", "tracing", "xdg", - "zbus", + "zbus 5.14.0", ] [[package]] name = "cosmic-config-derive" version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "quote", - "syn", + "syn 2.0.117", ] [[package]] name = "cosmic-freedesktop-icons" version = "0.4.0" -source = "git+https://github.com/pop-os/freedesktop-icons#9c562fe3ecf03241a46a60c0078cd6ea10bd75ce" +source = "git+https://github.com/pop-os/freedesktop-icons#7a61a704f6d1ec41f71cbe766e3cc484858523fa" dependencies = [ "bstr", "btoi", @@ -1094,20 +970,20 @@ dependencies = [ [[package]] name = "cosmic-player" -version = "1.0.13" +version = "1.0.9" dependencies = [ "ashpd 0.12.3", "clap_lex", "env_logger", "fork", "gstreamer-tag", - "i18n-embed", - "i18n-embed-fl", + "i18n-embed 0.14.1", + "i18n-embed-fl 0.7.0", "iced_video_player", "icu_collator", - "icu_locale", - "image", - "libcosmic-yoda", + "icu_provider 1.5.0", + "image 0.24.9", + "libcosmic", "log", "mpris-server", "rust-embed", @@ -1116,7 +992,6 @@ dependencies = [ "tokio", "url", "vergen", - "xdgen", ] [[package]] @@ -1124,7 +999,7 @@ name = "cosmic-protocols" version = "0.2.0" source = "git+https://github.com/pop-os/cosmic-protocols?rev=160b086#160b086abe03cd34a8a375d7fbe47b24308d1f38" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -1138,22 +1013,22 @@ name = "cosmic-settings-daemon" version = "0.1.0" source = "git+https://github.com/pop-os/dbus-settings-bindings#507e342c21d3ce6ae41b1d4f3fa2f0ad5ee23e75" dependencies = [ - "zbus", + "zbus 5.14.0", ] [[package]] name = "cosmic-text" -version = "0.19.0" -source = "git+https://github.com/pop-os/cosmic-text.git#c24886c2471e5606587c46090cd25dbbf209186b" +version = "0.18.2" +source = "git+https://github.com/pop-os/cosmic-text.git#9a2ab09f06905e91f41d64ac6eee887726e7fd76" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "fontdb", "harfrust", "linebender_resource_handle", "log", "rangemap", "rustc-hash 2.1.2", - "self_cell", + "self_cell 1.2.2", "skrifa", "smol_str", "swash", @@ -1167,6 +1042,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "almost", "configparser", @@ -1269,6 +1145,12 @@ dependencies = [ "uncased", ] +[[package]] +name = "ctor-lite" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e162d0c2e2068eb736b71e5597eff0b9944e6b973cd9f37b6a288ab9bf20e300" + [[package]] name = "cursor-icon" version = "1.2.0" @@ -1295,8 +1177,8 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "strsim 0.11.1", + "syn 2.0.117", ] [[package]] @@ -1307,7 +1189,20 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.117", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", ] [[package]] @@ -1334,7 +1229,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1345,7 +1240,7 @@ checksum = "362f47930db19fe7735f527e6595e4900316b893ebf6d48ad3d31be928d57dd6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1385,7 +1280,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.6.2", "libc", "objc2 0.6.4", @@ -1399,7 +1294,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1414,9 +1309,9 @@ dependencies = [ [[package]] name = "dnd" version = "0.1.0" -source = "git+https://forge.aditua.com/leyoda/window_clipboard.git?branch=yoda-x11-optional#319db02e5219c557c8f03b0e33a8eb4075cabb85" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "mime", "raw-window-handle", "smithay-client-toolkit", @@ -1441,7 +1336,46 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" version = "0.1.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" + +[[package]] +name = "drm" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0f8a69e60d75ae7dab4ef26a59ca99f2a89d4c142089b537775ae0c198bdcde" +dependencies = [ + "bitflags 2.11.0", + "bytemuck", + "drm-ffi", + "drm-fourcc", + "rustix 0.38.44", +] + +[[package]] +name = "drm-ffi" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41334f8405792483e32ad05fbb9c5680ff4e84491883d2947a4757dc54cb2ac6" +dependencies = [ + "drm-sys", + "rustix 0.38.44", +] + +[[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.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d09ff881f92f118b11105ba5e34ff8f4adf27b30dae8f12e28c193af1c83176" +dependencies = [ + "libc", + "linux-raw-sys 0.6.5", +] [[package]] name = "either" @@ -1473,50 +1407,20 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "env_filter" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" -dependencies = [ - "log", - "regex", + "syn 2.0.117", ] [[package]] name = "env_logger" -version = "0.11.10" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ - "anstream", - "anstyle", - "env_filter", - "jiff", + "humantime", + "is-terminal", "log", -] - -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "regex", + "termcolor", ] [[package]] @@ -1608,12 +1512,6 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" -[[package]] -name = "fax" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" - [[package]] name = "fdeflate" version = "0.3.7" @@ -1669,13 +1567,39 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" +[[package]] +name = "fluent" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb74634707bebd0ce645a981148e8fb8c7bccd4c33c652aeffd28bf2f96d555a" +dependencies = [ + "fluent-bundle 0.15.3", + "unic-langid", +] + [[package]] name = "fluent" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8137a6d5a2c50d6b0ebfcb9aaa91a28154e0a70605f112d30cb0cd4a78670477" dependencies = [ - "fluent-bundle", + "fluent-bundle 0.16.0", + "unic-langid", +] + +[[package]] +name = "fluent-bundle" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe0a21ee80050c678013f82edf4b705fe2f26f1f9877593d13198612503f493" +dependencies = [ + "fluent-langneg", + "fluent-syntax 0.11.1", + "intl-memoizer", + "intl_pluralrules", + "rustc-hash 1.1.0", + "self_cell 0.10.3", + "smallvec", "unic-langid", ] @@ -1686,11 +1610,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01203cb8918f5711e73891b347816d932046f95f54207710bda99beaeb423bf4" dependencies = [ "fluent-langneg", - "fluent-syntax", + "fluent-syntax 0.12.0", "intl-memoizer", "intl_pluralrules", "rustc-hash 2.1.2", - "self_cell", + "self_cell 1.2.2", "smallvec", "unic-langid", ] @@ -1704,6 +1628,15 @@ dependencies = [ "unic-langid", ] +[[package]] +name = "fluent-syntax" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a530c4694a6a8d528794ee9bbd8ba0122e779629ac908d15ad5a7ae7763a33d" +dependencies = [ + "thiserror 1.0.69", +] + [[package]] name = "fluent-syntax" version = "0.12.0" @@ -1734,9 +1667,9 @@ checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "font-types" -version = "0.11.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" +checksum = "2d9237c6d82152100c691fb77ea18037b402bcc7257d2c876a4ffac81bc22a1c" dependencies = [ "bytemuck", ] @@ -1782,7 +1715,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1793,9 +1726,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "fork" -version = "0.7.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bcc4b4161e53d499e41af904acb23950adf85682c772921ef3957cf1ecc98b3" +checksum = "05dc8b302e04a1c27f4fe694439ef0f29779ca4edc205b7b58f00db04e29656d" dependencies = [ "libc", ] @@ -1809,16 +1742,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "freedesktop_entry_parser" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b368437186ec63ceb50d0832ee1ebcb5878037fe16ead1c68081d4aee0d140a" -dependencies = [ - "indexmap", - "nom", -] - [[package]] name = "fsevent-sys" version = "4.1.0" @@ -1897,7 +1820,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1939,6 +1862,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.4", + "windows-link 0.2.1", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -1985,27 +1918,17 @@ dependencies = [ "weezl", ] -[[package]] -name = "gif" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" -dependencies = [ - "color_quant", - "weezl", -] - [[package]] name = "gio-sys" -version = "0.22.0" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64729ba2772c080448f9f966dba8f4456beeb100d8c28a865ef8a0f2ef4987e1" +checksum = "521e93a7e56fc89e84aea9a52cfc9436816a4b363b030260b699950ff1336c83" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -2027,11 +1950,11 @@ checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" [[package]] name = "glib" -version = "0.22.7" +version = "0.20.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c207e04e51605dcf7b2924c41591b3a10e1438eaac5bcf448fb91f325381104a" +checksum = "ffc4b6e352d4716d84d7dde562dd9aee2a7d48beb872dd9ece7f2d1515b2d683" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "futures-channel", "futures-core", "futures-executor", @@ -2048,21 +1971,22 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.22.6" +version = "0.20.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "506d23499707c7142898429757e8d9a3871d965239a2cb66dfa05052be6d6f19" +checksum = "e8084af62f09475a3f529b1629c10c429d7600ee1398ae12dd3bf175d74e7145" dependencies = [ "heck 0.5.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] name = "glib-sys" -version = "0.22.6" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7fbac234ed5bc2a28359b7bde8e1b9cdf1441cc2d7f068e4824672d7db9445" +checksum = "8ab79e1ed126803a8fb827e3de0e2ff95191912b8db65cee467edb56fc4cc215" dependencies = [ "libc", "system-deps", @@ -2091,9 +2015,9 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.22.6" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a861859b887a79cf461359c192c97a57d8fb0229dd291232e57aa11f6fa72c" +checksum = "ec9aca94bb73989e3cfdbf8f2e0f1f6da04db4d291c431f444838925c4c63eda" dependencies = [ "glib-sys", "libc", @@ -2106,7 +2030,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "gpu-alloc-types", ] @@ -2116,7 +2040,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", ] [[package]] @@ -2137,7 +2061,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -2148,20 +2072,20 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", ] [[package]] name = "grid" -version = "1.0.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b40ca9252762c466af32d0b1002e91e4e1bc5398f77455e55474deb466355ff5" +checksum = "f9e2d4c0a8296178d8802098410ca05d86b17a10bb5ab559b3fb404c1f948220" [[package]] name = "gstreamer" -version = "0.25.2" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28ca0c594cac4e86f5444aaa767c7bb810340c0710667a6467d3ead248e35e84" +checksum = "8757a87f3706560037a01a9f06a59fcc7bdb0864744dcf73546606e60c4316e1" dependencies = [ "cfg-if", "futures-channel", @@ -2170,13 +2094,13 @@ dependencies = [ "glib", "gstreamer-sys", "itertools", - "kstring", "libc", "muldiv", "num-integer", "num-rational", + "once_cell", "option-operations", - "pastey 0.2.2", + "paste", "pin-project-lite", "smallvec", "thiserror 2.0.18", @@ -2184,9 +2108,9 @@ dependencies = [ [[package]] name = "gstreamer-app" -version = "0.25.2" +version = "0.23.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97f8ae9238c2352398dcc084de28df3f7099af216ac6c160b52318d23f25c010" +checksum = "2e9a883eb21aebcf1289158225c05f7aea5da6ecf71fa7f0ff1ce4d25baf004e" dependencies = [ "futures-core", "futures-sink", @@ -2199,9 +2123,9 @@ dependencies = [ [[package]] name = "gstreamer-app-sys" -version = "0.25.0" +version = "0.23.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a74a8211e5d7df2f45b612c284ddf56b92bdf4e879e8ed72e7c46dd0842e158" +checksum = "94f7ef838306fe51852d503a14dc79ac42de005a59008a05098de3ecdaf05455" dependencies = [ "glib-sys", "gstreamer-base-sys", @@ -2212,9 +2136,9 @@ dependencies = [ [[package]] name = "gstreamer-audio" -version = "0.25.2" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cdd06eb9c901b05902c55d106034319e2d730179744867564198d17c8486ed2" +checksum = "2e7ec7e0374298897e669db7c79544bc44df12011985e7dd5f38644edaf2caf4" dependencies = [ "cfg-if", "glib", @@ -2222,14 +2146,15 @@ dependencies = [ "gstreamer-audio-sys", "gstreamer-base", "libc", + "once_cell", "smallvec", ] [[package]] name = "gstreamer-audio-sys" -version = "0.25.2" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d25892ad6fdd898936ca338d46d8632b298470ecc3eb82098e330ed2cdaec5d" +checksum = "2b5f3e09e7c04ec91d78c2a6ca78d50b574b9ed49fdf5e72f3693adca4306a87" dependencies = [ "glib-sys", "gobject-sys", @@ -2241,9 +2166,9 @@ dependencies = [ [[package]] name = "gstreamer-base" -version = "0.25.2" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c279df2918be97fb9570e589a32ade33598f643b0c4f0c92c17f06be6940574e" +checksum = "f19a74fd04ffdcb847dd322640f2cf520897129d00a7bcb92fd62a63f3e27404" dependencies = [ "atomic_refcell", "cfg-if", @@ -2255,9 +2180,9 @@ dependencies = [ [[package]] name = "gstreamer-base-sys" -version = "0.25.0" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6569606feeb89cfcf95a6476a64a0f0aec83fadcef0e91c24e576f7851ceac3a" +checksum = "87f2fb0037b6d3c5b51f60dea11e667910f33be222308ca5a101450018a09840" dependencies = [ "glib-sys", "gobject-sys", @@ -2268,9 +2193,9 @@ dependencies = [ [[package]] name = "gstreamer-pbutils" -version = "0.25.2" +version = "0.23.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2230395c2bf062b2538350e6a962b1ff5888f1b29cd65cd1d96dfd5ff74dfb66" +checksum = "acf4bf5857fa22f910634e86a5bce33b5581a9e90caa4e32fd4a20bdd4c83ed0" dependencies = [ "glib", "gstreamer", @@ -2283,9 +2208,9 @@ dependencies = [ [[package]] name = "gstreamer-pbutils-sys" -version = "0.25.2" +version = "0.23.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eefc07f8f23ca04fae932accefcf22059060b4e3fd41c6445a502cd31c1350b6" +checksum = "304101f5fccbbe41e0169536777ddb7680c2c837e18575c22b30fc20cedfb76f" dependencies = [ "glib-sys", "gobject-sys", @@ -2298,11 +2223,10 @@ dependencies = [ [[package]] name = "gstreamer-sys" -version = "0.25.2" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533fa8d28fc830eafccbcfcfddb390563ea5d3a351af2c3aab99e197e5f5b1ba" +checksum = "feea73b4d92dbf9c24a203c9cd0bcc740d584f6b5960d5faf359febf288919b2" dependencies = [ - "cfg-if", "glib-sys", "gobject-sys", "libc", @@ -2311,9 +2235,9 @@ dependencies = [ [[package]] name = "gstreamer-tag" -version = "0.25.2" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790d1c673da71c87e9648d98e96cdd785784ae948a9728b95b2c7c10f6f4ee61" +checksum = "b52aa41071bfd846faba7508c0a7ef0562aefc135517b2af8eb54c08c284f9c4" dependencies = [ "glib", "gstreamer", @@ -2323,9 +2247,9 @@ dependencies = [ [[package]] name = "gstreamer-tag-sys" -version = "0.25.0" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6bfa5a12fdd4489a50d0022ebd40439e3c4c29e3df96e2ab77fcc354f0d64b4" +checksum = "19d1757fb8d77a2c4e6662f8a42672e5ddbde847b32d2db1775877e925626f72" dependencies = [ "glib-sys", "gobject-sys", @@ -2336,9 +2260,9 @@ dependencies = [ [[package]] name = "gstreamer-video" -version = "0.25.2" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf728cb21499561ea0d6ce584e550bf2b98b279cc7741067ee42f41f98b486e" +checksum = "1318b599d77ca4f7702ecbdeac1672d6304cb16b7e5752fabb3ee8260449a666" dependencies = [ "cfg-if", "futures-channel", @@ -2347,14 +2271,15 @@ dependencies = [ "gstreamer-base", "gstreamer-video-sys", "libc", + "once_cell", "thiserror 2.0.18", ] [[package]] name = "gstreamer-video-sys" -version = "0.25.2" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c2c997a90a5806a8d7fcb416755e3047d6bab8f580d2ededc9ab7ad553caf" +checksum = "0a70f0947f12d253b9de9bc3fd92f981e4d025336c18389c7f08cdf388a99f5c" dependencies = [ "glib-sys", "gobject-sys", @@ -2392,13 +2317,19 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", "core_maths", "read-fonts", "smallvec", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.5" @@ -2456,6 +2387,12 @@ dependencies = [ "utf8-width", ] +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + [[package]] name = "i18n-config" version = "0.4.8" @@ -2470,6 +2407,28 @@ dependencies = [ "unic-langid", ] +[[package]] +name = "i18n-embed" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94205d95764f5bb9db9ea98fa77f89653365ca748e27161f5bbea2ffd50e459c" +dependencies = [ + "arc-swap", + "fluent 0.16.1", + "fluent-langneg", + "fluent-syntax 0.11.1", + "i18n-embed-impl", + "intl-memoizer", + "lazy_static", + "locale_config", + "log", + "parking_lot", + "rust-embed", + "thiserror 1.0.69", + "unic-langid", + "walkdir", +] + [[package]] name = "i18n-embed" version = "0.16.0" @@ -2477,9 +2436,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a217bbb075dcaefb292efa78897fc0678245ca67f265d12c351e42268fcb0305" dependencies = [ "arc-swap", - "fluent", + "fluent 0.17.0", "fluent-langneg", - "fluent-syntax", + "fluent-syntax 0.12.0", "i18n-embed-impl", "intl-memoizer", "log", @@ -2491,6 +2450,27 @@ dependencies = [ "walkdir", ] +[[package]] +name = "i18n-embed-fl" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc1f8715195dffc4caddcf1cf3128da15fe5d8a137606ea8856c9300047d5a2" +dependencies = [ + "dashmap", + "find-crate", + "fluent 0.16.1", + "fluent-syntax 0.11.1", + "i18n-config", + "i18n-embed 0.14.1", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 2.0.117", + "unic-langid", +] + [[package]] name = "i18n-embed-fl" version = "0.10.0" @@ -2498,15 +2478,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e598ed73b67db92f61e04672e599eef2991a262a40e1666735b8a86d2e7e9f30" dependencies = [ "find-crate", - "fluent", - "fluent-syntax", + "fluent 0.17.0", + "fluent-syntax 0.12.0", "i18n-config", - "i18n-embed", + "i18n-embed 0.16.0", "proc-macro-error2", "proc-macro2", "quote", - "strsim", - "syn", + "strsim 0.11.1", + "syn 2.0.117", "unic-langid", ] @@ -2520,12 +2500,13 @@ dependencies = [ "i18n-config", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] name = "iced" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "dnd", "iced_accessibility", @@ -2537,7 +2518,7 @@ dependencies = [ "iced_runtime", "iced_widget", "iced_winit", - "image", + "image 0.25.10", "mime", "thiserror 2.0.18", "window_clipboard", @@ -2546,6 +2527,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "accesskit", "accesskit_winit", @@ -2554,8 +2536,9 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytes", "cosmic-client-toolkit", "dnd", @@ -2577,6 +2560,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "iced_core", "iced_futures", @@ -2586,6 +2570,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "futures", "iced_core", @@ -2599,14 +2584,15 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", "cosmic-text", "half", "iced_core", "iced_futures", - "image", + "image 0.25.10", "kamadak-exif", "log", "lyon_path", @@ -2619,6 +2605,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "iced_graphics", "iced_runtime", @@ -2627,6 +2614,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -2638,6 +2626,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -2652,6 +2641,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "bytemuck", "cosmic-text", @@ -2668,6 +2658,7 @@ dependencies = [ [[package]] name = "iced_video_player" version = "0.6.0" +source = "git+https://github.com/wash2/iced_video_player.git?branch=iced-rebase#8ba65f2b95f9d69f06bfc821a0f4b6c4eac6091d" dependencies = [ "glib", "gstreamer", @@ -2676,17 +2667,19 @@ dependencies = [ "gstreamer-pbutils", "html-escape", "iced_wgpu", - "libcosmic-yoda", + "libcosmic", "log", - "thiserror 2.0.18", + "thiserror 1.0.69", "url", ] [[package]] name = "iced_wgpu" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ - "bitflags 2.11.1", + "as-raw-xcb-connection", + "bitflags 2.11.0", "bytemuck", "cosmic-client-toolkit", "cryoglyph", @@ -2702,16 +2695,19 @@ dependencies = [ "rustc-hash 2.1.2", "rustix 0.38.44", "thiserror 2.0.18", + "tiny-xlib", "wayland-backend", "wayland-client", "wayland-protocols", "wayland-sys", "wgpu", + "x11rb", ] [[package]] name = "iced_widget" version = "0.14.2" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -2729,6 +2725,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "cosmic-client-toolkit", "cursor-icon", @@ -2759,28 +2756,40 @@ dependencies = [ [[package]] name = "icu_collator" -version = "2.2.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b521b92a2666061ddda902769d8a4cf730b5c9529a845cc1b69770b12a6c9a71" +checksum = "d370371887d31d56f361c3eaa15743e54f13bc677059c9191c77e099ed6966b2" dependencies = [ + "displaydoc", "icu_collator_data", - "icu_collections", - "icu_locale", - "icu_locale_core", - "icu_normalizer", - "icu_properties", - "icu_provider", + "icu_collections 1.5.0", + "icu_locid_transform", + "icu_normalizer 1.5.0", + "icu_properties 1.5.1", + "icu_provider 1.5.0", "smallvec", "utf16_iter", "utf8_iter", - "zerovec", + "zerovec 0.10.4", ] [[package]] name = "icu_collator_data" -version = "2.2.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038ed8e5817f2059c2f3efb0945ba78d060d3d25e8f1a1bea5139f821a21a2f0" +checksum = "7b353986d77d28991eca4dea5ef2b8982f639342ae19ca81edc44f048bc38ebb" + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] [[package]] name = "icu_collections" @@ -2791,24 +2800,9 @@ dependencies = [ "displaydoc", "potential_utf", "utf8_iter", - "yoke", + "yoke 0.8.2", "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5a396343c7208121dc86e35623d3dfe19814a7613cfd14964994cdc9c9a2e26" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_locale_data", - "icu_provider", - "potential_utf", - "tinystr", - "zerovec", + "zerovec 0.11.6", ] [[package]] @@ -2818,18 +2812,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", - "litemap", - "serde", - "tinystr", - "writeable", - "zerovec", + "litemap 0.8.2", + "tinystr 0.8.3", + "writeable 0.6.3", + "zerovec 0.11.6", ] [[package]] -name = "icu_locale_data" -version = "2.2.0" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap 0.7.5", + "tinystr 0.7.6", + "writeable 0.5.5", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider 1.5.0", + "tinystr 0.7.6", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections 1.5.0", + "icu_normalizer_data 1.5.1", + "icu_properties 1.5.1", + "icu_provider 1.5.0", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec 0.10.4", +] [[package]] name = "icu_normalizer" @@ -2837,43 +2875,84 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", + "icu_collections 2.2.0", + "icu_normalizer_data 2.2.0", + "icu_properties 2.2.0", + "icu_provider 2.2.0", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", + "zerovec 0.11.6", ] +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + [[package]] name = "icu_normalizer_data" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections 1.5.0", + "icu_locid_transform", + "icu_properties_data 1.5.1", + "icu_provider 1.5.0", + "tinystr 0.7.6", + "zerovec 0.10.4", +] + [[package]] name = "icu_properties" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ - "icu_collections", + "icu_collections 2.2.0", "icu_locale_core", - "icu_properties_data", - "icu_provider", + "icu_properties_data 2.2.0", + "icu_provider 2.2.0", "zerotrie", - "zerovec", + "zerovec 0.11.6", ] +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + [[package]] name = "icu_properties_data" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr 0.7.6", + "writeable 0.5.5", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + [[package]] name = "icu_provider" version = "2.2.0" @@ -2882,13 +2961,22 @@ checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", - "serde", - "stable_deref_trait", - "writeable", - "yoke", + "writeable 0.6.3", + "yoke 0.8.2", "zerofrom", "zerotrie", - "zerovec", + "zerovec 0.11.6", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -2916,12 +3004,30 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ - "icu_normalizer", - "icu_properties", + "icu_normalizer 2.2.0", + "icu_properties 2.2.0", +] + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "jpeg-decoder", + "num-traits", + "png 0.17.16", + "qoi", + "tiff", ] [[package]] @@ -2932,18 +3038,9 @@ checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ "bytemuck", "byteorder-lite", - "color_quant", - "exr", - "gif 0.14.2", - "image-webp", "moxcms", "num-traits", "png 0.18.1", - "qoi", - "ravif", - "rayon", - "rgb", - "tiff", "zune-core 0.5.1", "zune-jpeg 0.5.15", ] @@ -2964,17 +3061,11 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" -[[package]] -name = "imgref" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40fac9d56ed6437b198fddba683305e8e2d651aa42647f00f5ae542e7f5c94a2" - [[package]] name = "indexmap" -version = "2.11.4" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" dependencies = [ "equivalent", "hashbrown 0.16.1", @@ -2988,7 +3079,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "inotify-sys", "libc", ] @@ -3002,17 +3093,6 @@ dependencies = [ "libc", ] -[[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "intl-memoizer" version = "0.5.3" @@ -3033,10 +3113,15 @@ dependencies = [ ] [[package]] -name = "is_terminal_polyfill" -version = "1.70.2" +name = "is-terminal" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.61.2", +] [[package]] name = "itertools" @@ -3055,9 +3140,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.24" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d" +checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -3070,13 +3155,13 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.24" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7" +checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -3121,7 +3206,7 @@ dependencies = [ "quote", "rustc_version", "simd_cesu8", - "syn", + "syn 2.0.117", ] [[package]] @@ -3149,7 +3234,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -3163,10 +3248,19 @@ dependencies = [ ] [[package]] -name = "js-sys" -version = "0.3.98" +name = "jpeg-decoder" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" +dependencies = [ + "rayon", +] + +[[package]] +name = "js-sys" +version = "0.3.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" dependencies = [ "cfg-if", "futures-util", @@ -3189,7 +3283,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "serde", ] @@ -3231,23 +3325,14 @@ dependencies = [ [[package]] name = "kqueue-sys" -version = "1.1.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "285efcf12ef41bec907b3000d5ffaeb54191d4d9d83c0d6157e6cbc2db255e64" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" dependencies = [ - "bitflags 2.11.1", + "bitflags 1.3.2", "libc", ] -[[package]] -name = "kstring" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1" -dependencies = [ - "static_assertions", -] - [[package]] name = "kurbo" version = "0.10.4" @@ -3269,6 +3354,12 @@ dependencies = [ "smallvec", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "leb128fmt" version = "0.1.0" @@ -3283,13 +3374,14 @@ checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "libc" -version = "0.2.186" +version = "0.2.184" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" [[package]] -name = "libcosmic-yoda" -version = "0.1.0-yoda.2" +name = "libcosmic" +version = "1.0.0" +source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" dependencies = [ "apply", "ashpd 0.12.3", @@ -3303,8 +3395,8 @@ dependencies = [ "derive_setters", "float-cmp 0.10.0", "futures", - "i18n-embed", - "i18n-embed-fl", + "i18n-embed 0.16.0", + "i18n-embed-fl 0.10.0", "iced", "iced_core", "iced_futures", @@ -3314,7 +3406,7 @@ dependencies = [ "iced_wgpu", "iced_widget", "iced_winit", - "image", + "image 0.25.10", "jiff", "log", "palette", @@ -3329,17 +3421,7 @@ dependencies = [ "tracing", "unicode-segmentation", "url", - "zbus", -] - -[[package]] -name = "libfuzzer-sys" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" -dependencies = [ - "arbitrary", - "cc", + "zbus 5.14.0", ] [[package]] @@ -3360,14 +3442,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "libc", "plain", - "redox_syscall 0.7.5", + "redox_syscall 0.7.3", ] [[package]] @@ -3391,12 +3473,24 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +[[package]] +name = "linux-raw-sys" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" + [[package]] name = "linux-raw-sys" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + [[package]] name = "litemap" version = "0.8.2" @@ -3409,6 +3503,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" +[[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.14" @@ -3424,20 +3531,11 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] - [[package]] name = "lru" -version = "0.16.4" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" [[package]] name = "lyon" @@ -3451,9 +3549,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.20" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8575c0d003ae459399623c4def180c63b77f343b1a7fee64f249b349e7699a31" +checksum = "9815fac08e6fd96733a11dce4f9d15a3f338e96a2e2311ee21e1b738efc2bc0f" dependencies = [ "lyon_path", "num-traits", @@ -3500,16 +3598,6 @@ dependencies = [ "libc", ] -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - [[package]] name = "memchr" version = "2.8.0" @@ -3549,7 +3637,7 @@ version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block", "core-graphics-types 0.2.0", "foreign-types", @@ -3561,7 +3649,7 @@ dependencies = [ [[package]] name = "mime" version = "0.1.0" -source = "git+https://forge.aditua.com/leyoda/window_clipboard.git?branch=yoda-x11-optional#319db02e5219c557c8f03b0e33a8eb4075cabb85" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "smithay-clipboard", ] @@ -3600,15 +3688,15 @@ dependencies = [ [[package]] name = "mpris-server" -version = "0.10.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70cf358e9a9516cc35ed40eebd56cbe80f5190a7a2b3cd0c2d358c86b879132b" +checksum = "058bc2227727af394f34aa51da3e36aeecf2c808f39315d35f754872660750ae" dependencies = [ "async-channel", "futures-channel", "serde", "trait-variant", - "zbus", + "zbus 4.4.0", ] [[package]] @@ -3631,7 +3719,7 @@ checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.11.1", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -3655,7 +3743,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "jni-sys 0.3.1", "log", "ndk-sys", @@ -3680,42 +3768,25 @@ dependencies = [ ] [[package]] -name = "new_debug_unreachable" -version = "1.0.6" +name = "nix" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "no_std_io2" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "memchr", + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", ] -[[package]] -name = "nom" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" -dependencies = [ - "memchr", -] - -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - [[package]] name = "notify" version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "fsevent-sys", "inotify", "kqueue", @@ -3733,17 +3804,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.11.1", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", + "bitflags 2.11.0", ] [[package]] @@ -3752,17 +3813,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "num-integer" version = "0.1.46" @@ -3778,7 +3828,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "num-bigint", "num-integer", "num-traits", ] @@ -3812,7 +3861,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -3875,7 +3924,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -3891,7 +3940,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", @@ -3904,7 +3953,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -3916,7 +3965,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.6.2", "dispatch2", "objc2 0.6.4", @@ -3928,7 +3977,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "libc", "objc2-core-foundation", ] @@ -3951,7 +4000,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "objc2-core-foundation", "objc2-core-graphics", ] @@ -3968,7 +4017,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -3980,7 +4029,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", @@ -3992,7 +4041,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4004,7 +4053,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4017,7 +4066,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "objc2 0.6.4", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -4038,12 +4087,6 @@ version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" -[[package]] -name = "once_cell_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" - [[package]] name = "option-ext" version = "0.2.0" @@ -4052,18 +4095,18 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "option-operations" -version = "0.6.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aca39cf52b03268400c16eeb9b56382ea3c3353409309b63f5c8f0b1faf42754" +checksum = "7c26d27bb1aeab65138e4bf7666045169d1717febcc9ff870166be8348b223d0" dependencies = [ - "pastey 0.2.2", + "paste", ] [[package]] name = "orbclient" -version = "0.3.54" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a570f6bca41d29acb2139229a7c873ec99bc9a313bd10804081d89bfac8ff329" +checksum = "59aed3b33578edcfa1bc96a321d590d31832b6ad55a26f0313362ce687e9abd6" dependencies = [ "libc", "libredox", @@ -4109,7 +4152,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -4143,7 +4186,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -4181,18 +4224,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pastey" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" - -[[package]] -name = "pastey" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5a797f0e07bdf071d15742978fc3128ec6c22891c31a3a931513263904c982a" - [[package]] name = "percent-encoding" version = "2.3.2" @@ -4227,7 +4258,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared 0.11.3", - "rand 0.8.6", + "rand 0.8.5", ] [[package]] @@ -4250,7 +4281,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -4263,7 +4294,7 @@ dependencies = [ "phf_shared 0.13.1", "proc-macro2", "quote", - "syn", + "syn 2.0.117", "uncased", ] @@ -4294,22 +4325,22 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.12" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf0d9e68100b3a7989b4901972f265cd542e560a3a8a724e1e20322f4d06ce9" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.12" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a990e22f43e84855daf260dded30524ef4a9021cc7541c26540500a50b624389" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -4337,9 +4368,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.33" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plain" @@ -4366,7 +4397,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "crc32fast", "fdeflate", "flate2", @@ -4401,9 +4432,9 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.7" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" dependencies = [ "portable-atomic", ] @@ -4414,9 +4445,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ - "serde_core", - "writeable", - "zerovec", + "zerovec 0.11.6", ] [[package]] @@ -4447,7 +4476,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.117", ] [[package]] @@ -4459,6 +4488,30 @@ dependencies = [ "toml_edit", ] +[[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 1.0.109", + "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-macro-error-attr2" version = "2.0.0" @@ -4478,7 +4531,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -4498,35 +4551,22 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", "version_check", "yansi", ] [[package]] name = "profiling" -version = "1.0.18" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" -dependencies = [ - "quote", - "syn", -] +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" [[package]] name = "pxfm" -version = "0.1.29" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" +checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" [[package]] name = "qoi" @@ -4545,14 +4585,23 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.39.4" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" dependencies = [ "memchr", "serde", ] +[[package]] +name = "quick-xml" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.45" @@ -4576,23 +4625,35 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.6" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ + "libc", + "rand_chacha 0.3.1", "rand_core 0.6.4", ] [[package]] name = "rand" -version = "0.9.4" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "rand_chacha", + "rand_chacha 0.9.0", "rand_core 0.9.5", ] +[[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 0.6.4", +] + [[package]] name = "rand_chacha" version = "0.9.0" @@ -4608,6 +4669,9 @@ name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] [[package]] name = "rand_core" @@ -4630,56 +4694,6 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" -[[package]] -name = "rav1e" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" -dependencies = [ - "aligned-vec", - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av-scenechange", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "paste", - "profiling", - "rand 0.9.4", - "rand_chacha", - "simd_helpers", - "thiserror 2.0.18", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", -] - [[package]] name = "raw-window-handle" version = "0.6.2" @@ -4688,9 +4702,9 @@ checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "rayon" -version = "1.12.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -4723,16 +4737,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", ] [[package]] name = "redox_syscall" -version = "0.7.5" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4666a1a60d8412eab19d94f6d13dcc9cea0a5ef4fdf6a5db306537413c661b1b" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", ] [[package]] @@ -4787,7 +4801,7 @@ version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" dependencies = [ - "gif 0.13.3", + "gif", "image-webp", "log", "pico-args", @@ -4837,7 +4851,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4147b952f3f819eca0e99527022f7d6a8d05f111aeb0a62960c74eb283bec8fc" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "once_cell", "serde", "serde_derive", @@ -4871,7 +4885,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn", + "syn 2.0.117", "walkdir", ] @@ -4912,7 +4926,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -4925,7 +4939,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys 0.12.1", @@ -4944,7 +4958,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", "core_maths", "log", @@ -4990,6 +5004,15 @@ dependencies = [ "tiny-skia", ] +[[package]] +name = "self_cell" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915d" +dependencies = [ + "self_cell 1.2.2", +] + [[package]] name = "self_cell" version = "1.2.2" @@ -5029,7 +5052,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -5054,7 +5077,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -5066,6 +5089,17 @@ dependencies = [ "serde_core", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.9" @@ -5109,15 +5143,6 @@ dependencies = [ "simdutf8", ] -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - [[package]] name = "simdutf8" version = "0.1.5" @@ -5135,9 +5160,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "skrifa" @@ -5176,7 +5201,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", "calloop", "calloop-wayland-source", @@ -5234,12 +5259,14 @@ dependencies = [ [[package]] name = "softbuffer" version = "0.4.1" -source = "git+https://github.com/pop-os/softbuffer?tag=cosmic-4.0#c2b2c19ddb38ff17495643699f97cb1f2064a1be" +source = "git+https://github.com/pop-os/softbuffer?tag=cosmic-4.0#a3f77e251e7422803f693df6e3fc313c010c4dcb" dependencies = [ + "as-raw-xcb-connection", "bytemuck", "cfg_aliases", "cocoa", "core-graphics", + "drm", "fastrand", "foreign-types", "js-sys", @@ -5249,12 +5276,14 @@ dependencies = [ "raw-window-handle", "redox_syscall 0.5.18", "rustix 0.38.44", + "tiny-xlib", "wasm-bindgen", "wayland-backend", "wayland-client", "wayland-sys", "web-sys", "windows-sys 0.52.0", + "x11rb", ] [[package]] @@ -5263,7 +5292,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", ] [[package]] @@ -5287,6 +5316,12 @@ dependencies = [ "float-cmp 0.9.0", ] +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strsim" version = "0.11.1" @@ -5320,6 +5355,16 @@ dependencies = [ "zeno", ] +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.117" @@ -5339,7 +5384,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -5360,7 +5405,7 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 1.1.0+spec-1.1.0", + "toml 1.1.2+spec-1.1.0", "version-compare", ] @@ -5430,7 +5475,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -5441,21 +5486,18 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] name = "tiff" -version = "0.11.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ - "fax", "flate2", - "half", - "quick-error", + "jpeg-decoder", "weezl", - "zune-jpeg 0.5.15", ] [[package]] @@ -5517,6 +5559,29 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tiny-xlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" +dependencies = [ + "as-raw-xcb-connection", + "ctor-lite", + "libloading", + "pkg-config", + "tracing", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec 0.10.4", +] + [[package]] name = "tinystr" version = "0.8.3" @@ -5525,7 +5590,7 @@ checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "serde_core", - "zerovec", + "zerovec 0.11.6", ] [[package]] @@ -5545,9 +5610,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.3" +version = "1.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" dependencies = [ "bytes", "libc", @@ -5568,7 +5633,7 @@ checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -5593,9 +5658,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.1.0+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8195ca05e4eb728f4ba94f3e3291661320af739c4e43779cbdfae82ab239fcc" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" dependencies = [ "indexmap", "serde_core", @@ -5603,7 +5668,7 @@ dependencies = [ "toml_datetime", "toml_parser", "toml_writer", - "winnow", + "winnow 1.0.1", ] [[package]] @@ -5617,14 +5682,14 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.6+spec-1.1.0" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0db3bae107c9522f86d361697dee1d7386a2ddcf659d5aea5159819a21a3c4a7" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ "indexmap", "toml_datetime", "toml_parser", - "winnow", + "winnow 1.0.1", ] [[package]] @@ -5633,7 +5698,7 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow", + "winnow 1.0.1", ] [[package]] @@ -5662,7 +5727,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -5682,7 +5747,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -5711,9 +5776,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.20.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "uds_windows" @@ -5751,7 +5816,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dce1bf08044d4b7a94028c93786f8566047edc11110595914de93362559bc658" dependencies = [ "serde", - "tinystr", + "tinystr 0.8.3", ] [[package]] @@ -5884,34 +5949,17 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - [[package]] name = "uuid" -version = "1.23.1" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" dependencies = [ "js-sys", "serde_core", "wasm-bindgen", ] -[[package]] -name = "v_frame" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - [[package]] name = "vergen" version = "8.3.2" @@ -5954,11 +6002,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.3+wasi-0.2.9" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ - "wit-bindgen 0.57.1", + "wit-bindgen", ] [[package]] @@ -5967,14 +6015,14 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.121" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" dependencies = [ "cfg-if", "once_cell", @@ -5985,9 +6033,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.71" +version = "0.4.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" +checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" dependencies = [ "js-sys", "wasm-bindgen", @@ -5995,9 +6043,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.121" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6005,22 +6053,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.121" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.121" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" dependencies = [ "unicode-ident", ] @@ -6053,7 +6101,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "hashbrown 0.15.5", "indexmap", "semver", @@ -6093,7 +6141,7 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "rustix 1.1.4", "wayland-backend", "wayland-scanner", @@ -6105,7 +6153,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cursor-icon", "wayland-backend", ] @@ -6127,7 +6175,7 @@ version = "0.32.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -6140,7 +6188,7 @@ version = "20250721.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6153,7 +6201,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6166,7 +6214,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6179,7 +6227,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6194,7 +6242,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" dependencies = [ "proc-macro2", - "quick-xml", + "quick-xml 0.39.2", "quote", ] @@ -6204,7 +6252,7 @@ version = "0.31.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc1846eb04c49182e04f4a099e2a830a2b745610bbc1d61246e206f29c7000a0" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "downcast-rs", "rustix 1.1.4", "wayland-backend", @@ -6225,9 +6273,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.98" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" +checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" dependencies = [ "js-sys", "wasm-bindgen", @@ -6256,7 +6304,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", - "bitflags 2.11.1", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "document-features", @@ -6287,7 +6335,7 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", "cfg_aliases", "document-features", @@ -6347,7 +6395,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.11.1", + "bitflags 2.11.0", "block", "bytemuck", "cfg-if", @@ -6392,7 +6440,7 @@ version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "bytemuck", "js-sys", "log", @@ -6434,11 +6482,12 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window_clipboard" version = "0.4.1" -source = "git+https://forge.aditua.com/leyoda/window_clipboard.git?branch=yoda-x11-optional#319db02e5219c557c8f03b0e33a8eb4075cabb85" +source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ "clipboard-win", "clipboard_macos", "clipboard_wayland", + "clipboard_x11", "dnd", "mime", "raw-window-handle", @@ -6522,7 +6571,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -6533,7 +6582,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -6544,7 +6593,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -6555,7 +6604,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -6860,9 +6909,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cfg_aliases", "cursor-icon", "dpi", @@ -6880,15 +6929,16 @@ dependencies = [ "winit-wayland", "winit-web", "winit-win32", + "winit-x11", ] [[package]] name = "winit-android" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ "android-activity", - "bitflags 2.11.1", + "bitflags 2.11.0", "dpi", "ndk", "raw-window-handle", @@ -6900,9 +6950,9 @@ dependencies = [ [[package]] name = "winit-appkit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.6.2", "dispatch2", "dpi", @@ -6922,7 +6972,7 @@ dependencies = [ [[package]] name = "winit-common" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ "memmap2 0.9.10", "objc2 0.6.4", @@ -6930,15 +6980,16 @@ dependencies = [ "smol_str", "tracing", "winit-core", + "x11-dl", "xkbcommon-dl", ] [[package]] name = "winit-core" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cursor-icon", "dpi", "keyboard-types", @@ -6950,14 +7001,14 @@ dependencies = [ [[package]] name = "winit-orbital" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "dpi", "libredox", "orbclient", "raw-window-handle", - "redox_syscall 0.7.5", + "redox_syscall 0.7.3", "smol_str", "tracing", "winit-core", @@ -6966,9 +7017,9 @@ dependencies = [ [[package]] name = "winit-uikit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "block2 0.6.2", "dispatch2", "dpi", @@ -6986,10 +7037,10 @@ dependencies = [ [[package]] name = "winit-wayland" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ "ahash", - "bitflags 2.11.1", + "bitflags 2.11.0", "calloop", "cursor-icon", "dpi", @@ -7012,10 +7063,10 @@ dependencies = [ [[package]] name = "winit-web" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ "atomic-waker", - "bitflags 2.11.1", + "bitflags 2.11.0", "concurrent-queue", "cursor-icon", "dpi", @@ -7034,9 +7085,9 @@ dependencies = [ [[package]] name = "winit-win32" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "cursor-icon", "dpi", "raw-window-handle", @@ -7047,11 +7098,43 @@ dependencies = [ "winit-core", ] +[[package]] +name = "winit-x11" +version = "0.31.0-beta.2" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +dependencies = [ + "bitflags 2.11.0", + "bytemuck", + "calloop", + "cursor-icon", + "dpi", + "libc", + "percent-encoding", + "raw-window-handle", + "rustix 1.1.4", + "smol_str", + "tracing", + "winit-common", + "winit-core", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + [[package]] name = "winnow" -version = "1.0.2" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" dependencies = [ "memchr", ] @@ -7065,12 +7148,6 @@ dependencies = [ "wit-bindgen-rust-macro", ] -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -7092,7 +7169,7 @@ dependencies = [ "heck 0.5.0", "indexmap", "prettyplease", - "syn", + "syn 2.0.117", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -7108,7 +7185,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn", + "syn 2.0.117", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -7120,7 +7197,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.1", + "bitflags 2.11.0", "indexmap", "log", "serde", @@ -7156,12 +7233,51 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "writeable" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.4", + "x11rb-protocol", + "xcursor", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + [[package]] name = "xcursor" version = "0.3.10" @@ -7175,15 +7291,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fb433233f2df9344722454bc7e96465c9d03bff9d77c248f9e7523fe79585b5" [[package]] -name = "xdgen" -version = "0.1.0" +name = "xdg-home" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25af88f104f06d5aeb80c77e5eb85e6f6f355f86f6e34307a14befd716efe4bf" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" dependencies = [ - "fluent", - "freedesktop_entry_parser", - "unic-langid", - "xmltree", + "libc", + "windows-sys 0.59.0", ] [[package]] @@ -7214,7 +7328,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.11.0", "dlib", "log", "once_cell", @@ -7230,39 +7344,18 @@ dependencies = [ "bytemuck", ] -[[package]] -name = "xml" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "636f85e5ca6488e96401b61eb7de54f4e44755c988af0f52cf90230c312a1a89" - [[package]] name = "xml-rs" version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" -[[package]] -name = "xmltree" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc04313cab124e498ab1724e739720807b6dc405b9ed0edc5860164d2e4ff70" -dependencies = [ - "xml", -] - [[package]] name = "xmlwriter" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" -[[package]] -name = "y4m" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" - [[package]] name = "yansi" version = "1.0.1" @@ -7275,6 +7368,18 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive 0.7.5", + "zerofrom", +] + [[package]] name = "yoke" version = "0.8.2" @@ -7282,10 +7387,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", - "yoke-derive", + "yoke-derive 0.8.2", "zerofrom", ] +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + [[package]] name = "yoke-derive" version = "0.8.2" @@ -7294,15 +7411,53 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", "synstructure", ] [[package]] name = "zbus" -version = "5.15.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bcbf15c8708d7fc1be0c993622e0a5cbd5e8b52bfa40afa4c3e0cd8d724ac1" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix", + "ordered-stream", + "rand 0.8.5", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "windows-sys 0.52.0", + "xdg-home", + "zbus_macros 4.4.0", + "zbus_names 3.0.0", + "zvariant 4.2.0", +] + +[[package]] +name = "zbus" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" dependencies = [ "async-broadcast", "async-executor", @@ -7328,10 +7483,10 @@ dependencies = [ "uds_windows", "uuid", "windows-sys 0.61.2", - "winnow", - "zbus_macros", - "zbus_names", - "zvariant", + "winnow 0.7.15", + "zbus_macros 5.14.0", + "zbus_names 4.3.1", + "zvariant 5.10.0", ] [[package]] @@ -7341,7 +7496,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6998de05217a084b7578728a9443d04ea4cd80f2a0839b8d78770b76ccd45863" dependencies = [ "zbus_xml", - "zvariant", + "zvariant 5.10.0", ] [[package]] @@ -7352,48 +7507,72 @@ checksum = "10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", "zbus-lockstep", "zbus_xml", - "zvariant", + "zvariant 5.10.0", ] [[package]] name = "zbus_macros" -version = "5.15.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51fa5406ad9175a8c825a931f8cf347116b531b3634fcb0b627c290f1f2516ff" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", - "zbus_names", - "zvariant", - "zvariant_utils", + "syn 2.0.117", + "zvariant_utils 2.1.0", +] + +[[package]] +name = "zbus_macros" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names 4.3.1", + "zvariant 5.10.0", + "zvariant_utils 3.3.0", ] [[package]] name = "zbus_names" -version = "4.3.2" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" dependencies = [ "serde", - "winnow", - "zvariant", + "static_assertions", + "zvariant 4.2.0", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow 0.7.15", + "zvariant 5.10.0", ] [[package]] name = "zbus_xml" -version = "5.1.1" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8067892e940ed1727dea64690378601603b31d62dfde019a5335fbb7c0e0ed9" +checksum = "441a0064125265655bccc3a6af6bef56814d9277ac83fce48b1cd7e160b80eac" dependencies = [ - "quick-xml", + "quick-xml 0.38.4", "serde", - "zbus_names", - "zvariant", + "zbus_names 4.3.1", + "zvariant 5.10.0", ] [[package]] @@ -7419,14 +7598,14 @@ checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] name = "zerofrom" -version = "0.1.8" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] @@ -7439,7 +7618,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", "synstructure", ] @@ -7450,9 +7629,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", - "yoke", + "yoke 0.8.2", "zerofrom", - "zerovec", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke 0.7.5", + "zerofrom", + "zerovec-derive 0.10.3", ] [[package]] @@ -7462,9 +7651,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "serde", - "yoke", + "yoke 0.8.2", "zerofrom", - "zerovec-derive", + "zerovec-derive 0.11.3", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -7475,7 +7675,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -7525,41 +7725,78 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.11.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c1567a6ec68df868cbbfde844cfc6d81649fe5109a62b116b19fabd53e618ee" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "zvariant_derive 4.2.0", +] + +[[package]] +name = "zvariant" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" dependencies = [ "endi", "enumflags2", "serde", "url", - "winnow", - "zvariant_derive", - "zvariant_utils", + "winnow 0.7.15", + "zvariant_derive 5.10.0", + "zvariant_utils 3.3.0", ] [[package]] name = "zvariant_derive" -version = "5.11.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d5b780599bbde114e39d9a0799577fad1ced5105d38515745f7b3099d8ceda" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", - "zvariant_utils", + "syn 2.0.117", + "zvariant_utils 2.1.0", +] + +[[package]] +name = "zvariant_derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils 3.3.0", ] [[package]] name = "zvariant_utils" -version = "3.3.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d464f5733ffa07a3164d656f18533caace9d0638596721355d73256a410d691" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" dependencies = [ "proc-macro2", "quote", "serde", - "syn", - "winnow", + "syn 2.0.117", + "winnow 0.7.15", ] diff --git a/Cargo.toml b/Cargo.toml index d55a60a..a31ad32 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,59 +1,56 @@ [package] name = "cosmic-player" -version = "1.0.13" +version = "1.0.9" edition = "2024" -rust-version = "1.93" [build-dependencies] vergen = { version = "8", features = ["git", "gitcl"] } -xdgen = "0.1" [dependencies] ashpd = { version = "0.12", optional = true } -gstreamer-tag = "0.25" -image = "0.25" +gstreamer-tag = "0.23" +image = "0.24.9" serde = { version = "1", features = ["serde_derive"] } tempfile = "3" tokio = { version = "1", features = ["sync"] } url = { version = "2", features = ["serde"] } # CLI arguments -clap_lex = "1.1" +clap_lex = "0.7" # Internationalization -icu_collator = "2.2" -icu_locale = "2.2" -i18n-embed = { version = "0.16", features = [ +icu_collator = "1.5" +icu_provider = { version = "1.5", features = ["sync"] } +i18n-embed = { version = "0.14", features = [ "fluent-system", "desktop-requester", ] } -i18n-embed-fl = "0.10" +i18n-embed-fl = "0.7" rust-embed = "8" # Logging -env_logger = "0.11" +env_logger = "0.10" log = "0.4" [dependencies.iced_video_player] -path = "vendor/iced_video_player" +git = "https://github.com/wash2/iced_video_player.git" +branch = "iced-rebase" default-features = false -[dependencies.cosmic] -package = "libcosmic-yoda" -path = "../libcosmic" +[dependencies.libcosmic] +git = "https://github.com/pop-os/libcosmic.git" default-features = false features = ["advanced-shaping", "tokio", "winit", "multi-window"] [dependencies.mpris-server] -version = "0.10" -features = ["tokio"] +version = "0.8.1" optional = true [target.'cfg(unix)'.dependencies] -fork = "0.7" +fork = "0.2" [features] default = ["mpris-server", "xdg-portal", "wgpu", "wayland"] -xdg-portal = ["ashpd", "cosmic/xdg-portal"] -wgpu = ["iced_video_player/wgpu", "cosmic/wgpu"] -wayland = ["cosmic/wayland"] +xdg-portal = ["ashpd", "libcosmic/xdg-portal"] +wgpu = ["iced_video_player/wgpu", "libcosmic/wgpu"] +wayland = ["libcosmic/wayland"] [profile.release-with-debug] inherits = "release" @@ -62,6 +59,10 @@ debug = true # [patch.'https://github.com/wash2/iced_video_player'] # iced_video_player = { path = "../iced_video_player" } +# [patch.'https://github.com/pop-os/libcosmic'] +# libcosmic = { path = "../libcosmic" } +# cosmic-config = { path = "../libcosmic/cosmic-config" } +# cosmic-theme = { path = "../libcosmic/cosmic-theme" } # libcosmic = { git = "https://github.com/pop-os/libcosmic//", branch = "iced-rebase" } # cosmic-config = { git = "https://github.com/pop-os/libcosmic//", branch = "iced-rebase" } # cosmic-theme = { git = "https://github.com/pop-os/libcosmic//", branch = "iced-rebase" } diff --git a/README.md b/README.md index f145524..0c2c300 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,2 @@ # cosmic-player WIP COSMIC media player - -## Yoda local fork notes - -This fork is used for the local COSMIC desktop build. - -Local integration changes: - -- `cosmic-player` depends on the local `libcosmic-yoda` crate from `../libcosmic` - instead of upstream `pop-os/libcosmic`. -- `iced_video_player` is vendored in `vendor/iced_video_player` so it uses the - same local `libcosmic-yoda` and `iced_wgpu` stack. This avoids mixing upstream - and local Iced/libcosmic types. -- The app now runs `App::close()` before application exit and before the Quit - menu action exits the runtime. This lets the GStreamer pipeline be dropped - normally instead of short-circuiting through `process::exit(0)`. -- Thumbnail generation has a bounded wait for video frames. Some files/codecs can - fail to produce a frame; the thumbnailer now returns an error instead of - spinning forever as a background `cosmic-player --thumbnail ...` process. - -Validation commands: - -```bash -cargo +1.93.0 check -cargo +1.93.0 tree -i libcosmic-yoda --depth 2 -cargo +1.93.0 tree -i libcosmic --depth 2 || true -``` - -Local redeploy: - -```bash -COSMIC_PLAYER_REPO=/home/lionel/Projets/COSMIC/cosmic-player ./redeploy.sh -``` diff --git a/build.rs b/build.rs index c354dda..bc2427f 100644 --- a/build.rs +++ b/build.rs @@ -1,27 +1,5 @@ use vergen::EmitBuilder; -use std::{env, fs, path::PathBuf}; -use xdgen::{App, Context, FluentString}; fn main() { EmitBuilder::builder().git_sha(true).emit().unwrap(); - - let id = "com.system76.CosmicPlayer"; - let ctx = Context::new("i18n", env::var("CARGO_PKG_NAME").unwrap()).unwrap(); - let app = App::new(FluentString("xdg-name")) - .comment(FluentString("xdg-comment")) - .keywords(FluentString("xdg-keywords")); - let output = PathBuf::from("target/xdgen"); - fs::create_dir_all(&output).unwrap(); - fs::write( - output.join(format!("{}.desktop", id)), - app.expand_desktop(format!("res/{}.desktop", id), &ctx) - .unwrap(), - ) - .unwrap(); - fs::write( - output.join(format!("{}.metainfo.xml", id)), - app.expand_metainfo(format!("res/{}.metainfo.xml", id), &ctx) - .unwrap(), - ) - .unwrap(); } diff --git a/debian/changelog b/debian/changelog index 281fb04..535b2b7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,21 +1,3 @@ -cosmic-player (1.0.13) noble; urgency=medium - - * Epoch 1.0.13 version update - - -- Jeremy Soller Tue, 12 May 2026 09:39:28 -0600 - -cosmic-player (1.0.12) noble; urgency=medium - - * Epoch 1.0.12 version update - - -- Jeremy Soller Tue, 05 May 2026 10:24:29 -0600 - -cosmic-player (1.0.11) noble; urgency=medium - - * Epoch 1.0.11 version update - - -- Jeremy Soller Tue, 14 Apr 2026 11:09:58 -0600 - cosmic-player (1.0.9) noble; urgency=medium * Epoch 1.0.9 version update diff --git a/i18n/ar/cosmic_player.ftl b/i18n/ar/cosmic_player.ftl index 39055e0..ca67b60 100644 --- a/i18n/ar/cosmic_player.ftl +++ b/i18n/ar/cosmic_player.ftl @@ -1,9 +1,9 @@ album = ألبوم: { $album } audio = الصوت no-video-or-audio-file-open = لا يوجد ملف فيديو أو صوت مفتوح -open-file = افتح ملف -open-folder = افتح مجلَّد -subtitles = الترجمة المرئية +open-file = افتح ملفًا +open-folder = افتح مجلد +subtitles = الترجمة unknown-author = مؤلف مجهول untitled = بلا عنوان @@ -31,24 +31,11 @@ file = ملف open-media = افتح الوسائط... open-recent-media = افتح الوسائط الحديثة close-file = أغلِق الملف -open-media-folder = افتح مجلَّد الوسائط... -open-recent-media-folder = افتح مجلِّد الوسائط الحديثة +open-media-folder = فتح مجلد الوسائط... +open-recent-media-folder = فتح مجلد الوسائط الحديثة close-media-folder = أغلِق مجلد الوسائط quit = أنهِ off = معطّل clear-recent = امحُ القائمة الحديثة repeat-disabled = التكرار مُعطَّل repeat-track = كرِّر المقطع -playback = التشغيل -next-frame = الإطار التالي -previous-frame = الإطار السابق -ab-repeat = تكرار A-B -ab-repeat-set-a = تكرار A-B (A) -ab-repeat-set-b = تكرار A-B (B) -ab-repeat-clear = امحُ تكرار A-B - -# XDG Metadata - -xdg-name = مشغّل وسائط COSMIC -xdg-comment = مشغّل وسائط لسطح مكتب COSMIC -xdg-keywords = فيلم;مقطع;فيديو;صوت diff --git a/i18n/ca/cosmic_player.ftl b/i18n/ca/cosmic_player.ftl index e55859b..e69de29 100644 --- a/i18n/ca/cosmic_player.ftl +++ b/i18n/ca/cosmic_player.ftl @@ -1,2 +0,0 @@ -quit = Surt -settings = Configuració diff --git a/i18n/cs/cosmic_player.ftl b/i18n/cs/cosmic_player.ftl index dd74821..698f32e 100644 --- a/i18n/cs/cosmic_player.ftl +++ b/i18n/cs/cosmic_player.ftl @@ -22,18 +22,5 @@ close-media-folder = Zavřít složku s médii quit = Ukončit off = Vypnuto clear-recent = Vymazat seznam nedávných -repeat-track = Opakovat stopu -repeat-disabled = Opakování vypnuto -playback = Přehrávání -next-frame = Další snímek -previous-frame = Předchozí snímek -ab-repeat = Opakování A-B -ab-repeat-set-a = Opakování A-B (A) -ab-repeat-set-b = Opakování A-B (B) -ab-repeat-clear = Vymazat opakování A-B - -# XDG Metadata - -xdg-name = Přehrávač médií COSMIC -xdg-comment = Přehrávač médií pro prostředí COSMIC -xdg-keywords = Audio;Film;Hudba;Zvuk;Video; +repeat-track = Opakovat skladbu +repeat-disabled = Opakování zakázáno diff --git a/i18n/de/cosmic_player.ftl b/i18n/de/cosmic_player.ftl index 76b4d63..5f20fed 100644 --- a/i18n/de/cosmic_player.ftl +++ b/i18n/de/cosmic_player.ftl @@ -29,7 +29,7 @@ light = Hell file = Datei open-media = Medium öffnen... -open-recent-media = Zuletzt verwendetes Medium öffnen +open-recent-media = Zuletzt verwendete Medien öffnen close-file = Datei schließen open-media-folder = Medienordner öffnen... open-recent-media-folder = Ordner der zuletzt verwendeten Medien öffnen @@ -38,14 +38,3 @@ quit = Beenden off = Aus repeat-disabled = Wiederholung deaktiviert repeat-track = Titel wiederholen -clear-recent = Liste zuletzt genutzter Einträge leeren -playback = Wiedergabe -next-frame = Nächstes Einzelbild -previous-frame = Vorheriges Einzelbild -ab-repeat = A-B-Wiederholung -ab-repeat-set-a = A-B-Wiederholung (A) -ab-repeat-set-b = A-B-Wiederholung (B) -ab-repeat-clear = A-B-Wiederholung löschen -xdg-keywords = Audio;Film;Musik;Ton;Video; -xdg-name = COSMIC Mediaplayer -xdg-comment = Mediaplayer für den COSMIC-Desktop diff --git a/i18n/el/cosmic_player.ftl b/i18n/el/cosmic_player.ftl index a0780b8..19b085c 100644 --- a/i18n/el/cosmic_player.ftl +++ b/i18n/el/cosmic_player.ftl @@ -1,36 +1,2 @@ -dark = Σκουρόχρωμο -light = Ανοιχτόχρωμο -file = Αρχείο -open-file = Άνοιγμα αρχείου -open-folder = Άνοιγμα φακέλου -settings = Ρυθμίσεις -close-file = Κλείσιμο αρχείου -subtitles = Υπότιτλοι -untitled = Χωρίς τίτλο -theme = Θέμα -repeat-track = Επανάληψη κομματιού -appearance = Εμφάνιση -quit = Έξοδος -album = Άλμπουμ: { $album } -playback = Αναπαραγωγή -next-frame = Επόμενο καρέ -previous-frame = Προηγούμενο καρέ -ab-repeat = Επανάληψη Α-Β -ab-repeat-set-a = Επανάληψη Α-Β (Α) -ab-repeat-set-b = Επανάληψη A-B (B) -open-media = Άνοιγμα πολυμέσων... -open-media-folder = Άνοιγμα φακέλου πολυμέσων... -unknown-author = Άγνωστος δημιουργός -match-desktop = Συμφωνία με την επιφάνεια εργασίας -close-media-folder = Κλείσιμο φακέλου πολυμέσων -repeat-disabled = Επανάληψη απενεργοποιημένη -audio = Κομμάτι ήχου -off = Ανενεργό -open-recent-media = Άνοιγμα πρόσφατων πολυμέσων -clear-recent = Απαλοιφή λίστας πρόσφατων -no-video-or-audio-file-open = Κανένα ανοικτό αρχείο βίντεο ή ήχου -open-recent-media-folder = Άνοιγμα φακέλου πρόσφατων πολυμέσων -ab-repeat-clear = Απαλοιφή επανάληψης Α-Β -xdg-name = Αναπαραγωγή πολυμέσων COSMIC -xdg-keywords = Ήχος;Ταινία;Μουσική;Τραγούδι;Βίντεο;Πολυμέσα;Audio;Film;Movie;Music;Sound;Video; -xdg-comment = Πρόγραμμα αναπαραγωγής πολυμέσων για το περιβάλλον επιφάνειας εργασίας COSMIC +dark = Σκοτεινό +light = Φωτεινό diff --git a/i18n/en/cosmic_player.ftl b/i18n/en/cosmic_player.ftl index 36cb2b2..505e312 100644 --- a/i18n/en/cosmic_player.ftl +++ b/i18n/en/cosmic_player.ftl @@ -45,9 +45,3 @@ ab-repeat = A-B Repeat ab-repeat-set-a = A-B Repeat (A) ab-repeat-set-b = A-B Repeat (B) ab-repeat-clear = Clear A-B Repeat - -# XDG Metadata - -xdg-name = COSMIC Media Player -xdg-comment = Media player for the COSMIC desktop -xdg-keywords = Audio;Film;Movie;Music;Sound;Video; diff --git a/i18n/es/cosmic_player.ftl b/i18n/es/cosmic_player.ftl index 3c96c7a..8171fb7 100644 --- a/i18n/es/cosmic_player.ftl +++ b/i18n/es/cosmic_player.ftl @@ -36,9 +36,3 @@ open-recent-media-folder = Abrir carpetas multimedia recientes close-media-folder = Cerrar carpeta multimedia quit = Salir off = Apagado - -# XDG Metadata - -xdg-name = Reproductor de medios COSMIC -xdg-comment = Reproductor de medios para el escritorio COSMIC -xdg-keywords = Audio;Película;Música;Vídeo;Sonido;Reproductor; diff --git a/i18n/eu/cosmic_player.ftl b/i18n/eu/cosmic_player.ftl deleted file mode 100644 index e69de29..0000000 diff --git a/i18n/fi/cosmic_player.ftl b/i18n/fi/cosmic_player.ftl index 8fc0bfd..2787675 100644 --- a/i18n/fi/cosmic_player.ftl +++ b/i18n/fi/cosmic_player.ftl @@ -11,7 +11,7 @@ unknown-author = Tuntematon tekijä untitled = Nimetön appearance = Ulkoasu theme = Teema -match-desktop = Sovita työpöytään +match-desktop = Sovita työpöydän kanssa dark = Tumma light = Vaalea file = Tiedosto @@ -24,13 +24,3 @@ open-media = Avaa media... open-recent-media = Avaa viimeaikainen media repeat-disabled = Kertaus pois käytöstä repeat-track = Kertaa kappale -playback = Toisto -next-frame = Seuraava kehys -previous-frame = Edellinen kehys -ab-repeat = A-B-kertaus -ab-repeat-set-a = A-B-kertaus (A) -ab-repeat-set-b = A-B-kertaus (B) -ab-repeat-clear = Tyhjennä A-B-kertaus -xdg-name = COSMICin mediasoitin -xdg-comment = Mediasoitin COSMIC-työpöydälle -xdg-keywords = Audio;Film;Movie;Music;Sound;Video;ääni;filmi;leffa;elokuva;musiikki; diff --git a/i18n/fr/cosmic_player.ftl b/i18n/fr/cosmic_player.ftl index cb796bb..1df3100 100644 --- a/i18n/fr/cosmic_player.ftl +++ b/i18n/fr/cosmic_player.ftl @@ -39,13 +39,3 @@ off = Désactivé clear-recent = Effacer la liste récente repeat-disabled = Répétition désactivée repeat-track = Répéter la piste -playback = Lecture -next-frame = Prochaine image -previous-frame = Image précédente -ab-repeat = Répétition A-B -ab-repeat-set-a = Répétition A-B (A) -ab-repeat-set-b = Répétition A-B (B) -ab-repeat-clear = Effacer la répétition A-B -xdg-name = Lecteur Multimédia COSMIC -xdg-comment = Lecteur Multimédia pour le bureau COSMIC -xdg-keywords = Audio;Film;Musique;Son;Vidéo; diff --git a/i18n/ga/cosmic_player.ftl b/i18n/ga/cosmic_player.ftl index e98e2a9..ee13806 100644 --- a/i18n/ga/cosmic_player.ftl +++ b/i18n/ga/cosmic_player.ftl @@ -39,10 +39,3 @@ off = As clear-recent = Glan an liosta le déanaí repeat-disabled = Athsheinm múchta repeat-track = Athsheinm an riain -playback = Athsheinm -next-frame = An chéad fráma eile -previous-frame = An fráma roimhe seo -ab-repeat = Athsheinm A-B -ab-repeat-set-a = Athsheinm A-B (A) -ab-repeat-set-b = Athsheinm A-B (B) -ab-repeat-clear = Glan Athsheinm A-B diff --git a/i18n/hu/cosmic_player.ftl b/i18n/hu/cosmic_player.ftl index 46d70ad..fa22b0f 100644 --- a/i18n/hu/cosmic_player.ftl +++ b/i18n/hu/cosmic_player.ftl @@ -39,16 +39,3 @@ off = Ki clear-recent = Legutóbbiak listájának törlése repeat-disabled = Ismétlés letiltva repeat-track = Szám ismétlése -playback = Lejátszás -next-frame = Következő képkocka -previous-frame = Előző képkocka -ab-repeat = A–B ismétlés -ab-repeat-set-a = A–B ismétlés (A) -ab-repeat-set-b = A–B ismétlés (B) -ab-repeat-clear = A–B ismétlés törlése - -# XDG Metadata - -xdg-name = COSMIC Médialejátszó -xdg-comment = Médialejátszó a COSMIC asztali környezethez -xdg-keywords = hang;film;zene;videó;média;lejátszó; diff --git a/i18n/id/cosmic_player.ftl b/i18n/id/cosmic_player.ftl index 160a5dd..2dd1d85 100644 --- a/i18n/id/cosmic_player.ftl +++ b/i18n/id/cosmic_player.ftl @@ -24,10 +24,3 @@ close-media-folder = Tutup map media clear-recent = Hapus daftar terbaru repeat-track = Ulangi trek repeat-disabled = Pengulangan dinonaktifkan -ab-repeat-clear = Bersihkan Pengulangan A-B -ab-repeat-set-b = Pengulangan A-B (B) -ab-repeat-set-a = Pengulangan A-B (A) -ab-repeat = Pengulangan A-B -playback = Pemutaran -next-frame = Bagian Selanjutnya -previous-frame = Bagian Sebelumnya diff --git a/i18n/it/cosmic_player.ftl b/i18n/it/cosmic_player.ftl index 075134d..25575b2 100644 --- a/i18n/it/cosmic_player.ftl +++ b/i18n/it/cosmic_player.ftl @@ -36,9 +36,3 @@ open-recent-media-folder = Apri cartella multimediale recente close-media-folder = Chiudi cartella multimediale quit = Esci off = Off - -# XDG Metadata - -xdg-name = COSMIC Media Player -xdg-comment = Lettore multimediale di COSMIC -xdg-keywords = Audio;Video;Musica;Film;Suoni;Riproduzione; diff --git a/i18n/kab/cosmic_player.ftl b/i18n/kab/cosmic_player.ftl index 28347ef..e69de29 100644 --- a/i18n/kab/cosmic_player.ftl +++ b/i18n/kab/cosmic_player.ftl @@ -1,33 +0,0 @@ -open-file = Ldi afaylu -open-folder = Ldi akaram -repeat-disabled = Allus yensa -repeat-track = Ales tazribt -quit = Tuffɣa -settings = Iɣewwaṛen -appearance = Timeẓri -theme = Asentel -dark = Aɣmayan -light = Aceɛlal -match-desktop = Amṣada d tnarit -file = Afaylu -close-file = Mdel afaylu -album = Album: { $album } -audio = Ameslaw -no-video-or-audio-file-open = Ulac afaylu n uvidyu neɣ n umeslaw yeldin -off = Sens -subtitles = Iduzwilen -unknown-author = Ameskar arussin -untitled = War azwel -open-media = Ldi amidya... -open-recent-media = Ldi amidya n melmi kan -clear-recent = Sfeḍ tabdart n melmi kan -open-media-folder = Ldi akaram n umidya... -open-recent-media-folder = Ldi akaram umidya n melmi kan -close-media-folder = Mdel akaram n umidya -playback = Taɣuri -next-frame = Akatar uḍfir -previous-frame = Akatar yezrin -ab-repeat = Allus A-B -ab-repeat-set-a = Allus A-B (A) -ab-repeat-set-b = Allus A-B (B) -ab-repeat-clear = Sfeḍ allus A-B diff --git a/i18n/kk/cosmic_player.ftl b/i18n/kk/cosmic_player.ftl index 9f6e10d..7ef2c72 100644 --- a/i18n/kk/cosmic_player.ftl +++ b/i18n/kk/cosmic_player.ftl @@ -24,13 +24,3 @@ open-recent-media-folder = Жуырдағы медиа бумасын ашу close-media-folder = Медиа бумасын жабу repeat-disabled = Қайталау сөндірілген repeat-track = Тректі қайталау -playback = Ойнату -next-frame = Келесі фрейм -previous-frame = Алдыңғы фрейм -ab-repeat = Қайталау А-Ә -ab-repeat-set-a = Қайталау А-Ә (А бапт.) -ab-repeat-set-b = Қайталау А-Ә (В бапт.) -ab-repeat-clear = Қайталау А-Ә (Тазарту) -xdg-name = COSMIC медиаплеері -xdg-comment = COSMIC жұмыс үстелі үшін медиаплеері -xdg-keywords = Audio;Film;Movie;Music;Sound;Video;Аудио;Фильм;Кино;Музыка;Дыбыс;Видео; diff --git a/i18n/ko/cosmic_player.ftl b/i18n/ko/cosmic_player.ftl index f757d79..1d56c99 100644 --- a/i18n/ko/cosmic_player.ftl +++ b/i18n/ko/cosmic_player.ftl @@ -22,6 +22,3 @@ no-video-or-audio-file-open = 비디오 혹은 오디오가 열려있지 않음 off = 끄기 album = 앨범: { $album } close-file = 파일 닫기 -repeat-disabled = 반복 비활성화 -previous-frame = 이전 프레임 -next-frame = 다음 프레임 diff --git a/i18n/lo/cosmic_player.ftl b/i18n/lo/cosmic_player.ftl deleted file mode 100644 index e69de29..0000000 diff --git a/i18n/lt/cosmic_player.ftl b/i18n/lt/cosmic_player.ftl index 83556a9..1e26d37 100644 --- a/i18n/lt/cosmic_player.ftl +++ b/i18n/lt/cosmic_player.ftl @@ -1,5 +1,5 @@ quit = Išeiti -settings = Nuostatos +settings = Nustatymai close-file = Uždaryti failą match-desktop = Pagal darbalaukio temą appearance = Išvaizda @@ -24,10 +24,3 @@ dark = Tamsus light = Šviesus repeat-track = Kartoti takelį repeat-disabled = Kartojimas išjungtas -playback = Atkūrimas -next-frame = Sekantis Kadras -previous-frame = Ankstenis Kadras -ab-repeat = A-B Kartojimas -ab-repeat-set-a = A-B Kartojimas (A) -ab-repeat-set-b = A-B Kartojimas (B) -ab-repeat-clear = Panaikinti A-B Kartojimą diff --git a/i18n/pl/cosmic_player.ftl b/i18n/pl/cosmic_player.ftl index 451a2f4..66af5c6 100644 --- a/i18n/pl/cosmic_player.ftl +++ b/i18n/pl/cosmic_player.ftl @@ -39,16 +39,3 @@ off = Wyłączone clear-recent = Wyczyść listę poprzednich repeat-disabled = Powtarzanie wyłączone repeat-track = Powtórz utwór -playback = Odtwarzanie -next-frame = Następna Klatka -ab-repeat = A-B Powtarzanie -ab-repeat-set-a = A-B Powtarzanie (A) -ab-repeat-set-b = A-B Powtarzanie (B) -ab-repeat-clear = Wyczyść Powtarzanie A-B -previous-frame = Poprzednia Klatka - -# XDG Metadata - -xdg-name = Odtwarzacz Multimediów COSMIC -xdg-comment = Odtwarzacz Multimediów dla środowiska graficznego COSMIC -xdg-keywords = Audio;Dźwięki;Filmy;Muzyka;Vídeo;Media;Odtwarzacz;Multimedia; diff --git a/i18n/pt-BR/cosmic_player.ftl b/i18n/pt-BR/cosmic_player.ftl index 5aaf766..9b2da29 100644 --- a/i18n/pt-BR/cosmic_player.ftl +++ b/i18n/pt-BR/cosmic_player.ftl @@ -39,16 +39,3 @@ off = Desligado clear-recent = Limpar lista de recentes repeat-track = Repetir faixa repeat-disabled = Repetição desabilitada -next-frame = Próximo quadro -previous-frame = Quadro anterior -playback = Reprodução -ab-repeat = Repetir A-B -ab-repeat-set-a = Repetir A-B (A) -ab-repeat-set-b = Repetir A-B (B) -ab-repeat-clear = Limpar repetição A-B - -# XDG Metadata - -xdg-name = Reprodutor de mídia -xdg-comment = Reprodutor de mídia do ambiente COSMIC -xdg-keywords = Áudio;Filme;Música;Som;Vídeo;Media;Player; diff --git a/i18n/pt/cosmic_player.ftl b/i18n/pt/cosmic_player.ftl index 0b02aa3..4459fc8 100644 --- a/i18n/pt/cosmic_player.ftl +++ b/i18n/pt/cosmic_player.ftl @@ -35,9 +35,3 @@ open-media-folder = Abrir pasta de multimédias... open-recent-media-folder = Abrir pasta recente de multimédias close-media-folder = Fechar pasta de multimédia quit = Sair - -# XDG Metadata - -xdg-name = Reprodutor de Mídia -xdg-comment = Reprodutor de mídia do desktop COSMIC -xdg-keywords = Audio;Filme;Música;Som;Vídeo;Media;Player; diff --git a/i18n/ru/cosmic_player.ftl b/i18n/ru/cosmic_player.ftl index 797d70a..e8de958 100644 --- a/i18n/ru/cosmic_player.ftl +++ b/i18n/ru/cosmic_player.ftl @@ -15,7 +15,7 @@ light = Светлая open-file = Открыть файл album = Альбом: { $album } audio = Аудио -no-video-or-audio-file-open = Нет открытых видео или аудио файлов +no-video-or-audio-file-open = Нет открытых аудио- или видеофайлов open-folder = Открыть папку subtitles = Субтитры unknown-author = Неизвестный автор @@ -24,24 +24,11 @@ file = Файл open-media = Открыть медиафайл… open-recent-media = Открыть недавний медиафайл close-file = Закрыть файл -open-media-folder = Открыть папку медиафайлов... -open-recent-media-folder = Открыть папку недавних медиафайлов +open-media-folder = Открыть папку медиафайлов… +open-recent-media-folder = Недавние папки медиафайлов close-media-folder = Закрыть папку медиафайлов quit = Выйти off = Выкл. clear-recent = Очистить список недавних repeat-disabled = Повтор отключён repeat-track = Повторять трек -playback = Воспроизведение -next-frame = Следующий кадр -previous-frame = Предыдущий кадр -ab-repeat = Повтор A–B -ab-repeat-set-a = Повтор A–B (уст. A) -ab-repeat-set-b = Повтор A–B (уст. B) -ab-repeat-clear = Повтор A–B (очистить) - -# XDG Metadata - -xdg-name = Медиаплеер -xdg-keywords = Аудио;Фильм;Музыка;Видео;Медиа;Звук;Мультимедиа;Медиаплеер; -xdg-comment = Медиаплеер для рабочей среды COSMIC diff --git a/i18n/sk/cosmic_player.ftl b/i18n/sk/cosmic_player.ftl index 1a7faac..268c6b4 100644 --- a/i18n/sk/cosmic_player.ftl +++ b/i18n/sk/cosmic_player.ftl @@ -30,9 +30,3 @@ open-media-folder = Otvoriť priečinok s médiami... open-recent-media-folder = Otvoriť posledný priečinok s médiami close-media-folder = Zatvoriť priečinok s médiami quit = Ukončiť - -# XDG Metadata - -xdg-name = Prehrávač Médií COSMIC -xdg-comment = Prehrávač médií pre pracovné prostredie COSMIC -xdg-keywords = audio;film;hudba;video;prehrávač;média;zvuk; diff --git a/i18n/sr/cosmic_player.ftl b/i18n/sr/cosmic_player.ftl index 81c0602..e69de29 100644 --- a/i18n/sr/cosmic_player.ftl +++ b/i18n/sr/cosmic_player.ftl @@ -1,36 +0,0 @@ -open-file = Отвори датотеку -quit = Изађи -settings = Подешавања -appearance = Изглед -dark = Тамна -light = Светла -open-folder = Отвори фасциклу -theme = Тема -match-desktop = Прати радну површину -file = Датотека -close-file = Затвори датотеку -album = Албум: { $album } -audio = Звук -no-video-or-audio-file-open = Нема отворене датотеке видеа или звука -off = Искључено -subtitles = Поднаслови -unknown-author = Непознати аутор -untitled = Без наслова -open-media = Отвори медиј... -open-recent-media = Отвори недавне медије -clear-recent = Очисти списак недавних -open-media-folder = Отвори медијску фасциклу... -open-recent-media-folder = Отвори недавну медијску фасциклу -close-media-folder = Затвори медијску фасциклу -repeat-disabled = Понављање онемогућено -repeat-track = Понови песму -playback = Пуштање -next-frame = Следећи кадар -previous-frame = Претходни кадар -ab-repeat = Понављање А-Б -ab-repeat-set-a = А-Б понављање (А) -ab-repeat-set-b = А-Б понављање (Б) -ab-repeat-clear = Очисти А-Б понављање -xdg-name = Космик пуштач медија -xdg-comment = Пуштач медија за Космик радну површ -xdg-keywords = Audio;Film;Movie;Music;Sound;Video; Аудио;Звук;Филм;Музика;Видео;zvuk;film;muzika; diff --git a/i18n/sv/cosmic_player.ftl b/i18n/sv/cosmic_player.ftl index c6c5ab2..57627c1 100644 --- a/i18n/sv/cosmic_player.ftl +++ b/i18n/sv/cosmic_player.ftl @@ -39,16 +39,3 @@ off = Av clear-recent = Töm senaste-listan repeat-disabled = Upprepning avaktiverad repeat-track = Upprepa spår -playback = Uppspelning -next-frame = Nästa bildruta -previous-frame = Föregående bildruta -ab-repeat = A-B-upprepning -ab-repeat-set-a = A-B-upprepning (A) -ab-repeat-set-b = A-B-upprepning (B) -ab-repeat-clear = Rensa A-B-upprepning - -# XDG Metadata - -xdg-name = COSMIC Mediaspelare -xdg-comment = Mediaspelare för skrivbordsmiljön COSMIC -xdg-keywords = Ljud;Film;Musik;Video;Media; diff --git a/i18n/uk/cosmic_player.ftl b/i18n/uk/cosmic_player.ftl index 650facc..4eef99c 100644 --- a/i18n/uk/cosmic_player.ftl +++ b/i18n/uk/cosmic_player.ftl @@ -13,24 +13,14 @@ match-desktop = Системна dark = Темна light = Світла file = Файл -open-media = Відкрити... -open-recent-media = Відкрити попередні +open-media = Відкрити медіа... +open-recent-media = Відкрити останні медіа close-file = Закрити файл -open-media-folder = Відкрити теку... -open-recent-media-folder = Відкрити попередню теку -close-media-folder = Закрити теку +open-media-folder = Відкрити теку з медіа... +open-recent-media-folder = Відкрити нещодавню теку з медіа +close-media-folder = Закрити теку з медіа quit = Вийти off = Вимк. clear-recent = Очистити список repeat-disabled = Не повторювати repeat-track = Повторювати -previous-frame = Попередній кадр -next-frame = Наступний кадр -xdg-name = Програвач COSMIC -xdg-comment = Програвач для стільниці COSMIC -xdg-keywords = Аудіо;Стрічка;Фільм;Кіно;Музика;Звук;Відео; -playback = Програти -ab-repeat = Повторення A-B -ab-repeat-set-a = Повторення A-B (A) -ab-repeat-set-b = Повторення A-B (B) -ab-repeat-clear = Очистити повтор A-B diff --git a/i18n/zh-CN/cosmic_player.ftl b/i18n/zh-CN/cosmic_player.ftl index 41fa355..28c4194 100644 --- a/i18n/zh-CN/cosmic_player.ftl +++ b/i18n/zh-CN/cosmic_player.ftl @@ -28,10 +28,10 @@ light = 亮色模式 ## File file = 文件 -open-media = 打开媒体文件… +open-media = 打开媒体文件... open-recent-media = 打开最近媒体文件 close-file = 关闭文件 -open-media-folder = 打开媒体文件夹… +open-media-folder = 打开媒体文件夹... open-recent-media-folder = 打开最近媒体文件夹 close-media-folder = 关闭媒体文件夹 quit = 退出 @@ -39,16 +39,3 @@ off = 已关闭 clear-recent = 清空近期列表 repeat-disabled = 重复已禁用 repeat-track = 重复轨道 -playback = 回放 -next-frame = 下一帧 -previous-frame = 上一帧 -ab-repeat = A-B 重复 -ab-repeat-set-a = A-B 重复(A) -ab-repeat-set-b = A-B 重复(B) -ab-repeat-clear = 清除 A-B 重复 - -# XDG Metadata - -xdg-name = COSMIC 媒体播放器 -xdg-comment = COSMIC 桌面的媒体播放器 -xdg-keywords = 音频;影片;电影;音乐;声音;视频; diff --git a/i18n/zh-TW/cosmic_player.ftl b/i18n/zh-TW/cosmic_player.ftl index 036ed4f..5bba32a 100644 --- a/i18n/zh-TW/cosmic_player.ftl +++ b/i18n/zh-TW/cosmic_player.ftl @@ -1,51 +1,32 @@ -album = 專輯:{ $album } +album = 專輯: {$album} audio = 音訊 -no-video-or-audio-file-open = 無影片或音訊檔案開啟 +no-video-or-audio-file-open = 未開啟視訊或音訊檔案 open-file = 開啟檔案 -open-folder = 開啟資料夾 +open-folder = 打開資料夾 subtitles = 字幕 -unknown-author = 不明作者 +unknown-author = 未知作者 untitled = 無標題 # Context Pages - ## Settings - settings = 設定 ### Appearance - appearance = 外觀 theme = 主題 -match-desktop = 符合桌面 -dark = 深色 -light = 淺色 +match-desktop = 與桌面保持一致 +dark = 深色主題 +light = 淺色主題 # Menu - ## File - file = 檔案 -open-media = 開啟媒體... -open-recent-media = 開啟最近使用的媒體 +open-media = 開啟媒體檔案... +open-recent-media = 打開最近的媒體檔案 close-file = 關閉檔案 open-media-folder = 開啟媒體資料夾... -open-recent-media-folder = 開啟最近使用的媒體資料夾 +open-recent-media-folder = 開啟最近的媒體資料夾 close-media-folder = 關閉媒體資料夾 -quit = 退出 -off = 關閉 -clear-recent = 清除最近使用清單 -repeat-disabled = 重複已經停用 -repeat-track = 重複曲目 -ab-repeat = A-B 重複 -ab-repeat-set-a = A-B 重複(A) -ab-repeat-set-b = A-B 重複(B) -ab-repeat-clear = 清除 A-B 重複 -playback = 回放 -next-frame = 下一幀 -previous-frame = 上一幀 -xdg-name = COSMIC 媒體播放器 -xdg-comment = 媒體播放器 用於 COSMIC 桌面 -xdg-keywords = 音訊;影片;電影;音樂;聲音;影像; +quit = 退出 \ No newline at end of file diff --git a/justfile b/justfile index 003fa0f..04c410a 100644 --- a/justfile +++ b/justfile @@ -13,11 +13,11 @@ bin-src := cargo-target-dir / 'release' / name bin-dst := base-dir / 'bin' / name desktop := APPID + '.desktop' -desktop-src := 'target/xdgen' / desktop +desktop-src := 'res' / desktop desktop-dst := clean(rootdir / prefix) / 'share' / 'applications' / desktop metainfo := APPID + '.metainfo.xml' -metainfo-src := 'target/xdgen' / metainfo +metainfo-src := 'res' / metainfo metainfo-dst := clean(rootdir / prefix) / 'share' / 'metainfo' / metainfo thumbnailer := APPID + '.thumbnailer' diff --git a/res/com.system76.CosmicPlayer.desktop b/res/com.system76.CosmicPlayer.desktop index d12fdc4..d33bbd1 100644 --- a/res/com.system76.CosmicPlayer.desktop +++ b/res/com.system76.CosmicPlayer.desktop @@ -1,6 +1,18 @@ +#TODO: more build-out, desktop actions, translations? [Desktop Entry] Name=COSMIC Media Player -Comment=Media player for the COSMIC desktop +Name[ar]=مشغّل وسائط COSMIC +Name[cs]=Přehrávač médií COSMIC +Name[zh_CN]=COSMIC 媒体播放器 +Name[hu]=COSMIC Médialejátszó +Name[pl]=Odtwarzacz Multimediów COSMIC +Name[pt_BR]=Reprodutor de Mídia +Name[pt]=Reprodutor de Mídia +Name[ru]=Медиаплеер +Name[sk]=Prehrávač Médií COSMIC +Name[sv]=COSMIC Mediaspelare +Name[es]=Reproductor de medios COSMIC +Name[it]=COSMIC Media Player Exec=cosmic-player %U Terminal=false Type=Application @@ -9,3 +21,14 @@ MimeType=application/mxf;application/ram;application/sdp;application/vnd.apple.m Icon=com.system76.CosmicPlayer Categories=COSMIC;AudioVideo;Player;Video; Keywords=Audio;Film;Movie;Music;Sound;Video; +Keywords[ar]=فيلم;مقطع;فيديو;صوت +Keywords[cs]=audio;film;hudba;video;média;zvuk; +Keywords[hu]=hang;film;zene;videó;média;lejátszó; +Keywords[pl]=Audio;Dźwięki;Filmy;Muzyka;Vídeo;Media;Odtwarzacz;Multimedia; +Keywords[pt_BR]=Audio;Filme;Música;Som;Vídeo;Media;Player; +Keywords[ru]=Аудио;Фильм;Музыка;Видео;Медиа;Звук;Мультимедиа;Медиаплеер; +Keywords[pt]=Audio;Filme;Música;Som;Vídeo;Media;Player; +Keywords[sk]=audio;film;hudba;video;prehrávač;média;zvuk; +Keywords[sv]=Ljud;Film;Musik;Video;Media; +Keywords[es]=Audio;Película;Música;Vídeo;Sonido;Reproductor; +Keywords[it]=Audio;Video;Musica;Film;Suoni;Riproduzione; diff --git a/res/com.system76.CosmicPlayer.metainfo.xml b/res/com.system76.CosmicPlayer.metainfo.xml index fdae66e..5dc3403 100644 --- a/res/com.system76.CosmicPlayer.metainfo.xml +++ b/res/com.system76.CosmicPlayer.metainfo.xml @@ -1,4 +1,4 @@ - + com.system76.CosmicPlayer CC0-1.0 @@ -9,15 +9,33 @@ https://github.com/pop-os/cosmic-player https://github.com/pop-os/cosmic-player COSMIC Media Player + مشغّل وسائط COSMIC + Přehrávač médií COSMIC + COSMIC Médialejátszó + Odtwarzacz Multimediów COSMIC + Reprodutor de Mídia + Reprodutor de Mídia + Prehrávač Médií COSMIC + Reproductor de medios COSMIC + COSMIC Media Player + COSMIC Mediaspelare Media player for the COSMIC desktop + مشغّل وسائط لسطح مكتب COSMIC + Přehrávač médií pro pracovní prostředí COSMIC + Médialejátszó a COSMIC asztali környezethez + Odtwarzacz Multimediów dla środowiska graficznego COSMIC + Reprodutor de mídia do desktop COSMIC + Reprodutor de mídia do desktop COSMIC + Prehrávač médií pre pracovné prostredie COSMIC + Reproductor de medios para el escritorio COSMIC + Lettore multimediale di COSMIC + Mediaspelare för skrivbordsmiljön COSMIC

Media player for the COSMIC desktop

مشغّل وسائط لسطح مكتب COSMIC

Přehrávač médií pro pracovní prostředí COSMIC

Médialejátszó a COSMIC asztali környezethez

-

Odtwarzacz Multimediów dla środowiska graficznego COSMIC

+

Odtwarzacz Multimediów dla środowiska graficznego COSMIC

Reprodutor de mídia do desktop COSMIC

Reprodutor de mídia do desktop COSMIC

Prehrávač médií pre pracovné prostredie COSMIC

@@ -25,20 +43,8 @@

Reproductor de medios para el escritorio COSMIC

Mediaspelare för skrivbordsmiljön COSMIC

- - Audio - Film - Movie - Music - Sound - Video - com.system76.CosmicPlayer.desktop - https://raw.githubusercontent.com/pop-os/cosmic-player/master/res/icons/hicolor/256x256/apps/com.system76.CosmicPlayer.svg + https://raw.githubusercontent.com/pop-os/cosmic-player/master/res/icons/hicolor/256x256/apps/com.system76.CosmicPlayer.svg com.system76.CosmicApplication diff --git a/res/icons/hicolor/16x16/apps/jump-backward-10-symbolic.svg b/res/icons/hicolor/16x16/apps/jump-backward-10-symbolic.svg deleted file mode 100644 index 51c26ca..0000000 --- a/res/icons/hicolor/16x16/apps/jump-backward-10-symbolic.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/res/icons/hicolor/16x16/apps/jump-forward-10-symbolic.svg b/res/icons/hicolor/16x16/apps/jump-forward-10-symbolic.svg deleted file mode 100644 index bc4095f..0000000 --- a/res/icons/hicolor/16x16/apps/jump-forward-10-symbolic.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/rustfmt.toml b/rustfmt.toml index c1578aa..fa09141 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1 +1 @@ -imports_granularity = "Module" +reorder_imports = false diff --git a/src/argparse.rs b/src/argparse.rs index f852b29..80d20fb 100644 --- a/src/argparse.rs +++ b/src/argparse.rs @@ -1,8 +1,7 @@ // Copyright 2024 System76 // SPDX-License-Identifier: GPL-3.0-only -use std::path::PathBuf; -use std::{fs, io}; +use std::{fs, io, path::PathBuf}; use clap_lex::RawArgs; use log::warn; diff --git a/src/config.rs b/src/config.rs index 0b6a29e..df13c43 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,11 +1,11 @@ // SPDX-License-Identifier: GPL-3.0-only -use cosmic::cosmic_config::cosmic_config_derive::CosmicConfigEntry; -use cosmic::cosmic_config::{self, CosmicConfigEntry}; -use cosmic::theme; +use cosmic::{ + cosmic_config::{self, CosmicConfigEntry, cosmic_config_derive::CosmicConfigEntry}, + theme, +}; use serde::{Deserialize, Serialize}; -use std::collections::VecDeque; -use std::path::PathBuf; +use std::{collections::VecDeque, path::PathBuf}; pub const CONFIG_VERSION: u64 = 1; diff --git a/src/key_bind.rs b/src/key_bind.rs index 817fff9..d276fb7 100644 --- a/src/key_bind.rs +++ b/src/key_bind.rs @@ -1,5 +1,4 @@ -use cosmic::iced::keyboard::Key; -use cosmic::iced::keyboard::key::Named; +use cosmic::{iced::keyboard::Key, iced::core::keyboard::key::Named}; use std::collections::HashMap; use crate::Action; diff --git a/src/localize.rs b/src/localize.rs index c3ebd46..d7d9ce5 100644 --- a/src/localize.rs +++ b/src/localize.rs @@ -1,64 +1,50 @@ // SPDX-License-Identifier: GPL-3.0-only -use i18n_embed::fluent::{FluentLanguageLoader, fluent_language_loader}; -use i18n_embed::{DefaultLocalizer, LanguageLoader, Localizer}; -use icu_collator::options::CollatorOptions; -use icu_collator::preferences::CollationNumericOrdering; -use icu_collator::{Collator, CollatorBorrowed, CollatorPreferences}; -use icu_locale::Locale; +use std::str::FromStr; +use std::sync::OnceLock; + +use i18n_embed::{ + DefaultLocalizer, LanguageLoader, Localizer, + fluent::{FluentLanguageLoader, fluent_language_loader}, +}; +use icu_collator::{Collator, CollatorOptions, Numeric}; +use icu_provider::DataLocale; use rust_embed::RustEmbed; -use std::sync::LazyLock; #[derive(RustEmbed)] #[folder = "i18n/"] struct Localizations; -pub static LANGUAGE_LOADER: LazyLock = LazyLock::new(|| { - let loader: FluentLanguageLoader = fluent_language_loader!(); - - loader - .load_fallback_language(&Localizations) - .expect("Error while loading fallback language"); - - loader -}); - -pub static LANGUAGE_SORTER: LazyLock = LazyLock::new(|| { - let create_collator = |locale: Locale| { - let mut prefs = CollatorPreferences::from(locale); - prefs.numeric_ordering = Some(CollationNumericOrdering::True); - Collator::try_new(prefs, CollatorOptions::default()).ok() - }; - - Locale::try_from_str(&LANGUAGE_LOADER.current_language().to_string()) - .ok() - .and_then(create_collator) - .or_else(|| { - Locale::try_from_str(&LANGUAGE_LOADER.fallback_language().to_string()) - .ok() - .and_then(create_collator) - }) - .unwrap_or_else(|| { - let locale = Locale::try_from_str("en-US").expect("en-US is a valid BCP-47 tag"); - create_collator(locale) - .expect("Creating a collator from the system's current language, the fallback language, or American English should succeed") - }) -}); +pub static LANGUAGE_LOADER: OnceLock = OnceLock::new(); +pub static LANGUAGE_SORTER: OnceLock = OnceLock::new(); #[macro_export] macro_rules! fl { ($message_id:literal) => {{ - i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id) + i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER.get().unwrap(), $message_id) }}; ($message_id:literal, $($args:expr),*) => {{ - i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id, $($args), *) + i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER.get().unwrap(), $message_id, $($args), *) }}; } // Get the `Localizer` to be used for localizing this library. pub fn localizer() -> Box { - Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations)) + LANGUAGE_LOADER.get_or_init(|| { + let loader: FluentLanguageLoader = fluent_language_loader!(); + + loader + .load_fallback_language(&Localizations) + .expect("Error while loading fallback language"); + + loader + }); + + Box::from(DefaultLocalizer::new( + LANGUAGE_LOADER.get().unwrap(), + &Localizations, + )) } pub fn localize() { @@ -66,6 +52,25 @@ pub fn localize() { let requested_languages = i18n_embed::DesktopLanguageRequester::requested_languages(); if let Err(error) = localizer.select(&requested_languages) { - eprintln!("Error while loading language for COSMIC Media Player {error}",); + eprintln!("Error while loading language for App List {}", error); } } + +pub fn sorter() -> &'static Collator { + LANGUAGE_SORTER.get_or_init(|| { + let mut options = CollatorOptions::new(); + options.numeric = Some(Numeric::On); + let localizer = localizer(); + let language_loader = localizer.language_loader(); + + DataLocale::from_str(&language_loader.current_language().to_string()) + .or_else(|_| DataLocale::from_str(&language_loader.fallback_language().to_string())) + .ok() + .and_then(|locale| Collator::try_new(&locale, options).ok()) + .or_else(|| { + let locale = DataLocale::from_str("en-US").expect("en-US is a valid BCP-47 tag"); + Collator::try_new(&locale, options).ok() + }) + .expect("Creating a collator from the system's current language, the fallback language, or American English should succeed") + }) +} diff --git a/src/main.rs b/src/main.rs index d9c2233..fa95330 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,32 +1,49 @@ // Copyright 2023 System76 // SPDX-License-Identifier: GPL-3.0-only -use cosmic::app::{Core, Settings, Task}; -use cosmic::command::set_theme; -use cosmic::cosmic_config::{self, CosmicConfigEntry}; -use cosmic::iced::event::{self, Event}; -use cosmic::iced::keyboard::{Event as KeyEvent, Key, Modifiers}; -use cosmic::iced::mouse::{Event as MouseEvent, ScrollDelta}; -use cosmic::iced::{ - Alignment, Background, Border, Color, ContentFit, Length, Limits, Subscription, exit, window, +use cosmic::{ + action, + app::{Core, Settings, Task}, + command::set_theme, + cosmic_config::{self, CosmicConfigEntry}, + cosmic_theme, executor, font, + iced::{ + event::{self, Event}, + keyboard::{Event as KeyEvent, Key, Modifiers}, + mouse::{Event as MouseEvent, ScrollDelta}, + window::{self, set_mode}, + Alignment, Background, Border, Color, ContentFit, Length, Limits, Subscription, + }, + theme, + widget::{self, menu::action::MenuAction, nav_bar, segmented_button, Slider}, + Application, ApplicationExt, Element, +}; +use iced_video_player::{ + gst::{self, prelude::*}, + gst_pbutils, Video, VideoPlayer, +}; +use std::{ + any::TypeId, + collections::HashMap, + ffi::{CStr, CString}, + fs, + path::{Path, PathBuf}, + process, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, + thread, + time::{Duration, Instant}, }; -use cosmic::iced::window::set_mode; -use cosmic::widget::menu::action::MenuAction; -use cosmic::widget::{self, Slider, nav_bar, segmented_button}; -use cosmic::{Application, ApplicationExt, Element, action, cosmic_theme, executor, font, theme}; -use iced_video_player::gst::prelude::*; -use iced_video_player::{Video, VideoPlayer, gst, gst_pbutils}; -use std::any::TypeId; -use std::collections::HashMap; -use std::ffi::{CStr, CString}; -use std::path::{Path, PathBuf}; -use std::time::{Duration, Instant}; -use std::{fs, process, thread}; use tokio::sync::mpsc; -use crate::config::{CONFIG_VERSION, Config, ConfigState, RepeatState}; -use crate::key_bind::{KeyBind, key_binds}; -use crate::project::ProjectNode; +use crate::{ + config::{Config, ConfigState, CONFIG_VERSION, RepeatState}, + key_bind::{key_binds, KeyBind}, + mpris::subscription, + project::ProjectNode, +}; mod argparse; mod config; @@ -47,12 +64,6 @@ const GST_PLAY_FLAG_VIDEO: i32 = 1 << 0; const GST_PLAY_FLAG_AUDIO: i32 = 1 << 1; const GST_PLAY_FLAG_TEXT: i32 = 1 << 2; -const JUMP_BACKWARD_ICON: &[u8] = - include_bytes!("../res/icons/hicolor/16x16/apps/jump-backward-10-symbolic.svg"); - -const JUMP_FORWARD_ICON: &[u8] = - include_bytes!("../res/icons/hicolor/16x16/apps/jump-forward-10-symbolic.svg"); - use std::error::Error; fn language_name(code: &str) -> Option { @@ -176,8 +187,6 @@ pub enum Action { FolderOpenRecent(usize), Fullscreen, PlayPause, - PlayPrev, - PlayNext, SeekBackward, SeekForward, NextFrame, @@ -201,8 +210,6 @@ impl MenuAction for Action { Self::FolderOpenRecent(index) => Message::FolderOpenRecent(*index), Self::Fullscreen => Message::Fullscreen, Self::PlayPause => Message::PlayPause, - Self::PlayPrev => Message::PlayPrev, - Self::PlayNext => Message::PlayNext, Self::SeekBackward => Message::SeekRelative(-10.0), Self::SeekForward => Message::SeekRelative(10.0), Self::NextFrame => Message::NextFrame, @@ -301,7 +308,6 @@ pub enum Message { Seek(f64), SeekRelative(f64), SeekRelease, - PlayPrev, PlayNext, NextFrame, PreviousFrame, @@ -605,10 +611,10 @@ impl App { } fn save_config_state(&mut self) { - if let Some(ref config_state_handler) = self.flags.config_state_handler - && let Err(err) = self.flags.config_state.write_entry(config_state_handler) - { - log::error!("failed to save config_state: {}", err); + if let Some(ref config_state_handler) = self.flags.config_state_handler { + if let Err(err) = self.flags.config_state.write_entry(config_state_handler) { + log::error!("failed to save config_state: {}", err); + } } } @@ -617,9 +623,9 @@ impl App { || !self .video_opt .as_ref() - .is_some_and(|video| video.has_video()) + .map_or(false, |video| video.has_video()) { - self.core.window.show_headerbar = !self.fullscreen; + self.core.window.show_headerbar = true && !self.fullscreen; self.controls = true; self.controls_time = Instant::now(); } else if self.controls && self.controls_time.elapsed() > CONTROLS_TIMEOUT { @@ -673,7 +679,7 @@ impl App { ..Default::default() }; //TODO: use any other stream tags? - if let Some(tags) = self.audio_tags.first() { + if let Some(tags) = self.audio_tags.get(0) { log::info!("{:#?}", tags); if let Some(tag) = tags.get::() { new.album = tag.get().into(); @@ -746,11 +752,11 @@ impl App { new.album_art_opt = url::Url::from_file_path(album_art.path()).ok(); } } - if let Some((old, _, tx)) = &mut self.mpris_opt - && new != *old - { - *old = new.clone(); - let _ = tx.send(MprisEvent::Meta(new.clone())); + if let Some((old, _, tx)) = &mut self.mpris_opt { + if new != *old { + *old = new.clone(); + let _ = tx.send(MprisEvent::Meta(new.clone())); + } } self.mpris_meta = new; } @@ -945,17 +951,12 @@ impl Application for App { fn on_escape(&mut self) -> Task { if self.fullscreen { - self.update(Message::Fullscreen) + return self.update(Message::Fullscreen); } else { Task::none() } } - fn on_app_exit(&mut self) -> Option { - self.close(); - None - } - fn on_nav_select(&mut self, id: nav_bar::Id) -> Task { // Toggle open state and get clone of node data let node_opt = match self.nav_model.data_mut::(id) { @@ -1209,12 +1210,12 @@ impl Application for App { } } Message::AudioCode(code) => { - if let Ok(code) = i32::try_from(code) - && let Some(video) = &self.video_opt - { - let pipeline = video.pipeline(); - pipeline.set_property("current-audio", code); - self.current_audio = pipeline.property("current-audio"); + if let Ok(code) = i32::try_from(code) { + if let Some(video) = &self.video_opt { + let pipeline = video.pipeline(); + pipeline.set_property("current-audio", code); + self.current_audio = pipeline.property("current-audio"); + } } } Message::AudioToggle => { @@ -1224,12 +1225,12 @@ impl Application for App { } } Message::AudioVolume(volume) => { - if let Some(video) = &mut self.video_opt - && (0.0..=1.0).contains(&volume) - { - video.set_volume(volume); - video.set_muted(false); - self.update_controls(true); + if let Some(video) = &mut self.video_opt { + if volume >= 0.0 && volume <= 1.0 { + video.set_volume(volume); + video.set_muted(false); + self.update_controls(true); + } } } Message::TextCode(index) => { @@ -1312,7 +1313,7 @@ impl Application for App { } } - if (0.0..=1.0).contains(&volume) && !nav_bar_toggled { + if (volume >= 0.0 && volume <= 1.0) && !nav_bar_toggled { video.set_volume(volume); video.set_muted(false); self.update_controls(true); @@ -1354,55 +1355,6 @@ impl Application for App { } } - Message::PlayPrev => { - if self.flags.config_state.player_state.repeat == RepeatState::Track { - return Task::none(); - } - - //first we get info about current media id & position in nav_bar - let curr_id = self.nav_model.active(); - let curr_position = match self.nav_model.position(curr_id) { - Some(pos) => pos, - None => { - log::warn!("Failed to get position of current media: {:?}", curr_id); - return self.update(Message::EndOfStream); - } - }; - - if let Some(video) = &mut self.video_opt { - self.position = video.position().as_secs_f64(); - - if self.position > 3.0 { - video.seek(0, false).expect("seek"); - } else { - if self.nav_model.activate_position(curr_position - 1) { - let curr_id = self.nav_model.active(); - match self.nav_model.data::(curr_id) { - //The prev one is a media file, we play it. - Some(ProjectNode::File { .. }) => { - return self.on_nav_select(curr_id); - } - - //The prev one is a folder. We expand it and recall PlayPrev. - Some(ProjectNode::Folder { .. }) => { - let _ = self.on_nav_select(curr_id); - return self.update(Message::PlayPrev); - } - - //Unknown type. We do nothing. - _ => log::warn!( - "unknown type: {:?}", - self.nav_model.data::(curr_id) - ), - } - } else { - // first file - video.seek(0, false).expect("seek"); - } - } - } - } - Message::PlayNext => { // TODO: known limitations: // 1) if the user collapses the folder entry while a song is playing, @@ -1585,20 +1537,20 @@ impl Application for App { self.update_mpris_state(); } Message::NewFrame => { - if let Some(video) = &mut self.video_opt - && !self.dragging - { - self.position = video.position().as_secs_f64(); + if let Some(video) = &mut self.video_opt { + if !self.dragging { + self.position = video.position().as_secs_f64(); - if let Some((a, b)) = self.ab_repeat { - let target_a = a.unwrap_or(0.0); - let target_b = b.unwrap_or(self.duration); - if self.position >= target_b { - let _ = video.seek(Duration::from_secs_f64(target_a), true); + if let Some((a, b)) = self.ab_repeat { + let target_a = a.unwrap_or(0.0); + let target_b = b.unwrap_or(self.duration); + if self.position >= target_b { + let _ = video.seek(Duration::from_secs_f64(target_a), true); + } } - } - self.update_controls(self.dropdown_opt.is_some()); + self.update_controls(self.dropdown_opt.is_some()); + } } } Message::Reload => { @@ -1611,8 +1563,7 @@ impl Application for App { return self.update_config(); } Message::WindowClose => { - self.close(); - return exit(); + process::exit(0); } } Task::none() @@ -1845,55 +1796,19 @@ impl Application for App { ); } if self.controls { - let mut row = widget::row::with_capacity(9) + let mut row = widget::row::with_capacity(7) .align_y(Alignment::Center) .spacing(space_xxs) .push( - if self - .video_opt - .as_ref() - .map_or(true, |video| video.has_video()) - { - widget::button::icon( - widget::icon::from_svg_bytes(JUMP_BACKWARD_ICON).symbolic(true), - ) - .on_press(Message::SeekRelative(-10.0)) - } else { - widget::button::icon( - widget::icon::from_name("media-skip-backward-symbolic").size(16), - ) - .on_press(Message::PlayPrev) - }, + widget::button::icon( + if self.video_opt.as_ref().map_or(true, |video| video.paused()) { + widget::icon::from_name("media-playback-start-symbolic").size(16) + } else { + widget::icon::from_name("media-playback-pause-symbolic").size(16) + }, + ) + .on_press(Message::PlayPause), ); - row = row.push( - widget::button::icon( - if self.video_opt.as_ref().map_or(true, |video| video.paused()) { - widget::icon::from_name("media-playback-start-symbolic").size(16) - } else { - widget::icon::from_name("media-playback-pause-symbolic").size(16) - }, - ) - .on_press(Message::PlayPause), - ); - - row = row.push( - if self - .video_opt - .as_ref() - .map_or(true, |video| video.has_video()) - { - widget::button::icon( - widget::icon::from_svg_bytes(JUMP_FORWARD_ICON).symbolic(true), - ) - .on_press(Message::SeekRelative(10.0)) - } else { - widget::button::icon( - widget::icon::from_name("media-skip-forward-symbolic").size(16), - ) - .on_press(Message::PlayNext) - }, - ); - row = row.push(widget::tooltip( widget::button::icon( widget::icon::from_name(match self.flags.config_state.player_state.repeat { diff --git a/src/menu.rs b/src/menu.rs index 0f21053..9af9769 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -1,11 +1,14 @@ // SPDX-License-Identifier: GPL-3.0-only -use cosmic::widget::RcElementWrapper; -use cosmic::widget::menu::key_bind::KeyBind; -use cosmic::widget::menu::{self, ItemHeight, ItemWidth, MenuBar}; -use cosmic::{Element, theme}; -use std::collections::HashMap; -use std::path::PathBuf; +use cosmic::{ + theme, + widget::{ + menu::{self, key_bind::KeyBind, ItemHeight, ItemWidth, MenuBar}, + RcElementWrapper, + }, + Element, +}; +use std::{collections::HashMap, path::PathBuf}; use crate::{Action, Config, ConfigState, Message, fl}; @@ -19,10 +22,10 @@ pub fn menu_bar<'a>( ) -> Element<'a, Message> { let home_dir_opt = std::env::home_dir(); let format_path = |path: &PathBuf| -> String { - if let Some(home_dir) = &home_dir_opt - && let Ok(part) = path.strip_prefix(home_dir) - { - return format!("~/{}", part.display()); + if let Some(home_dir) = &home_dir_opt { + if let Ok(part) = path.strip_prefix(home_dir) { + return format!("~/{}", part.display()); + } } path.display().to_string() }; diff --git a/src/mpris.rs b/src/mpris.rs index 8c87244..b14a1c4 100644 --- a/src/mpris.rs +++ b/src/mpris.rs @@ -1,16 +1,18 @@ -use cosmic::iced::futures::{self, SinkExt, Stream}; -use cosmic::iced::{Subscription, stream}; -use mpris_server::zbus::{Result, fdo}; +use cosmic::{ + iced::{ + futures::{self, SinkExt, Stream}, + Subscription, stream, + }, +}; use mpris_server::{ LoopStatus, Metadata, PlaybackRate, PlaybackStatus, PlayerInterface, Property, RootInterface, Server, Signal, Time, TrackId, Volume, + zbus::{Result, fdo}, }; -use std::any::TypeId; -use std::{future, process}; +use std::{any::TypeId, future, process}; use tokio::sync::{Mutex, mpsc}; -use crate::config::RepeatState; -use crate::{Message, MprisEvent, MprisMeta, MprisState}; +use crate::{Message, MprisEvent, MprisMeta, MprisState, config::RepeatState}; impl MprisMeta { fn metadata(&self) -> Metadata { @@ -150,12 +152,12 @@ impl RootInterface for Player { impl PlayerInterface for Player { async fn next(&self) -> fdo::Result<()> { log::info!("Next"); - self.message(Message::PlayNext).await + Ok(()) } async fn previous(&self) -> fdo::Result<()> { log::info!("Previous"); - self.message(Message::PlayPrev).await + Ok(()) } async fn pause(&self) -> fdo::Result<()> { @@ -271,12 +273,12 @@ impl PlayerInterface for Player { async fn can_go_next(&self) -> fdo::Result { log::info!("CanGoNext"); - Ok(true) + Ok(false) } async fn can_go_previous(&self) -> fdo::Result { log::info!("CanGoPrevious"); - Ok(true) + Ok(false) } async fn can_play(&self) -> fdo::Result { diff --git a/src/project.rs b/src/project.rs index 426b0f3..76f8558 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,9 +1,11 @@ // SPDX-License-Identifier: GPL-3.0-only use cosmic::widget; -use std::cmp::Ordering; -use std::path::{Path, PathBuf}; -use std::{fs, io}; +use std::{ + cmp::Ordering, + fs, io, + path::{Path, PathBuf}, +}; #[derive(Clone, Debug, Eq, PartialEq)] pub enum ProjectNode { @@ -24,15 +26,15 @@ impl ProjectNode { let path = fs::canonicalize(path)?; let name = path .file_name() - .ok_or(io::Error::other(format!( - "path {:?} has no file name", - path - )))? + .ok_or(io::Error::new( + io::ErrorKind::Other, + format!("path {:?} has no file name", path), + ))? .to_str() - .ok_or(io::Error::other(format!( - "path {:?} is not valid UTF-8", - path - )))? + .ok_or(io::Error::new( + io::ErrorKind::Other, + format!("path {:?} is not valid UTF-8", path), + ))? .to_string(); Ok(if path.is_dir() { Self::Folder { @@ -92,7 +94,7 @@ impl Ord for ProjectNode { } } } - crate::localize::LANGUAGE_SORTER.compare(self.name(), other.name()) + crate::localize::sorter().compare(self.name(), other.name()) } } diff --git a/src/thumbnail.rs b/src/thumbnail.rs index 96142d3..c7a0f42 100644 --- a/src/thumbnail.rs +++ b/src/thumbnail.rs @@ -1,9 +1,6 @@ use iced_video_player::Position; use image::{DynamicImage, ImageFormat, RgbaImage}; -use std::error::Error; -use std::num::NonZero; -use std::path::Path; -use std::time::Duration; +use std::{error::Error, num::NonZero, path::Path, time::Duration}; use url::Url; use super::video; @@ -17,7 +14,7 @@ pub fn main( let thumbnails = { let mut video = match video::new_video(input, video::VideoSettings { mute: true }) { Ok(ok) => ok, - Err(_err) => return Err(Into::into("missing required plugin".to_string())), + Err(_err) => return Err(Into::into(format!("missing required plugin"))), }; let duration = video.duration(); @@ -40,7 +37,7 @@ pub fn main( pixels, } => RgbaImage::from_raw(*width, *height, pixels.to_vec()) .map(DynamicImage::ImageRgba8) - .ok_or_else(|| "failed to convert thumbnail".to_string()), + .ok_or_else(|| format!("failed to convert thumbnail")), _ => Err(format!("unsupported thumbnail handle {:?}", thumbnails[0])), } }?; diff --git a/src/video.rs b/src/video.rs index 743f43e..fd73a68 100644 --- a/src/video.rs +++ b/src/video.rs @@ -1,8 +1,10 @@ -use iced_video_player::gst::prelude::*; -use iced_video_player::{Video, gst, gst_app, gst_pbutils}; +use iced_video_player::{ + Video, + gst::{self, prelude::*}, + gst_app, gst_pbutils, +}; -use cosmic::action; -use cosmic::app::Task; +use cosmic::{action, app::Task}; #[derive(Debug, Default)] pub struct VideoSettings { @@ -31,13 +33,13 @@ pub fn new_video( let Ok(elem) = vals[1].get::() else { return None; }; - if let Some(factory) = elem.factory() - && factory.name() == "souphttpsrc" - { - elem.set_property( - "user-agent", - "Mozilla/5.0 (X11; Linux x86_64; rv:142.0) Gecko/20100101 Firefox/142.0", - ); + if let Some(factory) = elem.factory() { + if factory.name() == "souphttpsrc" { + elem.set_property( + "user-agent", + "Mozilla/5.0 (X11; Linux x86_64; rv:142.0) Gecko/20100101 Firefox/142.0", + ); + } } None }); @@ -63,15 +65,18 @@ pub fn new_video( .unwrap() .pop_filtered(&[gst::MessageType::Element]) { - if let gst::MessageView::Element(element) = msg.view() - && gst_pbutils::MissingPluginMessage::is(element) - { - commands.push(Task::perform( - async { action::app(super::Message::MissingPlugin(msg)) }, - |x| x, - )); - // Do one codec install at a time - break; + match msg.view() { + gst::MessageView::Element(element) => { + if gst_pbutils::MissingPluginMessage::is(&element) { + commands.push(Task::perform( + async { action::app(super::Message::MissingPlugin(msg)) }, + |x| x, + )); + // Do one codec install at a time + break; + } + } + _ => {} } } pipeline.set_state(gst::State::Null).unwrap(); diff --git a/src/xdg_portals.rs b/src/xdg_portals.rs index e6630ea..357d1af 100644 --- a/src/xdg_portals.rs +++ b/src/xdg_portals.rs @@ -3,8 +3,10 @@ //! Integrations with XDG portals. -use ashpd::desktop::inhibit::{InhibitFlags, InhibitProxy}; -use ashpd::enumflags2::{BitFlags, make_bitflags}; +use ashpd::{ + desktop::inhibit::{InhibitFlags, InhibitProxy}, + enumflags2::{BitFlags, make_bitflags}, +}; use log::{debug, warn}; use tokio::sync::watch::Receiver; diff --git a/vendor/iced_video_player/.gitignore b/vendor/iced_video_player/.gitignore deleted file mode 100644 index cb8c9e0..0000000 --- a/vendor/iced_video_player/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target -.direnv \ No newline at end of file diff --git a/vendor/iced_video_player/Cargo.toml b/vendor/iced_video_player/Cargo.toml deleted file mode 100644 index 9bcea9c..0000000 --- a/vendor/iced_video_player/Cargo.toml +++ /dev/null @@ -1,88 +0,0 @@ -[package] -name = "iced_video_player" -description = "A convenient video player widget for Iced" -homepage = "https://github.com/jazzfool/iced_video_player" -repository = "https://github.com/jazzfool/iced_video_player" -readme = "README.md" -keywords = ["gui", "iced", "video"] -categories = ["gui", "multimedia"] -version = "0.6.0" -authors = ["jazzfool"] -edition = "2021" -resolver = "2" -license = "MIT OR Apache-2.0" -exclude = [".media/test.mp4"] - -[dependencies] -gstreamer = "0.25" -gstreamer-app = "0.25" # appsink -gstreamer-base = "0.25" # basesrc -gstreamer-pbutils = "0.25" -glib = "0.22" # gobject traits and error type -log = "0.4" -thiserror = "2" -url = "2" # media uri -html-escape = "0.2.13" -iced_wgpu = { path = "../../../libcosmic/iced/wgpu", default-features = false, optional = true } - -[dependencies.cosmic] -package = "libcosmic-yoda" -path = "../../../libcosmic" -default-features = false -features = ["tokio", "winit"] - -[dev-dependencies] -env_logger = "0.11" - -[features] -default = ["wgpu"] -wgpu = ["cosmic/wgpu", "iced_wgpu"] - -[package.metadata.nix] -systems = ["x86_64-linux"] -app = true -build = true -runtimeLibs = [ - "vulkan-loader", - "wayland", - "wayland-protocols", - "libxkbcommon", - "xorg.libX11", - "xorg.libXrandr", - "xorg.libXi", - "gst_all_1.gstreamer", - "gst_all_1.gstreamermm", - "gst_all_1.gst-plugins-bad", - "gst_all_1.gst-plugins-ugly", - "gst_all_1.gst-plugins-good", - "gst_all_1.gst-plugins-base", -] -buildInputs = [ - "libxkbcommon", - "gst_all_1.gstreamer", - "gst_all_1.gstreamermm", - "gst_all_1.gst-plugins-bad", - "gst_all_1.gst-plugins-ugly", - "gst_all_1.gst-plugins-good", - "gst_all_1.gst-plugins-base", -] - -[package.metadata.docs.rs] -rustc-args = ["--cfg", "docsrs"] -rustdoc-args = ["--cfg", "docsrs"] -targets = ["wasm32-unknown-unknown"] - - -# [patch.'https://github.com/pop-os/libcosmic'] -# libcosmic = { path = "../libcosmic" } -# cosmic-config = { path = "../libcosmic/cosmic-config" } -# cosmic-theme = { path = "../libcosmic/cosmic-theme" } -# libcosmic = { git = "https://github.com/pop-os/libcosmic//", branch = "iced-rebase" } -# cosmic-config = { git = "https://github.com/pop-os/libcosmic//", branch = "iced-rebase" } -# cosmic-theme = { git = "https://github.com/pop-os/libcosmic//", branch = "iced-rebase" } - -[dev_dependencies] -libcosmic = { git = "https://github.com/pop-os/libcosmic", features = [ - "wgpu", - "wayland", -] } diff --git a/vendor/iced_video_player/LICENSE-APACHE b/vendor/iced_video_player/LICENSE-APACHE deleted file mode 100644 index a7e77cb..0000000 --- a/vendor/iced_video_player/LICENSE-APACHE +++ /dev/null @@ -1,176 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/vendor/iced_video_player/LICENSE-MIT b/vendor/iced_video_player/LICENSE-MIT deleted file mode 100644 index 468cd79..0000000 --- a/vendor/iced_video_player/LICENSE-MIT +++ /dev/null @@ -1,23 +0,0 @@ -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/iced_video_player/README.md b/vendor/iced_video_player/README.md deleted file mode 100644 index 3c17b23..0000000 --- a/vendor/iced_video_player/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# Iced Video Player Widget - -Composable component to play videos in any Iced application built on the excellent GStreamer library. - - - -## Overview - -In general, this supports anything that [`gstreamer/playbin`](https://gstreamer.freedesktop.org/documentation/playback/playbin.html?gi-language=c) supports. - -Features: -- Load video files from any file path **or URL** (support for streaming over network). -- Video buffering when streaming on a network. -- Audio support. -- Programmatic control. -- Can capture thumbnails from a set of timestamps. -- Good performance (i.e., comparable to other video players). GStreamer (with the right plugins) will perform hardware-accelerated decoding, and the color space (YUV to RGB) is converted on the GPU whilst rendering the frame. - -Limitations (hopefully to be fixed): -- GStreamer is a bit annoying to set up on Windows. - -The player **does not** come with any surrounding GUI controls, but they should be quite easy to implement should you need them. -See the "minimal" example for a demonstration on how you could implement pausing, looping, and seeking. - -## Example Usage - -```rust -use iced_video_player::{Video, VideoPlayer}; - -fn main() -> iced::Result { - iced::run("Video Player", (), App::view) -} - -struct App { - video: Video, -} - -impl Default for App { - fn default() -> Self { - App { - video: Video::new(&url::Url::parse("file:///C:/my_video.mp4").unwrap()).unwrap(), - } - } -} - -impl App { - fn view(&self) -> iced::Element<()> { - VideoPlayer::new(&self.video).into() - } -} -``` - -## Building - -Follow the [GStreamer build instructions](https://github.com/sdroege/gstreamer-rs#installation). This should be able to compile on MSVC, MinGW, Linux, and MacOS. - -## License - -Licensed under either - -- [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) -- [MIT](http://opensource.org/licenses/MIT) - -at your option. diff --git a/vendor/iced_video_player/examples/minimal.rs b/vendor/iced_video_player/examples/minimal.rs deleted file mode 100644 index 0eb76c1..0000000 --- a/vendor/iced_video_player/examples/minimal.rs +++ /dev/null @@ -1,154 +0,0 @@ -use std::time::Duration; - -use cosmic::iced::{self, Program, Task, Theme}; - -use iced::{ - application::Application, - widget::{Button, Column, Container, Row, Slider, Text}, -}; -use iced_video_player::{Video, VideoPlayer}; - -pub fn main() -> iced::Result { - application().run() -} - -fn application() -> Application> { - iced::application(App::default, App::update, App::view).window_size((500.0, 800.0)) -} - -#[derive(Clone, Debug)] -enum Message { - TogglePause, - ToggleLoop, - Seek(f64), - SeekRelease, - EndOfStream, - NewFrame, -} - -struct App { - video: Video, - position: f64, - dragging: bool, -} - -impl Default for App { - fn default() -> Self { - App { - video: Video::new( - &url::Url::from_file_path( - std::path::PathBuf::from(file!()) - .parent() - .unwrap() - .join("../.media/test.mp4") - .canonicalize() - .unwrap(), - ) - .unwrap(), - ) - .unwrap(), - position: 0.0, - dragging: false, - } - } -} - -impl App { - fn update(&mut self, message: Message) -> Task { - match message { - Message::TogglePause => { - self.video.set_paused(!self.video.paused()); - } - Message::ToggleLoop => { - self.video.set_looping(!self.video.looping()); - } - Message::Seek(secs) => { - self.dragging = true; - self.video.set_paused(true); - self.position = secs; - } - Message::SeekRelease => { - self.dragging = false; - self.video - .seek(Duration::from_secs_f64(self.position), false) - .expect("seek"); - self.video.set_paused(false); - } - Message::EndOfStream => { - println!("end of stream"); - } - Message::NewFrame => { - if !self.dragging { - self.position = self.video.position().as_secs_f64(); - } - } - } - Task::none() - } - - fn view(&self) -> iced::Element<'_, Message> { - Column::new() - .push( - Container::new( - VideoPlayer::new(&self.video) - .width(iced::Length::Fill) - .height(iced::Length::Fill) - .content_fit(iced::ContentFit::Contain) - .on_end_of_stream(Message::EndOfStream) - .on_new_frame(Message::NewFrame), - ) - .align_x(iced::Alignment::Center) - .align_y(iced::Alignment::Center) - .width(iced::Length::Fill) - .height(iced::Length::Fill), - ) - .push( - Container::new( - Slider::new( - 0.0..=self.video.duration().as_secs_f64(), - self.position, - Message::Seek, - ) - .step(0.1) - .on_release(Message::SeekRelease), - ) - .padding(iced::Padding::new(5.0).left(10.0).right(10.0)), - ) - .push( - Row::new() - .spacing(5) - .align_y(iced::alignment::Vertical::Center) - .padding(iced::Padding::new(10.0).top(0.0)) - .push( - Button::new(Text::new(if self.video.paused() { - "Play" - } else { - "Pause" - })) - .width(80.0) - .on_press(Message::TogglePause), - ) - .push( - Button::new(Text::new(if self.video.looping() { - "Disable Loop" - } else { - "Enable Loop" - })) - .width(120.0) - .on_press(Message::ToggleLoop), - ) - .push( - Text::new(format!( - "{}:{:02}s / {}:{:02}s", - self.position as u64 / 60, - self.position as u64 % 60, - self.video.duration().as_secs() / 60, - self.video.duration().as_secs() % 60, - )) - .width(iced::Length::Fill) - .align_x(iced::alignment::Horizontal::Right), - ), - ) - .into() - } -} diff --git a/vendor/iced_video_player/src/lib.rs b/vendor/iced_video_player/src/lib.rs deleted file mode 100644 index f0c8584..0000000 --- a/vendor/iced_video_player/src/lib.rs +++ /dev/null @@ -1,79 +0,0 @@ -//! # Iced Video Player -//! -//! A convenient video player widget for Iced. -//! -//! To get started, load a video from a URI (e.g., a file path prefixed with `file:///`) using [`Video::new`](crate::Video::new), -//! then use it like any other Iced widget in your `view` function by creating a [`VideoPlayer`]. -//! -//! Example: -//! ```rust -//! use iced_video_player::{Video, VideoPlayer}; -//! -//! fn main() -> iced::Result { -//! iced::run("Video Player", (), App::view) -//! } -//! -//! struct App { -//! video: Video, -//! } -//! -//! impl Default for App { -//! fn default() -> Self { -//! App { -//! video: Video::new(&url::Url::parse("file:///C:/my_video.mp4").unwrap()).unwrap(), -//! } -//! } -//! } -//! -//! impl App { -//! fn view(&self) -> iced::Element<()> { -//! VideoPlayer::new(&self.video).into() -//! } -//! } -//! ``` -//! -//! You can programmatically control the video (e.g., seek, pause, loop, grab thumbnails) by accessing various methods on [`Video`]. - -#[cfg(feature = "wgpu")] -mod pipeline; -mod video; -mod video_player; - -pub use gstreamer as gst; -pub use gstreamer_app as gst_app; -pub use gstreamer_pbutils as gst_pbutils; -use thiserror::Error; - -pub use video::Position; -pub use video::Video; -pub use video_player::VideoPlayer; - -#[derive(Debug, Error)] -pub enum Error { - #[error("{0}")] - Glib(#[from] glib::Error), - #[error("{0}")] - Bool(#[from] glib::BoolError), - #[error("failed to get the gstreamer bus")] - Bus, - #[error("failed to get AppSink element with name='{0}' from gstreamer pipeline")] - AppSink(String), - #[error("{0}")] - StateChange(#[from] gst::StateChangeError), - #[error("failed to cast gstreamer element")] - Cast, - #[error("{0}")] - Io(#[from] std::io::Error), - #[error("invalid URI")] - Uri, - #[error("failed to get media capabilities")] - Caps, - #[error("failed to query media duration or position")] - Duration, - #[error("failed to sync with playback")] - Sync, - #[error("failed to lock internal sync primitive")] - Lock, - #[error("invalid framerate: {0}")] - Framerate(f64), -} diff --git a/vendor/iced_video_player/src/pipeline.rs b/vendor/iced_video_player/src/pipeline.rs deleted file mode 100644 index 2d9d3e7..0000000 --- a/vendor/iced_video_player/src/pipeline.rs +++ /dev/null @@ -1,447 +0,0 @@ -use cosmic::iced::wgpu; -use cosmic::iced::widget::shader::{Pipeline, Primitive, Viewport}; -use cosmic::iced::{self, Rectangle}; -use std::{ - collections::{btree_map::Entry, BTreeMap}, - sync::{ - atomic::{AtomicBool, Ordering}, - Arc, Mutex, - }, -}; - -use crate::video::Frame; - -#[repr(C)] -struct Uniforms { - rect: [f32; 4], -} - -struct VideoEntry { - texture_y: wgpu::Texture, - texture_uv: wgpu::Texture, - uniforms: wgpu::Buffer, - bg0: wgpu::BindGroup, - alive: Arc, -} - -pub struct VideoPipeline { - pipeline: wgpu::RenderPipeline, - bg0_layout: wgpu::BindGroupLayout, - sampler: wgpu::Sampler, - videos: BTreeMap, -} - -impl VideoPipeline { - fn new(device: &wgpu::Device, format: wgpu::TextureFormat, queue: &wgpu::Queue) -> Self { - let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { - label: Some("iced_video_player shader"), - source: wgpu::ShaderSource::Wgsl(include_str!("shader.wgsl").into()), - }); - - let bg0_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { - label: Some("iced_video_player bind group 0 layout"), - entries: &[ - wgpu::BindGroupLayoutEntry { - binding: 0, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Texture { - sample_type: wgpu::TextureSampleType::Float { filterable: true }, - view_dimension: wgpu::TextureViewDimension::D2, - multisampled: false, - }, - count: None, - }, - wgpu::BindGroupLayoutEntry { - binding: 1, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Texture { - sample_type: wgpu::TextureSampleType::Float { filterable: true }, - view_dimension: wgpu::TextureViewDimension::D2, - multisampled: false, - }, - count: None, - }, - wgpu::BindGroupLayoutEntry { - binding: 2, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), - count: None, - }, - wgpu::BindGroupLayoutEntry { - binding: 3, - visibility: wgpu::ShaderStages::VERTEX, - ty: wgpu::BindingType::Buffer { - ty: wgpu::BufferBindingType::Uniform, - has_dynamic_offset: false, - min_binding_size: None, - }, - count: None, - }, - ], - }); - - let layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { - label: Some("iced_video_player pipeline layout"), - bind_group_layouts: &[&bg0_layout], - push_constant_ranges: &[], - }); - - let pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label: Some("iced_video_player pipeline"), - layout: Some(&layout), - vertex: wgpu::VertexState { - module: &shader, - entry_point: Some("vs_main"), - buffers: &[], - compilation_options: wgpu::PipelineCompilationOptions::default(), - }, - primitive: wgpu::PrimitiveState::default(), - depth_stencil: None, - multisample: wgpu::MultisampleState { - count: 1, - mask: !0, - alpha_to_coverage_enabled: false, - }, - fragment: Some(wgpu::FragmentState { - module: &shader, - entry_point: Some("fs_main"), - targets: &[Some(wgpu::ColorTargetState { - format, - blend: None, - write_mask: wgpu::ColorWrites::ALL, - })], - compilation_options: wgpu::PipelineCompilationOptions::default(), - }), - multiview: None, - cache: None, - }); - - let sampler = device.create_sampler(&wgpu::SamplerDescriptor { - label: Some("iced_video_player sampler"), - address_mode_u: wgpu::AddressMode::ClampToEdge, - address_mode_v: wgpu::AddressMode::ClampToEdge, - address_mode_w: wgpu::AddressMode::ClampToEdge, - mag_filter: wgpu::FilterMode::Linear, - min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Nearest, - lod_min_clamp: 0.0, - lod_max_clamp: 1.0, - compare: None, - anisotropy_clamp: 1, - border_color: None, - }); - - VideoPipeline { - pipeline, - bg0_layout, - sampler, - videos: BTreeMap::new(), - } - } - - fn upload( - &mut self, - device: &wgpu::Device, - queue: &wgpu::Queue, - video_id: u64, - alive: &Arc, - (width, height): (u32, u32), - frame: &[u8], - ) { - if width == 0 || height == 0 { - return; - } - - if let Entry::Vacant(entry) = self.videos.entry(video_id) { - let texture_y = device.create_texture(&wgpu::TextureDescriptor { - label: Some("iced_video_player texture"), - size: wgpu::Extent3d { - width, - height, - depth_or_array_layers: 1, - }, - mip_level_count: 1, - sample_count: 1, - dimension: wgpu::TextureDimension::D2, - format: wgpu::TextureFormat::R8Unorm, - usage: wgpu::TextureUsages::COPY_DST | wgpu::TextureUsages::TEXTURE_BINDING, - view_formats: &[], - }); - - let texture_uv = device.create_texture(&wgpu::TextureDescriptor { - label: Some("iced_video_player texture"), - size: wgpu::Extent3d { - width: width / 2, - height: height / 2, - depth_or_array_layers: 1, - }, - mip_level_count: 1, - sample_count: 1, - dimension: wgpu::TextureDimension::D2, - format: wgpu::TextureFormat::Rg8Unorm, - usage: wgpu::TextureUsages::COPY_DST | wgpu::TextureUsages::TEXTURE_BINDING, - view_formats: &[], - }); - - let view_y = texture_y.create_view(&wgpu::TextureViewDescriptor { - label: Some("iced_video_player texture view"), - format: None, - dimension: None, - aspect: wgpu::TextureAspect::All, - base_mip_level: 0, - mip_level_count: None, - base_array_layer: 0, - array_layer_count: None, - usage: None, - }); - - let view_uv = texture_uv.create_view(&wgpu::TextureViewDescriptor { - label: Some("iced_video_player texture view"), - format: None, - dimension: None, - aspect: wgpu::TextureAspect::All, - base_mip_level: 0, - mip_level_count: None, - base_array_layer: 0, - array_layer_count: None, - usage: None, - }); - - let buffer = device.create_buffer(&wgpu::BufferDescriptor { - label: Some("iced_video_player uniform buffer"), - size: std::mem::size_of::() as _, - usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::UNIFORM, - mapped_at_creation: false, - }); - - let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - label: Some("iced_video_player bind group"), - layout: &self.bg0_layout, - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: wgpu::BindingResource::TextureView(&view_y), - }, - wgpu::BindGroupEntry { - binding: 1, - resource: wgpu::BindingResource::TextureView(&view_uv), - }, - wgpu::BindGroupEntry { - binding: 2, - resource: wgpu::BindingResource::Sampler(&self.sampler), - }, - wgpu::BindGroupEntry { - binding: 3, - resource: wgpu::BindingResource::Buffer(wgpu::BufferBinding { - buffer: &buffer, - offset: 0, - size: None, - }), - }, - ], - }); - - entry.insert(VideoEntry { - texture_y, - texture_uv, - uniforms: buffer, - bg0: bind_group, - alive: Arc::clone(alive), - }); - } - - let VideoEntry { - texture_y, - texture_uv, - .. - } = self.videos.get(&video_id).unwrap(); - - queue.write_texture( - wgpu::TexelCopyTextureInfo { - texture: texture_y, - mip_level: 0, - origin: wgpu::Origin3d::ZERO, - aspect: wgpu::TextureAspect::All, - }, - &frame[..(width * height) as usize], - wgpu::TexelCopyBufferLayout { - offset: 0, - bytes_per_row: Some(width), - rows_per_image: Some(height), - }, - wgpu::Extent3d { - width, - height, - depth_or_array_layers: 1, - }, - ); - - queue.write_texture( - wgpu::TexelCopyTextureInfo { - texture: texture_uv, - mip_level: 0, - origin: wgpu::Origin3d::ZERO, - aspect: wgpu::TextureAspect::All, - }, - &frame[(width * height) as usize..], - wgpu::TexelCopyBufferLayout { - offset: 0, - bytes_per_row: Some(width), - rows_per_image: Some(height / 2), - }, - wgpu::Extent3d { - width: width / 2, - height: height / 2, - depth_or_array_layers: 1, - }, - ); - } - - fn cleanup(&mut self) { - let ids: Vec<_> = self - .videos - .iter() - .filter_map(|(id, entry)| (!entry.alive.load(Ordering::SeqCst)).then_some(*id)) - .collect(); - for id in ids { - if let Some(video) = self.videos.remove(&id) { - video.texture_y.destroy(); - video.texture_uv.destroy(); - video.uniforms.destroy(); - } - } - } - - fn prepare(&mut self, queue: &wgpu::Queue, video_id: u64, bounds: &iced::Rectangle) { - if let Some(video) = self.videos.get(&video_id) { - let uniforms = Uniforms { - rect: [ - bounds.x, - bounds.y, - bounds.x + bounds.width, - bounds.y + bounds.height, - ], - }; - queue.write_buffer(&video.uniforms, 0, unsafe { - std::slice::from_raw_parts( - &uniforms as *const _ as *const u8, - std::mem::size_of::(), - ) - }); - } - - self.cleanup(); - } - - fn draw( - &self, - target: &wgpu::TextureView, - encoder: &mut wgpu::CommandEncoder, - viewport: &iced::Rectangle, - video_id: u64, - ) { - if let Some(video) = self.videos.get(&video_id) { - let mut pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { - label: Some("iced_video_player render pass"), - color_attachments: &[Some(wgpu::RenderPassColorAttachment { - view: target, - resolve_target: None, - ops: wgpu::Operations { - load: wgpu::LoadOp::Load, - store: wgpu::StoreOp::Store, - }, - depth_slice: None, - })], - depth_stencil_attachment: None, - timestamp_writes: None, - occlusion_query_set: None, - }); - - pass.set_pipeline(&self.pipeline); - pass.set_bind_group(0, &video.bg0, &[]); - pass.set_viewport( - viewport.x as _, - viewport.y as _, - viewport.width as _, - viewport.height as _, - 0.0, - 1.0, - ); - pass.draw(0..4, 0..1); - } - } -} - -impl Pipeline for VideoPipeline { - fn new(device: &wgpu::Device, queue: &wgpu::Queue, format: wgpu::TextureFormat) -> Self - where - Self: Sized, - { - VideoPipeline::new(device, format, queue) - } -} - -#[derive(Debug, Clone)] -pub(crate) struct VideoPrimitive { - video_id: u64, - alive: Arc, - frame: Arc>, - size: (u32, u32), - upload_frame: bool, -} - -impl VideoPrimitive { - pub fn new( - video_id: u64, - alive: Arc, - frame: Arc>, - size: (u32, u32), - upload_frame: bool, - ) -> Self { - VideoPrimitive { - video_id, - alive, - frame, - size, - upload_frame, - } - } -} - -impl Primitive for VideoPrimitive { - type Pipeline = VideoPipeline; - - fn prepare( - &self, - pipeline: &mut Self::Pipeline, - device: &wgpu::Device, - queue: &wgpu::Queue, - bounds: &Rectangle, - viewport: &Viewport, - ) { - if self.upload_frame { - if let Some(readable) = self.frame.lock().expect("lock frame mutex").readable() { - pipeline.upload( - device, - queue, - self.video_id, - &self.alive, - self.size, - readable.as_slice(), - ); - } - } - - pipeline.prepare(queue, self.video_id, &bounds); - } - - fn render( - &self, - pipeline: &Self::Pipeline, - encoder: &mut wgpu::CommandEncoder, - target: &wgpu::TextureView, - clip_bounds: &Rectangle, - ) { - pipeline.draw(target, encoder, &clip_bounds, self.video_id); - } -} diff --git a/vendor/iced_video_player/src/shader.wgsl b/vendor/iced_video_player/src/shader.wgsl deleted file mode 100644 index f1d85f5..0000000 --- a/vendor/iced_video_player/src/shader.wgsl +++ /dev/null @@ -1,58 +0,0 @@ -struct VertexOutput { - @builtin(position) position: vec4, - @location(0) uv: vec2, -} - -struct Uniforms { - rect: vec4, -} - -@group(0) @binding(0) -var tex_y: texture_2d; - -@group(0) @binding(1) -var tex_uv: texture_2d; - -@group(0) @binding(2) -var s: sampler; - -@group(0) @binding(3) -var uniforms: Uniforms; - -@vertex -fn vs_main(@builtin(vertex_index) in_vertex_index: u32) -> VertexOutput { - let quad = array, 6>( - uniforms.rect.xy, - uniforms.rect.zy, - uniforms.rect.xw, - uniforms.rect.zy, - uniforms.rect.zw, - uniforms.rect.xw, - ); - - var out: VertexOutput; - out.uv = vec2(0.0); - out.uv.x = select(0.0, 2.0, in_vertex_index == 1u); - out.uv.y = select(0.0, 2.0, in_vertex_index == 2u); - out.position = vec4(out.uv * vec2(2.0, -2.0) + vec2(-1.0, 1.0), 1.0, 1.0); - return out; -} - -@fragment -fn fs_main(in: VertexOutput) -> @location(0) vec4 { - let yuv2r = vec3(1.164, 0.0, 1.596); - let yuv2g = vec3(1.164, -0.391, -0.813); - let yuv2b = vec3(1.164, 2.018, 0.0); - - var yuv = vec3(0.0); - yuv.x = textureSample(tex_y, s, in.uv).r - 0.0625; - yuv.y = textureSample(tex_uv, s, in.uv).r - 0.5; - yuv.z = textureSample(tex_uv, s, in.uv).g - 0.5; - - var rgb = vec3(0.0); - rgb.x = dot(yuv, yuv2r); - rgb.y = dot(yuv, yuv2g); - rgb.z = dot(yuv, yuv2b); - - return vec4(rgb, 1.0); -} diff --git a/vendor/iced_video_player/src/video.rs b/vendor/iced_video_player/src/video.rs deleted file mode 100644 index 48e521c..0000000 --- a/vendor/iced_video_player/src/video.rs +++ /dev/null @@ -1,664 +0,0 @@ -use crate::Error; -use cosmic::iced::widget::image as img; -use gstreamer as gst; -use gstreamer_app as gst_app; -use gstreamer_app::prelude::*; -use std::num::NonZeroU8; -use std::ops::{Deref, DerefMut}; -use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; -use std::sync::{Arc, Mutex, RwLock}; -use std::time::{Duration, Instant}; - -const THUMBNAIL_FRAME_TIMEOUT: Duration = Duration::from_secs(10); - -/// Position in the media. -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub enum Position { - /// Position based on time. - /// - /// Not the most accurate format for videos. - Time(Duration), - /// Position based on nth frame. - Frame(u64), -} - -impl From for gst::GenericFormattedValue { - fn from(pos: Position) -> Self { - match pos { - Position::Time(t) => gst::ClockTime::from_nseconds(t.as_nanos() as _).into(), - Position::Frame(f) => gst::format::Default::from_u64(f).into(), - } - } -} - -impl From for Position { - fn from(t: Duration) -> Self { - Position::Time(t) - } -} - -impl From for Position { - fn from(f: u64) -> Self { - Position::Frame(f) - } -} - -#[derive(Debug)] -pub(crate) struct Frame(gst::Sample); - -impl Frame { - pub fn new() -> Self { - Self(gst::Sample::builder().build()) - } - pub fn store(&mut self, sample: gst::Sample) -> Option<()> { - if sample.buffer().is_some() { - self.0 = sample; - Some(()) - } else { - None - } - } - pub fn readable(&self) -> Option> { - self.0.buffer().map(|x| x.map_readable().ok()).flatten() - } -} - -#[derive(Debug)] -pub(crate) struct Internal { - pub(crate) id: u64, - - pub(crate) bus: gst::Bus, - pub(crate) source: gst::Pipeline, - pub(crate) alive: Arc, - pub(crate) worker: Option>, - - pub(crate) has_video: bool, - pub(crate) width: i32, - pub(crate) height: i32, - pub(crate) framerate: f64, - pub(crate) duration: Duration, - pub(crate) speed: f64, - pub(crate) sync_av: bool, - - pub(crate) frame: Arc>, - pub(crate) upload_frame: Arc, - pub(crate) redrawing: Arc, - pub(crate) last_frame_time: Arc>, - pub(crate) looping: bool, - pub(crate) is_eos: bool, - pub(crate) restart_stream: bool, - pub(crate) sync_av_avg: u64, - pub(crate) sync_av_counter: u64, - - pub(crate) subtitle_text: Arc>>, - pub(crate) upload_text: Arc, - - #[cfg(not(feature = "wgpu"))] - pub(crate) handle_opt: Option, -} - -impl Internal { - pub(crate) fn seek(&self, position: impl Into, accurate: bool) -> Result<(), Error> { - let position = position.into(); - - // gstreamer complains if the start & end value types aren't the same - match &position { - Position::Time(_) => self.source.seek( - self.speed, - gst::SeekFlags::FLUSH - | if accurate { - gst::SeekFlags::ACCURATE - } else { - gst::SeekFlags::empty() - }, - gst::SeekType::Set, - gst::GenericFormattedValue::from(position), - gst::SeekType::Set, - gst::ClockTime::NONE, - )?, - Position::Frame(_) => self.source.seek( - self.speed, - gst::SeekFlags::FLUSH - | if accurate { - gst::SeekFlags::ACCURATE - } else { - gst::SeekFlags::empty() - }, - gst::SeekType::Set, - gst::GenericFormattedValue::from(position), - gst::SeekType::Set, - gst::format::Default::NONE, - )?, - }; - - Ok(()) - } - - pub(crate) fn set_speed(&mut self, speed: f64) -> Result<(), Error> { - let Some(position) = self.source.query_position::() else { - return Err(Error::Caps); - }; - if speed > 0.0 { - self.source.seek( - speed, - gst::SeekFlags::FLUSH | gst::SeekFlags::ACCURATE, - gst::SeekType::Set, - position, - gst::SeekType::End, - gst::ClockTime::from_seconds(0), - )?; - } else { - self.source.seek( - speed, - gst::SeekFlags::FLUSH | gst::SeekFlags::ACCURATE, - gst::SeekType::Set, - gst::ClockTime::from_seconds(0), - gst::SeekType::Set, - position, - )?; - } - self.speed = speed; - Ok(()) - } - - pub(crate) fn restart_stream(&mut self) -> Result<(), Error> { - self.is_eos = false; - self.set_paused(false); - self.seek(0, false)?; - Ok(()) - } - - pub(crate) fn set_paused(&mut self, paused: bool) { - self.source - .set_state(if paused { - gst::State::Paused - } else { - gst::State::Playing - }) - .unwrap(/* state was changed in ctor; state errors caught there */); - - // Set restart_stream flag to make the stream restart on the next Message::NextFrame - if self.is_eos && !paused { - self.restart_stream = true; - } - } - - pub(crate) fn paused(&self) -> bool { - self.source.state(gst::ClockTime::ZERO).1 == gst::State::Paused - } - - /// Syncs audio with video when there is (inevitably) latency presenting the frame. - pub(crate) fn set_av_offset(&mut self, offset: Duration) { - if self.sync_av { - self.sync_av_counter += 1; - self.sync_av_avg = self.sync_av_avg * (self.sync_av_counter - 1) / self.sync_av_counter - + offset.as_nanos() as u64 / self.sync_av_counter; - if self.sync_av_counter % 128 == 0 { - self.source - .set_property("av-offset", -(self.sync_av_avg as i64)); - } - } - } -} - -/// A multimedia video loaded from a URI (e.g., a local file path or HTTP stream). -#[derive(Debug)] -pub struct Video(pub(crate) RwLock); - -impl Drop for Video { - fn drop(&mut self) { - let inner = self.0.get_mut().expect("failed to lock"); - - inner - .source - .set_state(gst::State::Null) - .expect("failed to set state"); - - inner.alive.store(false, Ordering::SeqCst); - if let Some(worker) = inner.worker.take() { - worker.join().expect("failed to stop video thread"); - } - } -} - -impl Video { - /// Create a new video player from a given video which loads from `uri`. - /// Note that live sources will report the duration to be zero. - pub fn new(uri: &url::Url) -> Result { - gst::init()?; - - let pipeline = format!( - "playbin uri=\"{}\" text-sink=\"appsink name=iced_text sync=true caps=text/x-raw\" video-sink=\"videoscale ! videoconvert ! appsink name=iced_video drop=true caps=video/x-raw,format=NV12,pixel-aspect-ratio=1/1\"", - uri.as_str() - ); - let pipeline = gst::parse::launch(pipeline.as_ref())? - .downcast::() - .map_err(|_| Error::Cast)?; - - let video_sink: gst::Element = pipeline.property("video-sink"); - let pad = video_sink.pads().first().cloned().unwrap(); - let pad = pad.dynamic_cast::().unwrap(); - let bin = pad - .parent_element() - .unwrap() - .downcast::() - .unwrap(); - let video_sink = bin.by_name("iced_video").unwrap(); - let video_sink = video_sink.downcast::().unwrap(); - - let text_sink: gst::Element = pipeline.property("text-sink"); - let text_sink = text_sink.downcast::().unwrap(); - - Self::from_gst_pipeline(pipeline, video_sink, Some(text_sink)) - } - - /// Creates a new video based on an existing GStreamer pipeline and appsink. - /// Expects an `appsink` plugin with `caps=video/x-raw,format=NV12`. - /// - /// An optional `text_sink` can be provided, which enables subtitle messages - /// to be emitted. - /// - /// **Note:** Many functions of [`Video`] assume a `playbin` pipeline. - /// Non-`playbin` pipelines given here may not have full functionality. - pub fn from_gst_pipeline( - pipeline: gst::Pipeline, - video_sink: gst_app::AppSink, - text_sink: Option, - ) -> Result { - gst::init()?; - static NEXT_ID: AtomicU64 = AtomicU64::new(0); - let id = NEXT_ID.fetch_add(1, Ordering::SeqCst); - - let pad = video_sink.pads().first().cloned().unwrap(); - - pipeline.set_state(gst::State::Playing)?; - - // wait for up to 5 seconds until the decoder gets the source capabilities - pipeline.state(gst::ClockTime::from_seconds(5)).0?; - - // extract resolution and framerate - // TODO(jazzfool): maybe we want to extract some other information too? - let (width, height, framerate, has_video) = if let Some(caps) = pad.current_caps() { - let s = caps.structure(0).ok_or(Error::Caps)?; - let width = s.get::("width").map_err(|_| Error::Caps)?; - let height = s.get::("height").map_err(|_| Error::Caps)?; - // resolution should be mod4 - let width = ((width + 4 - 1) / 4) * 4; - let framerate = s - .get::("framerate") - .map_err(|_| Error::Caps)?; - let framerate = framerate.numer() as f64 / framerate.denom() as f64; - (width, height, framerate, true) - } else { - log::warn!("Video caps not found, falling back to audio only"); - (0, 0, 4.0, false) - }; - - if framerate.is_nan() - || framerate.is_infinite() - || framerate < 0.0 - || framerate.abs() < f64::EPSILON - { - return Err(Error::Framerate(framerate)); - } - - let duration = Duration::from_nanos( - pipeline - .query_duration::() - .map(|duration| duration.nseconds()) - .unwrap_or(0), - ); - - let sync_av = pipeline.has_property("av-offset"); - - // NV12 = 12bpp - let frame = Arc::new(Mutex::new(Frame::new())); - let upload_frame = Arc::new(AtomicBool::new(false)); - let alive = Arc::new(AtomicBool::new(true)); - let last_frame_time = Arc::new(Mutex::new(Instant::now())); - - let frame_ref = Arc::clone(&frame); - let upload_frame_ref = Arc::clone(&upload_frame); - let alive_ref = Arc::clone(&alive); - let last_frame_time_ref = Arc::clone(&last_frame_time); - - let subtitle_text = Arc::new(Mutex::new(None)); - let upload_text = Arc::new(AtomicBool::new(false)); - let subtitle_text_ref = Arc::clone(&subtitle_text); - let upload_text_ref = Arc::clone(&upload_text); - - let pipeline_ref = pipeline.clone(); - - let worker = std::thread::spawn(move || { - let mut clear_subtitles_at = None; - - while alive_ref.load(Ordering::Acquire) { - match (|| -> Result<(), gst::FlowError> { - let sample = - if pipeline_ref.state(gst::ClockTime::ZERO).1 != gst::State::Playing { - video_sink - .try_pull_preroll(gst::ClockTime::from_mseconds(16)) - .ok_or(gst::FlowError::Eos)? - } else { - video_sink - .try_pull_sample(gst::ClockTime::from_mseconds(16)) - .ok_or(gst::FlowError::Eos)? - }; - - *last_frame_time_ref - .lock() - .map_err(|_| gst::FlowError::Error)? = Instant::now(); - - let buffer = sample.buffer().ok_or(gst::FlowError::Error)?; - let pts = buffer.pts().unwrap_or_default(); - { - let mut frame_guard = - frame_ref.lock().map_err(|_| gst::FlowError::Error)?; - *frame_guard = Frame(sample); - } - - upload_frame_ref.swap(true, Ordering::SeqCst); - - if let Some(at) = clear_subtitles_at { - if pts >= at { - *subtitle_text_ref - .lock() - .map_err(|_| gst::FlowError::Error)? = None; - upload_text_ref.store(true, Ordering::SeqCst); - clear_subtitles_at = None; - } - } - - let text = text_sink - .as_ref() - .and_then(|sink| sink.try_pull_sample(gst::ClockTime::from_seconds(0))); - if let Some(text) = text { - let text = text.buffer().ok_or(gst::FlowError::Error)?; - let pts = text.pts().unwrap_or_default(); - let duration = text.duration().unwrap_or(gst::ClockTime::ZERO); - let map = text.map_readable().map_err(|_| gst::FlowError::Error)?; - - let text = html_escape::decode_html_entities( - std::str::from_utf8(map.as_slice()) - .map_err(|_| gst::FlowError::Error)?, - ) - .to_string(); - *subtitle_text_ref - .lock() - .map_err(|_| gst::FlowError::Error)? = Some(text); - upload_text_ref.store(true, Ordering::SeqCst); - - clear_subtitles_at = Some(pts + duration); - } - - Ok(()) - })() { - Ok(()) => {} - Err(gst::FlowError::Eos) => { - if !has_video { - // Simulate frame upload when there is no video stream - upload_frame_ref.swap(true, Ordering::SeqCst); - std::thread::sleep(Duration::from_secs_f64(1.0 / framerate)); - } - } - Err(err) => { - log::error!("error pulling frame: {err}"); - } - } - } - }); - - Ok(Video(RwLock::new(Internal { - id, - - bus: pipeline.bus().unwrap(), - source: pipeline, - alive, - worker: Some(worker), - - has_video, - width, - height, - framerate, - duration, - speed: 1.0, - sync_av, - - frame, - upload_frame, - redrawing: Arc::new(AtomicBool::new(false)), - last_frame_time, - looping: false, - is_eos: false, - restart_stream: false, - sync_av_avg: 0, - sync_av_counter: 0, - - subtitle_text, - upload_text, - - #[cfg(not(feature = "wgpu"))] - handle_opt: None, - }))) - } - - pub(crate) fn read(&self) -> impl Deref + '_ { - self.0.read().expect("lock") - } - - pub(crate) fn write(&self) -> impl DerefMut + '_ { - self.0.write().expect("lock") - } - - pub(crate) fn get_mut(&mut self) -> impl DerefMut + '_ { - self.0.get_mut().expect("lock") - } - - pub fn has_video(&self) -> bool { - self.read().has_video - } - - /// Get the size/resolution of the video as `(width, height)`. - pub fn size(&self) -> (i32, i32) { - (self.read().width, self.read().height) - } - - /// Get the framerate of the video as frames per second. - pub fn framerate(&self) -> f64 { - self.read().framerate - } - - /// Set the volume multiplier of the audio. - /// `0.0` = 0% volume, `1.0` = 100% volume. - /// - /// This uses a linear scale, for example `0.5` is perceived as half as loud. - pub fn set_volume(&mut self, volume: f64) { - self.get_mut().source.set_property("volume", volume); - self.set_muted(self.muted()); // for some reason gstreamer unmutes when changing volume? - } - - /// Get the volume multiplier of the audio. - pub fn volume(&self) -> f64 { - self.read().source.property("volume") - } - - /// Set if the audio is muted or not, without changing the volume. - pub fn set_muted(&mut self, muted: bool) { - self.get_mut().source.set_property("mute", muted); - } - - /// Get if the audio is muted or not. - pub fn muted(&self) -> bool { - self.read().source.property("mute") - } - - /// Get if the stream ended or not. - pub fn eos(&self) -> bool { - self.read().is_eos - } - - /// Get if the media will loop or not. - pub fn looping(&self) -> bool { - self.read().looping - } - - /// Set if the media will loop or not. - pub fn set_looping(&mut self, looping: bool) { - self.get_mut().looping = looping; - } - - /// Set if the media is paused or not. - pub fn set_paused(&mut self, paused: bool) { - self.get_mut().set_paused(paused) - } - - /// Get if the media is paused or not. - pub fn paused(&self) -> bool { - self.read().paused() - } - - /// Jumps to a specific position in the media. - /// Passing `true` to the `accurate` parameter will result in more accurate seeking, - /// however, it is also slower. For most seeks (e.g., scrubbing) this is not needed. - pub fn seek(&mut self, position: impl Into, accurate: bool) -> Result<(), Error> { - self.get_mut().seek(position, accurate) - } - - /// Set the playback speed of the media. - /// The default speed is `1.0`. - pub fn set_speed(&mut self, speed: f64) -> Result<(), Error> { - self.get_mut().set_speed(speed) - } - - /// Get the current playback speed. - pub fn speed(&self) -> f64 { - self.read().speed - } - - /// Get the current playback position in time. - pub fn position(&self) -> Duration { - Duration::from_nanos( - self.read() - .source - .query_position::() - .map_or(0, |pos| pos.nseconds()), - ) - } - - /// Get the media duration. - pub fn duration(&self) -> Duration { - self.read().duration - } - - /// Restarts a stream; seeks to the first frame and unpauses, sets the `eos` flag to false. - pub fn restart_stream(&mut self) -> Result<(), Error> { - self.get_mut().restart_stream() - } - - /// Set the subtitle URL to display. - pub fn set_subtitle_url(&mut self, url: &url::Url) -> Result<(), Error> { - let paused = self.paused(); - let mut inner = self.get_mut(); - inner.source.set_state(gst::State::Ready)?; - inner.source.set_property("suburi", url.as_str()); - inner.set_paused(paused); - Ok(()) - } - - /// Get the current subtitle URL. - pub fn subtitle_url(&self) -> Option { - url::Url::parse(&self.read().source.property::("suburi")).ok() - } - - /// Get the underlying GStreamer pipeline. - pub fn pipeline(&self) -> gst::Pipeline { - self.read().source.clone() - } - - /// Generates a list of thumbnails based on a set of positions in the media, downscaled by a given factor. - /// - /// Slow; only needs to be called once for each instance. - /// It's best to call this at the very start of playback, otherwise the position may shift. - pub fn thumbnails( - &mut self, - positions: I, - downscale: NonZeroU8, - ) -> Result, Error> - where - I: IntoIterator, - { - let downscale = u8::from(downscale) as u32; - - let paused = self.paused(); - let muted = self.muted(); - let pos = self.position(); - - self.set_paused(false); - self.set_muted(true); - - let out = { - let inner = self.read(); - let width = inner.width; - let height = inner.height; - positions - .into_iter() - .map(|pos| { - inner.seek(pos, true)?; - - inner.upload_frame.store(false, Ordering::SeqCst); - - let started = Instant::now(); - while !inner.upload_frame.load(Ordering::SeqCst) { - if started.elapsed() >= THUMBNAIL_FRAME_TIMEOUT { - return Err(Error::Sync); - } - std::thread::sleep(Duration::from_millis(5)); - } - let frame_guard = inner.frame.lock().map_err(|_| Error::Lock)?; - let frame = frame_guard.readable().ok_or(Error::Lock)?; - - Ok(img::Handle::from_rgba( - inner.width as u32 / downscale, - inner.height as u32 / downscale, - yuv_to_rgba(frame.as_slice(), width as _, height as _, downscale), - )) - }) - .collect() - }; - - self.set_paused(paused); - self.set_muted(muted); - self.seek(pos, true)?; - - out - } -} - -pub(crate) fn yuv_to_rgba(yuv: &[u8], width: u32, height: u32, downscale: u32) -> Vec { - let uv_start = width * height; - let mut rgba = vec![]; - - for y in 0..height / downscale { - for x in 0..width / downscale { - let x_src = x * downscale; - let y_src = y * downscale; - - let uv_i = uv_start + width * (y_src / 2) + x_src / 2 * 2; - - let y = yuv[(y_src * width + x_src) as usize] as f32; - let u = yuv[uv_i as usize] as f32; - let v = yuv[(uv_i + 1) as usize] as f32; - - let r = 1.164 * (y - 16.0) + 1.596 * (v - 128.0); - let g = 1.164 * (y - 16.0) - 0.813 * (v - 128.0) - 0.391 * (u - 128.0); - let b = 1.164 * (y - 16.0) + 2.018 * (u - 128.0); - - rgba.push(r as u8); - rgba.push(g as u8); - rgba.push(b as u8); - rgba.push(0xFF); - } - } - - rgba -} diff --git a/vendor/iced_video_player/src/video_player.rs b/vendor/iced_video_player/src/video_player.rs deleted file mode 100644 index 7e0be6e..0000000 --- a/vendor/iced_video_player/src/video_player.rs +++ /dev/null @@ -1,476 +0,0 @@ -use crate::{gst, gst_pbutils, video::Video}; -use cosmic::iced::{ - self, - advanced::{self, layout, widget, Widget}, - mouse, Element, -}; -use gstreamer_app::prelude::*; -use log::error; -use std::{marker::PhantomData, sync::atomic::Ordering, time::Duration}; -use std::{sync::Arc, time::Instant}; - -#[cfg(feature = "wgpu")] -use crate::pipeline::VideoPrimitive; -#[cfg(feature = "wgpu")] -use iced_wgpu::primitive::Renderer as PrimitiveRenderer; - -#[cfg(not(feature = "wgpu"))] -use crate::video::yuv_to_rgba; -#[cfg(not(feature = "wgpu"))] -use cosmic::iced::advanced::image::Renderer as ImageRenderer; -#[cfg(not(feature = "wgpu"))] -trait PrimitiveRenderer: ImageRenderer {} -#[cfg(not(feature = "wgpu"))] -impl PrimitiveRenderer for iced::Renderer {} - -/// Video player widget which displays the current frame of a [`Video`](crate::Video). -pub struct VideoPlayer<'a, Message, Theme = iced::Theme, Renderer = iced::Renderer> -where - Renderer: PrimitiveRenderer, -{ - video: &'a Video, - content_fit: iced::ContentFit, - width: iced::Length, - height: iced::Length, - mouse_hidden: bool, - on_duration_changed: Option Message + 'a>>, - on_end_of_stream: Option, - on_new_frame: Option, - on_subtitle_text: Option) -> Message + 'a>>, - on_error: Option Message + 'a>>, - on_missing_plugin: Option Message + 'a>>, - on_tags: Option Message + 'a>>, - on_warning: Option Message + 'a>>, - id: Option, - _phantom: PhantomData<(Theme, Renderer)>, -} - -impl<'a, Message, Theme, Renderer> VideoPlayer<'a, Message, Theme, Renderer> -where - Renderer: PrimitiveRenderer, -{ - /// Creates a new video player widget for a given video. - pub fn new(video: &'a Video) -> Self { - VideoPlayer { - video, - content_fit: iced::ContentFit::Contain, - width: iced::Length::Shrink, - height: iced::Length::Shrink, - mouse_hidden: false, - on_duration_changed: None, - on_end_of_stream: None, - on_new_frame: None, - on_subtitle_text: None, - on_error: None, - on_missing_plugin: None, - on_tags: None, - on_warning: None, - _phantom: Default::default(), - id: None, - } - } - - /// Sets the ID of the `VideoPlayer`. - pub fn id(mut self, id: cosmic::widget::Id) -> Self { - self.id = Some(id); - self - } - - /// Sets the width of the `VideoPlayer` boundaries. - pub fn width(self, width: impl Into) -> Self { - VideoPlayer { - width: width.into(), - ..self - } - } - - /// Sets the height of the `VideoPlayer` boundaries. - pub fn height(self, height: impl Into) -> Self { - VideoPlayer { - height: height.into(), - ..self - } - } - - /// Sets the `ContentFit` of the `VideoPlayer`. - pub fn content_fit(self, content_fit: iced::ContentFit) -> Self { - VideoPlayer { - content_fit, - ..self - } - } - - pub fn mouse_hidden(self, mouse_hidden: bool) -> Self { - VideoPlayer { - mouse_hidden, - ..self - } - } - - pub fn on_duration_changed(self, on_duration_changed: F) -> Self - where - F: 'a + Fn(Duration) -> Message, - { - VideoPlayer { - on_duration_changed: Some(Box::new(on_duration_changed)), - ..self - } - } - - /// Message to send when the video reaches the end of stream (i.e., the video ends). - pub fn on_end_of_stream(self, on_end_of_stream: Message) -> Self { - VideoPlayer { - on_end_of_stream: Some(on_end_of_stream), - ..self - } - } - - /// Message to send when the video receives a new frame. - pub fn on_new_frame(self, on_new_frame: Message) -> Self { - VideoPlayer { - on_new_frame: Some(on_new_frame), - ..self - } - } - - /// Message to send when the video receives a new frame. - pub fn on_subtitle_text(self, on_subtitle_text: F) -> Self - where - F: 'a + Fn(Option) -> Message, - { - VideoPlayer { - on_subtitle_text: Some(Box::new(on_subtitle_text)), - ..self - } - } - - /// Message to send when the video playback encounters an error. - pub fn on_error(self, on_error: F) -> Self - where - F: 'a + Fn(glib::Error) -> Message, - { - VideoPlayer { - on_error: Some(Box::new(on_error)), - ..self - } - } - - pub fn on_missing_plugin(self, on_missing_plugin: F) -> Self - where - F: 'a + Fn(gst::Message) -> Message, - { - VideoPlayer { - on_missing_plugin: Some(Box::new(on_missing_plugin)), - ..self - } - } - - pub fn on_tags(self, on_tags: F) -> Self - where - F: 'a + Fn(gst::TagList) -> Message, - { - VideoPlayer { - on_tags: Some(Box::new(on_tags)), - ..self - } - } - - pub fn on_warning(self, on_warning: F) -> Self - where - F: 'a + Fn(glib::Error) -> Message, - { - VideoPlayer { - on_warning: Some(Box::new(on_warning)), - ..self - } - } -} - -impl<'a, Message, Theme, Renderer> Widget - for VideoPlayer<'a, Message, Theme, Renderer> -where - Message: Clone, - Renderer: PrimitiveRenderer, -{ - fn size(&self) -> iced::Size { - iced::Size { - width: iced::Length::Shrink, - height: iced::Length::Shrink, - } - } - - fn layout( - &mut self, - _tree: &mut widget::Tree, - _renderer: &Renderer, - limits: &layout::Limits, - ) -> layout::Node { - let (video_width, video_height) = self.video.size(); - - // based on `Image::layout` - let image_size = iced::Size::new(video_width as f32, video_height as f32); - let raw_size = limits.resolve(self.width, self.height, image_size); - let full_size = self.content_fit.fit(image_size, raw_size); - let final_size = iced::Size { - width: match self.width { - iced::Length::Shrink => f32::min(raw_size.width, full_size.width), - _ => raw_size.width, - }, - height: match self.height { - iced::Length::Shrink => f32::min(raw_size.height, full_size.height), - _ => raw_size.height, - }, - }; - - layout::Node::new(final_size) - } - - fn draw( - &self, - _tree: &widget::Tree, - renderer: &mut Renderer, - _theme: &Theme, - _style: &advanced::renderer::Style, - layout: advanced::Layout<'_>, - _cursor: advanced::mouse::Cursor, - _viewport: &iced::Rectangle, - ) { - let mut inner = self.video.write(); - - // bounds based on `Image::draw` - let image_size = iced::Size::new(inner.width as f32, inner.height as f32); - let bounds = layout.bounds(); - let adjusted_fit = self.content_fit.fit(image_size, bounds.size()); - let scale = iced::Vector::new( - adjusted_fit.width / image_size.width, - adjusted_fit.height / image_size.height, - ); - let final_size = iced::Size::new(image_size.width * scale.x, image_size.height * scale.y); - - let position = match self.content_fit { - iced::ContentFit::None => iced::Point::new( - bounds.x + (image_size.width - adjusted_fit.width) / 2.0, - bounds.y + (image_size.height - adjusted_fit.height) / 2.0, - ), - _ => iced::Point::new( - bounds.center_x() - final_size.width / 2.0, - bounds.center_y() - final_size.height / 2.0, - ), - }; - - let drawing_bounds = iced::Rectangle::new(position, final_size); - - let upload_frame = inner.upload_frame.swap(false, Ordering::SeqCst); - inner.redrawing.store(false, Ordering::SeqCst); - - if upload_frame { - let last_frame_time = inner - .last_frame_time - .lock() - .map(|time| *time) - .unwrap_or_else(|_| Instant::now()); - inner.set_av_offset(Instant::now() - last_frame_time); - } - - #[cfg(feature = "wgpu")] - renderer.draw_primitive( - drawing_bounds, - VideoPrimitive::new( - inner.id, - Arc::clone(&inner.alive), - Arc::clone(&inner.frame), - (inner.width as _, inner.height as _), - upload_frame, - ), - ); - - #[cfg(not(feature = "wgpu"))] - { - if upload_frame { - let mut opt = None; - { - let yuv_data_opt = match inner.frame.lock() { - Ok(frame) => Some(frame), - Err(_err) => None, - }; - if let Some(yuv_data) = yuv_data_opt.as_ref().and_then(|d| d.readable()) { - //TODO: convert on worker thread? - let rgba_data = - yuv_to_rgba(&yuv_data, inner.width as _, inner.height as _, 1); - opt = Some(advanced::image::Handle::from_rgba( - inner.width as _, - inner.height as _, - rgba_data, - )) - }; - } - inner.handle_opt = opt; - } - if let Some(handle) = &inner.handle_opt { - use cosmic::iced::Radians; - - renderer.draw_image( - handle.clone(), - advanced::image::FilterMethod::Nearest, - drawing_bounds, - Radians(0.), - 1.0, - [0.0; 4], - ); - } - } - } - - fn update( - &mut self, - _state: &mut widget::Tree, - event: &iced::Event, - _layout: advanced::Layout<'_>, - _cursor: advanced::mouse::Cursor, - _renderer: &Renderer, - _clipboard: &mut dyn advanced::Clipboard, - shell: &mut advanced::Shell<'_, Message>, - _viewport: &iced::Rectangle, - ) { - let mut inner = self.video.write(); - - if let iced::Event::Window(iced::window::Event::RedrawRequested(_)) = event { - if inner.restart_stream || (!inner.is_eos && !inner.paused()) { - let mut restart_stream = false; - if inner.restart_stream { - restart_stream = true; - // Set flag to false to avoid potentially multiple seeks - inner.restart_stream = false; - } - let mut eos_pause = false; - - while let Some(msg) = inner.bus.pop_filtered(&[ - gst::MessageType::DurationChanged, - gst::MessageType::Error, - gst::MessageType::Element, - gst::MessageType::Eos, - gst::MessageType::Tag, - gst::MessageType::Warning, - ]) { - match msg.view() { - gst::MessageView::DurationChanged(_) => { - inner.duration = Duration::from_nanos( - inner - .source - .query_duration::() - .map(|duration| duration.nseconds()) - .unwrap_or(0), - ); - if let Some(ref on_duration_changed) = self.on_duration_changed { - shell.publish(on_duration_changed(inner.duration)); - } - } - gst::MessageView::Error(err) => { - error!("bus returned an error: {err}"); - if let Some(ref on_error) = self.on_error { - shell.publish(on_error(err.error())) - }; - } - gst::MessageView::Element(element) => { - if gst_pbutils::MissingPluginMessage::is(&element) { - if let Some(ref on_missing_plugin) = self.on_missing_plugin { - shell.publish(on_missing_plugin(element.copy())); - } - } - } - gst::MessageView::Eos(_eos) => { - if let Some(on_end_of_stream) = self.on_end_of_stream.clone() { - shell.publish(on_end_of_stream); - } - if inner.looping { - restart_stream = true; - } else { - eos_pause = true; - } - } - gst::MessageView::Tag(tag_msg) => { - if let Some(ref on_tags) = self.on_tags { - shell.publish(on_tags(tag_msg.tags())); - } - } - gst::MessageView::Warning(warn) => { - log::warn!("bus returned a warning: {warn}"); - if let Some(ref on_warning) = self.on_warning { - shell.publish(on_warning(warn.error())); - } - } - _ => {} - } - } - - // Don't run eos_pause if restart_stream is true; fixes "pausing" after restarting a stream - if restart_stream { - if let Err(err) = inner.restart_stream() { - error!("cannot restart stream (can't seek): {err:#?}"); - } - } else if eos_pause { - inner.is_eos = true; - inner.set_paused(true); - } - - if !inner.redrawing.load(Ordering::SeqCst) - && inner.upload_frame.load(Ordering::SeqCst) - { - if let Some(on_new_frame) = self.on_new_frame.clone() { - inner.redrawing.store(true, Ordering::SeqCst); - shell.publish(on_new_frame); - } - } - - if let Some(on_subtitle_text) = &self.on_subtitle_text { - if inner.upload_text.swap(false, Ordering::SeqCst) { - if let Ok(text) = inner.subtitle_text.try_lock() { - shell.publish(on_subtitle_text(text.clone())); - } - } - } - - shell.request_redraw(); - } else { - shell.request_redraw_at(iced::window::RedrawRequest::At( - Instant::now() + Duration::from_millis(32), - )); - } - } - } - - fn mouse_interaction( - &self, - _tree: &widget::Tree, - _layout: advanced::Layout<'_>, - _cursor_position: mouse::Cursor, - _viewport: &iced::Rectangle, - _renderer: &Renderer, - ) -> mouse::Interaction { - if self.mouse_hidden { - mouse::Interaction::Hidden - } else { - mouse::Interaction::default() - } - } - - fn set_id(&mut self, id: widget::Id) { - self.id = Some(id); - } - - fn id(&self) -> Option { - self.id.clone() - } -} - -impl<'a, Message, Theme, Renderer> From> - for Element<'a, Message, Theme, Renderer> -where - Message: 'a + Clone, - Theme: 'a, - Renderer: 'a + PrimitiveRenderer, -{ - fn from(video_player: VideoPlayer<'a, Message, Theme, Renderer>) -> Self { - Self::new(video_player) - } -}