From b44c8d27456f72fdb6147b26cbac706695ea3517 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 13 Apr 2026 21:09:51 +0200 Subject: [PATCH 1/9] i18n: translation updates from weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Amadɣas Co-authored-by: Arve Eriksson <031299870@telia.com> Co-authored-by: Asier Saratsua Garmendia Co-authored-by: Baurzhan Muftakhidinov Co-authored-by: Blubberland Co-authored-by: ButterflyOfFire Co-authored-by: David Carvalho Co-authored-by: Dmitry Yarygin Co-authored-by: Ettore Atalan Co-authored-by: Fedorov Alexei Co-authored-by: Geeson Wan Co-authored-by: Hosted Weblate Co-authored-by: Jiri Grönroos Co-authored-by: Julien Brouillard Co-authored-by: Urocissa Caerulea.Tw Co-authored-by: VandaL Co-authored-by: Vilius Paliokas Co-authored-by: Zahid Rizky Fakhri Co-authored-by: defaultUser822 Co-authored-by: jonnysemon Co-authored-by: lorduskordus Co-authored-by: therealmate Co-authored-by: кубик круглый Co-authored-by: 麋麓 BigELK176 Co-authored-by: 김유빈 Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/ar/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/cs/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/de/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/fi/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/fr/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/hu/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/id/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/kab/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/kk/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/ko/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/lt/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/pl/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/ru/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/sv/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/zh_Hant/ Translation: Pop OS/COSMIC Player --- i18n/ar/cosmic_player.ftl | 17 +++++++++++----- i18n/cs/cosmic_player.ftl | 11 +++++++++-- i18n/de/cosmic_player.ftl | 10 +++++++++- i18n/eu/cosmic_player.ftl | 0 i18n/fi/cosmic_player.ftl | 2 +- i18n/fr/cosmic_player.ftl | 7 +++++++ i18n/hu/cosmic_player.ftl | 7 +++++++ i18n/id/cosmic_player.ftl | 7 +++++++ i18n/kab/cosmic_player.ftl | 33 +++++++++++++++++++++++++++++++ i18n/kk/cosmic_player.ftl | 7 +++++++ i18n/ko/cosmic_player.ftl | 1 + i18n/lt/cosmic_player.ftl | 7 +++++++ i18n/pl/cosmic_player.ftl | 7 +++++++ i18n/pt-BR/cosmic_player.ftl | 7 +++++++ i18n/ru/cosmic_player.ftl | 11 +++++++++-- i18n/sv/cosmic_player.ftl | 7 +++++++ i18n/zh-CN/cosmic_player.ftl | 11 +++++++++-- i18n/zh-TW/cosmic_player.ftl | 38 +++++++++++++++++++++++++----------- 18 files changed, 166 insertions(+), 24 deletions(-) create mode 100644 i18n/eu/cosmic_player.ftl diff --git a/i18n/ar/cosmic_player.ftl b/i18n/ar/cosmic_player.ftl index ca67b60..77b8b43 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,11 +31,18 @@ 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 diff --git a/i18n/cs/cosmic_player.ftl b/i18n/cs/cosmic_player.ftl index 698f32e..c580b82 100644 --- a/i18n/cs/cosmic_player.ftl +++ b/i18n/cs/cosmic_player.ftl @@ -22,5 +22,12 @@ 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 skladbu -repeat-disabled = Opakování zakázáno +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 diff --git a/i18n/de/cosmic_player.ftl b/i18n/de/cosmic_player.ftl index 5f20fed..9f45f1c 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 verwendete Medien öffnen +open-recent-media = Zuletzt verwendetes Medium öffnen close-file = Datei schließen open-media-folder = Medienordner öffnen... open-recent-media-folder = Ordner der zuletzt verwendeten Medien öffnen @@ -38,3 +38,11 @@ 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 diff --git a/i18n/eu/cosmic_player.ftl b/i18n/eu/cosmic_player.ftl new file mode 100644 index 0000000..e69de29 diff --git a/i18n/fi/cosmic_player.ftl b/i18n/fi/cosmic_player.ftl index 2787675..b50a481 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öydän kanssa +match-desktop = Sovita työpöytään dark = Tumma light = Vaalea file = Tiedosto diff --git a/i18n/fr/cosmic_player.ftl b/i18n/fr/cosmic_player.ftl index 1df3100..b160212 100644 --- a/i18n/fr/cosmic_player.ftl +++ b/i18n/fr/cosmic_player.ftl @@ -39,3 +39,10 @@ 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 diff --git a/i18n/hu/cosmic_player.ftl b/i18n/hu/cosmic_player.ftl index fa22b0f..9fe8a1c 100644 --- a/i18n/hu/cosmic_player.ftl +++ b/i18n/hu/cosmic_player.ftl @@ -39,3 +39,10 @@ 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 diff --git a/i18n/id/cosmic_player.ftl b/i18n/id/cosmic_player.ftl index 2dd1d85..160a5dd 100644 --- a/i18n/id/cosmic_player.ftl +++ b/i18n/id/cosmic_player.ftl @@ -24,3 +24,10 @@ 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/kab/cosmic_player.ftl b/i18n/kab/cosmic_player.ftl index e69de29..28347ef 100644 --- a/i18n/kab/cosmic_player.ftl +++ b/i18n/kab/cosmic_player.ftl @@ -0,0 +1,33 @@ +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 7ef2c72..40c0e87 100644 --- a/i18n/kk/cosmic_player.ftl +++ b/i18n/kk/cosmic_player.ftl @@ -24,3 +24,10 @@ 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 = Қайталау А-Ә (Тазарту) diff --git a/i18n/ko/cosmic_player.ftl b/i18n/ko/cosmic_player.ftl index 1d56c99..ae00d2b 100644 --- a/i18n/ko/cosmic_player.ftl +++ b/i18n/ko/cosmic_player.ftl @@ -22,3 +22,4 @@ no-video-or-audio-file-open = 비디오 혹은 오디오가 열려있지 않음 off = 끄기 album = 앨범: { $album } close-file = 파일 닫기 +repeat-disabled = 반복 비활성화 diff --git a/i18n/lt/cosmic_player.ftl b/i18n/lt/cosmic_player.ftl index 1e26d37..b3b58e4 100644 --- a/i18n/lt/cosmic_player.ftl +++ b/i18n/lt/cosmic_player.ftl @@ -24,3 +24,10 @@ 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 66af5c6..1a2cc16 100644 --- a/i18n/pl/cosmic_player.ftl +++ b/i18n/pl/cosmic_player.ftl @@ -39,3 +39,10 @@ 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 diff --git a/i18n/pt-BR/cosmic_player.ftl b/i18n/pt-BR/cosmic_player.ftl index 9b2da29..46cb09f 100644 --- a/i18n/pt-BR/cosmic_player.ftl +++ b/i18n/pt-BR/cosmic_player.ftl @@ -39,3 +39,10 @@ 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 = Reproduzir +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 diff --git a/i18n/ru/cosmic_player.ftl b/i18n/ru/cosmic_player.ftl index e8de958..512d61e 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,7 +24,7 @@ file = Файл open-media = Открыть медиафайл… open-recent-media = Открыть недавний медиафайл close-file = Закрыть файл -open-media-folder = Открыть папку медиафайлов… +open-media-folder = Открыть папку медиафайлов... open-recent-media-folder = Недавние папки медиафайлов close-media-folder = Закрыть папку медиафайлов quit = Выйти @@ -32,3 +32,10 @@ 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 (очистить) diff --git a/i18n/sv/cosmic_player.ftl b/i18n/sv/cosmic_player.ftl index 57627c1..40f6273 100644 --- a/i18n/sv/cosmic_player.ftl +++ b/i18n/sv/cosmic_player.ftl @@ -39,3 +39,10 @@ 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 diff --git a/i18n/zh-CN/cosmic_player.ftl b/i18n/zh-CN/cosmic_player.ftl index 28c4194..f8091e1 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,3 +39,10 @@ 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 重复 diff --git a/i18n/zh-TW/cosmic_player.ftl b/i18n/zh-TW/cosmic_player.ftl index 5bba32a..cb70115 100644 --- a/i18n/zh-TW/cosmic_player.ftl +++ b/i18n/zh-TW/cosmic_player.ftl @@ -1,32 +1,48 @@ -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 = 退出 \ No newline at end of file +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 = 上一幀 From a8d941675406af7732c1dc6cf094ee996509ec07 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 14 Apr 2026 11:10:42 -0600 Subject: [PATCH 2/9] Epoch 1.0.11 version update Generated by cosmic-epoch scripts/version-update.sh --- Cargo.lock | 296 ++++++++++++++++++++++++----------------------- Cargo.toml | 2 +- debian/changelog | 6 + 3 files changed, 158 insertions(+), 146 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a0025b9..e98e4d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -148,7 +148,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" dependencies = [ "android-properties", - "bitflags 2.11.0", + "bitflags 2.11.1", "cc", "jni", "libc", @@ -241,7 +241,7 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.2", + "rand 0.9.4", "raw-window-handle", "serde", "serde_repr", @@ -259,7 +259,7 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.2", + "rand 0.9.4", "serde", "serde_repr", "tokio", @@ -533,9 +533,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" dependencies = [ "serde_core", ] @@ -672,7 +672,7 @@ version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "polling", "rustix 1.1.4", "slab", @@ -693,9 +693,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.59" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "jobserver", @@ -897,7 +897,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "core-foundation 0.10.1", "libc", ] @@ -916,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.0", + "bitflags 2.11.1", "cosmic-protocols", "libc", "smithay-client-toolkit", @@ -927,7 +927,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -948,7 +948,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "quote", "syn 2.0.117", @@ -957,7 +957,7 @@ dependencies = [ [[package]] name = "cosmic-freedesktop-icons" version = "0.4.0" -source = "git+https://github.com/pop-os/freedesktop-icons#7a61a704f6d1ec41f71cbe766e3cc484858523fa" +source = "git+https://github.com/pop-os/freedesktop-icons#9c562fe3ecf03241a46a60c0078cd6ea10bd75ce" dependencies = [ "bstr", "btoi", @@ -970,7 +970,7 @@ dependencies = [ [[package]] name = "cosmic-player" -version = "1.0.9" +version = "1.0.11" dependencies = [ "ashpd 0.12.3", "clap_lex", @@ -999,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.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -1019,9 +1019,9 @@ dependencies = [ [[package]] name = "cosmic-text" version = "0.18.2" -source = "git+https://github.com/pop-os/cosmic-text.git#9a2ab09f06905e91f41d64ac6eee887726e7fd76" +source = "git+https://github.com/pop-os/cosmic-text.git#4d74f795cc771fdcc7ea0f9cacba63fcf036fad6" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "fontdb", "harfrust", "linebender_resource_handle", @@ -1042,7 +1042,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "almost", "configparser", @@ -1280,7 +1280,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.6.2", "libc", "objc2 0.6.4", @@ -1311,7 +1311,7 @@ name = "dnd" version = "0.1.0" source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "mime", "raw-window-handle", "smithay-client-toolkit", @@ -1336,7 +1336,7 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" version = "0.1.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" [[package]] name = "drm" @@ -1344,7 +1344,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0f8a69e60d75ae7dab4ef26a59ca99f2a89d4c142089b537775ae0c198bdcde" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "drm-ffi", "drm-fourcc", @@ -1667,9 +1667,9 @@ checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "font-types" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d9237c6d82152100c691fb77ea18037b402bcc7257d2c876a4ffac81bc22a1c" +checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" dependencies = [ "bytemuck", ] @@ -1954,7 +1954,7 @@ version = "0.20.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffc4b6e352d4716d84d7dde562dd9aee2a7d48beb872dd9ece7f2d1515b2d683" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "futures-channel", "futures-core", "futures-executor", @@ -2030,7 +2030,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "gpu-alloc-types", ] @@ -2040,7 +2040,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -2061,7 +2061,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -2072,7 +2072,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -2317,7 +2317,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9da2e5ae821f6e96664977bf974d6d6a2d6682f9ccee23e62ec1d134246845f9" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "core_maths", "read-fonts", @@ -2348,6 +2348,12 @@ dependencies = [ "foldhash 0.2.0", ] +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + [[package]] name = "heck" version = "0.4.1" @@ -2506,7 +2512,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "dnd", "iced_accessibility", @@ -2527,7 +2533,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "accesskit", "accesskit_winit", @@ -2536,9 +2542,9 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "bytes", "cosmic-client-toolkit", "dnd", @@ -2560,7 +2566,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "iced_core", "iced_futures", @@ -2570,7 +2576,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "futures", "iced_core", @@ -2584,9 +2590,9 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "cosmic-text", "half", @@ -2605,7 +2611,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "iced_graphics", "iced_runtime", @@ -2614,7 +2620,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -2626,7 +2632,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -2641,7 +2647,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "bytemuck", "cosmic-text", @@ -2676,10 +2682,10 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "as-raw-xcb-connection", - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "cosmic-client-toolkit", "cryoglyph", @@ -2707,7 +2713,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.2" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -2725,7 +2731,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "cosmic-client-toolkit", "cursor-icon", @@ -3063,12 +3069,12 @@ checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "indexmap" -version = "2.13.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", "serde", "serde_core", ] @@ -3079,7 +3085,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "inotify-sys", "libc", ] @@ -3258,9 +3264,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.94" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" dependencies = [ "cfg-if", "futures-util", @@ -3283,7 +3289,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "serde", ] @@ -3374,14 +3380,14 @@ checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "libc" -version = "0.2.184" +version = "0.2.185" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" +checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#6caccaba337ed9bab21c5fe3c2aa7392e322e89c" +source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" dependencies = [ "apply", "ashpd 0.12.3", @@ -3442,14 +3448,14 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "libc", "plain", - "redox_syscall 0.7.3", + "redox_syscall 0.7.4", ] [[package]] @@ -3533,9 +3539,9 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "lru" -version = "0.16.3" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" [[package]] name = "lyon" @@ -3637,7 +3643,7 @@ version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block", "core-graphics-types 0.2.0", "foreign-types", @@ -3719,7 +3725,7 @@ checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -3743,7 +3749,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "jni-sys 0.3.1", "log", "ndk-sys", @@ -3773,7 +3779,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if", "cfg_aliases", "libc", @@ -3786,7 +3792,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "fsevent-sys", "inotify", "kqueue", @@ -3804,7 +3810,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -3924,7 +3930,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -3940,7 +3946,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", @@ -3953,7 +3959,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -3965,7 +3971,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.6.2", "dispatch2", "objc2 0.6.4", @@ -3977,7 +3983,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "libc", "objc2-core-foundation", ] @@ -4000,7 +4006,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "objc2-core-foundation", "objc2-core-graphics", ] @@ -4017,7 +4023,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -4029,7 +4035,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", @@ -4041,7 +4047,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4053,7 +4059,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4066,7 +4072,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "objc2 0.6.4", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -4368,9 +4374,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "plain" @@ -4397,7 +4403,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "crc32fast", "fdeflate", "flate2", @@ -4636,9 +4642,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -4702,9 +4708,9 @@ checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -4737,16 +4743,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] name = "redox_syscall" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" +checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -4851,7 +4857,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4147b952f3f819eca0e99527022f7d6a8d05f111aeb0a62960c74eb283bec8fc" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "once_cell", "serde", "serde_derive", @@ -4926,7 +4932,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -4939,7 +4945,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys 0.12.1", @@ -4958,7 +4964,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "core_maths", "log", @@ -5201,7 +5207,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "calloop", "calloop-wayland-source", @@ -5292,7 +5298,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.0", + "bitflags 2.11.1", ] [[package]] @@ -6020,9 +6026,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" dependencies = [ "cfg-if", "once_cell", @@ -6033,9 +6039,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.67" +version = "0.4.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" +checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" dependencies = [ "js-sys", "wasm-bindgen", @@ -6043,9 +6049,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6053,9 +6059,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" dependencies = [ "bumpalo", "proc-macro2", @@ -6066,9 +6072,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" dependencies = [ "unicode-ident", ] @@ -6101,7 +6107,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "hashbrown 0.15.5", "indexmap", "semver", @@ -6141,7 +6147,7 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "rustix 1.1.4", "wayland-backend", "wayland-scanner", @@ -6153,7 +6159,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cursor-icon", "wayland-backend", ] @@ -6175,7 +6181,7 @@ version = "0.32.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-scanner", @@ -6188,7 +6194,7 @@ version = "20250721.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6201,7 +6207,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6214,7 +6220,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6227,7 +6233,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6252,7 +6258,7 @@ version = "0.31.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc1846eb04c49182e04f4a099e2a830a2b745610bbc1d61246e206f29c7000a0" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "downcast-rs", "rustix 1.1.4", "wayland-backend", @@ -6273,9 +6279,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.94" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" +checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" dependencies = [ "js-sys", "wasm-bindgen", @@ -6304,7 +6310,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if", "cfg_aliases", "document-features", @@ -6335,7 +6341,7 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "cfg_aliases", "document-features", @@ -6395,7 +6401,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.11.0", + "bitflags 2.11.1", "block", "bytemuck", "cfg-if", @@ -6440,7 +6446,7 @@ version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "js-sys", "log", @@ -6909,9 +6915,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg_aliases", "cursor-icon", "dpi", @@ -6935,10 +6941,10 @@ dependencies = [ [[package]] name = "winit-android" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "android-activity", - "bitflags 2.11.0", + "bitflags 2.11.1", "dpi", "ndk", "raw-window-handle", @@ -6950,9 +6956,9 @@ dependencies = [ [[package]] name = "winit-appkit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.6.2", "dispatch2", "dpi", @@ -6972,7 +6978,7 @@ dependencies = [ [[package]] name = "winit-common" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "memmap2 0.9.10", "objc2 0.6.4", @@ -6987,9 +6993,9 @@ dependencies = [ [[package]] name = "winit-core" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cursor-icon", "dpi", "keyboard-types", @@ -7001,14 +7007,14 @@ dependencies = [ [[package]] name = "winit-orbital" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "dpi", "libredox", "orbclient", "raw-window-handle", - "redox_syscall 0.7.3", + "redox_syscall 0.7.4", "smol_str", "tracing", "winit-core", @@ -7017,9 +7023,9 @@ dependencies = [ [[package]] name = "winit-uikit" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.6.2", "dispatch2", "dpi", @@ -7037,10 +7043,10 @@ dependencies = [ [[package]] name = "winit-wayland" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "ahash", - "bitflags 2.11.0", + "bitflags 2.11.1", "calloop", "cursor-icon", "dpi", @@ -7063,10 +7069,10 @@ dependencies = [ [[package]] name = "winit-web" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ "atomic-waker", - "bitflags 2.11.0", + "bitflags 2.11.1", "concurrent-queue", "cursor-icon", "dpi", @@ -7085,9 +7091,9 @@ dependencies = [ [[package]] name = "winit-win32" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cursor-icon", "dpi", "raw-window-handle", @@ -7101,9 +7107,9 @@ dependencies = [ [[package]] name = "winit-x11" version = "0.31.0-beta.2" -source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#a610ac9c7a72b39ff102ed4d946291618dc725b6" +source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "calloop", "cursor-icon", @@ -7197,7 +7203,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", + "bitflags 2.11.1", "indexmap", "log", "serde", @@ -7328,7 +7334,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "dlib", "log", "once_cell", diff --git a/Cargo.toml b/Cargo.toml index a31ad32..5fde597 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmic-player" -version = "1.0.9" +version = "1.0.11" edition = "2024" [build-dependencies] diff --git a/debian/changelog b/debian/changelog index 535b2b7..09014a0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +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 From 2aa2c841fa8dc95ec4cd4816ba6ad54ac886ff98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vuka=C5=A1in=20Vojinovi=C4=87?= <150025636+git-f0x@users.noreply.github.com> Date: Fri, 3 Apr 2026 00:09:03 +0200 Subject: [PATCH 3/9] chore: update dependencies --- .zed/settings.json | 15 + Cargo.lock | 1812 +++++++++++++++++++++----------------------- Cargo.toml | 22 +- rustfmt.toml | 2 +- src/argparse.rs | 3 +- src/config.rs | 10 +- src/key_bind.rs | 3 +- src/localize.rs | 89 +-- src/main.rs | 139 ++-- src/menu.rs | 23 +- src/mpris.rs | 16 +- src/project.rs | 26 +- src/thumbnail.rs | 9 +- src/video.rs | 45 +- src/xdg_portals.rs | 6 +- 15 files changed, 1061 insertions(+), 1159 deletions(-) create mode 100644 .zed/settings.json diff --git a/.zed/settings.json b/.zed/settings.json new file mode 100644 index 0000000..2cc7b98 --- /dev/null +++ b/.zed/settings.json @@ -0,0 +1,15 @@ +{ + "format_on_save": "on", + "lsp": { + "rust-analyzer": { + "initialization_options": { + "check": { + "command": "clippy", + }, + "rustfmt": { + "extraArgs": ["+nightly"], + }, + }, + }, + }, +} diff --git a/Cargo.lock b/Cargo.lock index e98e4d7..14fd7ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,7 +35,7 @@ dependencies = [ "accesskit_consumer", "atspi-common", "serde", - "zvariant 5.10.0", + "zvariant", ] [[package]] @@ -72,7 +72,7 @@ dependencies = [ "serde", "tokio", "tokio-stream", - "zbus 5.14.0", + "zbus", ] [[package]] @@ -135,6 +135,30 @@ 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 = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "almost" version = "0.2.0" @@ -175,6 +199,56 @@ 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" @@ -196,6 +270,12 @@ 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" @@ -205,6 +285,17 @@ 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" @@ -223,6 +314,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "ash" version = "0.38.0+1.3.281" @@ -247,7 +347,7 @@ dependencies = [ "serde_repr", "tokio", "url", - "zbus 5.14.0", + "zbus", ] [[package]] @@ -267,7 +367,7 @@ dependencies = [ "wayland-backend", "wayland-client", "wayland-protocols", - "zbus 5.14.0", + "zbus", ] [[package]] @@ -308,17 +408,6 @@ 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" @@ -374,7 +463,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -409,7 +498,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -420,9 +509,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "atomic_refcell" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" +checksum = "21e4227379beff4205943696e6c3e0cd809bacdf3f0edd6e3dd153e2269571a4" [[package]] name = "atomicwrites" @@ -453,11 +542,11 @@ dependencies = [ "enumflags2", "serde", "static_assertions", - "zbus 5.14.0", + "zbus", "zbus-lockstep", "zbus-lockstep-macros", - "zbus_names 4.3.1", - "zvariant 5.10.0", + "zbus_names", + "zvariant", ] [[package]] @@ -468,7 +557,7 @@ checksum = "2230e48787ed3eb4088996eab66a32ca20c0b67bbd4fd6cdfe79f04f1f04c9fc" dependencies = [ "atspi-common", "serde", - "zbus 5.14.0", + "zbus", ] [[package]] @@ -480,7 +569,7 @@ dependencies = [ "derive_utils", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -489,6 +578,49 @@ 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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375082f007bd67184fb9c0374614b29f9aaa604ec301635f72338bb65386a53d" +dependencies = [ + "arrayvec", +] + [[package]] name = "base64" version = "0.22.1" @@ -540,6 +672,15 @@ 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" @@ -616,6 +757,12 @@ 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" @@ -645,15 +792,9 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] -[[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" @@ -693,9 +834,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.60" +version = "1.2.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" dependencies = [ "find-msvc-tools", "jobserver", @@ -727,9 +868,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "clap_lex" -version = "0.7.7" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "clipboard-win" @@ -816,6 +957,12 @@ 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" @@ -927,7 +1074,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -942,16 +1089,16 @@ dependencies = [ "tokio", "tracing", "xdg", - "zbus 5.14.0", + "zbus", ] [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -977,12 +1124,12 @@ dependencies = [ "env_logger", "fork", "gstreamer-tag", - "i18n-embed 0.14.1", - "i18n-embed-fl 0.7.0", + "i18n-embed", + "i18n-embed-fl", "iced_video_player", "icu_collator", - "icu_provider 1.5.0", - "image 0.24.9", + "icu_locale", + "image", "libcosmic", "log", "mpris-server", @@ -1013,13 +1160,14 @@ name = "cosmic-settings-daemon" version = "0.1.0" source = "git+https://github.com/pop-os/dbus-settings-bindings#507e342c21d3ce6ae41b1d4f3fa2f0ad5ee23e75" dependencies = [ - "zbus 5.14.0", + "zbus", ] [[package]] name = "cosmic-text" -version = "0.18.2" -source = "git+https://github.com/pop-os/cosmic-text.git#4d74f795cc771fdcc7ea0f9cacba63fcf036fad6" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be17b688510d934ce13f48a2beba700e11583e281e0fda99c22bb256a14eda73" dependencies = [ "bitflags 2.11.1", "fontdb", @@ -1028,7 +1176,7 @@ dependencies = [ "log", "rangemap", "rustc-hash 2.1.2", - "self_cell 1.2.2", + "self_cell", "skrifa", "smol_str", "swash", @@ -1042,7 +1190,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "almost", "configparser", @@ -1108,7 +1256,7 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "cryoglyph" version = "0.1.0" -source = "git+https://github.com/pop-os/glyphon.git?tag=cosmic-0.14#c49de15bce4d8254ac136d1be9911960cc85ce12" +source = "git+https://github.com/iced-rs/cryoglyph.git?rev=e429a025df36ab8145708acb309080ae3deec17a#e429a025df36ab8145708acb309080ae3deec17a" dependencies = [ "cosmic-text", "etagere", @@ -1146,10 +1294,13 @@ dependencies = [ ] [[package]] -name = "ctor-lite" -version = "0.1.2" +name = "ctor" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e162d0c2e2068eb736b71e5597eff0b9944e6b973cd9f37b6a288ab9bf20e300" +checksum = "83cf0d42651b16c6dfe68685716d18480d18a9c39c62d76e8cf3eb6ed5d8bcbf" +dependencies = [ + "dtor", +] [[package]] name = "cursor-icon" @@ -1177,8 +1328,8 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.11.1", - "syn 2.0.117", + "strsim", + "syn", ] [[package]] @@ -1189,20 +1340,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "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", + "syn", ] [[package]] @@ -1229,7 +1367,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1240,7 +1378,7 @@ checksum = "362f47930db19fe7735f527e6595e4900316b893ebf6d48ad3d31be928d57dd6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1294,7 +1432,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1377,6 +1515,12 @@ dependencies = [ "linux-raw-sys 0.6.5", ] +[[package]] +name = "dtor" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edf234dd1594d6dd434a8fb8cada51ddbbc593e40e4a01556a0b31c62da2775b" + [[package]] name = "either" version = "1.15.0" @@ -1407,20 +1551,50 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", +] + +[[package]] +name = "env_filter" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" +dependencies = [ + "log", + "regex", ] [[package]] name = "env_logger" -version = "0.10.2" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" dependencies = [ - "humantime", - "is-terminal", + "anstream", + "anstyle", + "env_filter", + "jiff", "log", - "regex", - "termcolor", +] + +[[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", ] [[package]] @@ -1512,6 +1686,12 @@ 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" @@ -1567,39 +1747,13 @@ 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 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", + "fluent-bundle", "unic-langid", ] @@ -1610,11 +1764,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01203cb8918f5711e73891b347816d932046f95f54207710bda99beaeb423bf4" dependencies = [ "fluent-langneg", - "fluent-syntax 0.12.0", + "fluent-syntax", "intl-memoizer", "intl_pluralrules", "rustc-hash 2.1.2", - "self_cell 1.2.2", + "self_cell", "smallvec", "unic-langid", ] @@ -1628,15 +1782,6 @@ 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" @@ -1715,7 +1860,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1726,9 +1871,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "fork" -version = "0.2.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05dc8b302e04a1c27f4fe694439ef0f29779ca4edc205b7b58f00db04e29656d" +checksum = "5bcc4b4161e53d499e41af904acb23950adf85682c772921ef3957cf1ecc98b3" dependencies = [ "libc", ] @@ -1820,7 +1965,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1919,16 +2064,26 @@ dependencies = [ ] [[package]] -name = "gio-sys" -version = "0.20.10" +name = "gif" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521e93a7e56fc89e84aea9a52cfc9436816a4b363b030260b699950ff1336c83" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gio-sys" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64729ba2772c080448f9f966dba8f4456beeb100d8c28a865ef8a0f2ef4987e1" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -1950,9 +2105,9 @@ checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" [[package]] name = "glib" -version = "0.20.12" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc4b6e352d4716d84d7dde562dd9aee2a7d48beb872dd9ece7f2d1515b2d683" +checksum = "0f075bd737d1fa842a944a4a1dc209838caa7e0e2ddf8aefb9ddf76538bc3ed7" dependencies = [ "bitflags 2.11.1", "futures-channel", @@ -1971,22 +2126,21 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.20.12" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8084af62f09475a3f529b1629c10c429d7600ee1398ae12dd3bf175d74e7145" +checksum = "506d23499707c7142898429757e8d9a3871d965239a2cb66dfa05052be6d6f19" dependencies = [ "heck 0.5.0", - "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] name = "glib-sys" -version = "0.20.10" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ab79e1ed126803a8fb827e3de0e2ff95191912b8db65cee467edb56fc4cc215" +checksum = "5f7fbac234ed5bc2a28359b7bde8e1b9cdf1441cc2d7f068e4824672d7db9445" dependencies = [ "libc", "system-deps", @@ -2015,44 +2169,27 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.20.10" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec9aca94bb73989e3cfdbf8f2e0f1f6da04db4d291c431f444838925c4c63eda" +checksum = "22a861859b887a79cf461359c192c97a57d8fb0229dd291232e57aa11f6fa72c" dependencies = [ "glib-sys", "libc", "system-deps", ] -[[package]] -name = "gpu-alloc" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" -dependencies = [ - "bitflags 2.11.1", - "gpu-alloc-types", -] - -[[package]] -name = "gpu-alloc-types" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" -dependencies = [ - "bitflags 2.11.1", -] - [[package]] name = "gpu-allocator" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +checksum = "51255ea7cfaadb6c5f1528d43e92a82acb2b96c43365989a28b2d44ee38f8795" dependencies = [ + "ash", + "hashbrown 0.16.1", "log", "presser", - "thiserror 1.0.69", - "windows 0.58.0", + "thiserror 2.0.18", + "windows 0.62.2", ] [[package]] @@ -2077,15 +2214,15 @@ dependencies = [ [[package]] name = "grid" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9e2d4c0a8296178d8802098410ca05d86b17a10bb5ab559b3fb404c1f948220" +checksum = "b40ca9252762c466af32d0b1002e91e4e1bc5398f77455e55474deb466355ff5" [[package]] name = "gstreamer" -version = "0.23.7" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8757a87f3706560037a01a9f06a59fcc7bdb0864744dcf73546606e60c4316e1" +checksum = "ad8d6d77fae07708536f86a34ac15fc36c7e958ef7930b75119dba0242936f08" dependencies = [ "cfg-if", "futures-channel", @@ -2094,13 +2231,13 @@ dependencies = [ "glib", "gstreamer-sys", "itertools", + "kstring", "libc", "muldiv", "num-integer", "num-rational", - "once_cell", "option-operations", - "paste", + "pastey 0.2.2", "pin-project-lite", "smallvec", "thiserror 2.0.18", @@ -2108,9 +2245,9 @@ dependencies = [ [[package]] name = "gstreamer-app" -version = "0.23.5" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9a883eb21aebcf1289158225c05f7aea5da6ecf71fa7f0ff1ce4d25baf004e" +checksum = "714874829f75e805192ddc2bd130b9d7669ebc3ed0e8b106039dd3416cb82916" dependencies = [ "futures-core", "futures-sink", @@ -2123,9 +2260,9 @@ dependencies = [ [[package]] name = "gstreamer-app-sys" -version = "0.23.5" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f7ef838306fe51852d503a14dc79ac42de005a59008a05098de3ecdaf05455" +checksum = "7a74a8211e5d7df2f45b612c284ddf56b92bdf4e879e8ed72e7c46dd0842e158" dependencies = [ "glib-sys", "gstreamer-base-sys", @@ -2136,9 +2273,9 @@ dependencies = [ [[package]] name = "gstreamer-audio" -version = "0.23.6" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7ec7e0374298897e669db7c79544bc44df12011985e7dd5f38644edaf2caf4" +checksum = "46e64660e1963ff3b6a4a5175f917524254a6ae36ac7b83e29b760d879a33073" dependencies = [ "cfg-if", "glib", @@ -2146,15 +2283,14 @@ dependencies = [ "gstreamer-audio-sys", "gstreamer-base", "libc", - "once_cell", "smallvec", ] [[package]] name = "gstreamer-audio-sys" -version = "0.23.6" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5f3e09e7c04ec91d78c2a6ca78d50b574b9ed49fdf5e72f3693adca4306a87" +checksum = "b5111bd07d0e22cc66ec9b4b4ef5408beefb148af19944fbe4602983a043f34c" dependencies = [ "glib-sys", "gobject-sys", @@ -2166,9 +2302,9 @@ dependencies = [ [[package]] name = "gstreamer-base" -version = "0.23.6" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f19a74fd04ffdcb847dd322640f2cf520897129d00a7bcb92fd62a63f3e27404" +checksum = "c08353a8a382be9a49b15fb9c46b3abd6f8a6e6439e1eaedc87d08f1abdcfad1" dependencies = [ "atomic_refcell", "cfg-if", @@ -2180,9 +2316,9 @@ dependencies = [ [[package]] name = "gstreamer-base-sys" -version = "0.23.6" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f2fb0037b6d3c5b51f60dea11e667910f33be222308ca5a101450018a09840" +checksum = "6569606feeb89cfcf95a6476a64a0f0aec83fadcef0e91c24e576f7851ceac3a" dependencies = [ "glib-sys", "gobject-sys", @@ -2193,9 +2329,9 @@ dependencies = [ [[package]] name = "gstreamer-pbutils" -version = "0.23.5" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf4bf5857fa22f910634e86a5bce33b5581a9e90caa4e32fd4a20bdd4c83ed0" +checksum = "0592df4998340706ab324148ea83dee758ca3233f9bce378d1d32167205c2f4d" dependencies = [ "glib", "gstreamer", @@ -2208,9 +2344,9 @@ dependencies = [ [[package]] name = "gstreamer-pbutils-sys" -version = "0.23.5" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304101f5fccbbe41e0169536777ddb7680c2c837e18575c22b30fc20cedfb76f" +checksum = "3fc3025e83ceaa645aec615db27c3052ed29a856b38adc0405f70b92423c0f23" dependencies = [ "glib-sys", "gobject-sys", @@ -2223,10 +2359,11 @@ dependencies = [ [[package]] name = "gstreamer-sys" -version = "0.23.6" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feea73b4d92dbf9c24a203c9cd0bcc740d584f6b5960d5faf359febf288919b2" +checksum = "85d09343b4c23d64b3ef35f1f644598860cc9a4617e7ccded141de97cd528608" dependencies = [ + "cfg-if", "glib-sys", "gobject-sys", "libc", @@ -2235,9 +2372,9 @@ dependencies = [ [[package]] name = "gstreamer-tag" -version = "0.23.6" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b52aa41071bfd846faba7508c0a7ef0562aefc135517b2af8eb54c08c284f9c4" +checksum = "69be28c94a67efbb59dada55dc70cebb83d0e92aee5d2f75011a16d9dfdaa5c1" dependencies = [ "glib", "gstreamer", @@ -2247,9 +2384,9 @@ dependencies = [ [[package]] name = "gstreamer-tag-sys" -version = "0.23.6" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d1757fb8d77a2c4e6662f8a42672e5ddbde847b32d2db1775877e925626f72" +checksum = "e6bfa5a12fdd4489a50d0022ebd40439e3c4c29e3df96e2ab77fcc354f0d64b4" dependencies = [ "glib-sys", "gobject-sys", @@ -2260,9 +2397,9 @@ dependencies = [ [[package]] name = "gstreamer-video" -version = "0.23.6" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1318b599d77ca4f7702ecbdeac1672d6304cb16b7e5752fabb3ee8260449a666" +checksum = "51809937ed7f6fa3974b2730a39623d59fd7415ede882d08d5ecef5de39d758d" dependencies = [ "cfg-if", "futures-channel", @@ -2271,15 +2408,14 @@ dependencies = [ "gstreamer-base", "gstreamer-video-sys", "libc", - "once_cell", "thiserror 2.0.18", ] [[package]] name = "gstreamer-video-sys" -version = "0.23.6" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a70f0947f12d253b9de9bc3fd92f981e4d025336c18389c7f08cdf388a99f5c" +checksum = "458f82631a5063057c10583a57ba0fbce689e67122cfdb5eddbeaa43eb812e75" dependencies = [ "glib-sys", "gobject-sys", @@ -2324,12 +2460,6 @@ dependencies = [ "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" @@ -2345,6 +2475,8 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ + "allocator-api2", + "equivalent", "foldhash 0.2.0", ] @@ -2393,12 +2525,6 @@ 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" @@ -2413,28 +2539,6 @@ 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" @@ -2442,9 +2546,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a217bbb075dcaefb292efa78897fc0678245ca67f265d12c351e42268fcb0305" dependencies = [ "arc-swap", - "fluent 0.17.0", + "fluent", "fluent-langneg", - "fluent-syntax 0.12.0", + "fluent-syntax", "i18n-embed-impl", "intl-memoizer", "log", @@ -2456,27 +2560,6 @@ 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" @@ -2484,15 +2567,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e598ed73b67db92f61e04672e599eef2991a262a40e1666735b8a86d2e7e9f30" dependencies = [ "find-crate", - "fluent 0.17.0", - "fluent-syntax 0.12.0", + "fluent", + "fluent-syntax", "i18n-config", - "i18n-embed 0.16.0", + "i18n-embed", "proc-macro-error2", "proc-macro2", "quote", - "strsim 0.11.1", - "syn 2.0.117", + "strsim", + "syn", "unic-langid", ] @@ -2506,13 +2589,13 @@ dependencies = [ "i18n-config", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "dnd", "iced_accessibility", @@ -2524,7 +2607,7 @@ dependencies = [ "iced_runtime", "iced_widget", "iced_winit", - "image 0.25.10", + "image", "mime", "thiserror 2.0.18", "window_clipboard", @@ -2533,7 +2616,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "accesskit", "accesskit_winit", @@ -2542,7 +2625,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "bitflags 2.11.1", "bytes", @@ -2566,7 +2649,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "iced_core", "iced_futures", @@ -2576,7 +2659,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "futures", "iced_core", @@ -2590,7 +2673,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "bitflags 2.11.1", "bytemuck", @@ -2598,7 +2681,7 @@ dependencies = [ "half", "iced_core", "iced_futures", - "image 0.25.10", + "image", "kamadak-exif", "log", "lyon_path", @@ -2611,7 +2694,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "iced_graphics", "iced_runtime", @@ -2620,7 +2703,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -2632,7 +2715,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -2647,7 +2730,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "bytemuck", "cosmic-text", @@ -2664,7 +2747,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" +source = "git+https://github.com/wash2/iced_video_player.git?branch=iced-rebase#cb3635192f3dec37619855c904a168ca37a3dac3" dependencies = [ "glib", "gstreamer", @@ -2675,14 +2758,14 @@ dependencies = [ "iced_wgpu", "libcosmic", "log", - "thiserror 1.0.69", + "thiserror 2.0.18", "url", ] [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "as-raw-xcb-connection", "bitflags 2.11.1", @@ -2713,7 +2796,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.2" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -2731,7 +2814,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "cosmic-client-toolkit", "cursor-icon", @@ -2762,40 +2845,28 @@ dependencies = [ [[package]] name = "icu_collator" -version = "1.5.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d370371887d31d56f361c3eaa15743e54f13bc677059c9191c77e099ed6966b2" +checksum = "b521b92a2666061ddda902769d8a4cf730b5c9529a845cc1b69770b12a6c9a71" dependencies = [ - "displaydoc", "icu_collator_data", - "icu_collections 1.5.0", - "icu_locid_transform", - "icu_normalizer 1.5.0", - "icu_properties 1.5.1", - "icu_provider 1.5.0", + "icu_collections", + "icu_locale", + "icu_locale_core", + "icu_normalizer", + "icu_properties", + "icu_provider", "smallvec", "utf16_iter", "utf8_iter", - "zerovec 0.10.4", + "zerovec", ] [[package]] name = "icu_collator_data" -version = "1.5.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -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", -] +checksum = "038ed8e5817f2059c2f3efb0945ba78d060d3d25e8f1a1bea5139f821a21a2f0" [[package]] name = "icu_collections" @@ -2806,9 +2877,24 @@ dependencies = [ "displaydoc", "potential_utf", "utf8_iter", - "yoke 0.8.2", + "yoke", "zerofrom", - "zerovec 0.11.6", + "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", ] [[package]] @@ -2818,62 +2904,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", - "litemap 0.8.2", - "tinystr 0.8.3", - "writeable 0.6.3", - "zerovec 0.11.6", + "litemap", + "serde", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_data" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -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", -] +checksum = "d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993" [[package]] name = "icu_normalizer" @@ -2881,84 +2923,43 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ - "icu_collections 2.2.0", - "icu_normalizer_data 2.2.0", - "icu_properties 2.2.0", - "icu_provider 2.2.0", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", "smallvec", - "zerovec 0.11.6", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", ] -[[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 2.2.0", + "icu_collections", "icu_locale_core", - "icu_properties_data 2.2.0", - "icu_provider 2.2.0", + "icu_properties_data", + "icu_provider", "zerotrie", - "zerovec 0.11.6", + "zerovec", ] -[[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" @@ -2967,22 +2968,13 @@ checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", - "writeable 0.6.3", - "yoke 0.8.2", + "serde", + "stable_deref_trait", + "writeable", + "yoke", "zerofrom", "zerotrie", - "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", + "zerovec", ] [[package]] @@ -3014,26 +3006,8 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ - "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", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -3044,9 +3018,18 @@ 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", ] @@ -3067,6 +3050,12 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" +[[package]] +name = "imgref" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" + [[package]] name = "indexmap" version = "2.14.0" @@ -3099,6 +3088,17 @@ 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" @@ -3119,15 +3119,10 @@ dependencies = [ ] [[package]] -name = "is-terminal" -version = "0.4.17" +name = "is_terminal_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.61.2", -] +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -3146,9 +3141,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +checksum = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -3161,13 +3156,13 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +checksum = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -3212,7 +3207,7 @@ dependencies = [ "quote", "rustc_version", "simd_cesu8", - "syn 2.0.117", + "syn", ] [[package]] @@ -3240,7 +3235,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -3253,15 +3248,6 @@ dependencies = [ "libc", ] -[[package]] -name = "jpeg-decoder" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" -dependencies = [ - "rayon", -] - [[package]] name = "js-sys" version = "0.3.95" @@ -3339,6 +3325,15 @@ dependencies = [ "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" @@ -3360,12 +3355,6 @@ 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" @@ -3380,14 +3369,14 @@ checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "libc" -version = "0.2.185" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#0d69cd918374c5cccc2d9ce9ea37e0b322df463e" +source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" dependencies = [ "apply", "ashpd 0.12.3", @@ -3401,8 +3390,8 @@ dependencies = [ "derive_setters", "float-cmp 0.10.0", "futures", - "i18n-embed 0.16.0", - "i18n-embed-fl 0.10.0", + "i18n-embed", + "i18n-embed-fl", "iced", "iced_core", "iced_futures", @@ -3412,7 +3401,7 @@ dependencies = [ "iced_wgpu", "iced_widget", "iced_winit", - "image 0.25.10", + "image", "jiff", "log", "palette", @@ -3427,7 +3416,17 @@ dependencies = [ "tracing", "unicode-segmentation", "url", - "zbus 5.14.0", + "zbus", +] + +[[package]] +name = "libfuzzer-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" +dependencies = [ + "arbitrary", + "cc", ] [[package]] @@ -3491,12 +3490,6 @@ 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" @@ -3509,19 +3502,6 @@ 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" @@ -3537,6 +3517,15 @@ 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" @@ -3604,6 +3593,16 @@ 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" @@ -3639,9 +3638,9 @@ dependencies = [ [[package]] name = "metal" -version = "0.32.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" +checksum = "c7047791b5bc903b8cd963014b355f71dc9864a9a0b727057676c1dcae5cbc15" dependencies = [ "bitflags 2.11.1", "block", @@ -3694,15 +3693,15 @@ dependencies = [ [[package]] name = "mpris-server" -version = "0.8.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058bc2227727af394f34aa51da3e36aeecf2c808f39315d35f754872660750ae" +checksum = "70cf358e9a9516cc35ed40eebd56cbe80f5190a7a2b3cd0c2d358c86b879132b" dependencies = [ "async-channel", "futures-channel", "serde", "trait-variant", - "zbus 4.4.0", + "zbus", ] [[package]] @@ -3719,9 +3718,9 @@ checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" [[package]] name = "naga" -version = "27.0.3" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" +checksum = "618f667225063219ddfc61251087db8a9aec3c3f0950c916b614e403486f1135" dependencies = [ "arrayvec", "bit-set", @@ -3774,18 +3773,35 @@ dependencies = [ ] [[package]] -name = "nix" -version = "0.29.0" +name = "new_debug_unreachable" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "no_std_io2" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b51ed7824b6e07d354605f4abb3d9d300350701299da96642ee084f5ce631550" dependencies = [ - "bitflags 2.11.1", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", + "memchr", ] +[[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" @@ -3813,12 +3829,33 @@ 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", +] + [[package]] name = "num-conv" 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" @@ -3834,6 +3871,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ + "num-bigint", "num-integer", "num-traits", ] @@ -3867,7 +3905,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -4093,6 +4131,12 @@ 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" @@ -4101,18 +4145,18 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "option-operations" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c26d27bb1aeab65138e4bf7666045169d1717febcc9ff870166be8348b223d0" +checksum = "aca39cf52b03268400c16eeb9b56382ea3c3353409309b63f5c8f0b1faf42754" dependencies = [ - "paste", + "pastey 0.2.2", ] [[package]] name = "orbclient" -version = "0.3.51" +version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59aed3b33578edcfa1bc96a321d590d31832b6ad55a26f0313362ce687e9abd6" +checksum = "12c6933ddbbd16539a7672e697bb8d41ac3a4e99ac43eeb40c07236bd7fcb2dd" dependencies = [ "libc", "libredox", @@ -4158,7 +4202,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -4192,7 +4236,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -4230,6 +4274,18 @@ 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" @@ -4264,7 +4320,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared 0.11.3", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -4287,7 +4343,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -4300,7 +4356,7 @@ dependencies = [ "phf_shared 0.13.1", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "uncased", ] @@ -4346,7 +4402,7 @@ checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -4438,9 +4494,9 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] @@ -4451,7 +4507,9 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ - "zerovec 0.11.6", + "serde_core", + "writeable", + "zerovec", ] [[package]] @@ -4482,7 +4540,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.117", + "syn", ] [[package]] @@ -4494,30 +4552,6 @@ 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" @@ -4537,7 +4571,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -4557,7 +4591,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "version_check", "yansi", ] @@ -4567,12 +4601,25 @@ name = "profiling" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +dependencies = [ + "quote", + "syn", +] [[package]] name = "pxfm" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" +checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" [[package]] name = "qoi" @@ -4589,16 +4636,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" -[[package]] -name = "quick-xml" -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "quick-xml" version = "0.39.2" @@ -4606,6 +4643,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" dependencies = [ "memchr", + "serde", ] [[package]] @@ -4631,12 +4669,10 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ - "libc", - "rand_chacha 0.3.1", "rand_core 0.6.4", ] @@ -4646,20 +4682,10 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ - "rand_chacha 0.9.0", + "rand_chacha", "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" @@ -4675,9 +4701,6 @@ 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" @@ -4700,6 +4723,56 @@ 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" @@ -4807,7 +4880,7 @@ version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" dependencies = [ - "gif", + "gif 0.13.3", "image-webp", "log", "pico-args", @@ -4891,7 +4964,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.117", + "syn", "walkdir", ] @@ -5010,15 +5083,6 @@ 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" @@ -5058,7 +5122,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5083,7 +5147,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5095,17 +5159,6 @@ 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" @@ -5149,6 +5202,15 @@ 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" @@ -5265,7 +5327,7 @@ dependencies = [ [[package]] name = "softbuffer" version = "0.4.1" -source = "git+https://github.com/pop-os/softbuffer?tag=cosmic-4.0#a3f77e251e7422803f693df6e3fc313c010c4dcb" +source = "git+https://github.com/pop-os/softbuffer?tag=cosmic-4.0#c2b2c19ddb38ff17495643699f97cb1f2064a1be" dependencies = [ "as-raw-xcb-connection", "bytemuck", @@ -5322,12 +5384,6 @@ 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" @@ -5361,16 +5417,6 @@ 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" @@ -5390,7 +5436,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5481,7 +5527,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5492,18 +5538,21 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] name = "tiff" -version = "0.9.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" dependencies = [ + "fax", "flate2", - "jpeg-decoder", + "half", + "quick-error", "weezl", + "zune-jpeg 0.5.15", ] [[package]] @@ -5567,27 +5616,17 @@ dependencies = [ [[package]] name = "tiny-xlib" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" +checksum = "a90a0ca3ee6a69f2ad28fd11621a4c3f03b371f366be500b64df260c4ffbafb4" dependencies = [ "as-raw-xcb-connection", - "ctor-lite", + "ctor", "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" @@ -5596,7 +5635,7 @@ checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "serde_core", - "zerovec 0.11.6", + "zerovec", ] [[package]] @@ -5616,9 +5655,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.51.1" +version = "1.52.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" +checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" dependencies = [ "bytes", "libc", @@ -5639,7 +5678,7 @@ checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5674,7 +5713,7 @@ dependencies = [ "toml_datetime", "toml_parser", "toml_writer", - "winnow 1.0.1", + "winnow", ] [[package]] @@ -5695,7 +5734,7 @@ dependencies = [ "indexmap", "toml_datetime", "toml_parser", - "winnow 1.0.1", + "winnow", ] [[package]] @@ -5704,7 +5743,7 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.1", + "winnow", ] [[package]] @@ -5733,7 +5772,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5753,7 +5792,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5782,9 +5821,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "uds_windows" @@ -5822,7 +5861,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dce1bf08044d4b7a94028c93786f8566047edc11110595914de93362559bc658" dependencies = [ "serde", - "tinystr 0.8.3", + "tinystr", ] [[package]] @@ -5956,16 +5995,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] -name = "uuid" -version = "1.23.0" +name = "utf8parse" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" 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" @@ -6008,11 +6064,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -6021,7 +6077,7 @@ 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", + "wit-bindgen 0.51.0", ] [[package]] @@ -6066,7 +6122,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "wasm-bindgen-shared", ] @@ -6248,7 +6304,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" dependencies = [ "proc-macro2", - "quick-xml 0.39.2", + "quick-xml", "quote", ] @@ -6305,12 +6361,13 @@ checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "wgpu" -version = "27.0.1" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" +checksum = "f9cb534d5ffd109c7d1135f34cdae29e60eab94855a625dcfe1705f8bc7ad79f" dependencies = [ "arrayvec", "bitflags 2.11.1", + "bytemuck", "cfg-if", "cfg_aliases", "document-features", @@ -6334,9 +6391,9 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "27.0.3" +version = "28.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" +checksum = "d23f4642f53f666adcfd2d3218ab174d1e6681101aef18696b90cbe64d1c10f9" dependencies = [ "arrayvec", "bit-set", @@ -6366,36 +6423,36 @@ dependencies = [ [[package]] name = "wgpu-core-deps-apple" -version = "27.0.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" +checksum = "87b7b696b918f337c486bf93142454080a32a37832ba8a31e4f48221890047da" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-emscripten" -version = "27.0.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" +checksum = "34b251c331f84feac147de3c4aa3aa45112622a95dd7ee1b74384fa0458dbd79" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-windows-linux-android" -version = "27.0.0" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" +checksum = "68ca976e72b2c9964eb243e281f6ce7f14a514e409920920dcda12ae40febaae" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-hal" -version = "27.0.4" +version = "28.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" +checksum = "44d6cb474beb218824dcc9e1ce679d973f719262789bfb27407da560cac20eeb" dependencies = [ "android_system_properties", "arrayvec", @@ -6409,7 +6466,6 @@ dependencies = [ "core-graphics-types 0.2.0", "glow", "glutin_wgl_sys", - "gpu-alloc", "gpu-allocator", "gpu-descriptor", "hashbrown 0.16.1", @@ -6436,21 +6492,20 @@ dependencies = [ "wasm-bindgen", "web-sys", "wgpu-types", - "windows 0.58.0", - "windows-core 0.58.0", + "windows 0.62.2", + "windows-core 0.62.2", ] [[package]] name = "wgpu-types" -version = "27.0.1" +version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" +checksum = "e18308757e594ed2cd27dddbb16a139c42a683819d32a2e0b1b0167552f5840c" dependencies = [ "bitflags 2.11.1", "bytemuck", "js-sys", "log", - "thiserror 2.0.18", "web-sys", ] @@ -6500,27 +6555,29 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "windows" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" -dependencies = [ - "windows-core 0.58.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows" version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ - "windows-collections", + "windows-collections 0.2.0", "windows-core 0.61.2", - "windows-future", + "windows-future 0.2.1", "windows-link 0.1.3", - "windows-numerics", + "windows-numerics 0.2.0", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections 0.3.2", + "windows-core 0.62.2", + "windows-future 0.3.2", + "windows-numerics 0.3.1", ] [[package]] @@ -6533,16 +6590,12 @@ dependencies = [ ] [[package]] -name = "windows-core" -version = "0.58.0" +name = "windows-collections" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" dependencies = [ - "windows-implement 0.58.0", - "windows-interface 0.58.0", - "windows-result 0.2.0", - "windows-strings 0.1.0", - "windows-targets 0.52.6", + "windows-core 0.62.2", ] [[package]] @@ -6551,13 +6604,26 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", + "windows-implement", + "windows-interface", "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings 0.4.2", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + [[package]] name = "windows-future" version = "0.2.1" @@ -6566,18 +6632,18 @@ checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ "windows-core 0.61.2", "windows-link 0.1.3", - "windows-threading", + "windows-threading 0.1.0", ] [[package]] -name = "windows-implement" -version = "0.58.0" +name = "windows-future" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "windows-core 0.62.2", + "windows-link 0.2.1", + "windows-threading 0.2.1", ] [[package]] @@ -6588,18 +6654,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "windows-interface" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -6610,7 +6665,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -6636,12 +6691,13 @@ dependencies = [ ] [[package]] -name = "windows-result" -version = "0.2.0" +name = "windows-numerics" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" dependencies = [ - "windows-targets 0.52.6", + "windows-core 0.62.2", + "windows-link 0.2.1", ] [[package]] @@ -6654,13 +6710,12 @@ dependencies = [ ] [[package]] -name = "windows-strings" -version = "0.1.0" +name = "windows-result" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -6672,6 +6727,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -6774,6 +6838,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -7129,18 +7202,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.15" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" dependencies = [ "memchr", ] @@ -7154,6 +7218,12 @@ 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" @@ -7175,7 +7245,7 @@ dependencies = [ "heck 0.5.0", "indexmap", "prettyplease", - "syn 2.0.117", + "syn", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -7191,7 +7261,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -7239,12 +7309,6 @@ 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" @@ -7296,16 +7360,6 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fb433233f2df9344722454bc7e96465c9d03bff9d77c248f9e7523fe79585b5" -[[package]] -name = "xdg-home" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "xkbcommon" version = "0.7.0" @@ -7362,6 +7416,12 @@ 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" @@ -7374,18 +7434,6 @@ 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" @@ -7393,22 +7441,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", - "yoke-derive 0.8.2", + "yoke-derive", "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" @@ -7417,53 +7453,15 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "synstructure", ] [[package]] name = "zbus" -version = "4.4.0" +version = "5.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -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" +checksum = "c3bcbf15c8708d7fc1be0c993622e0a5cbd5e8b52bfa40afa4c3e0cd8d724ac1" dependencies = [ "async-broadcast", "async-executor", @@ -7489,10 +7487,10 @@ dependencies = [ "uds_windows", "uuid", "windows-sys 0.61.2", - "winnow 0.7.15", - "zbus_macros 5.14.0", - "zbus_names 4.3.1", - "zvariant 5.10.0", + "winnow", + "zbus_macros", + "zbus_names", + "zvariant", ] [[package]] @@ -7502,7 +7500,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6998de05217a084b7578728a9443d04ea4cd80f2a0839b8d78770b76ccd45863" dependencies = [ "zbus_xml", - "zvariant 5.10.0", + "zvariant", ] [[package]] @@ -7513,72 +7511,48 @@ checksum = "10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "zbus-lockstep", "zbus_xml", - "zvariant 5.10.0", + "zvariant", ] [[package]] name = "zbus_macros" -version = "4.4.0" +version = "5.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +checksum = "51fa5406ad9175a8c825a931f8cf347116b531b3634fcb0b627c290f1f2516ff" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "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", + "syn", + "zbus_names", + "zvariant", + "zvariant_utils", ] [[package]] name = "zbus_names" -version = "3.0.0" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d" dependencies = [ "serde", - "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", + "winnow", + "zvariant", ] [[package]] name = "zbus_xml" -version = "5.1.0" +version = "5.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "441a0064125265655bccc3a6af6bef56814d9277ac83fce48b1cd7e160b80eac" +checksum = "a8067892e940ed1727dea64690378601603b31d62dfde019a5335fbb7c0e0ed9" dependencies = [ - "quick-xml 0.38.4", + "quick-xml", "serde", - "zbus_names 4.3.1", - "zvariant 5.10.0", + "zbus_names", + "zvariant", ] [[package]] @@ -7604,7 +7578,7 @@ checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -7624,7 +7598,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "synstructure", ] @@ -7635,19 +7609,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", - "yoke 0.8.2", + "yoke", "zerofrom", -] - -[[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", + "zerovec", ] [[package]] @@ -7657,20 +7621,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "serde", - "yoke 0.8.2", + "yoke", "zerofrom", - "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", + "zerovec-derive", ] [[package]] @@ -7681,7 +7634,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -7731,78 +7684,41 @@ dependencies = [ [[package]] name = "zvariant" -version = "4.2.0" +version = "5.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -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" +checksum = "c4db0ecb8987cf5e92653c57c098f7f0e39a03112edb796f4fe089fb7eaa14ff" dependencies = [ "endi", "enumflags2", "serde", "url", - "winnow 0.7.15", - "zvariant_derive 5.10.0", - "zvariant_utils 3.3.0", + "winnow", + "zvariant_derive", + "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "4.2.0" +version = "5.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +checksum = "5b949b639ab1b4bed763aa7481ba0e368af68d8b55532f8ed4bec86a59f2ca98" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "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", + "syn", + "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "2.1.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -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" +checksum = "6d464f5733ffa07a3164d656f18533caace9d0638596721355d73256a410d691" dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.117", - "winnow 0.7.15", + "syn", + "winnow", ] diff --git a/Cargo.toml b/Cargo.toml index 5fde597..517b139 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,31 +2,32 @@ name = "cosmic-player" version = "1.0.11" edition = "2024" +rust-version = "1.93" [build-dependencies] vergen = { version = "8", features = ["git", "gitcl"] } [dependencies] ashpd = { version = "0.12", optional = true } -gstreamer-tag = "0.23" -image = "0.24.9" +gstreamer-tag = "0.25" +image = "0.25" serde = { version = "1", features = ["serde_derive"] } tempfile = "3" tokio = { version = "1", features = ["sync"] } url = { version = "2", features = ["serde"] } # CLI arguments -clap_lex = "0.7" +clap_lex = "1.1" # Internationalization -icu_collator = "1.5" -icu_provider = { version = "1.5", features = ["sync"] } -i18n-embed = { version = "0.14", features = [ +icu_collator = "2.2" +icu_locale = "2.2" +i18n-embed = { version = "0.16", features = [ "fluent-system", "desktop-requester", ] } -i18n-embed-fl = "0.7" +i18n-embed-fl = "0.10" rust-embed = "8" # Logging -env_logger = "0.10" +env_logger = "0.11" log = "0.4" [dependencies.iced_video_player] @@ -40,11 +41,12 @@ default-features = false features = ["advanced-shaping", "tokio", "winit", "multi-window"] [dependencies.mpris-server] -version = "0.8.1" +version = "0.10" +features = ["tokio"] optional = true [target.'cfg(unix)'.dependencies] -fork = "0.2" +fork = "0.7" [features] default = ["mpris-server", "xdg-portal", "wgpu", "wayland"] diff --git a/rustfmt.toml b/rustfmt.toml index fa09141..c1578aa 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1 +1 @@ -reorder_imports = false +imports_granularity = "Module" diff --git a/src/argparse.rs b/src/argparse.rs index 80d20fb..f852b29 100644 --- a/src/argparse.rs +++ b/src/argparse.rs @@ -1,7 +1,8 @@ // Copyright 2024 System76 // SPDX-License-Identifier: GPL-3.0-only -use std::{fs, io, path::PathBuf}; +use std::path::PathBuf; +use std::{fs, io}; use clap_lex::RawArgs; use log::warn; diff --git a/src/config.rs b/src/config.rs index df13c43..0b6a29e 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,11 +1,11 @@ // SPDX-License-Identifier: GPL-3.0-only -use cosmic::{ - cosmic_config::{self, CosmicConfigEntry, cosmic_config_derive::CosmicConfigEntry}, - theme, -}; +use cosmic::cosmic_config::cosmic_config_derive::CosmicConfigEntry; +use cosmic::cosmic_config::{self, CosmicConfigEntry}; +use cosmic::theme; use serde::{Deserialize, Serialize}; -use std::{collections::VecDeque, path::PathBuf}; +use std::collections::VecDeque; +use std::path::PathBuf; pub const CONFIG_VERSION: u64 = 1; diff --git a/src/key_bind.rs b/src/key_bind.rs index d276fb7..817fff9 100644 --- a/src/key_bind.rs +++ b/src/key_bind.rs @@ -1,4 +1,5 @@ -use cosmic::{iced::keyboard::Key, iced::core::keyboard::key::Named}; +use cosmic::iced::keyboard::Key; +use cosmic::iced::keyboard::key::Named; use std::collections::HashMap; use crate::Action; diff --git a/src/localize.rs b/src/localize.rs index d7d9ce5..c3ebd46 100644 --- a/src/localize.rs +++ b/src/localize.rs @@ -1,50 +1,64 @@ // SPDX-License-Identifier: GPL-3.0-only -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 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 rust_embed::RustEmbed; +use std::sync::LazyLock; #[derive(RustEmbed)] #[folder = "i18n/"] struct Localizations; -pub static LANGUAGE_LOADER: OnceLock = OnceLock::new(); -pub static LANGUAGE_SORTER: OnceLock = OnceLock::new(); +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") + }) +}); #[macro_export] macro_rules! fl { ($message_id:literal) => {{ - i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER.get().unwrap(), $message_id) + i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id) }}; ($message_id:literal, $($args:expr),*) => {{ - i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER.get().unwrap(), $message_id, $($args), *) + i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id, $($args), *) }}; } // Get the `Localizer` to be used for localizing this library. pub fn localizer() -> Box { - 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, - )) + Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations)) } pub fn localize() { @@ -52,25 +66,6 @@ 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 App List {}", error); + eprintln!("Error while loading language for COSMIC Media Player {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 fa95330..d689ce3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,49 +1,32 @@ // Copyright 2023 System76 // SPDX-License-Identifier: GPL-3.0-only -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::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::window::{self, set_mode}; +use cosmic::iced::{ + Alignment, Background, Border, Color, ContentFit, Length, Limits, Subscription, }; +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, ConfigState, CONFIG_VERSION, RepeatState}, - key_bind::{key_binds, KeyBind}, - mpris::subscription, - project::ProjectNode, -}; +use crate::config::{CONFIG_VERSION, Config, ConfigState, RepeatState}; +use crate::key_bind::{KeyBind, key_binds}; +use crate::project::ProjectNode; mod argparse; mod config; @@ -611,10 +594,10 @@ impl App { } fn save_config_state(&mut self) { - 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); - } + 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); } } @@ -623,9 +606,9 @@ impl App { || !self .video_opt .as_ref() - .map_or(false, |video| video.has_video()) + .is_some_and(|video| video.has_video()) { - self.core.window.show_headerbar = true && !self.fullscreen; + self.core.window.show_headerbar = !self.fullscreen; self.controls = true; self.controls_time = Instant::now(); } else if self.controls && self.controls_time.elapsed() > CONTROLS_TIMEOUT { @@ -679,7 +662,7 @@ impl App { ..Default::default() }; //TODO: use any other stream tags? - if let Some(tags) = self.audio_tags.get(0) { + if let Some(tags) = self.audio_tags.first() { log::info!("{:#?}", tags); if let Some(tag) = tags.get::() { new.album = tag.get().into(); @@ -752,11 +735,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 { - if new != *old { - *old = new.clone(); - let _ = tx.send(MprisEvent::Meta(new.clone())); - } + if let Some((old, _, tx)) = &mut self.mpris_opt + && new != *old + { + *old = new.clone(); + let _ = tx.send(MprisEvent::Meta(new.clone())); } self.mpris_meta = new; } @@ -951,7 +934,7 @@ impl Application for App { fn on_escape(&mut self) -> Task { if self.fullscreen { - return self.update(Message::Fullscreen); + self.update(Message::Fullscreen) } else { Task::none() } @@ -1210,12 +1193,12 @@ impl Application for App { } } Message::AudioCode(code) => { - 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"); - } + 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"); } } Message::AudioToggle => { @@ -1225,12 +1208,12 @@ impl Application for App { } } Message::AudioVolume(volume) => { - 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); - } + 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); } } Message::TextCode(index) => { @@ -1313,7 +1296,7 @@ impl Application for App { } } - if (volume >= 0.0 && volume <= 1.0) && !nav_bar_toggled { + if (0.0..=1.0).contains(&volume) && !nav_bar_toggled { video.set_volume(volume); video.set_muted(false); self.update_controls(true); @@ -1537,20 +1520,20 @@ impl Application for App { self.update_mpris_state(); } Message::NewFrame => { - if let Some(video) = &mut self.video_opt { - if !self.dragging { - self.position = video.position().as_secs_f64(); + if let Some(video) = &mut self.video_opt + && !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 => { @@ -1801,7 +1784,7 @@ impl Application for App { .spacing(space_xxs) .push( widget::button::icon( - if self.video_opt.as_ref().map_or(true, |video| video.paused()) { + if self.video_opt.as_ref().is_none_or(|video| video.paused()) { widget::icon::from_name("media-playback-start-symbolic").size(16) } else { widget::icon::from_name("media-playback-pause-symbolic").size(16) diff --git a/src/menu.rs b/src/menu.rs index 9af9769..0f21053 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -1,14 +1,11 @@ // SPDX-License-Identifier: GPL-3.0-only -use cosmic::{ - theme, - widget::{ - menu::{self, key_bind::KeyBind, ItemHeight, ItemWidth, MenuBar}, - RcElementWrapper, - }, - Element, -}; -use std::{collections::HashMap, path::PathBuf}; +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 crate::{Action, Config, ConfigState, Message, fl}; @@ -22,10 +19,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 { - if let Ok(part) = path.strip_prefix(home_dir) { - return format!("~/{}", part.display()); - } + if let Some(home_dir) = &home_dir_opt + && 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 b14a1c4..31a088f 100644 --- a/src/mpris.rs +++ b/src/mpris.rs @@ -1,18 +1,16 @@ -use cosmic::{ - iced::{ - futures::{self, SinkExt, Stream}, - Subscription, stream, - }, -}; +use cosmic::iced::futures::{self, SinkExt, Stream}; +use cosmic::iced::{Subscription, stream}; +use mpris_server::zbus::{Result, fdo}; use mpris_server::{ LoopStatus, Metadata, PlaybackRate, PlaybackStatus, PlayerInterface, Property, RootInterface, Server, Signal, Time, TrackId, Volume, - zbus::{Result, fdo}, }; -use std::{any::TypeId, future, process}; +use std::any::TypeId; +use std::{future, process}; use tokio::sync::{Mutex, mpsc}; -use crate::{Message, MprisEvent, MprisMeta, MprisState, config::RepeatState}; +use crate::config::RepeatState; +use crate::{Message, MprisEvent, MprisMeta, MprisState}; impl MprisMeta { fn metadata(&self) -> Metadata { diff --git a/src/project.rs b/src/project.rs index 76f8558..426b0f3 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,11 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-only use cosmic::widget; -use std::{ - cmp::Ordering, - fs, io, - path::{Path, PathBuf}, -}; +use std::cmp::Ordering; +use std::path::{Path, PathBuf}; +use std::{fs, io}; #[derive(Clone, Debug, Eq, PartialEq)] pub enum ProjectNode { @@ -26,15 +24,15 @@ impl ProjectNode { let path = fs::canonicalize(path)?; let name = path .file_name() - .ok_or(io::Error::new( - io::ErrorKind::Other, - format!("path {:?} has no file name", path), - ))? + .ok_or(io::Error::other(format!( + "path {:?} has no file name", + path + )))? .to_str() - .ok_or(io::Error::new( - io::ErrorKind::Other, - format!("path {:?} is not valid UTF-8", path), - ))? + .ok_or(io::Error::other(format!( + "path {:?} is not valid UTF-8", + path + )))? .to_string(); Ok(if path.is_dir() { Self::Folder { @@ -94,7 +92,7 @@ impl Ord for ProjectNode { } } } - crate::localize::sorter().compare(self.name(), other.name()) + crate::localize::LANGUAGE_SORTER.compare(self.name(), other.name()) } } diff --git a/src/thumbnail.rs b/src/thumbnail.rs index c7a0f42..96142d3 100644 --- a/src/thumbnail.rs +++ b/src/thumbnail.rs @@ -1,6 +1,9 @@ use iced_video_player::Position; use image::{DynamicImage, ImageFormat, RgbaImage}; -use std::{error::Error, num::NonZero, path::Path, time::Duration}; +use std::error::Error; +use std::num::NonZero; +use std::path::Path; +use std::time::Duration; use url::Url; use super::video; @@ -14,7 +17,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(format!("missing required plugin"))), + Err(_err) => return Err(Into::into("missing required plugin".to_string())), }; let duration = video.duration(); @@ -37,7 +40,7 @@ pub fn main( pixels, } => RgbaImage::from_raw(*width, *height, pixels.to_vec()) .map(DynamicImage::ImageRgba8) - .ok_or_else(|| format!("failed to convert thumbnail")), + .ok_or_else(|| "failed to convert thumbnail".to_string()), _ => Err(format!("unsupported thumbnail handle {:?}", thumbnails[0])), } }?; diff --git a/src/video.rs b/src/video.rs index fd73a68..743f43e 100644 --- a/src/video.rs +++ b/src/video.rs @@ -1,10 +1,8 @@ -use iced_video_player::{ - Video, - gst::{self, prelude::*}, - gst_app, gst_pbutils, -}; +use iced_video_player::gst::prelude::*; +use iced_video_player::{Video, gst, gst_app, gst_pbutils}; -use cosmic::{action, app::Task}; +use cosmic::action; +use cosmic::app::Task; #[derive(Debug, Default)] pub struct VideoSettings { @@ -33,13 +31,13 @@ pub fn new_video( let Ok(elem) = vals[1].get::() else { return None; }; - 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", - ); - } + 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", + ); } None }); @@ -65,18 +63,15 @@ pub fn new_video( .unwrap() .pop_filtered(&[gst::MessageType::Element]) { - 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; - } - } - _ => {} + 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; } } pipeline.set_state(gst::State::Null).unwrap(); diff --git a/src/xdg_portals.rs b/src/xdg_portals.rs index 357d1af..e6630ea 100644 --- a/src/xdg_portals.rs +++ b/src/xdg_portals.rs @@ -3,10 +3,8 @@ //! Integrations with XDG portals. -use ashpd::{ - desktop::inhibit::{InhibitFlags, InhibitProxy}, - enumflags2::{BitFlags, make_bitflags}, -}; +use ashpd::desktop::inhibit::{InhibitFlags, InhibitProxy}; +use ashpd::enumflags2::{BitFlags, make_bitflags}; use log::{debug, warn}; use tokio::sync::watch::Receiver; From 468b5f14592a611069f1ef1b680e02e63d5c646e Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 5 May 2026 10:24:36 -0600 Subject: [PATCH 4/9] Epoch 1.0.12 version update Generated by cosmic-epoch scripts/version-update.sh --- Cargo.lock | 138 +++++++++++++++++++++++------------------------ Cargo.toml | 2 +- debian/changelog | 6 +++ 3 files changed, 76 insertions(+), 70 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 14fd7ce..2fb9cc5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1074,7 +1074,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1095,7 +1095,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "quote", "syn", @@ -1117,7 +1117,7 @@ dependencies = [ [[package]] name = "cosmic-player" -version = "1.0.11" +version = "1.0.12" dependencies = [ "ashpd 0.12.3", "clap_lex", @@ -1190,7 +1190,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "almost", "configparser", @@ -2105,9 +2105,9 @@ checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" [[package]] name = "glib" -version = "0.22.6" +version = "0.22.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f075bd737d1fa842a944a4a1dc209838caa7e0e2ddf8aefb9ddf76538bc3ed7" +checksum = "c207e04e51605dcf7b2924c41591b3a10e1438eaac5bcf448fb91f325381104a" dependencies = [ "bitflags 2.11.1", "futures-channel", @@ -2595,7 +2595,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "dnd", "iced_accessibility", @@ -2616,7 +2616,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "accesskit", "accesskit_winit", @@ -2625,7 +2625,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "bitflags 2.11.1", "bytes", @@ -2649,7 +2649,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "iced_core", "iced_futures", @@ -2659,7 +2659,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "futures", "iced_core", @@ -2673,7 +2673,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "bitflags 2.11.1", "bytemuck", @@ -2694,7 +2694,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "iced_graphics", "iced_runtime", @@ -2703,7 +2703,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -2715,7 +2715,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -2730,7 +2730,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "bytemuck", "cosmic-text", @@ -2765,7 +2765,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "as-raw-xcb-connection", "bitflags 2.11.1", @@ -2796,7 +2796,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.2" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -2814,7 +2814,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "cosmic-client-toolkit", "cursor-icon", @@ -3002,9 +3002,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -3052,9 +3052,9 @@ checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "imgref" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" +checksum = "40fac9d56ed6437b198fddba683305e8e2d651aa42647f00f5ae542e7f5c94a2" [[package]] name = "indexmap" @@ -3250,9 +3250,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.95" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" +checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" dependencies = [ "cfg-if", "futures-util", @@ -3317,11 +3317,11 @@ dependencies = [ [[package]] name = "kqueue-sys" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +checksum = "a7b65860415f949f23fa882e669f2dbd4a0f0eeb1acdd56790b30494afd7da2f" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.11.1", "libc", ] @@ -3376,7 +3376,7 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#99c038a66ac721e6af9ca058aa5038ca279d9d0c" +source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" dependencies = [ "apply", "ashpd 0.12.3", @@ -3454,7 +3454,7 @@ dependencies = [ "bitflags 2.11.1", "libc", "plain", - "redox_syscall 0.7.4", + "redox_syscall 0.7.5", ] [[package]] @@ -3544,9 +3544,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9815fac08e6fd96733a11dce4f9d15a3f338e96a2e2311ee21e1b738efc2bc0f" +checksum = "8575c0d003ae459399623c4def180c63b77f343b1a7fee64f249b349e7699a31" dependencies = [ "lyon_path", "num-traits", @@ -3780,9 +3780,9 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "no_std_io2" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b51ed7824b6e07d354605f4abb3d9d300350701299da96642ee084f5ce631550" +checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" dependencies = [ "memchr", ] @@ -4154,9 +4154,9 @@ dependencies = [ [[package]] name = "orbclient" -version = "0.3.53" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12c6933ddbbd16539a7672e697bb8d41ac3a4e99ac43eeb40c07236bd7fcb2dd" +checksum = "a570f6bca41d29acb2139229a7c873ec99bc9a313bd10804081d89bfac8ff329" dependencies = [ "libc", "libredox", @@ -4387,18 +4387,18 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.11" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +checksum = "cbf0d9e68100b3a7989b4901972f265cd542e560a3a8a724e1e20322f4d06ce9" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.11" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +checksum = "a990e22f43e84855daf260dded30524ef4a9021cc7541c26540500a50b624389" dependencies = [ "proc-macro2", "quote", @@ -4598,18 +4598,18 @@ dependencies = [ [[package]] name = "profiling" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" dependencies = [ "profiling-procmacros", ] [[package]] name = "profiling-procmacros" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" dependencies = [ "quote", "syn", @@ -4638,9 +4638,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.39.2" +version = "0.39.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" +checksum = "721da970c312655cde9b4ffe0547f20a8494866a4af5ff51f18b7c633d0c870b" dependencies = [ "memchr", "serde", @@ -4821,9 +4821,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" +checksum = "4666a1a60d8412eab19d94f6d13dcc9cea0a5ef4fdf6a5db306537413c661b1b" dependencies = [ "bitflags 2.11.1", ] @@ -5228,9 +5228,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "skrifa" @@ -5655,9 +5655,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.1" +version = "1.52.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" +checksum = "110a78583f19d5cdb2c5ccf321d1290344e71313c6c37d43520d386027d18386" dependencies = [ "bytes", "libc", @@ -6082,9 +6082,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" +checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" dependencies = [ "cfg-if", "once_cell", @@ -6095,9 +6095,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.68" +version = "0.4.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" +checksum = "af934872acec734c2d80e6617bbb5ff4f12b052dd8e6332b0817bce889516084" dependencies = [ "js-sys", "wasm-bindgen", @@ -6105,9 +6105,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" +checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6115,9 +6115,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" +checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" dependencies = [ "bumpalo", "proc-macro2", @@ -6128,9 +6128,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" +checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" dependencies = [ "unicode-ident", ] @@ -6335,9 +6335,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.95" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" +checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" dependencies = [ "js-sys", "wasm-bindgen", @@ -7087,7 +7087,7 @@ dependencies = [ "libredox", "orbclient", "raw-window-handle", - "redox_syscall 0.7.4", + "redox_syscall 0.7.5", "smol_str", "tracing", "winit-core", @@ -7684,9 +7684,9 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.10.1" +version = "5.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db0ecb8987cf5e92653c57c098f7f0e39a03112edb796f4fe089fb7eaa14ff" +checksum = "1c1567a6ec68df868cbbfde844cfc6d81649fe5109a62b116b19fabd53e618ee" dependencies = [ "endi", "enumflags2", @@ -7699,9 +7699,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.10.1" +version = "5.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b949b639ab1b4bed763aa7481ba0e368af68d8b55532f8ed4bec86a59f2ca98" +checksum = "c7d5b780599bbde114e39d9a0799577fad1ced5105d38515745f7b3099d8ceda" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 517b139..641031d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmic-player" -version = "1.0.11" +version = "1.0.12" edition = "2024" rust-version = "1.93" diff --git a/debian/changelog b/debian/changelog index 09014a0..58bfc27 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +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 From f3d6469beda96f425efa63b1edf13af1cc69da17 Mon Sep 17 00:00:00 2001 From: Rodrigo Rivero Date: Thu, 7 May 2026 18:53:08 -0400 Subject: [PATCH 5/9] feat: add skip forward and backward playback controls --- .../16x16/apps/jump-backward-10-symbolic.svg | 5 + .../16x16/apps/jump-forward-10-symbolic.svg | 5 + src/main.rs | 114 ++++++++++++++++-- src/mpris.rs | 8 +- 4 files changed, 119 insertions(+), 13 deletions(-) create mode 100644 res/icons/hicolor/16x16/apps/jump-backward-10-symbolic.svg create mode 100644 res/icons/hicolor/16x16/apps/jump-forward-10-symbolic.svg diff --git a/res/icons/hicolor/16x16/apps/jump-backward-10-symbolic.svg b/res/icons/hicolor/16x16/apps/jump-backward-10-symbolic.svg new file mode 100644 index 0000000..51c26ca --- /dev/null +++ b/res/icons/hicolor/16x16/apps/jump-backward-10-symbolic.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/res/icons/hicolor/16x16/apps/jump-forward-10-symbolic.svg b/res/icons/hicolor/16x16/apps/jump-forward-10-symbolic.svg new file mode 100644 index 0000000..bc4095f --- /dev/null +++ b/res/icons/hicolor/16x16/apps/jump-forward-10-symbolic.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main.rs b/src/main.rs index d689ce3..2c11f3d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -47,6 +47,12 @@ 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 { @@ -170,6 +176,8 @@ pub enum Action { FolderOpenRecent(usize), Fullscreen, PlayPause, + PlayPrev, + PlayNext, SeekBackward, SeekForward, NextFrame, @@ -193,6 +201,8 @@ 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, @@ -291,6 +301,7 @@ pub enum Message { Seek(f64), SeekRelative(f64), SeekRelease, + PlayPrev, PlayNext, NextFrame, PreviousFrame, @@ -1338,6 +1349,55 @@ 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, @@ -1779,19 +1839,55 @@ impl Application for App { ); } if self.controls { - let mut row = widget::row::with_capacity(7) + let mut row = widget::row::with_capacity(9) .align_y(Alignment::Center) .spacing(space_xxs) .push( - widget::button::icon( - if self.video_opt.as_ref().is_none_or(|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), + 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) + }, ); + 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/mpris.rs b/src/mpris.rs index 31a088f..8c87244 100644 --- a/src/mpris.rs +++ b/src/mpris.rs @@ -150,12 +150,12 @@ impl RootInterface for Player { impl PlayerInterface for Player { async fn next(&self) -> fdo::Result<()> { log::info!("Next"); - Ok(()) + self.message(Message::PlayNext).await } async fn previous(&self) -> fdo::Result<()> { log::info!("Previous"); - Ok(()) + self.message(Message::PlayPrev).await } async fn pause(&self) -> fdo::Result<()> { @@ -271,12 +271,12 @@ impl PlayerInterface for Player { async fn can_go_next(&self) -> fdo::Result { log::info!("CanGoNext"); - Ok(false) + Ok(true) } async fn can_go_previous(&self) -> fdo::Result { log::info!("CanGoPrevious"); - Ok(false) + Ok(true) } async fn can_play(&self) -> fdo::Result { From fab830c994f7b91c45232206d451373373977520 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 25 Feb 2026 09:25:51 -0700 Subject: [PATCH 6/9] Translate desktop and metainfo with xdgen --- Cargo.lock | 60 +++++++++++++++++----- Cargo.toml | 1 + build.rs | 22 ++++++++ i18n/ar/cosmic_player.ftl | 6 +++ i18n/cs/cosmic_player.ftl | 6 +++ i18n/en/cosmic_player.ftl | 6 +++ i18n/es/cosmic_player.ftl | 6 +++ i18n/hu/cosmic_player.ftl | 6 +++ i18n/it/cosmic_player.ftl | 6 +++ i18n/pl/cosmic_player.ftl | 6 +++ i18n/pt-BR/cosmic_player.ftl | 6 +++ i18n/pt/cosmic_player.ftl | 6 +++ i18n/ru/cosmic_player.ftl | 5 ++ i18n/sk/cosmic_player.ftl | 6 +++ i18n/sv/cosmic_player.ftl | 6 +++ i18n/zh-CN/cosmic_player.ftl | 4 ++ justfile | 4 +- res/com.system76.CosmicPlayer.desktop | 25 +-------- res/com.system76.CosmicPlayer.metainfo.xml | 40 ++++++--------- 19 files changed, 164 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2fb9cc5..61addb3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1139,6 +1139,7 @@ dependencies = [ "tokio", "url", "vergen", + "xdgen", ] [[package]] @@ -1887,6 +1888,16 @@ 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" @@ -2480,12 +2491,6 @@ dependencies = [ "foldhash 0.2.0", ] -[[package]] -name = "hashbrown" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" - [[package]] name = "heck" version = "0.4.1" @@ -3058,12 +3063,12 @@ checksum = "40fac9d56ed6437b198fddba683305e8e2d651aa42647f00f5ae542e7f5c94a2" [[package]] name = "indexmap" -version = "2.14.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.17.0", + "hashbrown 0.16.1", "serde", "serde_core", ] @@ -5457,7 +5462,7 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 1.1.2+spec-1.1.0", + "toml 1.1.0+spec-1.1.0", "version-compare", ] @@ -5703,9 +5708,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.1.2+spec-1.1.0" +version = "1.1.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +checksum = "f8195ca05e4eb728f4ba94f3e3291661320af739c4e43779cbdfae82ab239fcc" dependencies = [ "indexmap", "serde_core", @@ -5727,9 +5732,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.11+spec-1.1.0" +version = "0.25.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +checksum = "0db3bae107c9522f86d361697dee1d7386a2ddcf659d5aea5159819a21a3c4a7" dependencies = [ "indexmap", "toml_datetime", @@ -7360,6 +7365,18 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fb433233f2df9344722454bc7e96465c9d03bff9d77c248f9e7523fe79585b5" +[[package]] +name = "xdgen" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25af88f104f06d5aeb80c77e5eb85e6f6f355f86f6e34307a14befd716efe4bf" +dependencies = [ + "fluent", + "freedesktop_entry_parser", + "unic-langid", + "xmltree", +] + [[package]] name = "xkbcommon" version = "0.7.0" @@ -7404,12 +7421,27 @@ 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" diff --git a/Cargo.toml b/Cargo.toml index 641031d..e3f5135 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ rust-version = "1.93" [build-dependencies] vergen = { version = "8", features = ["git", "gitcl"] } +xdgen = "0.1" [dependencies] ashpd = { version = "0.12", optional = true } diff --git a/build.rs b/build.rs index bc2427f..c354dda 100644 --- a/build.rs +++ b/build.rs @@ -1,5 +1,27 @@ 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/i18n/ar/cosmic_player.ftl b/i18n/ar/cosmic_player.ftl index 77b8b43..39055e0 100644 --- a/i18n/ar/cosmic_player.ftl +++ b/i18n/ar/cosmic_player.ftl @@ -46,3 +46,9 @@ 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/cs/cosmic_player.ftl b/i18n/cs/cosmic_player.ftl index c580b82..3830923 100644 --- a/i18n/cs/cosmic_player.ftl +++ b/i18n/cs/cosmic_player.ftl @@ -31,3 +31,9 @@ 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 pracovní prostředí COSMIC +xdg-keywords = audio;film;hudba;video;média;zvuk; diff --git a/i18n/en/cosmic_player.ftl b/i18n/en/cosmic_player.ftl index 505e312..36cb2b2 100644 --- a/i18n/en/cosmic_player.ftl +++ b/i18n/en/cosmic_player.ftl @@ -45,3 +45,9 @@ 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 8171fb7..3c96c7a 100644 --- a/i18n/es/cosmic_player.ftl +++ b/i18n/es/cosmic_player.ftl @@ -36,3 +36,9 @@ 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/hu/cosmic_player.ftl b/i18n/hu/cosmic_player.ftl index 9fe8a1c..46d70ad 100644 --- a/i18n/hu/cosmic_player.ftl +++ b/i18n/hu/cosmic_player.ftl @@ -46,3 +46,9 @@ 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/it/cosmic_player.ftl b/i18n/it/cosmic_player.ftl index 25575b2..075134d 100644 --- a/i18n/it/cosmic_player.ftl +++ b/i18n/it/cosmic_player.ftl @@ -36,3 +36,9 @@ 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/pl/cosmic_player.ftl b/i18n/pl/cosmic_player.ftl index 1a2cc16..451a2f4 100644 --- a/i18n/pl/cosmic_player.ftl +++ b/i18n/pl/cosmic_player.ftl @@ -46,3 +46,9 @@ 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 46cb09f..0736a26 100644 --- a/i18n/pt-BR/cosmic_player.ftl +++ b/i18n/pt-BR/cosmic_player.ftl @@ -46,3 +46,9 @@ 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 desktop COSMIC +xdg-keywords = Audio;Filme;Música;Som;Vídeo;Media;Player; diff --git a/i18n/pt/cosmic_player.ftl b/i18n/pt/cosmic_player.ftl index 4459fc8..0b02aa3 100644 --- a/i18n/pt/cosmic_player.ftl +++ b/i18n/pt/cosmic_player.ftl @@ -35,3 +35,9 @@ 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 512d61e..1e69f0c 100644 --- a/i18n/ru/cosmic_player.ftl +++ b/i18n/ru/cosmic_player.ftl @@ -39,3 +39,8 @@ 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 = Аудио;Фильм;Музыка;Видео;Медиа;Звук;Мультимедиа;Медиаплеер; diff --git a/i18n/sk/cosmic_player.ftl b/i18n/sk/cosmic_player.ftl index 268c6b4..1a7faac 100644 --- a/i18n/sk/cosmic_player.ftl +++ b/i18n/sk/cosmic_player.ftl @@ -30,3 +30,9 @@ 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/sv/cosmic_player.ftl b/i18n/sv/cosmic_player.ftl index 40f6273..c6c5ab2 100644 --- a/i18n/sv/cosmic_player.ftl +++ b/i18n/sv/cosmic_player.ftl @@ -46,3 +46,9 @@ 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/zh-CN/cosmic_player.ftl b/i18n/zh-CN/cosmic_player.ftl index f8091e1..c1a8e93 100644 --- a/i18n/zh-CN/cosmic_player.ftl +++ b/i18n/zh-CN/cosmic_player.ftl @@ -46,3 +46,7 @@ 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 媒体播放器 diff --git a/justfile b/justfile index 04c410a..003fa0f 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 := 'res' / desktop +desktop-src := 'target/xdgen' / desktop desktop-dst := clean(rootdir / prefix) / 'share' / 'applications' / desktop metainfo := APPID + '.metainfo.xml' -metainfo-src := 'res' / metainfo +metainfo-src := 'target/xdgen' / 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 d33bbd1..d12fdc4 100644 --- a/res/com.system76.CosmicPlayer.desktop +++ b/res/com.system76.CosmicPlayer.desktop @@ -1,18 +1,6 @@ -#TODO: more build-out, desktop actions, translations? [Desktop Entry] Name=COSMIC Media Player -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 +Comment=Media player for the COSMIC desktop Exec=cosmic-player %U Terminal=false Type=Application @@ -21,14 +9,3 @@ 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 5dc3403..fdae66e 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,33 +9,15 @@ 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

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

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 From 0a0f44773f8ddae07cba5f3bc658cc3e0c329c51 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 12 May 2026 13:11:38 +0200 Subject: [PATCH 7/9] i18n: translation updates from weblate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Adolfo Jayme Barrientos Co-authored-by: Aindriú Mac Giolla Eoin Co-authored-by: Baurzhan Muftakhidinov Co-authored-by: BoneNI Co-authored-by: Dan Co-authored-by: David Carvalho Co-authored-by: Ettore Atalan Co-authored-by: Fedorov Alexei Co-authored-by: Feike Donia Co-authored-by: Filippos Papadopoulos Co-authored-by: Geeson Wan Co-authored-by: Hosted Weblate Co-authored-by: Jim Spentzos Co-authored-by: Jiri Grönroos Co-authored-by: Julien Brouillard Co-authored-by: Konstantinos Co-authored-by: Tadas Misiūnas Co-authored-by: Walter William Beckerleg Bruckman Co-authored-by: lorduskordus Co-authored-by: mcptminei Co-authored-by: Димко Co-authored-by: Марко М. Костић Co-authored-by: 麋麓 BigELK176 Co-authored-by: 김유빈 Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/ca/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/cs/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/de/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/el/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/fi/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/fr/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/ga/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/kk/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/ko/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/lt/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/ru/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/sr/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/uk/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/zh_Hant/ Translation: Pop OS/COSMIC Player --- i18n/ca/cosmic_player.ftl | 2 ++ i18n/cs/cosmic_player.ftl | 4 ++-- i18n/de/cosmic_player.ftl | 3 +++ i18n/el/cosmic_player.ftl | 38 ++++++++++++++++++++++++++++++++++-- i18n/fi/cosmic_player.ftl | 10 ++++++++++ i18n/fr/cosmic_player.ftl | 3 +++ i18n/ga/cosmic_player.ftl | 7 +++++++ i18n/kk/cosmic_player.ftl | 3 +++ i18n/ko/cosmic_player.ftl | 2 ++ i18n/lo/cosmic_player.ftl | 0 i18n/lt/cosmic_player.ftl | 2 +- i18n/pt-BR/cosmic_player.ftl | 8 ++++---- i18n/ru/cosmic_player.ftl | 3 ++- i18n/sr/cosmic_player.ftl | 36 ++++++++++++++++++++++++++++++++++ i18n/uk/cosmic_player.ftl | 20 ++++++++++++++----- i18n/zh-CN/cosmic_player.ftl | 2 ++ i18n/zh-TW/cosmic_player.ftl | 3 +++ 17 files changed, 131 insertions(+), 15 deletions(-) create mode 100644 i18n/lo/cosmic_player.ftl diff --git a/i18n/ca/cosmic_player.ftl b/i18n/ca/cosmic_player.ftl index e69de29..e55859b 100644 --- a/i18n/ca/cosmic_player.ftl +++ b/i18n/ca/cosmic_player.ftl @@ -0,0 +1,2 @@ +quit = Surt +settings = Configuració diff --git a/i18n/cs/cosmic_player.ftl b/i18n/cs/cosmic_player.ftl index 3830923..dd74821 100644 --- a/i18n/cs/cosmic_player.ftl +++ b/i18n/cs/cosmic_player.ftl @@ -35,5 +35,5 @@ 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 pracovní prostředí COSMIC -xdg-keywords = audio;film;hudba;video;média;zvuk; +xdg-comment = Přehrávač médií pro prostředí COSMIC +xdg-keywords = Audio;Film;Hudba;Zvuk;Video; diff --git a/i18n/de/cosmic_player.ftl b/i18n/de/cosmic_player.ftl index 9f45f1c..76b4d63 100644 --- a/i18n/de/cosmic_player.ftl +++ b/i18n/de/cosmic_player.ftl @@ -46,3 +46,6 @@ 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 19b085c..a0780b8 100644 --- a/i18n/el/cosmic_player.ftl +++ b/i18n/el/cosmic_player.ftl @@ -1,2 +1,36 @@ -dark = Σκοτεινό -light = Φωτεινό +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 diff --git a/i18n/fi/cosmic_player.ftl b/i18n/fi/cosmic_player.ftl index b50a481..8fc0bfd 100644 --- a/i18n/fi/cosmic_player.ftl +++ b/i18n/fi/cosmic_player.ftl @@ -24,3 +24,13 @@ 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 b160212..cb796bb 100644 --- a/i18n/fr/cosmic_player.ftl +++ b/i18n/fr/cosmic_player.ftl @@ -46,3 +46,6 @@ 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 ee13806..e98e2a9 100644 --- a/i18n/ga/cosmic_player.ftl +++ b/i18n/ga/cosmic_player.ftl @@ -39,3 +39,10 @@ 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/kk/cosmic_player.ftl b/i18n/kk/cosmic_player.ftl index 40c0e87..9f6e10d 100644 --- a/i18n/kk/cosmic_player.ftl +++ b/i18n/kk/cosmic_player.ftl @@ -31,3 +31,6 @@ 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 ae00d2b..f757d79 100644 --- a/i18n/ko/cosmic_player.ftl +++ b/i18n/ko/cosmic_player.ftl @@ -23,3 +23,5 @@ 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 new file mode 100644 index 0000000..e69de29 diff --git a/i18n/lt/cosmic_player.ftl b/i18n/lt/cosmic_player.ftl index b3b58e4..83556a9 100644 --- a/i18n/lt/cosmic_player.ftl +++ b/i18n/lt/cosmic_player.ftl @@ -1,5 +1,5 @@ quit = Išeiti -settings = Nustatymai +settings = Nuostatos close-file = Uždaryti failą match-desktop = Pagal darbalaukio temą appearance = Išvaizda diff --git a/i18n/pt-BR/cosmic_player.ftl b/i18n/pt-BR/cosmic_player.ftl index 0736a26..5aaf766 100644 --- a/i18n/pt-BR/cosmic_player.ftl +++ b/i18n/pt-BR/cosmic_player.ftl @@ -41,7 +41,7 @@ repeat-track = Repetir faixa repeat-disabled = Repetição desabilitada next-frame = Próximo quadro previous-frame = Quadro anterior -playback = Reproduzir +playback = Reprodução ab-repeat = Repetir A-B ab-repeat-set-a = Repetir A-B (A) ab-repeat-set-b = Repetir A-B (B) @@ -49,6 +49,6 @@ ab-repeat-clear = Limpar repetição A-B # 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; +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/ru/cosmic_player.ftl b/i18n/ru/cosmic_player.ftl index 1e69f0c..797d70a 100644 --- a/i18n/ru/cosmic_player.ftl +++ b/i18n/ru/cosmic_player.ftl @@ -25,7 +25,7 @@ open-media = Открыть медиафайл… open-recent-media = Открыть недавний медиафайл close-file = Закрыть файл open-media-folder = Открыть папку медиафайлов... -open-recent-media-folder = Недавние папки медиафайлов +open-recent-media-folder = Открыть папку недавних медиафайлов close-media-folder = Закрыть папку медиафайлов quit = Выйти off = Выкл. @@ -44,3 +44,4 @@ ab-repeat-clear = Повтор A–B (очистить) xdg-name = Медиаплеер xdg-keywords = Аудио;Фильм;Музыка;Видео;Медиа;Звук;Мультимедиа;Медиаплеер; +xdg-comment = Медиаплеер для рабочей среды COSMIC diff --git a/i18n/sr/cosmic_player.ftl b/i18n/sr/cosmic_player.ftl index e69de29..81c0602 100644 --- a/i18n/sr/cosmic_player.ftl +++ b/i18n/sr/cosmic_player.ftl @@ -0,0 +1,36 @@ +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/uk/cosmic_player.ftl b/i18n/uk/cosmic_player.ftl index 4eef99c..650facc 100644 --- a/i18n/uk/cosmic_player.ftl +++ b/i18n/uk/cosmic_player.ftl @@ -13,14 +13,24 @@ 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 c1a8e93..41fa355 100644 --- a/i18n/zh-CN/cosmic_player.ftl +++ b/i18n/zh-CN/cosmic_player.ftl @@ -50,3 +50,5 @@ 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 cb70115..036ed4f 100644 --- a/i18n/zh-TW/cosmic_player.ftl +++ b/i18n/zh-TW/cosmic_player.ftl @@ -46,3 +46,6 @@ ab-repeat-clear = 清除 A-B 重複 playback = 回放 next-frame = 下一幀 previous-frame = 上一幀 +xdg-name = COSMIC 媒體播放器 +xdg-comment = 媒體播放器 用於 COSMIC 桌面 +xdg-keywords = 音訊;影片;電影;音樂;聲音;影像; From d1f63c570c76421f625734fb40feffa41e4cd944 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 12 May 2026 09:39:33 -0600 Subject: [PATCH 8/9] Epoch 1.0.13 version update Generated by cosmic-epoch scripts/version-update.sh --- Cargo.lock | 132 +++++++++++++++++++++++------------------------ Cargo.toml | 2 +- debian/changelog | 6 +++ 3 files changed, 73 insertions(+), 67 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 61addb3..82cd5ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -614,9 +614,9 @@ dependencies = [ [[package]] name = "avif-serialize" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375082f007bd67184fb9c0374614b29f9aaa604ec301635f72338bb65386a53d" +checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" dependencies = [ "arrayvec", ] @@ -834,9 +834,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.61" +version = "1.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" dependencies = [ "find-msvc-tools", "jobserver", @@ -1074,7 +1074,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1095,7 +1095,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "quote", "syn", @@ -1117,7 +1117,7 @@ dependencies = [ [[package]] name = "cosmic-player" -version = "1.0.12" +version = "1.0.13" dependencies = [ "ashpd 0.12.3", "clap_lex", @@ -1191,7 +1191,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "almost", "configparser", @@ -2231,9 +2231,9 @@ checksum = "b40ca9252762c466af32d0b1002e91e4e1bc5398f77455e55474deb466355ff5" [[package]] name = "gstreamer" -version = "0.25.1" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8d6d77fae07708536f86a34ac15fc36c7e958ef7930b75119dba0242936f08" +checksum = "28ca0c594cac4e86f5444aaa767c7bb810340c0710667a6467d3ead248e35e84" dependencies = [ "cfg-if", "futures-channel", @@ -2256,9 +2256,9 @@ dependencies = [ [[package]] name = "gstreamer-app" -version = "0.25.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714874829f75e805192ddc2bd130b9d7669ebc3ed0e8b106039dd3416cb82916" +checksum = "97f8ae9238c2352398dcc084de28df3f7099af216ac6c160b52318d23f25c010" dependencies = [ "futures-core", "futures-sink", @@ -2284,9 +2284,9 @@ dependencies = [ [[package]] name = "gstreamer-audio" -version = "0.25.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e64660e1963ff3b6a4a5175f917524254a6ae36ac7b83e29b760d879a33073" +checksum = "2cdd06eb9c901b05902c55d106034319e2d730179744867564198d17c8486ed2" dependencies = [ "cfg-if", "glib", @@ -2299,9 +2299,9 @@ dependencies = [ [[package]] name = "gstreamer-audio-sys" -version = "0.25.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5111bd07d0e22cc66ec9b4b4ef5408beefb148af19944fbe4602983a043f34c" +checksum = "3d25892ad6fdd898936ca338d46d8632b298470ecc3eb82098e330ed2cdaec5d" dependencies = [ "glib-sys", "gobject-sys", @@ -2313,9 +2313,9 @@ dependencies = [ [[package]] name = "gstreamer-base" -version = "0.25.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08353a8a382be9a49b15fb9c46b3abd6f8a6e6439e1eaedc87d08f1abdcfad1" +checksum = "c279df2918be97fb9570e589a32ade33598f643b0c4f0c92c17f06be6940574e" dependencies = [ "atomic_refcell", "cfg-if", @@ -2340,9 +2340,9 @@ dependencies = [ [[package]] name = "gstreamer-pbutils" -version = "0.25.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592df4998340706ab324148ea83dee758ca3233f9bce378d1d32167205c2f4d" +checksum = "2230395c2bf062b2538350e6a962b1ff5888f1b29cd65cd1d96dfd5ff74dfb66" dependencies = [ "glib", "gstreamer", @@ -2355,9 +2355,9 @@ dependencies = [ [[package]] name = "gstreamer-pbutils-sys" -version = "0.25.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fc3025e83ceaa645aec615db27c3052ed29a856b38adc0405f70b92423c0f23" +checksum = "eefc07f8f23ca04fae932accefcf22059060b4e3fd41c6445a502cd31c1350b6" dependencies = [ "glib-sys", "gobject-sys", @@ -2370,9 +2370,9 @@ dependencies = [ [[package]] name = "gstreamer-sys" -version = "0.25.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85d09343b4c23d64b3ef35f1f644598860cc9a4617e7ccded141de97cd528608" +checksum = "533fa8d28fc830eafccbcfcfddb390563ea5d3a351af2c3aab99e197e5f5b1ba" dependencies = [ "cfg-if", "glib-sys", @@ -2383,9 +2383,9 @@ dependencies = [ [[package]] name = "gstreamer-tag" -version = "0.25.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69be28c94a67efbb59dada55dc70cebb83d0e92aee5d2f75011a16d9dfdaa5c1" +checksum = "790d1c673da71c87e9648d98e96cdd785784ae948a9728b95b2c7c10f6f4ee61" dependencies = [ "glib", "gstreamer", @@ -2408,9 +2408,9 @@ dependencies = [ [[package]] name = "gstreamer-video" -version = "0.25.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51809937ed7f6fa3974b2730a39623d59fd7415ede882d08d5ecef5de39d758d" +checksum = "2bf728cb21499561ea0d6ce584e550bf2b98b279cc7741067ee42f41f98b486e" dependencies = [ "cfg-if", "futures-channel", @@ -2424,9 +2424,9 @@ dependencies = [ [[package]] name = "gstreamer-video-sys" -version = "0.25.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f82631a5063057c10583a57ba0fbce689e67122cfdb5eddbeaa43eb812e75" +checksum = "109c2c997a90a5806a8d7fcb416755e3047d6bab8f580d2ededc9ab7ad553caf" dependencies = [ "glib-sys", "gobject-sys", @@ -2600,7 +2600,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "dnd", "iced_accessibility", @@ -2621,7 +2621,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "accesskit", "accesskit_winit", @@ -2630,7 +2630,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "bitflags 2.11.1", "bytes", @@ -2654,7 +2654,7 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "iced_core", "iced_futures", @@ -2664,7 +2664,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "futures", "iced_core", @@ -2678,7 +2678,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "bitflags 2.11.1", "bytemuck", @@ -2699,7 +2699,7 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "iced_graphics", "iced_runtime", @@ -2708,7 +2708,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -2720,7 +2720,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -2735,7 +2735,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "bytemuck", "cosmic-text", @@ -2770,7 +2770,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "as-raw-xcb-connection", "bitflags 2.11.1", @@ -2801,7 +2801,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.2" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -2819,7 +2819,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "cosmic-client-toolkit", "cursor-icon", @@ -3255,9 +3255,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.97" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" +checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" dependencies = [ "cfg-if", "futures-util", @@ -3322,9 +3322,9 @@ dependencies = [ [[package]] name = "kqueue-sys" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7b65860415f949f23fa882e669f2dbd4a0f0eeb1acdd56790b30494afd7da2f" +checksum = "285efcf12ef41bec907b3000d5ffaeb54191d4d9d83c0d6157e6cbc2db255e64" dependencies = [ "bitflags 2.11.1", "libc", @@ -3381,7 +3381,7 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libcosmic" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#0e0960f3c79138b445ae84f7ac6f91d4db36e8b4" +source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "apply", "ashpd 0.12.3", @@ -4643,9 +4643,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.39.3" +version = "0.39.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721da970c312655cde9b4ffe0547f20a8494866a4af5ff51f18b7c633d0c870b" +checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" dependencies = [ "memchr", "serde", @@ -5660,9 +5660,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.2" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "110a78583f19d5cdb2c5ccf321d1290344e71313c6c37d43520d386027d18386" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", @@ -6087,9 +6087,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" +checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" dependencies = [ "cfg-if", "once_cell", @@ -6100,9 +6100,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.70" +version = "0.4.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af934872acec734c2d80e6617bbb5ff4f12b052dd8e6332b0817bce889516084" +checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" dependencies = [ "js-sys", "wasm-bindgen", @@ -6110,9 +6110,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" +checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6120,9 +6120,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" +checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" dependencies = [ "bumpalo", "proc-macro2", @@ -6133,9 +6133,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.120" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" +checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" dependencies = [ "unicode-ident", ] @@ -6340,9 +6340,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.97" +version = "0.3.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" +checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" dependencies = [ "js-sys", "wasm-bindgen", @@ -7615,9 +7615,9 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] diff --git a/Cargo.toml b/Cargo.toml index e3f5135..5e770d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cosmic-player" -version = "1.0.12" +version = "1.0.13" edition = "2024" rust-version = "1.93" diff --git a/debian/changelog b/debian/changelog index 58bfc27..281fb04 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +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 From 22e5890a7c2f7a5f0d95d13a2080b9b9f59e0478 Mon Sep 17 00:00:00 2001 From: leyoda Date: Mon, 18 May 2026 12:22:47 +0200 Subject: [PATCH 9/9] local: integrate yoda libcosmic and fix thumbnail hang --- .gitignore | 4 + Cargo.lock | 401 +++-------- Cargo.toml | 18 +- README.md | 32 + src/main.rs | 12 +- vendor/iced_video_player/.gitignore | 2 + vendor/iced_video_player/Cargo.toml | 88 +++ vendor/iced_video_player/LICENSE-APACHE | 176 +++++ vendor/iced_video_player/LICENSE-MIT | 23 + vendor/iced_video_player/README.md | 64 ++ vendor/iced_video_player/examples/minimal.rs | 154 +++++ vendor/iced_video_player/src/lib.rs | 79 +++ vendor/iced_video_player/src/pipeline.rs | 447 +++++++++++++ vendor/iced_video_player/src/shader.wgsl | 58 ++ vendor/iced_video_player/src/video.rs | 664 +++++++++++++++++++ vendor/iced_video_player/src/video_player.rs | 476 +++++++++++++ 16 files changed, 2388 insertions(+), 310 deletions(-) create mode 100644 vendor/iced_video_player/.gitignore create mode 100644 vendor/iced_video_player/Cargo.toml create mode 100644 vendor/iced_video_player/LICENSE-APACHE create mode 100644 vendor/iced_video_player/LICENSE-MIT create mode 100644 vendor/iced_video_player/README.md create mode 100644 vendor/iced_video_player/examples/minimal.rs create mode 100644 vendor/iced_video_player/src/lib.rs create mode 100644 vendor/iced_video_player/src/pipeline.rs create mode 100644 vendor/iced_video_player/src/shader.wgsl create mode 100644 vendor/iced_video_player/src/video.rs create mode 100644 vendor/iced_video_player/src/video_player.rs diff --git a/.gitignore b/.gitignore index 10de4bd..2c25f66 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,8 @@ /debian/files /target/ /vendor/ +!/vendor/ +/vendor/* +!/vendor/iced_video_player/ +!/vendor/iced_video_player/** /vendor.tar diff --git a/Cargo.lock b/Cargo.lock index 82cd5ad..61b931e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -153,12 +153,6 @@ dependencies = [ "equator", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - [[package]] name = "almost" version = "0.2.0" @@ -308,12 +302,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "as-raw-xcb-connection" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" - [[package]] name = "as-slice" version = "0.2.1" @@ -884,7 +872,7 @@ dependencies = [ [[package]] name = "clipboard_macos" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" +source = "git+https://forge.aditua.com/leyoda/window_clipboard.git?branch=yoda-x11-optional#319db02e5219c557c8f03b0e33a8eb4075cabb85" dependencies = [ "objc", "objc-foundation", @@ -894,22 +882,13 @@ dependencies = [ [[package]] name = "clipboard_wayland" version = "0.2.2" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" +source = "git+https://forge.aditua.com/leyoda/window_clipboard.git?branch=yoda-x11-optional#319db02e5219c557c8f03b0e33a8eb4075cabb85" 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" @@ -1074,7 +1053,6 @@ dependencies = [ [[package]] name = "cosmic-config" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1095,7 +1073,6 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "quote", "syn", @@ -1130,7 +1107,7 @@ dependencies = [ "icu_collator", "icu_locale", "image", - "libcosmic", + "libcosmic-yoda", "log", "mpris-server", "rust-embed", @@ -1167,8 +1144,7 @@ dependencies = [ [[package]] name = "cosmic-text" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be17b688510d934ce13f48a2beba700e11583e281e0fda99c22bb256a14eda73" +source = "git+https://github.com/pop-os/cosmic-text.git#c24886c2471e5606587c46090cd25dbbf209186b" dependencies = [ "bitflags 2.11.1", "fontdb", @@ -1191,7 +1167,6 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "almost", "configparser", @@ -1257,7 +1232,7 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "cryoglyph" version = "0.1.0" -source = "git+https://github.com/iced-rs/cryoglyph.git?rev=e429a025df36ab8145708acb309080ae3deec17a#e429a025df36ab8145708acb309080ae3deec17a" +source = "git+https://github.com/pop-os/glyphon.git?tag=cosmic-0.14#c49de15bce4d8254ac136d1be9911960cc85ce12" dependencies = [ "cosmic-text", "etagere", @@ -1294,15 +1269,6 @@ dependencies = [ "uncased", ] -[[package]] -name = "ctor" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83cf0d42651b16c6dfe68685716d18480d18a9c39c62d76e8cf3eb6ed5d8bcbf" -dependencies = [ - "dtor", -] - [[package]] name = "cursor-icon" version = "1.2.0" @@ -1448,7 +1414,7 @@ dependencies = [ [[package]] name = "dnd" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" +source = "git+https://forge.aditua.com/leyoda/window_clipboard.git?branch=yoda-x11-optional#319db02e5219c557c8f03b0e33a8eb4075cabb85" dependencies = [ "bitflags 2.11.1", "mime", @@ -1477,51 +1443,6 @@ name = "dpi" version = "0.1.2" source = "git+https://github.com/pop-os/winit.git?tag=cosmic-0.14#261cda54017f98a12dc55569c864430fe6770366" -[[package]] -name = "drm" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0f8a69e60d75ae7dab4ef26a59ca99f2a89d4c142089b537775ae0c198bdcde" -dependencies = [ - "bitflags 2.11.1", - "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 = "dtor" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edf234dd1594d6dd434a8fb8cada51ddbbc593e40e4a01556a0b31c62da2775b" - [[package]] name = "either" version = "1.15.0" @@ -2018,16 +1939,6 @@ 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" @@ -2190,17 +2101,34 @@ dependencies = [ ] [[package]] -name = "gpu-allocator" -version = "0.28.0" +name = "gpu-alloc" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51255ea7cfaadb6c5f1528d43e92a82acb2b96c43365989a28b2d44ee38f8795" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.11.1", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.11.1", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" dependencies = [ - "ash", - "hashbrown 0.16.1", "log", "presser", - "thiserror 2.0.18", - "windows 0.62.2", + "thiserror 1.0.69", + "windows 0.58.0", ] [[package]] @@ -2486,8 +2414,6 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ - "allocator-api2", - "equivalent", "foldhash 0.2.0", ] @@ -2600,7 +2526,6 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "dnd", "iced_accessibility", @@ -2621,7 +2546,6 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "accesskit", "accesskit_winit", @@ -2630,7 +2554,6 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "bitflags 2.11.1", "bytes", @@ -2654,7 +2577,6 @@ dependencies = [ [[package]] name = "iced_debug" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "iced_core", "iced_futures", @@ -2664,7 +2586,6 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "futures", "iced_core", @@ -2678,7 +2599,6 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "bitflags 2.11.1", "bytemuck", @@ -2699,7 +2619,6 @@ dependencies = [ [[package]] name = "iced_program" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "iced_graphics", "iced_runtime", @@ -2708,7 +2627,6 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -2720,7 +2638,6 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -2735,7 +2652,6 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "bytemuck", "cosmic-text", @@ -2752,7 +2668,6 @@ dependencies = [ [[package]] name = "iced_video_player" version = "0.6.0" -source = "git+https://github.com/wash2/iced_video_player.git?branch=iced-rebase#cb3635192f3dec37619855c904a168ca37a3dac3" dependencies = [ "glib", "gstreamer", @@ -2761,7 +2676,7 @@ dependencies = [ "gstreamer-pbutils", "html-escape", "iced_wgpu", - "libcosmic", + "libcosmic-yoda", "log", "thiserror 2.0.18", "url", @@ -2770,9 +2685,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ - "as-raw-xcb-connection", "bitflags 2.11.1", "bytemuck", "cosmic-client-toolkit", @@ -2789,19 +2702,16 @@ 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#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -2819,7 +2729,6 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" dependencies = [ "cosmic-client-toolkit", "cursor-icon", @@ -3379,9 +3288,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] -name = "libcosmic" -version = "1.0.0" -source = "git+https://github.com/pop-os/libcosmic.git#4fab6c777dbd1a023440f08fb2b729c86492366c" +name = "libcosmic-yoda" +version = "0.1.0-yoda.2" dependencies = [ "apply", "ashpd 0.12.3", @@ -3483,12 +3391,6 @@ 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" @@ -3643,9 +3545,9 @@ dependencies = [ [[package]] name = "metal" -version = "0.33.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7047791b5bc903b8cd963014b355f71dc9864a9a0b727057676c1dcae5cbc15" +checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ "bitflags 2.11.1", "block", @@ -3659,7 +3561,7 @@ dependencies = [ [[package]] name = "mime" version = "0.1.0" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" +source = "git+https://forge.aditua.com/leyoda/window_clipboard.git?branch=yoda-x11-optional#319db02e5219c557c8f03b0e33a8eb4075cabb85" dependencies = [ "smithay-clipboard", ] @@ -3723,9 +3625,9 @@ checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" [[package]] name = "naga" -version = "28.0.0" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "618f667225063219ddfc61251087db8a9aec3c3f0950c916b614e403486f1135" +checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ "arrayvec", "bit-set", @@ -5334,12 +5236,10 @@ name = "softbuffer" version = "0.4.1" source = "git+https://github.com/pop-os/softbuffer?tag=cosmic-4.0#c2b2c19ddb38ff17495643699f97cb1f2064a1be" dependencies = [ - "as-raw-xcb-connection", "bytemuck", "cfg_aliases", "cocoa", "core-graphics", - "drm", "fastrand", "foreign-types", "js-sys", @@ -5349,14 +5249,12 @@ 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]] @@ -5619,19 +5517,6 @@ dependencies = [ "strict-num", ] -[[package]] -name = "tiny-xlib" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90a0ca3ee6a69f2ad28fd11621a4c3f03b371f366be500b64df260c4ffbafb4" -dependencies = [ - "as-raw-xcb-connection", - "ctor", - "libloading", - "pkg-config", - "tracing", -] - [[package]] name = "tinystr" version = "0.8.3" @@ -6366,13 +6251,12 @@ checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "wgpu" -version = "28.0.0" +version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9cb534d5ffd109c7d1135f34cdae29e60eab94855a625dcfe1705f8bc7ad79f" +checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", "bitflags 2.11.1", - "bytemuck", "cfg-if", "cfg_aliases", "document-features", @@ -6396,9 +6280,9 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "28.0.1" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d23f4642f53f666adcfd2d3218ab174d1e6681101aef18696b90cbe64d1c10f9" +checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" dependencies = [ "arrayvec", "bit-set", @@ -6428,36 +6312,36 @@ dependencies = [ [[package]] name = "wgpu-core-deps-apple" -version = "28.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87b7b696b918f337c486bf93142454080a32a37832ba8a31e4f48221890047da" +checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-emscripten" -version = "28.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b251c331f84feac147de3c4aa3aa45112622a95dd7ee1b74384fa0458dbd79" +checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-windows-linux-android" -version = "28.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ca976e72b2c9964eb243e281f6ce7f14a514e409920920dcda12ae40febaae" +checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-hal" -version = "28.0.1" +version = "27.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d6cb474beb218824dcc9e1ce679d973f719262789bfb27407da560cac20eeb" +checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" dependencies = [ "android_system_properties", "arrayvec", @@ -6471,6 +6355,7 @@ dependencies = [ "core-graphics-types 0.2.0", "glow", "glutin_wgl_sys", + "gpu-alloc", "gpu-allocator", "gpu-descriptor", "hashbrown 0.16.1", @@ -6497,20 +6382,21 @@ dependencies = [ "wasm-bindgen", "web-sys", "wgpu-types", - "windows 0.62.2", - "windows-core 0.62.2", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] name = "wgpu-types" -version = "28.0.0" +version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e18308757e594ed2cd27dddbb16a139c42a683819d32a2e0b1b0167552f5840c" +checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ "bitflags 2.11.1", "bytemuck", "js-sys", "log", + "thiserror 2.0.18", "web-sys", ] @@ -6548,12 +6434,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window_clipboard" version = "0.4.1" -source = "git+https://github.com/pop-os/window_clipboard.git?tag=sctk-0.20#f68595ee0e62fbd6589f4709b5aaa5c3c7ea5f6c" +source = "git+https://forge.aditua.com/leyoda/window_clipboard.git?branch=yoda-x11-optional#319db02e5219c557c8f03b0e33a8eb4075cabb85" dependencies = [ "clipboard-win", "clipboard_macos", "clipboard_wayland", - "clipboard_x11", "dnd", "mime", "raw-window-handle", @@ -6562,27 +6447,25 @@ dependencies = [ [[package]] name = "windows" -version = "0.61.3" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-collections 0.2.0", - "windows-core 0.61.2", - "windows-future 0.2.1", - "windows-link 0.1.3", - "windows-numerics 0.2.0", + "windows-core 0.58.0", + "windows-targets 0.52.6", ] [[package]] name = "windows" -version = "0.62.2" +version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ - "windows-collections 0.3.2", - "windows-core 0.62.2", - "windows-future 0.3.2", - "windows-numerics 0.3.1", + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", ] [[package]] @@ -6595,12 +6478,16 @@ dependencies = [ ] [[package]] -name = "windows-collections" -version = "0.3.2" +name = "windows-core" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-core 0.62.2", + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", ] [[package]] @@ -6609,26 +6496,13 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.60.2", + "windows-interface 0.59.3", "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings 0.4.2", ] -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - [[package]] name = "windows-future" version = "0.2.1" @@ -6637,18 +6511,18 @@ checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ "windows-core 0.61.2", "windows-link 0.1.3", - "windows-threading 0.1.0", + "windows-threading", ] [[package]] -name = "windows-future" -version = "0.3.2" +name = "windows-implement" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", - "windows-threading 0.2.1", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -6662,6 +6536,17 @@ dependencies = [ "syn", ] +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-interface" version = "0.59.3" @@ -6696,13 +6581,12 @@ dependencies = [ ] [[package]] -name = "windows-numerics" -version = "0.3.1" +name = "windows-result" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", + "windows-targets 0.52.6", ] [[package]] @@ -6715,12 +6599,13 @@ dependencies = [ ] [[package]] -name = "windows-result" -version = "0.4.1" +name = "windows-strings" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-link 0.2.1", + "windows-result 0.2.0", + "windows-targets 0.52.6", ] [[package]] @@ -6732,15 +6617,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link 0.2.1", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -6843,15 +6719,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-threading" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" -dependencies = [ - "windows-link 0.2.1", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -7013,7 +6880,6 @@ dependencies = [ "winit-wayland", "winit-web", "winit-win32", - "winit-x11", ] [[package]] @@ -7064,7 +6930,6 @@ dependencies = [ "smol_str", "tracing", "winit-core", - "x11-dl", "xkbcommon-dl", ] @@ -7182,29 +7047,6 @@ 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#261cda54017f98a12dc55569c864430fe6770366" -dependencies = [ - "bitflags 2.11.1", - "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" @@ -7320,39 +7162,6 @@ 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" diff --git a/Cargo.toml b/Cargo.toml index 5e770d9..d55a60a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,12 +32,12 @@ env_logger = "0.11" log = "0.4" [dependencies.iced_video_player] -git = "https://github.com/wash2/iced_video_player.git" -branch = "iced-rebase" +path = "vendor/iced_video_player" default-features = false -[dependencies.libcosmic] -git = "https://github.com/pop-os/libcosmic.git" +[dependencies.cosmic] +package = "libcosmic-yoda" +path = "../libcosmic" default-features = false features = ["advanced-shaping", "tokio", "winit", "multi-window"] @@ -51,9 +51,9 @@ fork = "0.7" [features] default = ["mpris-server", "xdg-portal", "wgpu", "wayland"] -xdg-portal = ["ashpd", "libcosmic/xdg-portal"] -wgpu = ["iced_video_player/wgpu", "libcosmic/wgpu"] -wayland = ["libcosmic/wayland"] +xdg-portal = ["ashpd", "cosmic/xdg-portal"] +wgpu = ["iced_video_player/wgpu", "cosmic/wgpu"] +wayland = ["cosmic/wayland"] [profile.release-with-debug] inherits = "release" @@ -62,10 +62,6 @@ 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 0c2c300..f145524 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,34 @@ # 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/src/main.rs b/src/main.rs index 2c11f3d..d9c2233 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,10 +7,10 @@ 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::window::{self, set_mode}; use cosmic::iced::{ - Alignment, Background, Border, Color, ContentFit, Length, Limits, Subscription, + Alignment, Background, Border, Color, ContentFit, Length, Limits, Subscription, exit, window, }; +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}; @@ -951,6 +951,11 @@ impl Application for App { } } + 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) { @@ -1606,7 +1611,8 @@ impl Application for App { return self.update_config(); } Message::WindowClose => { - process::exit(0); + self.close(); + return exit(); } } Task::none() diff --git a/vendor/iced_video_player/.gitignore b/vendor/iced_video_player/.gitignore new file mode 100644 index 0000000..cb8c9e0 --- /dev/null +++ b/vendor/iced_video_player/.gitignore @@ -0,0 +1,2 @@ +/target +.direnv \ No newline at end of file diff --git a/vendor/iced_video_player/Cargo.toml b/vendor/iced_video_player/Cargo.toml new file mode 100644 index 0000000..9bcea9c --- /dev/null +++ b/vendor/iced_video_player/Cargo.toml @@ -0,0 +1,88 @@ +[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 new file mode 100644 index 0000000..a7e77cb --- /dev/null +++ b/vendor/iced_video_player/LICENSE-APACHE @@ -0,0 +1,176 @@ + 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 new file mode 100644 index 0000000..468cd79 --- /dev/null +++ b/vendor/iced_video_player/LICENSE-MIT @@ -0,0 +1,23 @@ +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 new file mode 100644 index 0000000..3c17b23 --- /dev/null +++ b/vendor/iced_video_player/README.md @@ -0,0 +1,64 @@ +# 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 new file mode 100644 index 0000000..0eb76c1 --- /dev/null +++ b/vendor/iced_video_player/examples/minimal.rs @@ -0,0 +1,154 @@ +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 new file mode 100644 index 0000000..f0c8584 --- /dev/null +++ b/vendor/iced_video_player/src/lib.rs @@ -0,0 +1,79 @@ +//! # 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 new file mode 100644 index 0000000..2d9d3e7 --- /dev/null +++ b/vendor/iced_video_player/src/pipeline.rs @@ -0,0 +1,447 @@ +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 new file mode 100644 index 0000000..f1d85f5 --- /dev/null +++ b/vendor/iced_video_player/src/shader.wgsl @@ -0,0 +1,58 @@ +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 new file mode 100644 index 0000000..48e521c --- /dev/null +++ b/vendor/iced_video_player/src/video.rs @@ -0,0 +1,664 @@ +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 new file mode 100644 index 0000000..7e0be6e --- /dev/null +++ b/vendor/iced_video_player/src/video_player.rs @@ -0,0 +1,476 @@ +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) + } +}