use xdg-portal for opening files

This commit is contained in:
Robin Appelman 2026-01-17 22:53:53 +01:00
commit 1cc7b8b6e9
3 changed files with 467 additions and 133 deletions

548
Cargo.lock generated
View file

@ -115,6 +115,23 @@ version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
[[package]]
name = "ashpd"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "618a409b91d5265798a99e3d1d0b226911605e581c4e7255e83c1e397b172bce"
dependencies = [
"enumflags2",
"futures-channel",
"futures-util",
"rand 0.9.2",
"serde",
"serde_repr",
"tokio",
"url",
"zbus",
]
[[package]] [[package]]
name = "async-broadcast" name = "async-broadcast"
version = "0.7.2" version = "0.7.2"
@ -173,9 +190,9 @@ dependencies = [
[[package]] [[package]]
name = "async-lock" name = "async-lock"
version = "3.4.1" version = "3.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311"
dependencies = [ dependencies = [
"event-listener", "event-listener",
"event-listener-strategy", "event-listener-strategy",
@ -726,7 +743,7 @@ checksum = "0febbeb1118a9ecdee6e4520ead6b54882e843dd0592ad233247dbee84c53db8"
dependencies = [ dependencies = [
"displaydoc", "displaydoc",
"smallvec", "smallvec",
"writeable", "writeable 0.5.5",
] ]
[[package]] [[package]]
@ -741,6 +758,15 @@ version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
[[package]]
name = "form_urlencoded"
version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
dependencies = [
"percent-encoding",
]
[[package]] [[package]]
name = "fsevent-sys" name = "fsevent-sys"
version = "4.1.0" version = "4.1.0"
@ -756,6 +782,15 @@ version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
[[package]]
name = "futures-channel"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
dependencies = [
"futures-core",
]
[[package]] [[package]]
name = "futures-core" name = "futures-core"
version = "0.3.31" version = "0.3.31"
@ -781,10 +816,42 @@ dependencies = [
"pin-project-lite", "pin-project-lite",
] ]
[[package]]
name = "futures-macro"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.111",
]
[[package]]
name = "futures-task"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
[[package]]
name = "futures-util"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
dependencies = [
"futures-core",
"futures-macro",
"futures-task",
"pin-project-lite",
"pin-utils",
"slab",
]
[[package]] [[package]]
name = "galton" name = "galton"
version = "0.1.1" version = "0.1.1"
dependencies = [ dependencies = [
"ashpd",
"clap", "clap",
"ctrlc", "ctrlc",
"hex", "hex",
@ -793,11 +860,11 @@ dependencies = [
"maplit", "maplit",
"notify-debouncer-full", "notify-debouncer-full",
"notify-rust", "notify-rust",
"open",
"regex", "regex",
"serde", "serde",
"sha2", "sha2",
"thiserror", "thiserror",
"tokio",
"toml", "toml",
"tracing", "tracing",
"tracing-subscriber", "tracing-subscriber",
@ -953,7 +1020,7 @@ checksum = "d1fcc7f316b2c079dde77564a1360639c1a956a23fa96122732e416cb10717bb"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"num-traits", "num-traits",
"rand", "rand 0.8.5",
"static_assertions", "static_assertions",
] ]
@ -966,17 +1033,17 @@ dependencies = [
"icu_calendar", "icu_calendar",
"icu_casemap", "icu_casemap",
"icu_collator", "icu_collator",
"icu_collections", "icu_collections 1.5.0",
"icu_datetime", "icu_datetime",
"icu_decimal", "icu_decimal",
"icu_experimental", "icu_experimental",
"icu_list", "icu_list",
"icu_locid", "icu_locid",
"icu_locid_transform", "icu_locid_transform",
"icu_normalizer", "icu_normalizer 1.5.0",
"icu_plurals", "icu_plurals",
"icu_properties", "icu_properties 1.5.1",
"icu_provider", "icu_provider 1.5.0",
"icu_segmenter", "icu_segmenter",
"icu_timezone", "icu_timezone",
] ]
@ -992,10 +1059,10 @@ dependencies = [
"icu_calendar_data", "icu_calendar_data",
"icu_locid", "icu_locid",
"icu_locid_transform", "icu_locid_transform",
"icu_provider", "icu_provider 1.5.0",
"tinystr", "tinystr 0.7.6",
"writeable", "writeable 0.5.5",
"zerovec", "zerovec 0.10.4",
] ]
[[package]] [[package]]
@ -1012,12 +1079,12 @@ checksum = "9ff0c8ae9f8d31b12e27fc385ff9ab1f3cd9b17417c665c49e4ec958c37da75f"
dependencies = [ dependencies = [
"displaydoc", "displaydoc",
"icu_casemap_data", "icu_casemap_data",
"icu_collections", "icu_collections 1.5.0",
"icu_locid", "icu_locid",
"icu_properties", "icu_properties 1.5.1",
"icu_provider", "icu_provider 1.5.0",
"writeable", "writeable 0.5.5",
"zerovec", "zerovec 0.10.4",
] ]
[[package]] [[package]]
@ -1034,15 +1101,15 @@ checksum = "d370371887d31d56f361c3eaa15743e54f13bc677059c9191c77e099ed6966b2"
dependencies = [ dependencies = [
"displaydoc", "displaydoc",
"icu_collator_data", "icu_collator_data",
"icu_collections", "icu_collections 1.5.0",
"icu_locid_transform", "icu_locid_transform",
"icu_normalizer", "icu_normalizer 1.5.0",
"icu_properties", "icu_properties 1.5.1",
"icu_provider", "icu_provider 1.5.0",
"smallvec", "smallvec",
"utf16_iter", "utf16_iter",
"utf8_iter", "utf8_iter",
"zerovec", "zerovec 0.10.4",
] ]
[[package]] [[package]]
@ -1058,9 +1125,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
dependencies = [ dependencies = [
"displaydoc", "displaydoc",
"yoke", "yoke 0.7.5",
"zerofrom", "zerofrom",
"zerovec", "zerovec 0.10.4",
]
[[package]]
name = "icu_collections"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
dependencies = [
"displaydoc",
"potential_utf",
"yoke 0.8.1",
"zerofrom",
"zerovec 0.11.5",
] ]
[[package]] [[package]]
@ -1078,12 +1158,12 @@ dependencies = [
"icu_locid", "icu_locid",
"icu_locid_transform", "icu_locid_transform",
"icu_plurals", "icu_plurals",
"icu_provider", "icu_provider 1.5.0",
"icu_timezone", "icu_timezone",
"smallvec", "smallvec",
"tinystr", "tinystr 0.7.6",
"writeable", "writeable 0.5.5",
"zerovec", "zerovec 0.10.4",
] ]
[[package]] [[package]]
@ -1102,8 +1182,8 @@ dependencies = [
"fixed_decimal", "fixed_decimal",
"icu_decimal_data", "icu_decimal_data",
"icu_locid_transform", "icu_locid_transform",
"icu_provider", "icu_provider 1.5.0",
"writeable", "writeable 0.5.5",
] ]
[[package]] [[package]]
@ -1120,26 +1200,26 @@ checksum = "844ad7b682a165c758065d694bc4d74ac67f176da1c499a04d85d492c0f193b7"
dependencies = [ dependencies = [
"displaydoc", "displaydoc",
"fixed_decimal", "fixed_decimal",
"icu_collections", "icu_collections 1.5.0",
"icu_decimal", "icu_decimal",
"icu_experimental_data", "icu_experimental_data",
"icu_locid", "icu_locid",
"icu_locid_transform", "icu_locid_transform",
"icu_normalizer", "icu_normalizer 1.5.0",
"icu_pattern", "icu_pattern",
"icu_plurals", "icu_plurals",
"icu_properties", "icu_properties 1.5.1",
"icu_provider", "icu_provider 1.5.0",
"litemap", "litemap 0.7.5",
"num-bigint", "num-bigint",
"num-rational", "num-rational",
"num-traits", "num-traits",
"smallvec", "smallvec",
"tinystr", "tinystr 0.7.6",
"writeable", "writeable 0.5.5",
"zerofrom", "zerofrom",
"zerotrie", "zerotrie 0.1.3",
"zerovec", "zerovec 0.10.4",
] ]
[[package]] [[package]]
@ -1157,9 +1237,9 @@ dependencies = [
"displaydoc", "displaydoc",
"icu_list_data", "icu_list_data",
"icu_locid_transform", "icu_locid_transform",
"icu_provider", "icu_provider 1.5.0",
"regex-automata 0.2.0", "regex-automata 0.2.0",
"writeable", "writeable 0.5.5",
] ]
[[package]] [[package]]
@ -1168,6 +1248,19 @@ version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52b1a7fbdbf3958f1be8354cb59ac73f165b7b7082d447ff2090355c9a069120" checksum = "52b1a7fbdbf3958f1be8354cb59ac73f165b7b7082d447ff2090355c9a069120"
[[package]]
name = "icu_locale_core"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
dependencies = [
"displaydoc",
"litemap 0.8.1",
"tinystr 0.8.2",
"writeable 0.6.2",
"zerovec 0.11.5",
]
[[package]] [[package]]
name = "icu_locid" name = "icu_locid"
version = "1.5.0" version = "1.5.0"
@ -1175,10 +1268,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
dependencies = [ dependencies = [
"displaydoc", "displaydoc",
"litemap", "litemap 0.7.5",
"tinystr", "tinystr 0.7.6",
"writeable", "writeable 0.5.5",
"zerovec", "zerovec 0.10.4",
] ]
[[package]] [[package]]
@ -1190,9 +1283,9 @@ dependencies = [
"displaydoc", "displaydoc",
"icu_locid", "icu_locid",
"icu_locid_transform_data", "icu_locid_transform_data",
"icu_provider", "icu_provider 1.5.0",
"tinystr", "tinystr 0.7.6",
"zerovec", "zerovec 0.10.4",
] ]
[[package]] [[package]]
@ -1208,15 +1301,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
dependencies = [ dependencies = [
"displaydoc", "displaydoc",
"icu_collections", "icu_collections 1.5.0",
"icu_normalizer_data", "icu_normalizer_data 1.5.1",
"icu_properties", "icu_properties 1.5.1",
"icu_provider", "icu_provider 1.5.0",
"smallvec", "smallvec",
"utf16_iter", "utf16_iter",
"utf8_iter", "utf8_iter",
"write16", "write16",
"zerovec", "zerovec 0.10.4",
]
[[package]]
name = "icu_normalizer"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
dependencies = [
"icu_collections 2.1.1",
"icu_normalizer_data 2.1.1",
"icu_properties 2.1.2",
"icu_provider 2.1.1",
"smallvec",
"zerovec 0.11.5",
] ]
[[package]] [[package]]
@ -1225,6 +1332,12 @@ version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7"
[[package]]
name = "icu_normalizer_data"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
[[package]] [[package]]
name = "icu_pattern" name = "icu_pattern"
version = "0.2.0" version = "0.2.0"
@ -1233,8 +1346,8 @@ checksum = "cb7f36aafd098d6717de34e668a8120822275c1fba22b936e757b7de8a2fd7e4"
dependencies = [ dependencies = [
"displaydoc", "displaydoc",
"either", "either",
"writeable", "writeable 0.5.5",
"yoke", "yoke 0.7.5",
"zerofrom", "zerofrom",
] ]
@ -1248,8 +1361,8 @@ dependencies = [
"fixed_decimal", "fixed_decimal",
"icu_locid_transform", "icu_locid_transform",
"icu_plurals_data", "icu_plurals_data",
"icu_provider", "icu_provider 1.5.0",
"zerovec", "zerovec 0.10.4",
] ]
[[package]] [[package]]
@ -1265,12 +1378,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
dependencies = [ dependencies = [
"displaydoc", "displaydoc",
"icu_collections", "icu_collections 1.5.0",
"icu_locid_transform", "icu_locid_transform",
"icu_properties_data", "icu_properties_data 1.5.1",
"icu_provider", "icu_provider 1.5.0",
"tinystr", "tinystr 0.7.6",
"zerovec", "zerovec 0.10.4",
]
[[package]]
name = "icu_properties"
version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec"
dependencies = [
"icu_collections 2.1.1",
"icu_locale_core",
"icu_properties_data 2.1.2",
"icu_provider 2.1.1",
"zerotrie 0.2.3",
"zerovec 0.11.5",
] ]
[[package]] [[package]]
@ -1279,6 +1406,12 @@ version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2"
[[package]]
name = "icu_properties_data"
version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af"
[[package]] [[package]]
name = "icu_provider" name = "icu_provider"
version = "1.5.0" version = "1.5.0"
@ -1289,11 +1422,26 @@ dependencies = [
"icu_locid", "icu_locid",
"icu_provider_macros", "icu_provider_macros",
"stable_deref_trait", "stable_deref_trait",
"tinystr", "tinystr 0.7.6",
"writeable", "writeable 0.5.5",
"yoke", "yoke 0.7.5",
"zerofrom", "zerofrom",
"zerovec", "zerovec 0.10.4",
]
[[package]]
name = "icu_provider"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
dependencies = [
"displaydoc",
"icu_locale_core",
"writeable 0.6.2",
"yoke 0.8.1",
"zerofrom",
"zerotrie 0.2.3",
"zerovec 0.11.5",
] ]
[[package]] [[package]]
@ -1304,9 +1452,9 @@ checksum = "d6324dfd08348a8e0374a447ebd334044d766b1839bb8d5ccf2482a99a77c0bc"
dependencies = [ dependencies = [
"icu_locid", "icu_locid",
"icu_locid_transform", "icu_locid_transform",
"icu_provider", "icu_provider 1.5.0",
"tinystr", "tinystr 0.7.6",
"zerovec", "zerovec 0.10.4",
] ]
[[package]] [[package]]
@ -1328,12 +1476,12 @@ checksum = "a717725612346ffc2d7b42c94b820db6908048f39434504cb130e8b46256b0de"
dependencies = [ dependencies = [
"core_maths", "core_maths",
"displaydoc", "displaydoc",
"icu_collections", "icu_collections 1.5.0",
"icu_locid", "icu_locid",
"icu_provider", "icu_provider 1.5.0",
"icu_segmenter_data", "icu_segmenter_data",
"utf8_iter", "utf8_iter",
"zerovec", "zerovec 0.10.4",
] ]
[[package]] [[package]]
@ -1350,11 +1498,11 @@ checksum = "aa91ba6a585939a020c787235daa8aee856d9bceebd6355e283c0c310bc6de96"
dependencies = [ dependencies = [
"displaydoc", "displaydoc",
"icu_calendar", "icu_calendar",
"icu_provider", "icu_provider 1.5.0",
"icu_timezone_data", "icu_timezone_data",
"tinystr", "tinystr 0.7.6",
"zerotrie", "zerotrie 0.1.3",
"zerovec", "zerovec 0.10.4",
] ]
[[package]] [[package]]
@ -1363,6 +1511,27 @@ version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1adcf7b613a268af025bc2a2532b4b9ee294e6051c5c0832d8bff20ac0232e68" checksum = "1adcf7b613a268af025bc2a2532b4b9ee294e6051c5c0832d8bff20ac0232e68"
[[package]]
name = "idna"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
dependencies = [
"idna_adapter",
"smallvec",
"utf8_iter",
]
[[package]]
name = "idna_adapter"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
dependencies = [
"icu_normalizer 2.1.1",
"icu_properties 2.1.2",
]
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.12.1" version = "2.12.1"
@ -1427,25 +1596,6 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "is-docker"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3"
dependencies = [
"once_cell",
]
[[package]]
name = "is-wsl"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5"
dependencies = [
"is-docker",
"once_cell",
]
[[package]] [[package]]
name = "is_terminal_polyfill" name = "is_terminal_polyfill"
version = "1.70.2" version = "1.70.2"
@ -1599,6 +1749,12 @@ version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856"
[[package]]
name = "litemap"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.29" version = "0.4.29"
@ -1934,17 +2090,6 @@ version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]]
name = "open"
version = "5.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc"
dependencies = [
"is-wsl",
"libc",
"pathdiff",
]
[[package]] [[package]]
name = "ordered-float" name = "ordered-float"
version = "5.1.0" version = "5.1.0"
@ -1970,12 +2115,6 @@ version = "2.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
[[package]]
name = "pathdiff"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
[[package]] [[package]]
name = "percent-encoding" name = "percent-encoding"
version = "2.3.2" version = "2.3.2"
@ -1988,6 +2127,12 @@ version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
[[package]]
name = "pin-utils"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]] [[package]]
name = "piper" name = "piper"
version = "0.2.4" version = "0.2.4"
@ -2013,6 +2158,15 @@ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.61.2",
] ]
[[package]]
name = "potential_utf"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
dependencies = [
"zerovec 0.11.5",
]
[[package]] [[package]]
name = "powerfmt" name = "powerfmt"
version = "0.2.0" version = "0.2.0"
@ -2145,8 +2299,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [ dependencies = [
"libc", "libc",
"rand_chacha", "rand_chacha 0.3.1",
"rand_core", "rand_core 0.6.4",
]
[[package]]
name = "rand"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
"rand_chacha 0.9.0",
"rand_core 0.9.5",
] ]
[[package]] [[package]]
@ -2156,7 +2320,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [ dependencies = [
"ppv-lite86", "ppv-lite86",
"rand_core", "rand_core 0.6.4",
]
[[package]]
name = "rand_chacha"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
"rand_core 0.9.5",
] ]
[[package]] [[package]]
@ -2168,13 +2342,22 @@ dependencies = [
"getrandom 0.2.16", "getrandom 0.2.16",
] ]
[[package]]
name = "rand_core"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
dependencies = [
"getrandom 0.3.4",
]
[[package]] [[package]]
name = "rand_xoshiro" name = "rand_xoshiro"
version = "0.6.0" version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa"
dependencies = [ dependencies = [
"rand_core", "rand_core 0.6.4",
] ]
[[package]] [[package]]
@ -2241,8 +2424,8 @@ dependencies = [
"ahash 0.8.12", "ahash 0.8.12",
"enum_dispatch", "enum_dispatch",
"icu_casemap", "icu_casemap",
"icu_collections", "icu_collections 1.5.0",
"icu_properties", "icu_properties 1.5.1",
] ]
[[package]] [[package]]
@ -2293,7 +2476,7 @@ dependencies = [
"borsh", "borsh",
"bytes", "bytes",
"num-traits", "num-traits",
"rand", "rand 0.8.5",
"rkyv", "rkyv",
"serde", "serde",
"serde_json", "serde_json",
@ -2470,6 +2653,16 @@ version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "socket2"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
dependencies = [
"libc",
"windows-sys 0.60.2",
]
[[package]] [[package]]
name = "stable_deref_trait" name = "stable_deref_trait"
version = "1.2.1" version = "1.2.1"
@ -2652,7 +2845,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
dependencies = [ dependencies = [
"displaydoc", "displaydoc",
"zerovec", "zerovec 0.10.4",
]
[[package]]
name = "tinystr"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
dependencies = [
"displaydoc",
"zerovec 0.11.5",
] ]
[[package]] [[package]]
@ -2670,6 +2873,22 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
version = "1.49.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86"
dependencies = [
"bytes",
"libc",
"mio",
"pin-project-lite",
"signal-hook-registry",
"socket2",
"tracing",
"windows-sys 0.61.2",
]
[[package]] [[package]]
name = "toml" name = "toml"
version = "0.9.10+spec-1.1.0" version = "0.9.10+spec-1.1.0"
@ -2813,6 +3032,19 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0976c77def3f1f75c4ef892a292c31c0bbe9e3d0702c63044d7c76db298171a3" checksum = "0976c77def3f1f75c4ef892a292c31c0bbe9e3d0702c63044d7c76db298171a3"
[[package]]
name = "url"
version = "2.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
dependencies = [
"form_urlencoded",
"idna",
"percent-encoding",
"serde",
"serde_derive",
]
[[package]] [[package]]
name = "utf16_iter" name = "utf16_iter"
version = "1.0.5" version = "1.0.5"
@ -3304,6 +3536,12 @@ dependencies = [
"either", "either",
] ]
[[package]]
name = "writeable"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
[[package]] [[package]]
name = "wyz" name = "wyz"
version = "0.5.1" version = "0.5.1"
@ -3347,7 +3585,7 @@ dependencies = [
"num-traits", "num-traits",
"ordered-float", "ordered-float",
"percent-encoding", "percent-encoding",
"rand", "rand 0.8.5",
"rand_xoshiro", "rand_xoshiro",
"regexml", "regexml",
"rust_decimal", "rust_decimal",
@ -3529,7 +3767,18 @@ checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
dependencies = [ dependencies = [
"serde", "serde",
"stable_deref_trait", "stable_deref_trait",
"yoke-derive", "yoke-derive 0.7.5",
"zerofrom",
]
[[package]]
name = "yoke"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
dependencies = [
"stable_deref_trait",
"yoke-derive 0.8.1",
"zerofrom", "zerofrom",
] ]
@ -3545,6 +3794,18 @@ dependencies = [
"synstructure", "synstructure",
] ]
[[package]]
name = "yoke-derive"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.111",
"synstructure",
]
[[package]] [[package]]
name = "zbus" name = "zbus"
version = "5.12.0" version = "5.12.0"
@ -3569,6 +3830,7 @@ dependencies = [
"ordered-stream", "ordered-stream",
"serde", "serde",
"serde_repr", "serde_repr",
"tokio",
"tracing", "tracing",
"uds_windows", "uds_windows",
"uuid", "uuid",
@ -3654,7 +3916,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb594dd55d87335c5f60177cee24f19457a5ec10a065e0a3014722ad252d0a1f" checksum = "fb594dd55d87335c5f60177cee24f19457a5ec10a065e0a3014722ad252d0a1f"
dependencies = [ dependencies = [
"displaydoc", "displaydoc",
"yoke", "yoke 0.7.5",
"zerofrom",
]
[[package]]
name = "zerotrie"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
dependencies = [
"displaydoc",
"yoke 0.8.1",
"zerofrom", "zerofrom",
] ]
@ -3664,9 +3937,20 @@ version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
dependencies = [ dependencies = [
"yoke", "yoke 0.7.5",
"zerofrom", "zerofrom",
"zerovec-derive", "zerovec-derive 0.10.3",
]
[[package]]
name = "zerovec"
version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
dependencies = [
"yoke 0.8.1",
"zerofrom",
"zerovec-derive 0.11.2",
] ]
[[package]] [[package]]
@ -3680,6 +3964,17 @@ dependencies = [
"syn 2.0.111", "syn 2.0.111",
] ]
[[package]]
name = "zerovec-derive"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.111",
]
[[package]] [[package]]
name = "zvariant" name = "zvariant"
version = "5.8.0" version = "5.8.0"
@ -3689,6 +3984,7 @@ dependencies = [
"endi", "endi",
"enumflags2", "enumflags2",
"serde", "serde",
"url",
"winnow", "winnow",
"zvariant_derive", "zvariant_derive",
"zvariant_utils", "zvariant_utils",

View file

@ -23,7 +23,8 @@ hex = "0.4.3"
xee-xpath = "0.1.5" xee-xpath = "0.1.5"
xee-interpreter = "0.2.0" xee-interpreter = "0.2.0"
notify-rust = "4.11.7" notify-rust = "4.11.7"
open = "5.3.3" tokio = "1.49.0"
ashpd = "0.12.1"
[dev-dependencies] [dev-dependencies]
maplit = "1.0.2" maplit = "1.0.2"

View file

@ -1,15 +1,16 @@
use crate::config::{normalize_path, GaltonConfig}; use crate::config::{GaltonConfig, normalize_path};
use crate::file::FileInfo; use crate::file::FileInfo;
use crate::rule::{Rule, RuleResult}; use crate::rule::{Rule, RuleResult};
use clap::builder::styling::{AnsiColor, Effects}; use ashpd::desktop::open_uri;
use clap::builder::Styles; use clap::builder::Styles;
use clap::builder::styling::{AnsiColor, Effects};
use clap::{Parser, Subcommand}; use clap::{Parser, Subcommand};
use main_error::MainResult; use main_error::MainResult;
use notify_debouncer_full::notify::event::{AccessKind, AccessMode, ModifyKind, RenameMode}; use notify_debouncer_full::notify::event::{AccessKind, AccessMode, ModifyKind, RenameMode};
use notify_debouncer_full::notify::{EventKind, RecursiveMode}; use notify_debouncer_full::notify::{EventKind, RecursiveMode};
use notify_debouncer_full::{new_debouncer, DebounceEventResult}; use notify_debouncer_full::{DebounceEventResult, new_debouncer};
use notify_rust::{Hint, Notification}; use notify_rust::{Hint, Notification};
use std::fs::{copy, create_dir_all, read_dir, remove_file, rename}; use std::fs::{File, copy, create_dir_all, read_dir, remove_file, rename};
use std::io::ErrorKind; use std::io::ErrorKind;
use std::os::unix::fs::symlink; use std::os::unix::fs::symlink;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
@ -197,12 +198,12 @@ fn show_notification(source: PathBuf) {
spawn(move || { spawn(move || {
notification.wait_for_action(|action| match action { notification.wait_for_action(|action| match action {
"document-open" => { "document-open" => {
if let Err(error) = open::that(&source) { if let Err(error) = open_file(source.clone()) {
error!(%error, file = %source.display(), "failed to open file from notification"); error!(%error, file = %source.display(), "failed to open file from notification");
} }
} }
"folder-open" => { "folder-open" => {
if let Err(error) = open::that(source.parent().unwrap()) { if let Err(error) = open_file(source.parent().unwrap().into()) {
error!(%error, file = %source.display(), "failed to open parent folder from notification"); error!(%error, file = %source.display(), "failed to open parent folder from notification");
} }
} }
@ -216,6 +217,25 @@ fn show_notification(source: PathBuf) {
} }
} }
fn open_file(path: PathBuf) -> Result<(), ashpd::Error> {
let request = open_uri::OpenFileRequest::default().ask(false);
spawn_tokio_blocking(async move {
match File::open(&path) {
Ok(fd) => {
request
.send_file(&fd)
.await
.inspect_err(|err| error!("Failed to send open request: {err}"))?;
Ok(())
}
Err(err) => {
error!("Failed to open file: {err}");
Err(ashpd::Error::IO(err))
}
}
})
}
fn maybe_link_target(source: &Path, target: Option<&str>) { fn maybe_link_target(source: &Path, target: Option<&str>) {
if let Some(target) = target { if let Some(target) = target {
if Path::new(target).is_symlink() { if Path::new(target).is_symlink() {
@ -252,6 +272,23 @@ fn match_file(file: &FileInfo, rules: &[Rule]) -> Option<RuleResult> {
None None
} }
pub fn spawn_tokio_blocking<F>(fut: F) -> F::Output
where
F: Future + Send + 'static,
F::Output: Send + 'static,
{
spawn(move || {
let rt = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.expect("failed to build tokio runtime");
rt.block_on(fut)
})
.join()
.expect("fail for thread")
}
#[instrument(skip_all, fields(file = file.path))] #[instrument(skip_all, fields(file = file.path))]
fn handle_file(file: &FileInfo, rules: &[Rule], remove_duplicates: bool) -> Option<PathBuf> { fn handle_file(file: &FileInfo, rules: &[Rule], remove_duplicates: bool) -> Option<PathBuf> {
let Some(result) = match_file(file, rules) else { let Some(result) = match_file(file, rules) else {