From 13349595810e1baadf0f3f2ff746c968628eb613 Mon Sep 17 00:00:00 2001 From: Niels De Graef Date: Sat, 29 Jun 2024 11:27:44 +0200 Subject: [PATCH] Allow taking a picture with the camera We "lost" this feature with the GTK4 port. Re-implement this again with the camera portal and a GStreamer pipeline to handle the pipewire buffers. Since we use the "gtk4paintablesink" element for integrating the GStreamer's buffers with GTK4, we need to make sure that we have the necessary dependencies in the Flatpak manifest too (since it's written in Rust). For now, we solve this by copying Showtime's flatpak manifest elements. Thanks to Jordan Petridis and Maximiliano Sandova for figuring out the Flatpak Rust integration. Fixes: https://gitlab.gnome.org/GNOME/gnome-contacts/-/issues/219 --- .../flatpak/gst-plugin-gtk4-sources.json | 1724 +++++++++++++++++ .../flatpak/org.gnome.Contacts.Devel.json | 27 +- data/ui/contacts-avatar-selector.ui | 35 +- data/ui/contacts-crop-dialog.ui | 9 +- meson.build | 8 +- src/cc-crop-area.c | 18 +- src/cc-crop-area.h | 2 +- src/contacts-avatar-selector.vala | 227 +-- src/contacts-avatar.vala | 12 +- src/contacts-crop-dialog.vala | 89 +- src/main.vala | 6 +- src/meson.build | 4 +- vapi/custom.vapi | 2 +- 13 files changed, 1980 insertions(+), 183 deletions(-) create mode 100644 build-aux/flatpak/gst-plugin-gtk4-sources.json diff --git a/build-aux/flatpak/gst-plugin-gtk4-sources.json b/build-aux/flatpak/gst-plugin-gtk4-sources.json new file mode 100644 index 00000000..fb85c285 --- /dev/null +++ b/build-aux/flatpak/gst-plugin-gtk4-sources.json @@ -0,0 +1,1724 @@ +[ + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/android-tzdata/android-tzdata-0.1.1.crate", + "sha256": "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0", + "dest": "cargo/vendor/android-tzdata-0.1.1" + }, + { + "type": "inline", + "contents": "{\"package\": \"e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0\", \"files\": {}}", + "dest": "cargo/vendor/android-tzdata-0.1.1", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/android_system_properties/android_system_properties-0.1.5.crate", + "sha256": "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311", + "dest": "cargo/vendor/android_system_properties-0.1.5" + }, + { + "type": "inline", + "contents": "{\"package\": \"819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311\", \"files\": {}}", + "dest": "cargo/vendor/android_system_properties-0.1.5", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/async-channel/async-channel-2.3.1.crate", + "sha256": "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a", + "dest": "cargo/vendor/async-channel-2.3.1" + }, + { + "type": "inline", + "contents": "{\"package\": \"89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a\", \"files\": {}}", + "dest": "cargo/vendor/async-channel-2.3.1", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/atomic_refcell/atomic_refcell-0.1.13.crate", + "sha256": "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c", + "dest": "cargo/vendor/atomic_refcell-0.1.13" + }, + { + "type": "inline", + "contents": "{\"package\": \"41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c\", \"files\": {}}", + "dest": "cargo/vendor/atomic_refcell-0.1.13", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/autocfg/autocfg-1.3.0.crate", + "sha256": "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0", + "dest": "cargo/vendor/autocfg-1.3.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0\", \"files\": {}}", + "dest": "cargo/vendor/autocfg-1.3.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/bitflags/bitflags-2.6.0.crate", + "sha256": "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de", + "dest": "cargo/vendor/bitflags-2.6.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de\", \"files\": {}}", + "dest": "cargo/vendor/bitflags-2.6.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/bumpalo/bumpalo-3.16.0.crate", + "sha256": "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c", + "dest": "cargo/vendor/bumpalo-3.16.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c\", \"files\": {}}", + "dest": "cargo/vendor/bumpalo-3.16.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/cairo-rs/cairo-rs-0.20.0.crate", + "sha256": "797fd5a634dcb0ad0d7d583df794deb0a236d88e759cd34b7da20198c6c9d145", + "dest": "cargo/vendor/cairo-rs-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"797fd5a634dcb0ad0d7d583df794deb0a236d88e759cd34b7da20198c6c9d145\", \"files\": {}}", + "dest": "cargo/vendor/cairo-rs-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/cairo-sys-rs/cairo-sys-rs-0.20.0.crate", + "sha256": "428290f914b9b86089f60f5d8a9f6e440508e1bcff23b25afd51502b0a2da88f", + "dest": "cargo/vendor/cairo-sys-rs-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"428290f914b9b86089f60f5d8a9f6e440508e1bcff23b25afd51502b0a2da88f\", \"files\": {}}", + "dest": "cargo/vendor/cairo-sys-rs-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/cc/cc-1.1.0.crate", + "sha256": "eaff6f8ce506b9773fa786672d63fc7a191ffea1be33f72bbd4aeacefca9ffc8", + "dest": "cargo/vendor/cc-1.1.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"eaff6f8ce506b9773fa786672d63fc7a191ffea1be33f72bbd4aeacefca9ffc8\", \"files\": {}}", + "dest": "cargo/vendor/cc-1.1.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/cfg-expr/cfg-expr-0.15.8.crate", + "sha256": "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02", + "dest": "cargo/vendor/cfg-expr-0.15.8" + }, + { + "type": "inline", + "contents": "{\"package\": \"d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02\", \"files\": {}}", + "dest": "cargo/vendor/cfg-expr-0.15.8", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/cfg-if/cfg-if-1.0.0.crate", + "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", + "dest": "cargo/vendor/cfg-if-1.0.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd\", \"files\": {}}", + "dest": "cargo/vendor/cfg-if-1.0.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/chrono/chrono-0.4.38.crate", + "sha256": "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401", + "dest": "cargo/vendor/chrono-0.4.38" + }, + { + "type": "inline", + "contents": "{\"package\": \"a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401\", \"files\": {}}", + "dest": "cargo/vendor/chrono-0.4.38", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/concurrent-queue/concurrent-queue-2.5.0.crate", + "sha256": "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973", + "dest": "cargo/vendor/concurrent-queue-2.5.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973\", \"files\": {}}", + "dest": "cargo/vendor/concurrent-queue-2.5.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/core-foundation-sys/core-foundation-sys-0.8.6.crate", + "sha256": "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f", + "dest": "cargo/vendor/core-foundation-sys-0.8.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f\", \"files\": {}}", + "dest": "cargo/vendor/core-foundation-sys-0.8.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/crossbeam-utils/crossbeam-utils-0.8.20.crate", + "sha256": "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80", + "dest": "cargo/vendor/crossbeam-utils-0.8.20" + }, + { + "type": "inline", + "contents": "{\"package\": \"22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80\", \"files\": {}}", + "dest": "cargo/vendor/crossbeam-utils-0.8.20", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/either/either-1.13.0.crate", + "sha256": "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0", + "dest": "cargo/vendor/either-1.13.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0\", \"files\": {}}", + "dest": "cargo/vendor/either-1.13.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/equivalent/equivalent-1.0.1.crate", + "sha256": "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5", + "dest": "cargo/vendor/equivalent-1.0.1" + }, + { + "type": "inline", + "contents": "{\"package\": \"5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5\", \"files\": {}}", + "dest": "cargo/vendor/equivalent-1.0.1", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/event-listener/event-listener-5.3.1.crate", + "sha256": "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba", + "dest": "cargo/vendor/event-listener-5.3.1" + }, + { + "type": "inline", + "contents": "{\"package\": \"6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba\", \"files\": {}}", + "dest": "cargo/vendor/event-listener-5.3.1", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/event-listener-strategy/event-listener-strategy-0.5.2.crate", + "sha256": "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1", + "dest": "cargo/vendor/event-listener-strategy-0.5.2" + }, + { + "type": "inline", + "contents": "{\"package\": \"0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1\", \"files\": {}}", + "dest": "cargo/vendor/event-listener-strategy-0.5.2", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/field-offset/field-offset-0.3.6.crate", + "sha256": "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f", + "dest": "cargo/vendor/field-offset-0.3.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f\", \"files\": {}}", + "dest": "cargo/vendor/field-offset-0.3.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/futures-channel/futures-channel-0.3.30.crate", + "sha256": "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78", + "dest": "cargo/vendor/futures-channel-0.3.30" + }, + { + "type": "inline", + "contents": "{\"package\": \"eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78\", \"files\": {}}", + "dest": "cargo/vendor/futures-channel-0.3.30", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/futures-core/futures-core-0.3.30.crate", + "sha256": "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d", + "dest": "cargo/vendor/futures-core-0.3.30" + }, + { + "type": "inline", + "contents": "{\"package\": \"dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d\", \"files\": {}}", + "dest": "cargo/vendor/futures-core-0.3.30", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/futures-executor/futures-executor-0.3.30.crate", + "sha256": "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d", + "dest": "cargo/vendor/futures-executor-0.3.30" + }, + { + "type": "inline", + "contents": "{\"package\": \"a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d\", \"files\": {}}", + "dest": "cargo/vendor/futures-executor-0.3.30", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/futures-io/futures-io-0.3.30.crate", + "sha256": "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1", + "dest": "cargo/vendor/futures-io-0.3.30" + }, + { + "type": "inline", + "contents": "{\"package\": \"a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1\", \"files\": {}}", + "dest": "cargo/vendor/futures-io-0.3.30", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/futures-macro/futures-macro-0.3.30.crate", + "sha256": "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac", + "dest": "cargo/vendor/futures-macro-0.3.30" + }, + { + "type": "inline", + "contents": "{\"package\": \"87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac\", \"files\": {}}", + "dest": "cargo/vendor/futures-macro-0.3.30", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/futures-task/futures-task-0.3.30.crate", + "sha256": "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004", + "dest": "cargo/vendor/futures-task-0.3.30" + }, + { + "type": "inline", + "contents": "{\"package\": \"38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004\", \"files\": {}}", + "dest": "cargo/vendor/futures-task-0.3.30", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/futures-util/futures-util-0.3.30.crate", + "sha256": "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48", + "dest": "cargo/vendor/futures-util-0.3.30" + }, + { + "type": "inline", + "contents": "{\"package\": \"3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48\", \"files\": {}}", + "dest": "cargo/vendor/futures-util-0.3.30", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gdk-pixbuf/gdk-pixbuf-0.20.0.crate", + "sha256": "28bb53ecb56857c683c9ec859908e076dd3969c7d67598bd8b1ce095d211304a", + "dest": "cargo/vendor/gdk-pixbuf-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"28bb53ecb56857c683c9ec859908e076dd3969c7d67598bd8b1ce095d211304a\", \"files\": {}}", + "dest": "cargo/vendor/gdk-pixbuf-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gdk-pixbuf-sys/gdk-pixbuf-sys-0.20.0.crate", + "sha256": "9f6681a0c1330d1d3968bec1529f7172d62819ef0bdbb0d18022320654158b03", + "dest": "cargo/vendor/gdk-pixbuf-sys-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"9f6681a0c1330d1d3968bec1529f7172d62819ef0bdbb0d18022320654158b03\", \"files\": {}}", + "dest": "cargo/vendor/gdk-pixbuf-sys-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gdk4/gdk4-0.9.0.crate", + "sha256": "4b7d7237c1487ed4b300aac7744efcbf1319e12d60d7afcd6f505414bd5b5dea", + "dest": "cargo/vendor/gdk4-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"4b7d7237c1487ed4b300aac7744efcbf1319e12d60d7afcd6f505414bd5b5dea\", \"files\": {}}", + "dest": "cargo/vendor/gdk4-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gdk4-sys/gdk4-sys-0.9.0.crate", + "sha256": "a67576c8ec012156d7f680e201a807b4432a77babb3157e0555e990ab6bcd878", + "dest": "cargo/vendor/gdk4-sys-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"a67576c8ec012156d7f680e201a807b4432a77babb3157e0555e990ab6bcd878\", \"files\": {}}", + "dest": "cargo/vendor/gdk4-sys-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gdk4-wayland/gdk4-wayland-0.9.0.crate", + "sha256": "34f422f60971cdea128457cad122c46fee48b3a53aa1e1d140919d50ff5b7491", + "dest": "cargo/vendor/gdk4-wayland-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"34f422f60971cdea128457cad122c46fee48b3a53aa1e1d140919d50ff5b7491\", \"files\": {}}", + "dest": "cargo/vendor/gdk4-wayland-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gdk4-wayland-sys/gdk4-wayland-sys-0.9.0.crate", + "sha256": "23295b2ecafae572224a382b876b0bdc0fed947da63b51edebc8798288002048", + "dest": "cargo/vendor/gdk4-wayland-sys-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"23295b2ecafae572224a382b876b0bdc0fed947da63b51edebc8798288002048\", \"files\": {}}", + "dest": "cargo/vendor/gdk4-wayland-sys-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gdk4-win32/gdk4-win32-0.9.0.crate", + "sha256": "05afbcc8165b10f9143d2c4e4a589fce3a5071c6b20d75dd40704266d6eb4bb4", + "dest": "cargo/vendor/gdk4-win32-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"05afbcc8165b10f9143d2c4e4a589fce3a5071c6b20d75dd40704266d6eb4bb4\", \"files\": {}}", + "dest": "cargo/vendor/gdk4-win32-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gdk4-win32-sys/gdk4-win32-sys-0.9.0.crate", + "sha256": "198c0604ceb45732c76b1fdb696d92b99400ea3a1c549fc5e40f4d79f8033205", + "dest": "cargo/vendor/gdk4-win32-sys-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"198c0604ceb45732c76b1fdb696d92b99400ea3a1c549fc5e40f4d79f8033205\", \"files\": {}}", + "dest": "cargo/vendor/gdk4-win32-sys-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gdk4-x11/gdk4-x11-0.9.0.crate", + "sha256": "c4b89c2149f74668d630279559fb5e2b4f11a77124b73d04518cc344854cd626", + "dest": "cargo/vendor/gdk4-x11-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"c4b89c2149f74668d630279559fb5e2b4f11a77124b73d04518cc344854cd626\", \"files\": {}}", + "dest": "cargo/vendor/gdk4-x11-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gdk4-x11-sys/gdk4-x11-sys-0.9.0.crate", + "sha256": "a186f565940124ebd6c1c97e9eb0909e2d19a33ccd3eebed4ff32ebda766207d", + "dest": "cargo/vendor/gdk4-x11-sys-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"a186f565940124ebd6c1c97e9eb0909e2d19a33ccd3eebed4ff32ebda766207d\", \"files\": {}}", + "dest": "cargo/vendor/gdk4-x11-sys-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gio/gio-0.20.0.crate", + "sha256": "398e3da68749fdc32783cbf7521ec3f65c9cf946db8c7774f8460af49e52c6e2", + "dest": "cargo/vendor/gio-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"398e3da68749fdc32783cbf7521ec3f65c9cf946db8c7774f8460af49e52c6e2\", \"files\": {}}", + "dest": "cargo/vendor/gio-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gio-sys/gio-sys-0.20.0.crate", + "sha256": "e4feb96b31c32730ea3e1e89aecd2e4e37ecb1c473ad8f685e3430a159419f63", + "dest": "cargo/vendor/gio-sys-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"e4feb96b31c32730ea3e1e89aecd2e4e37ecb1c473ad8f685e3430a159419f63\", \"files\": {}}", + "dest": "cargo/vendor/gio-sys-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/glib/glib-0.20.0.crate", + "sha256": "fee90a615ce05be7a32932cfb8adf2c4bbb4700e80d37713c981fb24c0c56238", + "dest": "cargo/vendor/glib-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"fee90a615ce05be7a32932cfb8adf2c4bbb4700e80d37713c981fb24c0c56238\", \"files\": {}}", + "dest": "cargo/vendor/glib-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/glib-macros/glib-macros-0.20.0.crate", + "sha256": "4da558d8177c0c8c54368818b508a4244e1286fce2858cef4e547023f0cfa5ef", + "dest": "cargo/vendor/glib-macros-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"4da558d8177c0c8c54368818b508a4244e1286fce2858cef4e547023f0cfa5ef\", \"files\": {}}", + "dest": "cargo/vendor/glib-macros-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/glib-sys/glib-sys-0.20.0.crate", + "sha256": "4958c26e5a01c9af00dea669a97369eccbec29a8e6d125c24ea2d85ee7467b60", + "dest": "cargo/vendor/glib-sys-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"4958c26e5a01c9af00dea669a97369eccbec29a8e6d125c24ea2d85ee7467b60\", \"files\": {}}", + "dest": "cargo/vendor/glib-sys-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gobject-sys/gobject-sys-0.20.0.crate", + "sha256": "c6908864f5ffff15b56df7e90346863904f49b949337ed0456b9287af61903b8", + "dest": "cargo/vendor/gobject-sys-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"c6908864f5ffff15b56df7e90346863904f49b949337ed0456b9287af61903b8\", \"files\": {}}", + "dest": "cargo/vendor/gobject-sys-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/graphene-rs/graphene-rs-0.20.0.crate", + "sha256": "630e940ad5824f90221d6579043a9cd1f8bec86b4a17faaf7827d58eb16e8c1f", + "dest": "cargo/vendor/graphene-rs-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"630e940ad5824f90221d6579043a9cd1f8bec86b4a17faaf7827d58eb16e8c1f\", \"files\": {}}", + "dest": "cargo/vendor/graphene-rs-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/graphene-sys/graphene-sys-0.20.0.crate", + "sha256": "6fb8fade7b754982f47ebbed241fd2680816fdd4598321784da10b9e1168836a", + "dest": "cargo/vendor/graphene-sys-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"6fb8fade7b754982f47ebbed241fd2680816fdd4598321784da10b9e1168836a\", \"files\": {}}", + "dest": "cargo/vendor/graphene-sys-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gsk4/gsk4-0.9.0.crate", + "sha256": "1f3cf2091e1af185b347b3450817d93dea6fe435df7abd4c2cd7fb5bcb4cfda8", + "dest": "cargo/vendor/gsk4-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"1f3cf2091e1af185b347b3450817d93dea6fe435df7abd4c2cd7fb5bcb4cfda8\", \"files\": {}}", + "dest": "cargo/vendor/gsk4-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gsk4-sys/gsk4-sys-0.9.0.crate", + "sha256": "6aa69614a26d8760c186c3690f1b0fbb917572ca23ef83137445770ceddf8cde", + "dest": "cargo/vendor/gsk4-sys-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"6aa69614a26d8760c186c3690f1b0fbb917572ca23ef83137445770ceddf8cde\", \"files\": {}}", + "dest": "cargo/vendor/gsk4-sys-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gst-plugin-version-helper/gst-plugin-version-helper-0.8.2.crate", + "sha256": "4e5e874f1660252fd2ec81c602066df3633b3a6fcbe2b196f7f93c27cf069b2a", + "dest": "cargo/vendor/gst-plugin-version-helper-0.8.2" + }, + { + "type": "inline", + "contents": "{\"package\": \"4e5e874f1660252fd2ec81c602066df3633b3a6fcbe2b196f7f93c27cf069b2a\", \"files\": {}}", + "dest": "cargo/vendor/gst-plugin-version-helper-0.8.2", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer/gstreamer-0.23.0.crate", + "sha256": "21e95b1d1153239a621ec143501fdcca6c1ad3efb87d268597285f85c4136f73", + "dest": "cargo/vendor/gstreamer-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"21e95b1d1153239a621ec143501fdcca6c1ad3efb87d268597285f85c4136f73\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-allocators/gstreamer-allocators-0.23.0.crate", + "sha256": "cab5a724c4af4f18bb5cbe8b03adc188c3254f6a6acfc981ec28e00cf2f4f088", + "dest": "cargo/vendor/gstreamer-allocators-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"cab5a724c4af4f18bb5cbe8b03adc188c3254f6a6acfc981ec28e00cf2f4f088\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-allocators-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-allocators-sys/gstreamer-allocators-sys-0.23.0.crate", + "sha256": "05c49cf4d560666db1d83afa3aa3200d6dff3675ab672746260514e8583f4b68", + "dest": "cargo/vendor/gstreamer-allocators-sys-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"05c49cf4d560666db1d83afa3aa3200d6dff3675ab672746260514e8583f4b68\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-allocators-sys-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-base/gstreamer-base-0.23.0.crate", + "sha256": "a3faa0b3cf361bf538dcb25b5cb7f6e73bd872ed031d85f3997b42d3fbd66409", + "dest": "cargo/vendor/gstreamer-base-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"a3faa0b3cf361bf538dcb25b5cb7f6e73bd872ed031d85f3997b42d3fbd66409\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-base-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-base-sys/gstreamer-base-sys-0.23.0.crate", + "sha256": "4a6643ef963c636b8022adc93aa19eac6f356bd174a187c499339fc5d64c1e05", + "dest": "cargo/vendor/gstreamer-base-sys-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"4a6643ef963c636b8022adc93aa19eac6f356bd174a187c499339fc5d64c1e05\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-base-sys-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-gl/gstreamer-gl-0.23.0.crate", + "sha256": "cfe28e4b7c72022958add8a3d86e7293ff227a5086c426731b5ec5a15ffbc759", + "dest": "cargo/vendor/gstreamer-gl-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"cfe28e4b7c72022958add8a3d86e7293ff227a5086c426731b5ec5a15ffbc759\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-gl-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-gl-egl/gstreamer-gl-egl-0.23.0.crate", + "sha256": "e643d4810c4fab58eecf494504e304bd67fceabce2635dbc238302c904fb2b65", + "dest": "cargo/vendor/gstreamer-gl-egl-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"e643d4810c4fab58eecf494504e304bd67fceabce2635dbc238302c904fb2b65\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-gl-egl-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-gl-egl-sys/gstreamer-gl-egl-sys-0.23.0.crate", + "sha256": "f5b75c95d1c4ddb23018e01db2103c1012c66bf35771fae00d5cce6270cb5cbe", + "dest": "cargo/vendor/gstreamer-gl-egl-sys-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"f5b75c95d1c4ddb23018e01db2103c1012c66bf35771fae00d5cce6270cb5cbe\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-gl-egl-sys-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-gl-sys/gstreamer-gl-sys-0.23.0.crate", + "sha256": "2bc2ff7c20ae47c4a80f42a67d85d6889a5fad3bc2385aec6dc9b58795920c5b", + "dest": "cargo/vendor/gstreamer-gl-sys-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"2bc2ff7c20ae47c4a80f42a67d85d6889a5fad3bc2385aec6dc9b58795920c5b\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-gl-sys-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-gl-wayland/gstreamer-gl-wayland-0.23.0.crate", + "sha256": "4bfdf826d8cd3963d4bf2b195f9c5e83cec326320c7919710c5eea65c766a86a", + "dest": "cargo/vendor/gstreamer-gl-wayland-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"4bfdf826d8cd3963d4bf2b195f9c5e83cec326320c7919710c5eea65c766a86a\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-gl-wayland-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-gl-wayland-sys/gstreamer-gl-wayland-sys-0.23.0.crate", + "sha256": "558b96fbba96b96ced4cea976fcb159f0aef66c963ca3507cc04b9f9c5e57c35", + "dest": "cargo/vendor/gstreamer-gl-wayland-sys-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"558b96fbba96b96ced4cea976fcb159f0aef66c963ca3507cc04b9f9c5e57c35\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-gl-wayland-sys-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-gl-x11/gstreamer-gl-x11-0.23.0.crate", + "sha256": "a09d7356fed130cec502fb4d7059e830a28fcbe22495f047e3d58333981aa875", + "dest": "cargo/vendor/gstreamer-gl-x11-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"a09d7356fed130cec502fb4d7059e830a28fcbe22495f047e3d58333981aa875\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-gl-x11-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-gl-x11-sys/gstreamer-gl-x11-sys-0.23.0.crate", + "sha256": "442f9e3a4c979fb868bdf3c9249bf669370c4a463a3408f940592e15a7eea958", + "dest": "cargo/vendor/gstreamer-gl-x11-sys-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"442f9e3a4c979fb868bdf3c9249bf669370c4a463a3408f940592e15a7eea958\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-gl-x11-sys-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-sys/gstreamer-sys-0.23.0.crate", + "sha256": "d9c9005b55dd2b1784645963c1ec409f9d420a56f6348d0ae69c2eaff584bcc3", + "dest": "cargo/vendor/gstreamer-sys-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"d9c9005b55dd2b1784645963c1ec409f9d420a56f6348d0ae69c2eaff584bcc3\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-sys-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-video/gstreamer-video-0.23.0.crate", + "sha256": "57332bca1ae7825a53fe57d993b63389f132d335aed691ac76f0ffe4304548e3", + "dest": "cargo/vendor/gstreamer-video-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"57332bca1ae7825a53fe57d993b63389f132d335aed691ac76f0ffe4304548e3\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-video-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gstreamer-video-sys/gstreamer-video-sys-0.23.0.crate", + "sha256": "0f5c334d143384e8dc714af948c2e5d7d12cb588fdcfb56f3bf37c24daf350ef", + "dest": "cargo/vendor/gstreamer-video-sys-0.23.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"0f5c334d143384e8dc714af948c2e5d7d12cb588fdcfb56f3bf37c24daf350ef\", \"files\": {}}", + "dest": "cargo/vendor/gstreamer-video-sys-0.23.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gtk4/gtk4-0.9.0.crate", + "sha256": "eaffc6c743c9160514cc9b67eace364e5dc5798369fa809cdb04e035c21c5c5d", + "dest": "cargo/vendor/gtk4-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"eaffc6c743c9160514cc9b67eace364e5dc5798369fa809cdb04e035c21c5c5d\", \"files\": {}}", + "dest": "cargo/vendor/gtk4-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gtk4-macros/gtk4-macros-0.9.0.crate", + "sha256": "188211f546ce5801f6d0245c37b6249143a2cb4fa040e54829ca1e76796e9f09", + "dest": "cargo/vendor/gtk4-macros-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"188211f546ce5801f6d0245c37b6249143a2cb4fa040e54829ca1e76796e9f09\", \"files\": {}}", + "dest": "cargo/vendor/gtk4-macros-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/gtk4-sys/gtk4-sys-0.9.0.crate", + "sha256": "1114a207af8ada02cf4658a76692f4190f06f093380d5be07e3ca8b43aa7c666", + "dest": "cargo/vendor/gtk4-sys-0.9.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"1114a207af8ada02cf4658a76692f4190f06f093380d5be07e3ca8b43aa7c666\", \"files\": {}}", + "dest": "cargo/vendor/gtk4-sys-0.9.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/hashbrown/hashbrown-0.14.5.crate", + "sha256": "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1", + "dest": "cargo/vendor/hashbrown-0.14.5" + }, + { + "type": "inline", + "contents": "{\"package\": \"e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1\", \"files\": {}}", + "dest": "cargo/vendor/hashbrown-0.14.5", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/heck/heck-0.5.0.crate", + "sha256": "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea", + "dest": "cargo/vendor/heck-0.5.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\", \"files\": {}}", + "dest": "cargo/vendor/heck-0.5.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/iana-time-zone/iana-time-zone-0.1.60.crate", + "sha256": "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141", + "dest": "cargo/vendor/iana-time-zone-0.1.60" + }, + { + "type": "inline", + "contents": "{\"package\": \"e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141\", \"files\": {}}", + "dest": "cargo/vendor/iana-time-zone-0.1.60", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/iana-time-zone-haiku/iana-time-zone-haiku-0.1.2.crate", + "sha256": "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f", + "dest": "cargo/vendor/iana-time-zone-haiku-0.1.2" + }, + { + "type": "inline", + "contents": "{\"package\": \"f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f\", \"files\": {}}", + "dest": "cargo/vendor/iana-time-zone-haiku-0.1.2", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/indexmap/indexmap-2.2.6.crate", + "sha256": "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26", + "dest": "cargo/vendor/indexmap-2.2.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26\", \"files\": {}}", + "dest": "cargo/vendor/indexmap-2.2.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/itertools/itertools-0.13.0.crate", + "sha256": "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186", + "dest": "cargo/vendor/itertools-0.13.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186\", \"files\": {}}", + "dest": "cargo/vendor/itertools-0.13.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/js-sys/js-sys-0.3.69.crate", + "sha256": "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d", + "dest": "cargo/vendor/js-sys-0.3.69" + }, + { + "type": "inline", + "contents": "{\"package\": \"29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d\", \"files\": {}}", + "dest": "cargo/vendor/js-sys-0.3.69", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/khronos-egl/khronos-egl-6.0.0.crate", + "sha256": "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76", + "dest": "cargo/vendor/khronos-egl-6.0.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76\", \"files\": {}}", + "dest": "cargo/vendor/khronos-egl-6.0.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/libc/libc-0.2.155.crate", + "sha256": "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c", + "dest": "cargo/vendor/libc-0.2.155" + }, + { + "type": "inline", + "contents": "{\"package\": \"97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c\", \"files\": {}}", + "dest": "cargo/vendor/libc-0.2.155", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/log/log-0.4.22.crate", + "sha256": "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24", + "dest": "cargo/vendor/log-0.4.22" + }, + { + "type": "inline", + "contents": "{\"package\": \"a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24\", \"files\": {}}", + "dest": "cargo/vendor/log-0.4.22", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/memchr/memchr-2.7.4.crate", + "sha256": "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3", + "dest": "cargo/vendor/memchr-2.7.4" + }, + { + "type": "inline", + "contents": "{\"package\": \"78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3\", \"files\": {}}", + "dest": "cargo/vendor/memchr-2.7.4", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/memoffset/memoffset-0.9.1.crate", + "sha256": "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a", + "dest": "cargo/vendor/memoffset-0.9.1" + }, + { + "type": "inline", + "contents": "{\"package\": \"488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a\", \"files\": {}}", + "dest": "cargo/vendor/memoffset-0.9.1", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/muldiv/muldiv-1.0.1.crate", + "sha256": "956787520e75e9bd233246045d19f42fb73242759cc57fba9611d940ae96d4b0", + "dest": "cargo/vendor/muldiv-1.0.1" + }, + { + "type": "inline", + "contents": "{\"package\": \"956787520e75e9bd233246045d19f42fb73242759cc57fba9611d940ae96d4b0\", \"files\": {}}", + "dest": "cargo/vendor/muldiv-1.0.1", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/num-integer/num-integer-0.1.46.crate", + "sha256": "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f", + "dest": "cargo/vendor/num-integer-0.1.46" + }, + { + "type": "inline", + "contents": "{\"package\": \"7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f\", \"files\": {}}", + "dest": "cargo/vendor/num-integer-0.1.46", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/num-rational/num-rational-0.4.2.crate", + "sha256": "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824", + "dest": "cargo/vendor/num-rational-0.4.2" + }, + { + "type": "inline", + "contents": "{\"package\": \"f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824\", \"files\": {}}", + "dest": "cargo/vendor/num-rational-0.4.2", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/num-traits/num-traits-0.2.19.crate", + "sha256": "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841", + "dest": "cargo/vendor/num-traits-0.2.19" + }, + { + "type": "inline", + "contents": "{\"package\": \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\", \"files\": {}}", + "dest": "cargo/vendor/num-traits-0.2.19", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/once_cell/once_cell-1.19.0.crate", + "sha256": "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92", + "dest": "cargo/vendor/once_cell-1.19.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92\", \"files\": {}}", + "dest": "cargo/vendor/once_cell-1.19.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/option-operations/option-operations-0.5.0.crate", + "sha256": "7c26d27bb1aeab65138e4bf7666045169d1717febcc9ff870166be8348b223d0", + "dest": "cargo/vendor/option-operations-0.5.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"7c26d27bb1aeab65138e4bf7666045169d1717febcc9ff870166be8348b223d0\", \"files\": {}}", + "dest": "cargo/vendor/option-operations-0.5.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/pango/pango-0.20.0.crate", + "sha256": "54768854025df6903061d0084fd9702a253ddfd60db7d9b751d43b76689a7f0a", + "dest": "cargo/vendor/pango-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"54768854025df6903061d0084fd9702a253ddfd60db7d9b751d43b76689a7f0a\", \"files\": {}}", + "dest": "cargo/vendor/pango-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/pango-sys/pango-sys-0.20.0.crate", + "sha256": "b07cc57d10cee4ec661f718a6902cee18c2f4cfae08e87e5a390525946913390", + "dest": "cargo/vendor/pango-sys-0.20.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"b07cc57d10cee4ec661f718a6902cee18c2f4cfae08e87e5a390525946913390\", \"files\": {}}", + "dest": "cargo/vendor/pango-sys-0.20.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/parking/parking-2.2.0.crate", + "sha256": "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae", + "dest": "cargo/vendor/parking-2.2.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae\", \"files\": {}}", + "dest": "cargo/vendor/parking-2.2.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/paste/paste-1.0.15.crate", + "sha256": "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a", + "dest": "cargo/vendor/paste-1.0.15" + }, + { + "type": "inline", + "contents": "{\"package\": \"57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a\", \"files\": {}}", + "dest": "cargo/vendor/paste-1.0.15", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/pin-project-lite/pin-project-lite-0.2.14.crate", + "sha256": "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02", + "dest": "cargo/vendor/pin-project-lite-0.2.14" + }, + { + "type": "inline", + "contents": "{\"package\": \"bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02\", \"files\": {}}", + "dest": "cargo/vendor/pin-project-lite-0.2.14", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/pin-utils/pin-utils-0.1.0.crate", + "sha256": "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184", + "dest": "cargo/vendor/pin-utils-0.1.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184\", \"files\": {}}", + "dest": "cargo/vendor/pin-utils-0.1.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/pkg-config/pkg-config-0.3.30.crate", + "sha256": "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec", + "dest": "cargo/vendor/pkg-config-0.3.30" + }, + { + "type": "inline", + "contents": "{\"package\": \"d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec\", \"files\": {}}", + "dest": "cargo/vendor/pkg-config-0.3.30", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/proc-macro-crate/proc-macro-crate-3.1.0.crate", + "sha256": "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284", + "dest": "cargo/vendor/proc-macro-crate-3.1.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284\", \"files\": {}}", + "dest": "cargo/vendor/proc-macro-crate-3.1.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/proc-macro2/proc-macro2-1.0.86.crate", + "sha256": "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77", + "dest": "cargo/vendor/proc-macro2-1.0.86" + }, + { + "type": "inline", + "contents": "{\"package\": \"5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77\", \"files\": {}}", + "dest": "cargo/vendor/proc-macro2-1.0.86", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/quote/quote-1.0.36.crate", + "sha256": "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7", + "dest": "cargo/vendor/quote-1.0.36" + }, + { + "type": "inline", + "contents": "{\"package\": \"0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7\", \"files\": {}}", + "dest": "cargo/vendor/quote-1.0.36", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/rustc_version/rustc_version-0.4.0.crate", + "sha256": "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366", + "dest": "cargo/vendor/rustc_version-0.4.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366\", \"files\": {}}", + "dest": "cargo/vendor/rustc_version-0.4.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/semver/semver-1.0.23.crate", + "sha256": "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b", + "dest": "cargo/vendor/semver-1.0.23" + }, + { + "type": "inline", + "contents": "{\"package\": \"61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b\", \"files\": {}}", + "dest": "cargo/vendor/semver-1.0.23", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/serde/serde-1.0.204.crate", + "sha256": "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12", + "dest": "cargo/vendor/serde-1.0.204" + }, + { + "type": "inline", + "contents": "{\"package\": \"bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12\", \"files\": {}}", + "dest": "cargo/vendor/serde-1.0.204", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/serde_derive/serde_derive-1.0.204.crate", + "sha256": "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222", + "dest": "cargo/vendor/serde_derive-1.0.204" + }, + { + "type": "inline", + "contents": "{\"package\": \"e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222\", \"files\": {}}", + "dest": "cargo/vendor/serde_derive-1.0.204", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/serde_spanned/serde_spanned-0.6.6.crate", + "sha256": "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0", + "dest": "cargo/vendor/serde_spanned-0.6.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0\", \"files\": {}}", + "dest": "cargo/vendor/serde_spanned-0.6.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/slab/slab-0.4.9.crate", + "sha256": "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67", + "dest": "cargo/vendor/slab-0.4.9" + }, + { + "type": "inline", + "contents": "{\"package\": \"8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67\", \"files\": {}}", + "dest": "cargo/vendor/slab-0.4.9", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/smallvec/smallvec-1.13.2.crate", + "sha256": "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67", + "dest": "cargo/vendor/smallvec-1.13.2" + }, + { + "type": "inline", + "contents": "{\"package\": \"3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67\", \"files\": {}}", + "dest": "cargo/vendor/smallvec-1.13.2", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/syn/syn-2.0.70.crate", + "sha256": "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16", + "dest": "cargo/vendor/syn-2.0.70" + }, + { + "type": "inline", + "contents": "{\"package\": \"2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16\", \"files\": {}}", + "dest": "cargo/vendor/syn-2.0.70", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/system-deps/system-deps-7.0.1.crate", + "sha256": "6c81f13d9a334a6c242465140bd262fae382b752ff2011c4f7419919a9c97922", + "dest": "cargo/vendor/system-deps-7.0.1" + }, + { + "type": "inline", + "contents": "{\"package\": \"6c81f13d9a334a6c242465140bd262fae382b752ff2011c4f7419919a9c97922\", \"files\": {}}", + "dest": "cargo/vendor/system-deps-7.0.1", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/target-lexicon/target-lexicon-0.12.15.crate", + "sha256": "4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2", + "dest": "cargo/vendor/target-lexicon-0.12.15" + }, + { + "type": "inline", + "contents": "{\"package\": \"4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2\", \"files\": {}}", + "dest": "cargo/vendor/target-lexicon-0.12.15", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/thiserror/thiserror-1.0.61.crate", + "sha256": "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709", + "dest": "cargo/vendor/thiserror-1.0.61" + }, + { + "type": "inline", + "contents": "{\"package\": \"c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709\", \"files\": {}}", + "dest": "cargo/vendor/thiserror-1.0.61", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/thiserror-impl/thiserror-impl-1.0.61.crate", + "sha256": "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533", + "dest": "cargo/vendor/thiserror-impl-1.0.61" + }, + { + "type": "inline", + "contents": "{\"package\": \"46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533\", \"files\": {}}", + "dest": "cargo/vendor/thiserror-impl-1.0.61", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/toml/toml-0.8.14.crate", + "sha256": "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335", + "dest": "cargo/vendor/toml-0.8.14" + }, + { + "type": "inline", + "contents": "{\"package\": \"6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335\", \"files\": {}}", + "dest": "cargo/vendor/toml-0.8.14", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/toml_datetime/toml_datetime-0.6.6.crate", + "sha256": "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf", + "dest": "cargo/vendor/toml_datetime-0.6.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf\", \"files\": {}}", + "dest": "cargo/vendor/toml_datetime-0.6.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/toml_edit/toml_edit-0.21.1.crate", + "sha256": "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1", + "dest": "cargo/vendor/toml_edit-0.21.1" + }, + { + "type": "inline", + "contents": "{\"package\": \"6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1\", \"files\": {}}", + "dest": "cargo/vendor/toml_edit-0.21.1", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/toml_edit/toml_edit-0.22.15.crate", + "sha256": "d59a3a72298453f564e2b111fa896f8d07fabb36f51f06d7e875fc5e0b5a3ef1", + "dest": "cargo/vendor/toml_edit-0.22.15" + }, + { + "type": "inline", + "contents": "{\"package\": \"d59a3a72298453f564e2b111fa896f8d07fabb36f51f06d7e875fc5e0b5a3ef1\", \"files\": {}}", + "dest": "cargo/vendor/toml_edit-0.22.15", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/unicode-ident/unicode-ident-1.0.12.crate", + "sha256": "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b", + "dest": "cargo/vendor/unicode-ident-1.0.12" + }, + { + "type": "inline", + "contents": "{\"package\": \"3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b\", \"files\": {}}", + "dest": "cargo/vendor/unicode-ident-1.0.12", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/version-compare/version-compare-0.2.0.crate", + "sha256": "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b", + "dest": "cargo/vendor/version-compare-0.2.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b\", \"files\": {}}", + "dest": "cargo/vendor/version-compare-0.2.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/wasm-bindgen/wasm-bindgen-0.2.92.crate", + "sha256": "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8", + "dest": "cargo/vendor/wasm-bindgen-0.2.92" + }, + { + "type": "inline", + "contents": "{\"package\": \"4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8\", \"files\": {}}", + "dest": "cargo/vendor/wasm-bindgen-0.2.92", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/wasm-bindgen-backend/wasm-bindgen-backend-0.2.92.crate", + "sha256": "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da", + "dest": "cargo/vendor/wasm-bindgen-backend-0.2.92" + }, + { + "type": "inline", + "contents": "{\"package\": \"614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da\", \"files\": {}}", + "dest": "cargo/vendor/wasm-bindgen-backend-0.2.92", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/wasm-bindgen-macro/wasm-bindgen-macro-0.2.92.crate", + "sha256": "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726", + "dest": "cargo/vendor/wasm-bindgen-macro-0.2.92" + }, + { + "type": "inline", + "contents": "{\"package\": \"a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726\", \"files\": {}}", + "dest": "cargo/vendor/wasm-bindgen-macro-0.2.92", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/wasm-bindgen-macro-support/wasm-bindgen-macro-support-0.2.92.crate", + "sha256": "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7", + "dest": "cargo/vendor/wasm-bindgen-macro-support-0.2.92" + }, + { + "type": "inline", + "contents": "{\"package\": \"e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7\", \"files\": {}}", + "dest": "cargo/vendor/wasm-bindgen-macro-support-0.2.92", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/wasm-bindgen-shared/wasm-bindgen-shared-0.2.92.crate", + "sha256": "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96", + "dest": "cargo/vendor/wasm-bindgen-shared-0.2.92" + }, + { + "type": "inline", + "contents": "{\"package\": \"af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96\", \"files\": {}}", + "dest": "cargo/vendor/wasm-bindgen-shared-0.2.92", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/windows-core/windows-core-0.52.0.crate", + "sha256": "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9", + "dest": "cargo/vendor/windows-core-0.52.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9\", \"files\": {}}", + "dest": "cargo/vendor/windows-core-0.52.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/windows-sys/windows-sys-0.52.0.crate", + "sha256": "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d", + "dest": "cargo/vendor/windows-sys-0.52.0" + }, + { + "type": "inline", + "contents": "{\"package\": \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\", \"files\": {}}", + "dest": "cargo/vendor/windows-sys-0.52.0", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/windows-targets/windows-targets-0.52.6.crate", + "sha256": "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973", + "dest": "cargo/vendor/windows-targets-0.52.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\", \"files\": {}}", + "dest": "cargo/vendor/windows-targets-0.52.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/windows_aarch64_gnullvm/windows_aarch64_gnullvm-0.52.6.crate", + "sha256": "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3", + "dest": "cargo/vendor/windows_aarch64_gnullvm-0.52.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\", \"files\": {}}", + "dest": "cargo/vendor/windows_aarch64_gnullvm-0.52.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/windows_aarch64_msvc/windows_aarch64_msvc-0.52.6.crate", + "sha256": "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469", + "dest": "cargo/vendor/windows_aarch64_msvc-0.52.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\", \"files\": {}}", + "dest": "cargo/vendor/windows_aarch64_msvc-0.52.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/windows_i686_gnu/windows_i686_gnu-0.52.6.crate", + "sha256": "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b", + "dest": "cargo/vendor/windows_i686_gnu-0.52.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\", \"files\": {}}", + "dest": "cargo/vendor/windows_i686_gnu-0.52.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/windows_i686_gnullvm/windows_i686_gnullvm-0.52.6.crate", + "sha256": "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66", + "dest": "cargo/vendor/windows_i686_gnullvm-0.52.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\", \"files\": {}}", + "dest": "cargo/vendor/windows_i686_gnullvm-0.52.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/windows_i686_msvc/windows_i686_msvc-0.52.6.crate", + "sha256": "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66", + "dest": "cargo/vendor/windows_i686_msvc-0.52.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\", \"files\": {}}", + "dest": "cargo/vendor/windows_i686_msvc-0.52.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/windows_x86_64_gnu/windows_x86_64_gnu-0.52.6.crate", + "sha256": "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78", + "dest": "cargo/vendor/windows_x86_64_gnu-0.52.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\", \"files\": {}}", + "dest": "cargo/vendor/windows_x86_64_gnu-0.52.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/windows_x86_64_gnullvm/windows_x86_64_gnullvm-0.52.6.crate", + "sha256": "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d", + "dest": "cargo/vendor/windows_x86_64_gnullvm-0.52.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\", \"files\": {}}", + "dest": "cargo/vendor/windows_x86_64_gnullvm-0.52.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/windows_x86_64_msvc/windows_x86_64_msvc-0.52.6.crate", + "sha256": "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec", + "dest": "cargo/vendor/windows_x86_64_msvc-0.52.6" + }, + { + "type": "inline", + "contents": "{\"package\": \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\", \"files\": {}}", + "dest": "cargo/vendor/windows_x86_64_msvc-0.52.6", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/winnow/winnow-0.5.40.crate", + "sha256": "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876", + "dest": "cargo/vendor/winnow-0.5.40" + }, + { + "type": "inline", + "contents": "{\"package\": \"f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876\", \"files\": {}}", + "dest": "cargo/vendor/winnow-0.5.40", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "archive", + "archive-type": "tar-gzip", + "url": "https://static.crates.io/crates/winnow/winnow-0.6.13.crate", + "sha256": "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1", + "dest": "cargo/vendor/winnow-0.6.13" + }, + { + "type": "inline", + "contents": "{\"package\": \"59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1\", \"files\": {}}", + "dest": "cargo/vendor/winnow-0.6.13", + "dest-filename": ".cargo-checksum.json" + }, + { + "type": "inline", + "contents": "[source.vendored-sources]\ndirectory = \"cargo/vendor\"\n\n[source.crates-io]\nreplace-with = \"vendored-sources\"\n", + "dest": "cargo", + "dest-filename": "config" + } +] diff --git a/build-aux/flatpak/org.gnome.Contacts.Devel.json b/build-aux/flatpak/org.gnome.Contacts.Devel.json index 9ee27804..d97445f3 100644 --- a/build-aux/flatpak/org.gnome.Contacts.Devel.json +++ b/build-aux/flatpak/org.gnome.Contacts.Devel.json @@ -4,7 +4,8 @@ "runtime-version": "master", "sdk": "org.gnome.Sdk", "sdk-extensions": [ - "org.freedesktop.Sdk.Extension.vala-nightly" + "org.freedesktop.Sdk.Extension.vala-nightly", + "org.freedesktop.Sdk.Extension.rust-stable" ], "command": "gnome-contacts", "tags" : [ @@ -13,7 +14,8 @@ ], "build-options" : { "prepend-path" : "/usr/lib/sdk/vala-nightly/bin/", - "prepend-ld-library-path" : "/usr/lib/sdk/vala-nightly/lib" + "prepend-ld-library-path" : "/usr/lib/sdk/vala-nightly/lib", + "append-path": "/usr/lib/sdk/rust-stable/bin" }, "finish-args": [ /* X11 + XShm access */ @@ -213,6 +215,27 @@ } ] }, + { + "name": "gst-plugin-gtk4", + "buildsystem": "simple", + "sources": [ + { + "type": "archive", + "url": "https://crates.io/api/v1/crates/gst-plugin-gtk4/0.13.0/download", + "dest-filename": "gst-plugin-gtk4-0.13.0.tar.gz", + "sha256": "69b98aeb531b6cf9c3a6eb36742cedc0168054e2f040b76ddc61260c10dec589" + }, + "gst-plugin-gtk4-sources.json" + ], + "build-commands": [ + "cargo cinstall --offline --release --features=wayland,x11glx,x11egl,gtk_v4_14 --library-type=cdylib --prefix=/app --libdir=/app/lib" + ], + "build-options": { + "env": { + "CARGO_HOME": "/run/build/gst-plugin-gtk4/cargo" + } + } + }, { "name": "gnome-contacts", "buildsystem": "meson", diff --git a/data/ui/contacts-avatar-selector.ui b/data/ui/contacts-avatar-selector.ui index b8d97f14..685e63ea 100644 --- a/data/ui/contacts-avatar-selector.ui +++ b/data/ui/contacts-avatar-selector.ui @@ -84,21 +84,26 @@ SPDX-License-Identifier: GPL-2.0-or-later - - - False - Take a Picture… - True - True - - - - - - Select a File… - True - True - + + + horizontal + 6 + + + Take a Picture… + True + True + + + + + + Select a File… + True + True + + + diff --git a/data/ui/contacts-crop-dialog.ui b/data/ui/contacts-crop-dialog.ui index 98cb7468..3c020bc1 100644 --- a/data/ui/contacts-crop-dialog.ui +++ b/data/ui/contacts-crop-dialog.ui @@ -22,7 +22,7 @@ SPDX-License-Identifier: GPL-2.0-or-later - + False @@ -52,6 +52,13 @@ SPDX-License-Identifier: GPL-2.0-or-later + + + + True + True + + diff --git a/meson.build b/meson.build index 3acbf2ac..240430cd 100644 --- a/meson.build +++ b/meson.build @@ -52,12 +52,10 @@ libadwaita_dep = dependency('libadwaita-1', version: '>= 1.4.alpha') # E-D-S libebook = dependency('libebook-1.2', version: '>=' + min_eds_version) libedataserver = dependency('libedataserver-1.2', version: '>=' + min_eds_version) -# libedataserverui = dependency('libedataserverui-1.2', version: '>=' + min_eds_version) -# Portals (needed for camera access) +# Camera libportal_dep = dependency('libportal-gtk4', version: '>= 0.6') -# Cheese -# cheese_dep = dependency('cheese', required: get_option('cheese')) -# cheese_gtk_dep = dependency('cheese-gtk', version: '>= 3.3.91', required: get_option('cheese')) +gstreamer_dep = dependency('gstreamer-1.0') +# QR Code libqrencode_dep = dependency('libqrencode', version: '>=4.1.1') # gnome-online-accounts if get_option('goa') diff --git a/src/cc-crop-area.c b/src/cc-crop-area.c index 2b7a3210..cd753035 100644 --- a/src/cc-crop-area.c +++ b/src/cc-crop-area.c @@ -581,17 +581,18 @@ cc_crop_area_new (void) } /** - * cc_crop_area_create_pixbuf: + * cc_crop_area_create_texture: * @area: A crop area * * Renders the area's paintable, with the cropping applied by the user, into a - * GdkPixbuf. + * GdkTexture. * * Returns: (transfer full): The cropped picture */ -GdkPixbuf * -cc_crop_area_create_pixbuf (CcCropArea *area) +GdkTexture * +cc_crop_area_create_texture (CcCropArea *area) { + g_autoptr (GdkPaintable) paintable = NULL; g_autoptr (GtkSnapshot) snapshot = NULL; g_autoptr (GskRenderNode) node = NULL; g_autoptr (GskRenderer) renderer = NULL; @@ -602,9 +603,10 @@ cc_crop_area_create_pixbuf (CcCropArea *area) g_return_val_if_fail (CC_IS_CROP_AREA (area), NULL); snapshot = gtk_snapshot_new (); - gdk_paintable_snapshot (area->paintable, snapshot, - gdk_paintable_get_intrinsic_width (area->paintable), - gdk_paintable_get_intrinsic_height (area->paintable)); + paintable = gdk_paintable_get_current_image (area->paintable); + gdk_paintable_snapshot (paintable, snapshot, + gdk_paintable_get_intrinsic_width (paintable), + gdk_paintable_get_intrinsic_height (paintable)); node = gtk_snapshot_free_to_node (g_steal_pointer (&snapshot)); renderer = gsk_gl_renderer_new (); @@ -617,7 +619,7 @@ cc_crop_area_create_pixbuf (CcCropArea *area) texture = gsk_renderer_render_texture (renderer, node, &viewport); gsk_renderer_unrealize (renderer); - return gdk_pixbuf_get_from_texture (texture); + return g_steal_pointer (&texture); } /** diff --git a/src/cc-crop-area.h b/src/cc-crop-area.h index eead74a7..a859838f 100644 --- a/src/cc-crop-area.h +++ b/src/cc-crop-area.h @@ -22,7 +22,7 @@ void cc_crop_area_set_paintable (CcCropArea *area, void cc_crop_area_set_min_size (CcCropArea *area, int width, int height); -GdkPixbuf * cc_crop_area_create_pixbuf (CcCropArea *area); +GdkTexture * cc_crop_area_create_texture (CcCropArea *area); G_END_DECLS diff --git a/src/contacts-avatar-selector.vala b/src/contacts-avatar-selector.vala index d31658f7..53dd35ae 100644 --- a/src/contacts-avatar-selector.vala +++ b/src/contacts-avatar-selector.vala @@ -11,41 +11,34 @@ const int ICONS_SIZE = 64; private class Contacts.Thumbnail : Gtk.FlowBoxChild { - public Gdk.Pixbuf? source_pixbuf { get; construct set; } + public Gdk.Texture texture { get; construct set; } - private Thumbnail (Gdk.Pixbuf? source_pixbuf = null) { - Object (visible: true, - halign: Gtk.Align.CENTER, - source_pixbuf: source_pixbuf); + construct { + this.halign = Gtk.Align.CENTER; - this.add_css_class ("circular"); + add_css_class ("circular"); var avatar = new Avatar (ICONS_SIZE); - avatar.set_pixbuf (source_pixbuf); + avatar.set_paintable (this.texture); this.set_child (avatar); } - public Thumbnail.for_chunk (AvatarChunk chunk) + private Thumbnail (Gdk.Texture texture) { + Object (texture: texture); + } + + public static async Thumbnail? for_chunk (AvatarChunk chunk) throws Error requires (chunk.avatar != null) { - Gdk.Pixbuf? pixbuf = null; - try { - var stream = chunk.avatar.load (MAIN_SIZE, null); - pixbuf = new Gdk.Pixbuf.from_stream (stream); - } catch (Error e) { - debug ("Couldn't create thumbnail for chunk: %s", e.message); - } - this (pixbuf); + var stream = yield chunk.avatar.load_async (MAIN_SIZE); + var pixbuf = yield new Gdk.Pixbuf.from_stream_async (stream); + return new Thumbnail (Gdk.Texture.for_pixbuf (pixbuf)); } - public Thumbnail.for_filename (string filename) { - Gdk.Pixbuf? pixbuf = null; - try { - pixbuf = new Gdk.Pixbuf.from_file (filename); - } catch (Error e) { - debug ("Couldn't create frame for file '%s': %s", filename, e.message); - } - this (pixbuf); + public static async Thumbnail? for_file (File file) throws Error { + var stream = yield file.read_async (); + var pixbuf = yield new Gdk.Pixbuf.from_stream_async (stream); + return new Thumbnail (Gdk.Texture.for_pixbuf (pixbuf)); } } @@ -69,11 +62,7 @@ public class Contacts.AvatarSelector : Adw.Window { private Xdp.Portal? portal = null; - private Gdk.Pixbuf? _selected_avatar = null; - public Gdk.Pixbuf? selected_avatar { - owned get { return scale_pixbuf_for_avatar_use (this._selected_avatar); } - private set { this._selected_avatar = value; } - } + private Gdk.Texture? selected = null; static construct { install_action ("set-avatar", null, (Gtk.WidgetActionActivateFunc) on_set_avatar); @@ -93,16 +82,16 @@ public class Contacts.AvatarSelector : Adw.Window { var selected = thumbnail_grid.get_selected_children (); if (selected != null) { unowned var thumbnail = (Thumbnail) selected.data; - this.selected_avatar = thumbnail.source_pixbuf; + this.selected = thumbnail.texture; } else { - this.selected_avatar = null; + this.selected = null; } } private void on_thumbnail_activated (Gtk.FlowBox thumbnail_grid, Gtk.FlowBoxChild child) { unowned var thumbnail = (Thumbnail) child; - this.selected_avatar = thumbnail.source_pixbuf; + this.selected = thumbnail.texture; activate_action_variant ("set-avatar", null); } @@ -117,51 +106,23 @@ public class Contacts.AvatarSelector : Adw.Window { } } - private Gdk.Pixbuf? scale_pixbuf_for_avatar_use (Gdk.Pixbuf? pixbuf) { - if (pixbuf == null) - return null; - - int w = pixbuf.get_width (); - int h = pixbuf.get_height (); - - if (w <= MAIN_SIZE && h <= MAIN_SIZE) - return pixbuf; - - if (w > h) { - h = (int) Math.round (h * (float) MAIN_SIZE / w); - w = MAIN_SIZE; - } else { - w = (int) Math.round (w * (float) MAIN_SIZE / h); - h = MAIN_SIZE; - } - - return pixbuf.scale_simple (w, h, Gdk.InterpType.HYPER); - } - /** Sets the selected avatar on the contact (it does _not_ save it) */ private void on_set_avatar (string action_name, Variant? param) { - debug ("Setting avatar"); - try { - uint8[] buffer; - this.selected_avatar.save_to_buffer (out buffer, "png", null); - var icon = new BytesIcon (new Bytes (buffer)); - - // Save into the most relevant avatar - var avatar_chunk = this.contact.get_most_relevant_chunk ("avatar", true); - if (avatar_chunk == null) - avatar_chunk = this.contact.create_chunk ("avatar", null); - ((AvatarChunk) avatar_chunk).avatar = icon; - destroy (); - } catch (Error e) { - destroy (); - - warning ("Failed to set avatar: %s", e.message); - var dialog = new Adw.MessageDialog (this.transient_for, - null, - _("Failed to set avatar")); - dialog.add_response ("close", _("_Close")); - dialog.show (); + if (this.selected == null) { + warning ("Trying to save avatar, but none selected"); + return; } + + debug ("Saving avatar"); + var bytes = this.selected.save_to_png_bytes (); + var icon = new BytesIcon (bytes); + + // Save into the most relevant avatar + var avatar_chunk = this.contact.get_most_relevant_chunk ("avatar", true); + if (avatar_chunk == null) + avatar_chunk = this.contact.create_chunk ("avatar", null); + ((AvatarChunk) avatar_chunk).avatar = icon; + destroy (); } private void update_thumbnail_grid () { @@ -169,31 +130,48 @@ public class Contacts.AvatarSelector : Adw.Window { var chunks = new Gtk.FilterListModel (this.contact, (owned) filter); for (uint i = 0; i < chunks.get_n_items (); i++) { var chunk = (AvatarChunk) chunks.get_item (i); - var thumbnail = new Thumbnail.for_chunk (chunk); - if (thumbnail.source_pixbuf != null) { - this.thumbnail_grid.insert (thumbnail, -1); - } + Thumbnail.for_chunk.begin (chunk, (obj, res) => { + try { + var thumbnail = Thumbnail.for_chunk.end (res); + this.thumbnail_grid.insert (thumbnail, -1); + } catch (Error e) { + debug ("Couldn't create thumbnail for chunk: %s", e.message); + } + }); } var stock_files = Utils.get_stock_avatars (); - foreach (var file_name in stock_files) { - var thumbnail = new Thumbnail.for_filename (file_name); - if (thumbnail.source_pixbuf != null) { - this.thumbnail_grid.insert (thumbnail, -1); - } + foreach (unowned var filename in stock_files) { + var file = File.new_for_path (filename); + Thumbnail.for_file.begin (file, (obj, res) => { + try { + var thumbnail = Thumbnail.for_file.end (res); + this.thumbnail_grid.insert (thumbnail, -1); + } catch (Error e) { + debug ("Couldn't create thumbnail for file '%s': %s", filename, e.message); + } + }); } } [GtkCallback] private void on_camera_button_clicked (Gtk.Button button) { - // XXX implement - // var dialog = new CropDialog.for_portal (this.portal, - // this.get_root () as Gtk.Window); - // dialog.show (); + var dialog = new CropDialog.for_portal (this.portal, + this.get_root () as Gtk.Window); + dialog.cropped.connect ((dialog, texture) => { + this.selected = texture; + activate_action_variant ("set-avatar", null); + dialog.destroy (); + }); + dialog.present (); } [GtkCallback] private void on_file_clicked (Gtk.Button button) { + choose_file.begin ((obj, res) => { choose_file.end (res); }); + } + + private async void choose_file () { var file_dialog = new Gtk.FileDialog (); file_dialog.title = _("Browse for more pictures"); file_dialog.accept_label = _("_Open"); @@ -223,47 +201,40 @@ public class Contacts.AvatarSelector : Adw.Window { if (pictures_folder != null) file_dialog.set_initial_folder (File.new_for_path (pictures_folder)); - file_dialog.open.begin (this.get_root () as Gtk.Window, null, (obj, response) => { - try { - var file = file_dialog.open.end (response); - - try { - var in_stream = file.read (); - var pixbuf = new Gdk.Pixbuf.from_stream (in_stream, null); - in_stream.close (); - if (pixbuf.get_width () > MAIN_SIZE || pixbuf.get_height () > MAIN_SIZE) { - var dialog = new CropDialog.for_pixbuf (pixbuf, - get_root () as Gtk.Window); - dialog.cropped.connect ((pixbuf) => { - this.selected_avatar = pixbuf; - activate_action_variant ("set-avatar", null); - }); - dialog.present (); - } else { - this.selected_avatar = pixbuf; - activate_action_variant ("set-avatar", null); - } - } catch (GLib.Error e) { - warning ("Failed to set avatar: %s", e.message); - var dialog = new Adw.MessageDialog (get_root () as Gtk.Window, - null, - _("Failed to set avatar.")); - dialog.add_response ("close", _("_Close")); - dialog.default_response = "close"; - dialog.show(); - } - } catch (Error error) { - switch (error.code) { - case Gtk.DialogError.CANCELLED: - case Gtk.DialogError.DISMISSED: - debug ("Dismissed opening file: %s", error.message); - break; - case Gtk.DialogError.FAILED: - default: - warning ("Could not open file: %s", error.message); - break; - } + var parent_window = this.get_root () as Gtk.Window; + try { + var file = yield file_dialog.open (parent_window, null); + var in_stream = yield file.read_async (); + var pixbuf = yield new Gdk.Pixbuf.from_stream_async (in_stream, null); + var texture = Gdk.Texture.for_pixbuf (pixbuf); + in_stream.close (); + + var dialog = new CropDialog.for_paintable (texture, parent_window); + dialog.cropped.connect ((dialog, texture) => { + this.selected = texture; + activate_action_variant ("set-avatar", null); + dialog.destroy (); + }); + dialog.present (); + } catch (Gtk.DialogError error) { + switch (error.code) { + case Gtk.DialogError.CANCELLED: + case Gtk.DialogError.DISMISSED: + debug ("Dismissed opening file: %s", error.message); + break; + case Gtk.DialogError.FAILED: + default: + warning ("Could not open file: %s", error.message); + break; } - }); + } catch (GLib.Error e) { + warning ("Failed to set avatar: %s", e.message); + var dialog = new Adw.MessageDialog (get_root () as Gtk.Window, + null, + _("Failed to set avatar.")); + dialog.add_response ("close", _("_Close")); + dialog.default_response = "close"; + dialog.show(); + } } } diff --git a/src/contacts-avatar.vala b/src/contacts-avatar.vala index 68a1fec7..6cde4af0 100644 --- a/src/contacts-avatar.vala +++ b/src/contacts-avatar.vala @@ -106,7 +106,7 @@ public class Contacts.Avatar : Adw.Bin { private async void load_avatar (LoadableIcon? icon) { if (icon == null) { - set_pixbuf (null); + set_paintable (null); return; } @@ -116,18 +116,18 @@ public class Contacts.Avatar : Adw.Bin { this.avatar_size, this.avatar_size, true); - this.set_pixbuf (pixbuf); + set_paintable (Gdk.Texture.for_pixbuf (pixbuf)); } catch (Error e) { warning ("Couldn't load avatar of '%s': %s", this.individual.display_name, e.message); } } /** - * Manually set the avatar to the given pixbuf, even if the contact has an avatar. + * Manually set the avatar to the given paintable, + * even if the contact has an avatar. */ - public void set_pixbuf (Gdk.Pixbuf? a_pixbuf) { - var img = (a_pixbuf != null)? Gdk.Texture.for_pixbuf (a_pixbuf) : null; - ((Adw.Avatar) this.child).set_custom_image (img); + public void set_paintable (Gdk.Paintable? paintable) { + ((Adw.Avatar) this.child).set_custom_image (paintable); } /* Find a nice name to generate the label and color for the fallback avatar diff --git a/src/contacts-crop-dialog.vala b/src/contacts-crop-dialog.vala index 2cb5cd51..3351de74 100644 --- a/src/contacts-crop-dialog.vala +++ b/src/contacts-crop-dialog.vala @@ -8,33 +8,98 @@ public class Contacts.CropDialog : Adw.Window { [GtkChild] - private unowned Adw.ToolbarView toolbar_view; + private unowned Cc.CropArea crop_area; - private Cc.CropArea crop_area; - - public signal void cropped (Gdk.Pixbuf pixbuf); + public signal void cropped (Gdk.Texture texture); static construct { + typeof (Cc.CropArea).ensure (); install_action ("crop", null, (Gtk.WidgetActionActivateFunc) on_crop); } construct { - this.crop_area = new Cc.CropArea (); - this.crop_area.vexpand = true; - this.crop_area.hexpand = true; this.crop_area.set_min_size (48, 48); - this.toolbar_view.content = this.crop_area; } - public CropDialog.for_pixbuf (Gdk.Pixbuf pixbuf, + public CropDialog.for_paintable (Gdk.Paintable paintable, + Gtk.Window? parent = null) { + Object (transient_for: parent); + + this.crop_area.set_paintable (paintable); + } + + public CropDialog.for_portal (Xdp.Portal portal, Gtk.Window? parent = null) { Object (transient_for: parent); - this.crop_area.set_paintable (Gdk.Texture.for_pixbuf (pixbuf)); + do_camera.begin(portal, (obj, res) => { + do_camera.end (res); + }); + } + + private async void do_camera (Xdp.Portal portal) { + var parent = Xdp.parent_new_gtk (this); + try { + debug ("Requesting camera access"); + yield portal.access_camera (parent, Xdp.CameraFlags.NONE, null); + debug ("Camera access success"); + } catch (GLib.Error err) { + warning ("Couldn't access camera: %s", err.message); + return; + } + + var pw_fd = portal.open_pipewire_remote_for_camera (); + debug ("Got Pipewire fd %d", pw_fd); + + // Setup GStreamer pipeline + var pipeline = new Gst.Pipeline (null); + + var source = Gst.ElementFactory.make ("pipewiresrc", null); + var queue = Gst.ElementFactory.make ("queue", null); + var glsinkbin = Gst.ElementFactory.make ("glsinkbin", null); + var paintable_sink = Gst.ElementFactory.make ("gtk4paintablesink", null); + if (source == null || queue == null || glsinkbin == null || paintable_sink == null) { + warning ("Your GStreamer installation is missing some required elements"); + return; + } + + pipeline.add_many (source, queue, glsinkbin); + source.link_many (queue, glsinkbin); + + var paintable = GLib.Value (typeof (Gdk.Paintable)); + paintable_sink.get_property ("paintable", ref paintable); + this.crop_area.set_paintable (paintable as Gdk.Paintable); + glsinkbin.set_property ("sink", paintable_sink); + + source.set_property ("fd", pw_fd); + + // Start + pipeline.set_state (Gst.State.PLAYING); + + // Handle cleanup on window close + this.close_request.connect (() => { + pipeline.set_state (Gst.State.NULL); + return false; + }); + + // Watch the bus + var bus = pipeline.get_bus (); + bus.add_signal_watch (); + bus.message.connect ((bus, message) => { + if (message.type == Gst.MessageType.ERROR) { + GLib.Error err; + string debug; + message.parse_error (out err, out debug); + warning ("GStreamer error: %s. %s", err.message, debug); + } else if (message.type == Gst.MessageType.EOS) { + warning ("EOS"); + } + }); } private void on_crop (string action_name, Variant? param) { - cropped (this.crop_area.create_pixbuf ()); - destroy (); + var texture = this.crop_area.create_texture (); + close (); + cropped (texture); } } diff --git a/src/main.vala b/src/main.vala index fbb7d055..39ac89f3 100644 --- a/src/main.vala +++ b/src/main.vala @@ -12,9 +12,9 @@ main (string[] args) { Intl.bind_textdomain_codeset (Config.GETTEXT_PACKAGE, "UTF-8"); Intl.textdomain (Config.GETTEXT_PACKAGE); -#if HAVE_CHEESE - GtkCheese.init (ref args); -#endif + GLib.Environment.set_application_name (_("Contacts")); + + Gst.init (ref args); var app = new App (); app.run (args); diff --git a/src/meson.build b/src/meson.build index 28653983..8beb9b44 100644 --- a/src/meson.build +++ b/src/meson.build @@ -7,6 +7,8 @@ install_data('org.gnome.Contacts.gschema.xml', install_dir: get_option('datadir') / 'glib-2.0' / 'schemas', ) +# Validates gsettings file + # Common library libcontacts_sources = files( 'contacts-chunk-filter.vala', @@ -54,11 +56,11 @@ contacts_deps = [ gee, gio_unix, glib, + gstreamer_dep, gtk4_dep, libadwaita_dep, libebook, libedataserver, - # libedataserverui, libportal_dep, math, libqrencode_dep, diff --git a/vapi/custom.vapi b/vapi/custom.vapi index 9aee3db2..658b07f0 100644 --- a/vapi/custom.vapi +++ b/vapi/custom.vapi @@ -6,7 +6,7 @@ namespace Cc { public void set_min_size (int width, int height); public void set_paintable (Gdk.Paintable paintable); public Gdk.Paintable get_paintable (); - public Gdk.Pixbuf create_pixbuf (); + public Gdk.Texture create_texture (); } } -- GitLab