diff --git a/.github/workflows/check_source_code.yml b/.github/workflows/check_source_code.yml
index a72d2ae..9397c72 100644
--- a/.github/workflows/check_source_code.yml
+++ b/.github/workflows/check_source_code.yml
@@ -27,7 +27,7 @@ jobs:
- name: Install dependencies
run: |
apt update
- apt install -y libgtk-4-dev libadwaita-1-dev git curl
+ apt install -y build-essential libgtk-4-dev libadwaita-1-dev git curl
- uses: dtolnay/rust-toolchain@stable
with:
diff --git a/.github/workflows/compile_release_build.yml b/.github/workflows/compile_release_build.yml
index 295a1b8..a70b8c4 100644
--- a/.github/workflows/compile_release_build.yml
+++ b/.github/workflows/compile_release_build.yml
@@ -26,7 +26,7 @@ jobs:
- name: Install dependencies
run: |
apt update
- apt install -y libgtk-4-dev libadwaita-1-dev git curl
+ apt install -y build-essential libgtk-4-dev libadwaita-1-dev git curl
- uses: dtolnay/rust-toolchain@stable
with:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 657b876..9e1cb4e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+### Added
+
+- Bundle `applications-system-symbolic` icon to the app
+- Added "force grab cursor" option to the gamescope settings
+- Added Thai
+- Added Ukrainian
+
+### Changed
+
+- Update wish url
+- Updated dependencies
+- Improved app args parsing
+- Updated locales
+
+### Fixed
+
+- Fixed GtkSwitch UI state representation
+
## [3.9.4] - 29.12.2023
### Changed
diff --git a/Cargo.lock b/Cargo.lock
index d141f71..762c60f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -57,8 +57,8 @@ checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
[[package]]
name = "anime-game-core"
-version = "1.17.4"
-source = "git+https://github.com/an-anime-team/anime-game-core?tag=1.17.4#74a7c5a18cc4a870ff78e12d63ec136b3ef2d424"
+version = "1.17.5"
+source = "git+https://github.com/an-anime-team/anime-game-core?tag=1.17.5#55dd60f6b5f78aa80e2217404c3ee1151657f011"
dependencies = [
"anyhow",
"bzip2",
@@ -87,6 +87,7 @@ dependencies = [
"anime-launcher-sdk",
"anyhow",
"cached",
+ "enum-ordinalize",
"fluent-templates",
"glib-build-tools",
"gtk4",
@@ -106,8 +107,8 @@ dependencies = [
[[package]]
name = "anime-launcher-sdk"
-version = "1.12.5"
-source = "git+https://github.com/an-anime-team/anime-launcher-sdk?tag=1.12.5#fae9497c43f9d7636d32ba755163808f805049b1"
+version = "1.12.7"
+source = "git+https://github.com/an-anime-team/anime-launcher-sdk?tag=1.12.7#f4133c0875af54b07b4c0dac04df4598193ac9ec"
dependencies = [
"anime-game-core",
"anyhow",
@@ -199,41 +200,31 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
[[package]]
name = "ashpd"
-version = "0.6.7"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c018490e423efb6f032ef575f873ea57b61d44bec763cfe027b8e8852a027cf"
+checksum = "dd884d7c72877a94102c3715f3b1cd09ff4fac28221add3e57cfbe25c236d093"
dependencies = [
- "async-std",
"enumflags2",
"futures-channel",
"futures-util",
- "once_cell",
"rand",
"serde",
"serde_repr",
+ "tokio",
"url",
"zbus",
]
[[package]]
name = "async-broadcast"
-version = "0.5.1"
+version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b"
+checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb"
dependencies = [
- "event-listener 2.5.3",
- "futures-core",
-]
-
-[[package]]
-name = "async-channel"
-version = "1.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35"
-dependencies = [
- "concurrent-queue",
- "event-listener 2.5.3",
+ "event-listener 5.2.0",
+ "event-listener-strategy 0.5.0",
"futures-core",
+ "pin-project-lite",
]
[[package]]
@@ -244,72 +235,11 @@ checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c"
dependencies = [
"concurrent-queue",
"event-listener 4.0.1",
- "event-listener-strategy",
+ "event-listener-strategy 0.4.0",
"futures-core",
"pin-project-lite",
]
-[[package]]
-name = "async-executor"
-version = "1.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c"
-dependencies = [
- "async-lock 3.2.0",
- "async-task",
- "concurrent-queue",
- "fastrand 2.0.1",
- "futures-lite 2.1.0",
- "slab",
-]
-
-[[package]]
-name = "async-fs"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06"
-dependencies = [
- "async-lock 2.8.0",
- "autocfg",
- "blocking",
- "futures-lite 1.13.0",
-]
-
-[[package]]
-name = "async-global-executor"
-version = "2.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c"
-dependencies = [
- "async-channel 2.1.1",
- "async-executor",
- "async-io 2.2.2",
- "async-lock 3.2.0",
- "blocking",
- "futures-lite 2.1.0",
- "once_cell",
-]
-
-[[package]]
-name = "async-io"
-version = "1.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af"
-dependencies = [
- "async-lock 2.8.0",
- "autocfg",
- "cfg-if",
- "concurrent-queue",
- "futures-lite 1.13.0",
- "log",
- "parking",
- "polling 2.8.0",
- "rustix 0.37.27",
- "slab",
- "socket2 0.4.10",
- "waker-fn",
-]
-
[[package]]
name = "async-io"
version = "2.2.2"
@@ -320,10 +250,10 @@ dependencies = [
"cfg-if",
"concurrent-queue",
"futures-io",
- "futures-lite 2.1.0",
+ "futures-lite",
"parking",
- "polling 3.3.1",
- "rustix 0.38.28",
+ "polling",
+ "rustix",
"slab",
"tracing",
"windows-sys 0.52.0",
@@ -345,25 +275,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c"
dependencies = [
"event-listener 4.0.1",
- "event-listener-strategy",
+ "event-listener-strategy 0.4.0",
"pin-project-lite",
]
[[package]]
name = "async-process"
-version = "1.8.1"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88"
+checksum = "451e3cf68011bd56771c79db04a9e333095ab6349f7e47592b788e9b98720cc8"
dependencies = [
- "async-io 1.13.0",
- "async-lock 2.8.0",
+ "async-channel",
+ "async-io",
+ "async-lock 3.2.0",
"async-signal",
"blocking",
"cfg-if",
- "event-listener 3.1.0",
- "futures-lite 1.13.0",
- "rustix 0.38.28",
- "windows-sys 0.48.0",
+ "event-listener 5.2.0",
+ "futures-lite",
+ "rustix",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -383,44 +314,18 @@ version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5"
dependencies = [
- "async-io 2.2.2",
+ "async-io",
"async-lock 2.8.0",
"atomic-waker",
"cfg-if",
"futures-core",
"futures-io",
- "rustix 0.38.28",
+ "rustix",
"signal-hook-registry",
"slab",
"windows-sys 0.48.0",
]
-[[package]]
-name = "async-std"
-version = "1.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d"
-dependencies = [
- "async-channel 1.9.0",
- "async-global-executor",
- "async-io 1.13.0",
- "async-lock 2.8.0",
- "crossbeam-utils",
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-lite 1.13.0",
- "gloo-timers",
- "kv-log-macro",
- "log",
- "memchr",
- "once_cell",
- "pin-project-lite",
- "pin-utils",
- "slab",
- "wasm-bindgen-futures",
-]
-
[[package]]
name = "async-task"
version = "4.6.0"
@@ -529,12 +434,12 @@ version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118"
dependencies = [
- "async-channel 2.1.1",
+ "async-channel",
"async-lock 3.2.0",
"async-task",
- "fastrand 2.0.1",
+ "fastrand",
"futures-io",
- "futures-lite 2.1.0",
+ "futures-lite",
"piper",
"tracing",
]
@@ -561,6 +466,12 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+[[package]]
+name = "bytes"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
+
[[package]]
name = "bzip2"
version = "0.4.4"
@@ -584,9 +495,9 @@ dependencies = [
[[package]]
name = "cached"
-version = "0.46.1"
+version = "0.49.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7c8c50262271cdf5abc979a5f76515c234e764fa025d1ba4862c0f0bcda0e95"
+checksum = "f251fd1e72720ca07bf5d8e310f54a193fd053479a1f6342c6663ee4fa01cf96"
dependencies = [
"ahash",
"cached_proc_macro",
@@ -599,9 +510,9 @@ dependencies = [
[[package]]
name = "cached_proc_macro"
-version = "0.18.1"
+version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c878c71c2821aa2058722038a59a67583a4240524687c6028571c9b395ded61f"
+checksum = "ad9f16c0d84de31a2ab7fdf5f7783c14631f7075cf464eb3bb43119f61c9cb2a"
dependencies = [
"darling",
"proc-macro2",
@@ -611,29 +522,28 @@ dependencies = [
[[package]]
name = "cached_proc_macro_types"
-version = "0.1.0"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a4f925191b4367301851c6d99b09890311d74b0d43f274c0b34c86d308a3663"
+checksum = "ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0"
[[package]]
name = "cairo-rs"
-version = "0.18.3"
+version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f33613627f0dea6a731b0605101fad59ba4f193a52c96c4687728d822605a8a1"
+checksum = "2650f66005301bd33cc486dec076e1293c4cecf768bc7ba9bf5d2b1be339b99c"
dependencies = [
"bitflags 2.4.1",
"cairo-sys-rs",
"glib",
"libc",
- "once_cell",
"thiserror",
]
[[package]]
name = "cairo-sys-rs"
-version = "0.18.2"
+version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51"
+checksum = "fd3bb3119664efbd78b5e6c93957447944f16bdbced84c17a9f41c7829b81e64"
dependencies = [
"glib-sys",
"libc",
@@ -881,7 +791,7 @@ checksum = "e5766087c2235fec47fafa4cfecc81e494ee679d0fd4a59887ea0919bfb0e4fc"
dependencies = [
"cfg-if",
"libc",
- "socket2 0.5.5",
+ "socket2",
"windows-sys 0.48.0",
]
@@ -898,13 +808,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
[[package]]
-name = "enum-ordinalize"
-version = "3.1.15"
+name = "endi"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee"
+checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf"
+
+[[package]]
+name = "enum-ordinalize"
+version = "4.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5"
+dependencies = [
+ "enum-ordinalize-derive",
+]
+
+[[package]]
+name = "enum-ordinalize-derive"
+version = "4.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff"
dependencies = [
- "num-bigint",
- "num-traits",
"proc-macro2",
"quote",
"syn 2.0.43",
@@ -955,9 +878,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
[[package]]
name = "event-listener"
-version = "3.1.0"
+version = "4.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2"
+checksum = "84f2cdcf274580f2d63697192d744727b3198894b1bf02923643bf59e2c26712"
dependencies = [
"concurrent-queue",
"parking",
@@ -966,9 +889,9 @@ dependencies = [
[[package]]
name = "event-listener"
-version = "4.0.1"
+version = "5.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84f2cdcf274580f2d63697192d744727b3198894b1bf02923643bf59e2c26712"
+checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91"
dependencies = [
"concurrent-queue",
"parking",
@@ -986,12 +909,13 @@ dependencies = [
]
[[package]]
-name = "fastrand"
-version = "1.9.0"
+name = "event-listener-strategy"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291"
dependencies = [
- "instant",
+ "event-listener 5.2.0",
+ "pin-project-lite",
]
[[package]]
@@ -1006,7 +930,7 @@ version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
dependencies = [
- "memoffset 0.9.0",
+ "memoffset",
"rustc_version",
]
@@ -1078,24 +1002,24 @@ dependencies = [
[[package]]
name = "fluent-template-macros"
-version = "0.8.0"
+version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dec7592cd1f45c1afe9084ce59c62a3a7c266c125c4c2ec97e95b0563c4aa914"
+checksum = "5659bd41653516a2e46d76a58e67aa4885024c78fb5d00303f0673bbd53ad781"
dependencies = [
"flume 0.10.14",
"ignore",
"once_cell",
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.43",
"unic-langid",
]
[[package]]
name = "fluent-templates"
-version = "0.8.0"
+version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c3ef2c2152757885365abce32ddf682746062f1b6b3c0824a29fbed6ee4d080"
+checksum = "8f755e319f6f8f836b94b28c6094c414d29a17cee76e24374c7cd61f7696b3f6"
dependencies = [
"arc-swap",
"fluent",
@@ -1104,7 +1028,7 @@ dependencies = [
"fluent-syntax",
"fluent-template-macros",
"flume 0.10.14",
- "heck",
+ "heck 0.4.1",
"ignore",
"intl-memoizer",
"lazy_static",
@@ -1211,28 +1135,13 @@ version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
-[[package]]
-name = "futures-lite"
-version = "1.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
-dependencies = [
- "fastrand 1.9.0",
- "futures-core",
- "futures-io",
- "memchr",
- "parking",
- "pin-project-lite",
- "waker-fn",
-]
-
[[package]]
name = "futures-lite"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aeee267a1883f7ebef3700f262d2d54de95dfaf38189015a74fdc4e0c7ad8143"
dependencies = [
- "fastrand 2.0.1",
+ "fastrand",
"futures-core",
"futures-io",
"parking",
@@ -1282,22 +1191,21 @@ dependencies = [
[[package]]
name = "gdk-pixbuf"
-version = "0.18.3"
+version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "446f32b74d22c33b7b258d4af4ffde53c2bf96ca2e29abdf1a785fe59bd6c82c"
+checksum = "f6a23f8a0b5090494fd04924662d463f8386cc678dd3915015a838c1a3679b92"
dependencies = [
"gdk-pixbuf-sys",
"gio",
"glib",
"libc",
- "once_cell",
]
[[package]]
name = "gdk-pixbuf-sys"
-version = "0.18.0"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7"
+checksum = "3dcbd04c1b2c4834cc008b4828bc917d062483b88d26effde6342e5622028f96"
dependencies = [
"gio-sys",
"glib-sys",
@@ -1308,9 +1216,9 @@ dependencies = [
[[package]]
name = "gdk4"
-version = "0.7.3"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7edb019ad581f8ecf8ea8e4baa6df7c483a95b5a59be3140be6a9c3b0c632af6"
+checksum = "9100b25604183f2fd97f55ef087fae96ab4934d7215118a35303e422688e6e4b"
dependencies = [
"cairo-rs",
"gdk-pixbuf",
@@ -1323,9 +1231,9 @@ dependencies = [
[[package]]
name = "gdk4-sys"
-version = "0.7.2"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbab43f332a3cf1df9974da690b5bb0e26720ed09a228178ce52175372dcfef0"
+checksum = "d0b76874c40bb8d1c7d03a7231e23ac75fa577a456cd53af32ec17ec8f121626"
dependencies = [
"cairo-sys-rs",
"gdk-pixbuf-sys",
@@ -1369,9 +1277,9 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
[[package]]
name = "gio"
-version = "0.18.4"
+version = "0.19.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73"
+checksum = "c64947d08d7fbb03bf8ad1f25a8ac6cf4329bc772c9b7e5abe7bf9493c81194f"
dependencies = [
"futures-channel",
"futures-core",
@@ -1380,7 +1288,6 @@ dependencies = [
"gio-sys",
"glib",
"libc",
- "once_cell",
"pin-project-lite",
"smallvec",
"thiserror",
@@ -1388,22 +1295,22 @@ dependencies = [
[[package]]
name = "gio-sys"
-version = "0.18.1"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2"
+checksum = "bcf8e1d9219bb294636753d307b030c1e8a032062cba74f493c431a5c8b81ce4"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
"system-deps",
- "winapi",
+ "windows-sys 0.52.0",
]
[[package]]
name = "glib"
-version = "0.18.4"
+version = "0.19.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "951bbd7fdc5c044ede9f05170f05a3ae9479239c3afdfe2d22d537a3add15c4e"
+checksum = "01e191cc1af1f35b9699213107068cd3fe05d9816275ac118dc785a0dd8faebf"
dependencies = [
"bitflags 2.4.1",
"futures-channel",
@@ -1417,26 +1324,27 @@ dependencies = [
"gobject-sys",
"libc",
"memchr",
- "once_cell",
"smallvec",
"thiserror",
]
[[package]]
name = "glib-build-tools"
-version = "0.18.0"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3431c56f463443cba9bc3600248bc6d680cb614c2ee1cdd39dab5415bd12ac5c"
+checksum = "108f374fff60efd14b0d70d8916e7213aed18d7dd071ba3e9334ed2dac1dc86a"
+dependencies = [
+ "gio",
+]
[[package]]
name = "glib-macros"
-version = "0.18.3"
+version = "0.19.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72793962ceece3863c2965d7f10c8786323b17c7adea75a515809fa20ab799a5"
+checksum = "9972bb91643d589c889654693a4f1d07697fdcb5d104b5c44fb68649ba1bf68d"
dependencies = [
- "heck",
- "proc-macro-crate 2.0.0",
- "proc-macro-error",
+ "heck 0.5.0",
+ "proc-macro-crate 3.1.0",
"proc-macro2",
"quote",
"syn 2.0.43",
@@ -1444,9 +1352,9 @@ dependencies = [
[[package]]
name = "glib-sys"
-version = "0.18.1"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898"
+checksum = "630f097773d7c7a0bb3258df4e8157b47dc98bbfa0e60ad9ab56174813feced4"
dependencies = [
"libc",
"system-deps",
@@ -1465,23 +1373,11 @@ dependencies = [
"regex-syntax",
]
-[[package]]
-name = "gloo-timers"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c"
-dependencies = [
- "futures-channel",
- "futures-core",
- "js-sys",
- "wasm-bindgen",
-]
-
[[package]]
name = "gobject-sys"
-version = "0.18.0"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44"
+checksum = "c85e2b1080b9418dd0c58b498da3a5c826030343e0ef07bde6a955d28de54979"
dependencies = [
"glib-sys",
"libc",
@@ -1490,9 +1386,9 @@ dependencies = [
[[package]]
name = "graphene-rs"
-version = "0.18.1"
+version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b2228cda1505613a7a956cca69076892cfbda84fc2b7a62b94a41a272c0c401"
+checksum = "99e4d388e96c5f29e2b2f67045d229ddf826d0a8d6d282f94ed3b34452222c91"
dependencies = [
"glib",
"graphene-sys",
@@ -1501,9 +1397,9 @@ dependencies = [
[[package]]
name = "graphene-sys"
-version = "0.18.1"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc4144cee8fc8788f2a9b73dc5f1d4e1189d1f95305c4cb7bd9c1af1cfa31f59"
+checksum = "236ed66cc9b18d8adf233716f75de803d0bf6fc806f60d14d948974a12e240d0"
dependencies = [
"glib-sys",
"libc",
@@ -1513,9 +1409,9 @@ dependencies = [
[[package]]
name = "gsk4"
-version = "0.7.3"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d958e351d2f210309b32d081c832d7de0aca0b077aa10d88336c6379bd01f7e"
+checksum = "c65036fc8f99579e8cb37b12487969b707ab23ec8ab953682ff347cbd15d396e"
dependencies = [
"cairo-rs",
"gdk4",
@@ -1528,9 +1424,9 @@ dependencies = [
[[package]]
name = "gsk4-sys"
-version = "0.7.3"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12bd9e3effea989f020e8f1ff3fa3b8c63ba93d43b899c11a118868853a56d55"
+checksum = "bd24c814379f9c3199dc53e52253ee8d0f657eae389ab282c330505289d24738"
dependencies = [
"cairo-sys-rs",
"gdk4-sys",
@@ -1544,9 +1440,9 @@ dependencies = [
[[package]]
name = "gtk4"
-version = "0.7.3"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aeb51aa3e9728575a053e1f43543cd9992ac2477e1b186ad824fd4adfb70842"
+checksum = "aa82753b8c26277e4af1446c70e35b19aad4fb794a7b143859e7eeb9a4025d83"
dependencies = [
"cairo-rs",
"field-offset",
@@ -1565,12 +1461,12 @@ dependencies = [
[[package]]
name = "gtk4-macros"
-version = "0.7.2"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d57ec49cf9b657f69a05bca8027cff0a8dfd0c49e812be026fc7311f2163832f"
+checksum = "40300bf071d2fcd4c94eacc09e84ec6fe73129d2ceb635cf7e55b026b5443567"
dependencies = [
"anyhow",
- "proc-macro-crate 1.3.1",
+ "proc-macro-crate 3.1.0",
"proc-macro-error",
"proc-macro2",
"quote",
@@ -1579,9 +1475,9 @@ dependencies = [
[[package]]
name = "gtk4-sys"
-version = "0.7.3"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54d8c4aa23638ce9faa2caf7e2a27d4a1295af2155c8e8d28c4d4eeca7a65eb8"
+checksum = "0db1b104138f087ccdc81d2c332de5dd049b89de3d384437cc1093b17cd2da18"
dependencies = [
"cairo-sys-rs",
"gdk-pixbuf-sys",
@@ -1612,6 +1508,12 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
[[package]]
name = "hermit-abi"
version = "0.3.3"
@@ -1728,17 +1630,6 @@ dependencies = [
"unic-langid",
]
-[[package]]
-name = "io-lifetimes"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
-dependencies = [
- "hermit-abi",
- "libc",
- "windows-sys 0.48.0",
-]
-
[[package]]
name = "is-docker"
version = "0.2.0"
@@ -1788,15 +1679,6 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca9325aac17917b5650f25d477ce2909f2e9539688227fdee3ceb5093f666c9e"
-[[package]]
-name = "kv-log-macro"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f"
-dependencies = [
- "log",
-]
-
[[package]]
name = "lazy_static"
version = "1.4.0"
@@ -1805,9 +1687,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libadwaita"
-version = "0.5.3"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2fe7e70c06507ed10a16cda707f358fbe60fe0dc237498f78c686ade92fd979c"
+checksum = "91b4990248b9e1ec5e72094a2ccaea70ec3809f88f6fd52192f2af306b87c5d9"
dependencies = [
"gdk-pixbuf",
"gdk4",
@@ -1821,9 +1703,9 @@ dependencies = [
[[package]]
name = "libadwaita-sys"
-version = "0.5.3"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e10aaa38de1d53374f90deeb4535209adc40cc5dba37f9704724169bceec69a"
+checksum = "23a748e4e92be1265cd9e93d569c0b5dfc7814107985aa6743d670ab281ea1a8"
dependencies = [
"gdk4-sys",
"gio-sys",
@@ -1841,12 +1723,6 @@ version = "0.2.151"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
-[[package]]
-name = "linux-raw-sys"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
-
[[package]]
name = "linux-raw-sys"
version = "0.4.12"
@@ -1868,9 +1744,6 @@ name = "log"
version = "0.4.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
-dependencies = [
- "value-bag",
-]
[[package]]
name = "lzma-sys"
@@ -1918,15 +1791,6 @@ version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
-[[package]]
-name = "memoffset"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
-dependencies = [
- "autocfg",
-]
-
[[package]]
name = "memoffset"
version = "0.9.0"
@@ -1962,6 +1826,17 @@ dependencies = [
"webpki-roots",
]
+[[package]]
+name = "mio"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
+dependencies = [
+ "libc",
+ "wasi",
+ "windows-sys 0.48.0",
+]
+
[[package]]
name = "nanorand"
version = "0.7.0"
@@ -1980,7 +1855,18 @@ dependencies = [
"bitflags 1.3.2",
"cfg-if",
"libc",
- "memoffset 0.7.1",
+]
+
+[[package]]
+name = "nix"
+version = "0.27.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
+dependencies = [
+ "bitflags 2.4.1",
+ "cfg-if",
+ "libc",
+ "memoffset",
]
[[package]]
@@ -2002,36 +1888,6 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "num-bigint"
-version = "0.4.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
-dependencies = [
- "autocfg",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-integer"
-version = "0.1.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
-dependencies = [
- "autocfg",
- "num-traits",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
-dependencies = [
- "autocfg",
-]
-
[[package]]
name = "num_cpus"
version = "1.16.0"
@@ -2132,22 +1988,21 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
[[package]]
name = "pango"
-version = "0.18.3"
+version = "0.19.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4"
+checksum = "b1264d13deb823cc652f26cfe59afb1ec4b9db2a5bd27c41b738c879cc1bfaa1"
dependencies = [
"gio",
"glib",
"libc",
- "once_cell",
"pango-sys",
]
[[package]]
name = "pango-sys"
-version = "0.18.0"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5"
+checksum = "f52ef6a881c19fbfe3b1484df5cad411acaaba29dbec843941c3110d19f340ea"
dependencies = [
"glib-sys",
"gobject-sys",
@@ -2215,31 +2070,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4"
dependencies = [
"atomic-waker",
- "fastrand 2.0.1",
+ "fastrand",
"futures-io",
]
[[package]]
name = "pkg-config"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a"
-
-[[package]]
-name = "polling"
-version = "2.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce"
-dependencies = [
- "autocfg",
- "bitflags 1.3.2",
- "cfg-if",
- "concurrent-queue",
- "libc",
- "log",
- "pin-project-lite",
- "windows-sys 0.48.0",
-]
+checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
[[package]]
name = "polling"
@@ -2250,7 +2089,7 @@ dependencies = [
"cfg-if",
"concurrent-queue",
"pin-project-lite",
- "rustix 0.38.28",
+ "rustix",
"tracing",
"windows-sys 0.52.0",
]
@@ -2285,11 +2124,11 @@ dependencies = [
[[package]]
name = "proc-macro-crate"
-version = "2.0.0"
+version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8"
+checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284"
dependencies = [
- "toml_edit 0.20.7",
+ "toml_edit 0.21.0",
]
[[package]]
@@ -2372,9 +2211,9 @@ dependencies = [
[[package]]
name = "raw-window-handle"
-version = "0.5.2"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9"
+checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544"
[[package]]
name = "rayon"
@@ -2436,11 +2275,10 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
[[package]]
name = "relm4"
-version = "0.7.0-beta.2"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f505ac255c34dc85b8b189cbc8e12d012765aa9294727c6082e76777e56a50bf"
+checksum = "e6e0e187b58db367305e8486d3228158251da1c8ba1e18baa9de61894e822649"
dependencies = [
- "async-trait",
"flume 0.11.0",
"fragile",
"futures",
@@ -2454,9 +2292,9 @@ dependencies = [
[[package]]
name = "relm4-macros"
-version = "0.7.0-beta.2"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "086047e49d6426fd9f53109950f205d2ed88027d5fecfece724e6722904fe473"
+checksum = "0774e846889823aa5766f5b62cface3189a5b36280e65b2faaa6df0319da1726"
dependencies = [
"proc-macro2",
"quote",
@@ -2465,15 +2303,13 @@ dependencies = [
[[package]]
name = "rfd"
-version = "0.12.1"
+version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c9e7b57df6e8472152674607f6cc68aa14a748a3157a857a94f516e11aeacc2"
+checksum = "25a73a7337fc24366edfca76ec521f51877b114e42dab584008209cca6719251"
dependencies = [
"ashpd",
- "async-io 1.13.0",
"block",
"dispatch",
- "futures-util",
"js-sys",
"log",
"objc",
@@ -2523,20 +2359,6 @@ dependencies = [
"semver",
]
-[[package]]
-name = "rustix"
-version = "0.37.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2"
-dependencies = [
- "bitflags 1.3.2",
- "errno",
- "io-lifetimes",
- "libc",
- "linux-raw-sys 0.3.8",
- "windows-sys 0.48.0",
-]
-
[[package]]
name = "rustix"
version = "0.38.28"
@@ -2546,7 +2368,7 @@ dependencies = [
"bitflags 2.4.1",
"errno",
"libc",
- "linux-raw-sys 0.4.12",
+ "linux-raw-sys",
"windows-sys 0.52.0",
]
@@ -2779,9 +2601,9 @@ dependencies = [
[[package]]
name = "smallvec"
-version = "1.11.2"
+version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
[[package]]
name = "snafu"
@@ -2799,22 +2621,12 @@ version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf"
dependencies = [
- "heck",
+ "heck 0.4.1",
"proc-macro2",
"quote",
"syn 1.0.109",
]
-[[package]]
-name = "socket2"
-version = "0.4.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
-dependencies = [
- "libc",
- "winapi",
-]
-
[[package]]
name = "socket2"
version = "0.5.5"
@@ -2896,7 +2708,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331"
dependencies = [
"cfg-expr",
- "heck",
+ "heck 0.4.1",
"pkg-config",
"toml",
"version-compare",
@@ -2926,9 +2738,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa"
dependencies = [
"cfg-if",
- "fastrand 2.0.1",
+ "fastrand",
"redox_syscall",
- "rustix 0.38.28",
+ "rustix",
"windows-sys 0.52.0",
]
@@ -3006,13 +2818,20 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.35.1"
+version = "1.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
+checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"
dependencies = [
"backtrace",
+ "bytes",
+ "libc",
+ "mio",
"num_cpus",
"pin-project-lite",
+ "signal-hook-registry",
+ "socket2",
+ "tracing",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -3047,17 +2866,6 @@ dependencies = [
"winnow",
]
-[[package]]
-name = "toml_edit"
-version = "0.20.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
-dependencies = [
- "indexmap",
- "toml_datetime",
- "winnow",
-]
-
[[package]]
name = "toml_edit"
version = "0.21.0"
@@ -3149,7 +2957,7 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9"
dependencies = [
- "memoffset 0.9.0",
+ "memoffset",
"tempfile",
"winapi",
]
@@ -3272,12 +3080,6 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
-[[package]]
-name = "value-bag"
-version = "1.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe"
-
[[package]]
name = "version-compare"
version = "0.1.1"
@@ -3290,12 +3092,6 @@ version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
-[[package]]
-name = "waker-fn"
-version = "1.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690"
-
[[package]]
name = "walkdir"
version = "2.4.0"
@@ -3609,8 +3405,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "914566e6413e7fa959cc394fb30e563ba80f3541fbd40816d4c05a0fc3f2a0f1"
dependencies = [
"libc",
- "linux-raw-sys 0.4.12",
- "rustix 0.38.28",
+ "linux-raw-sys",
+ "rustix",
]
[[package]]
@@ -3619,7 +3415,7 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd"
dependencies = [
- "nix",
+ "nix 0.26.4",
"winapi",
]
@@ -3643,39 +3439,32 @@ dependencies = [
[[package]]
name = "zbus"
-version = "3.14.1"
+version = "4.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948"
+checksum = "7b8e3d6ae3342792a6cc2340e4394334c7402f3d793b390d2c5494a4032b3030"
dependencies = [
"async-broadcast",
- "async-executor",
- "async-fs",
- "async-io 1.13.0",
- "async-lock 2.8.0",
"async-process",
"async-recursion",
- "async-task",
"async-trait",
- "blocking",
- "byteorder",
"derivative",
"enumflags2",
- "event-listener 2.5.3",
+ "event-listener 5.2.0",
"futures-core",
"futures-sink",
"futures-util",
"hex",
- "nix",
- "once_cell",
+ "nix 0.27.1",
"ordered-stream",
"rand",
"serde",
"serde_repr",
"sha1",
"static_assertions",
+ "tokio",
"tracing",
"uds_windows",
- "winapi",
+ "windows-sys 0.52.0",
"xdg-home",
"zbus_macros",
"zbus_names",
@@ -3684,9 +3473,9 @@ dependencies = [
[[package]]
name = "zbus_macros"
-version = "3.14.1"
+version = "4.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d"
+checksum = "b7a3e850ff1e7217a3b7a07eba90d37fe9bb9e89a310f718afcde5885ca9b6d7"
dependencies = [
"proc-macro-crate 1.3.1",
"proc-macro2",
@@ -3698,9 +3487,9 @@ dependencies = [
[[package]]
name = "zbus_names"
-version = "2.6.0"
+version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9"
+checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c"
dependencies = [
"serde",
"static_assertions",
@@ -3778,13 +3567,12 @@ dependencies = [
[[package]]
name = "zvariant"
-version = "3.15.0"
+version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c"
+checksum = "4e09e8be97d44eeab994d752f341e67b3b0d80512a8b315a0671d47232ef1b65"
dependencies = [
- "byteorder",
+ "endi",
"enumflags2",
- "libc",
"serde",
"static_assertions",
"url",
@@ -3793,9 +3581,9 @@ dependencies = [
[[package]]
name = "zvariant_derive"
-version = "3.15.0"
+version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd"
+checksum = "72a5857e2856435331636a9fbb415b09243df4521a267c5bedcd5289b4d5799e"
dependencies = [
"proc-macro-crate 1.3.1",
"proc-macro2",
@@ -3806,9 +3594,9 @@ dependencies = [
[[package]]
name = "zvariant_utils"
-version = "1.0.1"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200"
+checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172"
dependencies = [
"proc-macro2",
"quote",
diff --git a/Cargo.toml b/Cargo.toml
index 61ff755..483d438 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -15,34 +15,35 @@ lto = true
opt-level = "s"
[build-dependencies]
-glib-build-tools = "0.18"
+glib-build-tools = "0.19"
[dependencies.anime-launcher-sdk]
git = "https://github.com/an-anime-team/anime-launcher-sdk"
-tag = "1.12.5"
+tag = "1.12.7"
features = ["all", "genshin"]
# path = "../anime-launcher-sdk" # ! for dev purposes only
[dependencies]
-relm4 = { version = "0.7.0-beta.2", features = ["macros", "libadwaita"] }
-gtk = { package = "gtk4", version = "0.7.3", features = ["v4_12"] }
-adw = { package = "libadwaita", version = "0.5.3", features = ["v1_3"] }
+relm4 = { version = "0.8.1", features = ["macros", "libadwaita"] }
+gtk = { package = "gtk4", version = "0.8.1", features = ["v4_12"] }
+adw = { package = "libadwaita", version = "0.6.0", features = ["v1_4"] }
-rfd = { version = "0.12.1", features = ["xdg-portal"], default-features = false }
+rfd = { version = "0.14.1", features = ["xdg-portal", "tokio"], default-features = false }
open = "5.0.0"
whatadistro = "0.1.0"
serde_json = "1.0"
anyhow = "1.0"
lazy_static = "1.4.0"
-cached = { version = "0.46", features = ["proc_macro"] }
+cached = { version = "0.49", features = ["proc_macro"] }
md-5 = { version = "0.10", features = ["asm"] }
+enum-ordinalize = "4.3"
tracing = "0.1"
tracing-subscriber = "0.3"
-fluent-templates = "0.8"
+fluent-templates = "0.9"
unic-langid = "0.9"
human-panic = "1.2.2"
diff --git a/assets/images/icons/applications-system-symbolic.svg b/assets/images/icons/applications-system-symbolic.svg
new file mode 100644
index 0000000..0d780a6
--- /dev/null
+++ b/assets/images/icons/applications-system-symbolic.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/assets/locales/common.ftl b/assets/locales/common.ftl
index 2e88c1e..632d9e5 100644
--- a/assets/locales/common.ftl
+++ b/assets/locales/common.ftl
@@ -32,3 +32,4 @@ ko-kr = 한국어
id-id = Indonesia
vi-vn = Tiếng Việt
uk-ua = Українська
+th-th = ไทย
diff --git a/assets/locales/de/gamescope.ftl b/assets/locales/de/gamescope.ftl
index f222a66..600c6c2 100644
--- a/assets/locales/de/gamescope.ftl
+++ b/assets/locales/de/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = Eine Open-Source-Upscaling-Technik, die von Nvidia als herstel
other-settings = Andere Einstellungen
framerate-limit = Framerate-Limit
unfocused-framerate-limit = Unfokussiert Framerate-Limit
+
+force-grab-cursor = Cursor greifen erzwingen
+force-grab-cursor-description = Verwende immer den relativen Mausmodus, anstatt abhängig von der Sichtbarkeit des Cursors umzuschalten. Der Mauszeiger wird korrekt in der Mitte des Spiels zentriert.
diff --git a/assets/locales/en/gamescope.ftl b/assets/locales/en/gamescope.ftl
index 6fbb639..7e7ed77 100644
--- a/assets/locales/en/gamescope.ftl
+++ b/assets/locales/en/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = An open source upscaling technique developed by Nvidia as a cr
other-settings = Other settings
framerate-limit = Framerate limit
unfocused-framerate-limit = Unfocused framerate limit
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/es/gamescope.ftl b/assets/locales/es/gamescope.ftl
index b04ff36..d65d0dd 100644
--- a/assets/locales/es/gamescope.ftl
+++ b/assets/locales/es/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = Una técnica de escalado de código abierto desarrollada por N
other-settings = Otras opciones
framerate-limit = Límite de framerate
unfocused-framerate-limit = Límite de framerate en segundo plano
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/fr/gamescope.ftl b/assets/locales/fr/gamescope.ftl
index 2df9d55..53eda0c 100644
--- a/assets/locales/fr/gamescope.ftl
+++ b/assets/locales/fr/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = Une technologie de mise à l'échelle Open Source développée
other-settings = Autres paramètres
framerate-limit = Limitation des FPS
unfocused-framerate-limit = Limitation des FPS hors focus
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/hu/enhancements.ftl b/assets/locales/hu/enhancements.ftl
index dbf0337..3add58c 100644
--- a/assets/locales/hu/enhancements.ftl
+++ b/assets/locales/hu/enhancements.ftl
@@ -48,8 +48,8 @@ fps-unlocker-description = Eltávolítja az fps limitet. Az anti-cheat észreveh
enabled = Bekapcsolva
-fps-unlocker-interval = Overwrite interval
-fps-unlocker-interval-description = Delay in milliseconds between overwriting the FPS limit value. Periodic overwrites are necessary to prevent it from resetting
+fps-unlocker-interval = Felülírási időköz
+fps-unlocker-interval-description = Milliszekundumban (ms) hogy mekkora időközönként van felülírva az fps limit értéke. Erre szükség van hogy ne állítsa vissza magát az fps limit
window-mode = Ablak mód
borderless = Keretmentes
diff --git a/assets/locales/hu/gamescope.ftl b/assets/locales/hu/gamescope.ftl
index 7b0b993..758ffac 100644
--- a/assets/locales/hu/gamescope.ftl
+++ b/assets/locales/hu/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = Open source upscaling technika az Nvidia-tól, alternatíva a
other-settings = Egyéb beállítások
framerate-limit = FPS limit
unfocused-framerate-limit = Fókuszon kívüli FPS limit
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/id/enhancements.ftl b/assets/locales/id/enhancements.ftl
index cbac656..5684fb6 100644
--- a/assets/locales/id/enhancements.ftl
+++ b/assets/locales/id/enhancements.ftl
@@ -48,8 +48,8 @@ fps-unlocker-description = Meniadakan batas maksimum frame yang dapat dirender o
enabled = Aktifkan
-fps-unlocker-interval = Overwrite interval
-fps-unlocker-interval-description = Delay in milliseconds between overwriting the FPS limit value. Periodic overwrites are necessary to prevent it from resetting
+fps-unlocker-interval = Interval penulisan ulang FPS
+fps-unlocker-interval-description = Jeda antara penulisan ulang nilai batas FPS dalam milidetik. Penulisan ulang secara berkala dibutuhkan untuk mencegah nilai batas FPS kembali seperti semula
window-mode = Window Mode
borderless = Tanpa border
diff --git a/assets/locales/id/gamescope.ftl b/assets/locales/id/gamescope.ftl
index 9be40bb..8c9e95c 100644
--- a/assets/locales/id/gamescope.ftl
+++ b/assets/locales/id/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = Teknik peningkatan skala yang dikembangkan oleh Nvidia sebagai
other-settings = Pengaturan lainnya
framerate-limit = Batas framerate
unfocused-framerate-limit = Batas framerate saat tidak fokus
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/it/enhancements.ftl b/assets/locales/it/enhancements.ftl
index e178a82..bdcd3ff 100644
--- a/assets/locales/it/enhancements.ftl
+++ b/assets/locales/it/enhancements.ftl
@@ -48,8 +48,8 @@ fps-unlocker-description = Rimuovi la limitazione del rendering dei frame modifi
enabled = Abilitato
-fps-unlocker-interval = Overwrite interval
-fps-unlocker-interval-description = Delay in milliseconds between overwriting the FPS limit value. Periodic overwrites are necessary to prevent it from resetting
+fps-unlocker-interval = Intervallo di sovrascrittura
+fps-unlocker-interval-description = Ritardo in millisecondi tra le sovrascritture del valore limite FPS. Sovrascritture periodiche sono necessarie per impedire che si reimposti al valore predefinito
window-mode = Modalità della finestra
borderless = Senza bordi
diff --git a/assets/locales/it/gamescope.ftl b/assets/locales/it/gamescope.ftl
index 9ebaa4d..06fdc7a 100644
--- a/assets/locales/it/gamescope.ftl
+++ b/assets/locales/it/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = Una tecnica di upscaling open-source sviluppata da Nvidia per
other-settings = Altre impostazioni
framerate-limit = Limite del framerate
unfocused-framerate-limit = Limite del framerate quando fuori dal focus
+
+force-grab-cursor = Forza la cattura del cursore
+force-grab-cursor-description = Usa sempre la modalità relativa del mouse invece di cambiare in base alla visibilità del cursore. Il cursore del mouse verrà correttamente centrato nel gioco
diff --git a/assets/locales/ja/gamescope.ftl b/assets/locales/ja/gamescope.ftl
index 5bcefa8..48c5bff 100644
--- a/assets/locales/ja/gamescope.ftl
+++ b/assets/locales/ja/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = An open source upscaling technique developed by Nvidia as a cr
other-settings = その他の設定
framerate-limit = FPS制限
unfocused-framerate-limit = 非フォーカス時の最大FPS
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/ko/gamescope.ftl b/assets/locales/ko/gamescope.ftl
index fbe9709..eeb0407 100644
--- a/assets/locales/ko/gamescope.ftl
+++ b/assets/locales/ko/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = Nvidia가 독점 DLSS 솔루션에 대한 낮은 오버헤드
other-settings = 기타 설정
framerate-limit = 프레임 속도 제한
unfocused-framerate-limit = 초점이 맞지 않는 프레임 속도 제한
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/nl/gamescope.ftl b/assets/locales/nl/gamescope.ftl
index c72b5bf..6f6dc12 100644
--- a/assets/locales/nl/gamescope.ftl
+++ b/assets/locales/nl/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = Een open source opschalingstechniek ontwikkeld door Nvidia als
other-settings = Andere instellingen
framerate-limit = Frameratelimiet
unfocused-framerate-limit = Ongefocuste frameratelimiet
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/pl/gamescope.ftl b/assets/locales/pl/gamescope.ftl
index 53441fd..5305bc8 100644
--- a/assets/locales/pl/gamescope.ftl
+++ b/assets/locales/pl/gamescope.ftl
@@ -10,4 +10,7 @@ nis-description = Technika skalowania otwartego źródła opracowana przez Nvidi
other-settings = Inne ustawienia
framerate-limit = Limit klatek na sekundę
-unfocused-framerate-limit = Limit klatek na sekundę po utraceniu skupienia
\ No newline at end of file
+unfocused-framerate-limit = Limit klatek na sekundę po utraceniu skupienia
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/pt/gamescope.ftl b/assets/locales/pt/gamescope.ftl
index 722ec94..d4bbdbe 100644
--- a/assets/locales/pt/gamescope.ftl
+++ b/assets/locales/pt/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = Uma técnica de upscaling de código aberto desenvolvida pela
other-settings = Outras configuraões
framerate-limit = Limite de taxa de quadros
unfocused-framerate-limit = Limite de taxa de quadros desfocado
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/ru/gamescope.ftl b/assets/locales/ru/gamescope.ftl
index 478608e..48aff04 100644
--- a/assets/locales/ru/gamescope.ftl
+++ b/assets/locales/ru/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = Открытая техника масштабирования
other-settings = Другие настройки
framerate-limit = Лимит числа кадров
unfocused-framerate-limit = Лимит числа кадров вне фокуса
+
+force-grab-cursor = Принудительный захват курсора
+force-grab-cursor-description = Использовать относительный режим мыши вместо переворачивания в зависимости от видимости курсора. Курсор мыши будет правильно центрирован в игре
diff --git a/assets/locales/sv/gamescope.ftl b/assets/locales/sv/gamescope.ftl
index 959b29e..8cd626b 100644
--- a/assets/locales/sv/gamescope.ftl
+++ b/assets/locales/sv/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = En uppskalningsteknik med öppen källkod som utvecklats av Nv
other-settings = Andra inställningar
framerate-limit = Gräns för bilduppdateringshastighet
unfocused-framerate-limit = Gräns för bilduppdateringshastighet utan fokus
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/th/components.ftl b/assets/locales/th/components.ftl
new file mode 100644
index 0000000..b15072b
--- /dev/null
+++ b/assets/locales/th/components.ftl
@@ -0,0 +1,20 @@
+components = ส่วนประกอบ
+components-description = จัดการเวอร์ชัน Wine และ DXVK
+
+selected-version = เวอร์ชันที่เลือก
+recommended-only = แสดงเเวอร์ชั่นที่แนะนำเท่านั้น
+
+wine-version = เวอร์ชันของ Wine
+wine-recommended-description = แสดงเฉพาะเวอร์ชัน Wine ที่แนะนำเท่านั้น
+
+wine-options = การตั้งค่าของ Wine
+
+wine-use-shared-libraries = ใช้ไลบรารีที่ใช้ร่วมกันของ Wine
+wine-use-shared-libraries-description = ตั้งค่าตัว LD_LIBRARY_PATH เพื่อโหลดไลบรารีระบบจากบิลด์ Wine ที่เลือก
+
+gstreamer-use-shared-libraries = ใช้ไลบรารีที่ใช้ร่วมกันของ gstreamer
+gstreamer-use-shared-libraries-description = ตั้งค่าตัวแปร GST_PLUGIN_PATH เพื่อโหลดไลบรารี gstreamer จากบิลด์ Wine ที่เลือก
+
+dxvk-version = เวอร์ชันของ DXVK
+dxvk-selection-disabled = การเลือก DXVK ถูกปิดใช้งานโดยการตั้งค่ากลุ่ม Wine ของคุณ
+dxvk-recommended-description = แสดงเฉพาะเวอร์ชัน DXVK ที่แนะนำเท่านั้น
diff --git a/assets/locales/th/enhancements.ftl b/assets/locales/th/enhancements.ftl
new file mode 100644
index 0000000..b818234
--- /dev/null
+++ b/assets/locales/th/enhancements.ftl
@@ -0,0 +1,57 @@
+game-settings-description = จัดการการตั้งค่าในเกมและเซสชันบัญชี
+sandbox-settings-description = รันเกมในแซนด์บ็อกซ์ คล้ายกับที่ Flatpak ทำ
+environment-settings-description = ระบุตัวแปรสภาวะแวดล้อมและคำสั่งเปิดเกม
+
+wine = Wine
+
+synchronization = การซิงโครไนซ์
+wine-sync-description = เทคโนโลยีที่ใช้ในการประสานเหตุการณ์ Wine ภายใน
+
+language = ภาษา
+wine-lang-description = ภาษาที่ใช้ในสภาพแวดล้อมไวน์ สามารถแก้ไขปัญหารูปแบบแป้นพิมพ์ได้
+system = ระบบ
+
+borderless-window = หน้าต่างไร้ขอบ
+virtual-desktop = เดสก์ท็อปเสมือน
+
+map-drive-c = เชื่อม ไดรฟ์ C:
+map-drive-c-description = เชื่อมโยง ไดรฟ์ C: จาก Wine prefix ไปยังระบบ dosdevices โดยอัตโนมัติ
+
+map-game-folder = เชื่อม โฟลเดอร์เกม
+map-game-folder-description = เชื่อมโยงโฟลเดอร์เกมไปยังระบบ dosdevices โดยอัตโนมัติ
+
+game = เกม
+
+hud = HUD
+
+fsr = FSR
+fsr-description = ยกระดับความชัดเกมให้เข้ากับขนาดจอภาพของคุณ หากต้องการใช้เลือกความละเอียดที่ต่ำกว่าในการตั้งค่าของเกมแล้วกด Alt+Enter
+ultra-quality = คุณภาพเยี่ยม
+quality = คุณภาพ
+balanced = พอประมาณ
+performance = เร็วที่สุด
+
+gamemode = Gamemode
+gamemode-description = จัดลำดับความสำคัญของเกมเหนือกระบวนการอื่น
+
+gamescope = Gamescope
+gamescope-description = Gamescope เป็นเครื่องมือจาก Valve ที่ช่วยให้เกมทำงานในอินสแตนซ์ Xwayland ที่แยกจากระบบ และรองรับ GPU ของ AMD, Intel และ Nvidia
+
+discord-rpc = Discord RPC
+discord-rpc-description = Discord RPC อนุญาตให้คุณให้ข้อมูล Discord ที่คุณกำลังเล่นเกมอยู่เพื่อแจ้งให้เพื่อนของคุณทราบ
+icon = ไอคอน
+title = หัวข้อ
+description = คำอธิบาย
+
+fps-unlocker = FPS Unlocker
+fps-unlocker-description = ลบข้อจำกัดในการเรนเดอร์เฟรมโดยการปรับเปลี่ยนหน่วยความจำของเกม สามารถตรวจจับได้โดยระบบการป้องกันการโกงของเกม
+
+enabled = เปิดใช้งาน
+
+fps-unlocker-interval = เขียนทับช่วงเวลา
+fps-unlocker-interval-description = การเขียนทับค่าจำกัด FPS ทุกมิลลิวินาที จำเป็นต้องเขียนทับเป็นระยะเพื่อป้องกันไม่ให้รีเซ็ต
+
+window-mode = โหมดหน้าต่างเกม
+borderless = โหมดไร้ขอบเขต
+popup = ป๊อปอัพ
+fullscreen = เต็มจอ
diff --git a/assets/locales/th/environment.ftl b/assets/locales/th/environment.ftl
new file mode 100644
index 0000000..d3b20a8
--- /dev/null
+++ b/assets/locales/th/environment.ftl
@@ -0,0 +1,7 @@
+environment = สภาวะแวดล้อม
+game-command = คำสั่งเกม
+game-command-description = คำสั่งที่ใช้ในการเปิดเกม ตัวยึดตำแหน่ง %command% ถูกสร้างขึ้นโดยอัตโนมัติโดยตัวเรียกใช้งาน ตัวอย่างเช่น: gamemoderun '%command%'
+new-variable = ตัวแปรใหม่
+name = ชื่อ
+value = ค่า
+add = เพิ่ม
diff --git a/assets/locales/th/errors.ftl b/assets/locales/th/errors.ftl
new file mode 100644
index 0000000..0a06f96
--- /dev/null
+++ b/assets/locales/th/errors.ftl
@@ -0,0 +1,66 @@
+launcher-folder-opening-error = ไม่สามารถเปิดโฟลเดอร์ Launcher ได้
+game-folder-opening-error = ไม่สามารถเปิดโฟลเดอร์เกมได้
+config-file-opening-error = ไม่สามารถเปิดไฟล์ config ได้
+debug-file-opening-error = ไม่สามารถเปิดไฟล์ debug ได้
+
+wish-url-search-failed = ไม่พบ URL การอธิษฐาน
+wish-url-opening-error = ไม่สามารถเปิด URL การอธิษฐานได้
+
+wine-run-error = ล้มเหลวในการปฏิบัติการเรียกใช้ไฟล์ {$executable} โดยใช้ Wine
+
+game-launching-failed = ไม่สามารถเปิดเกมได้
+failed-get-selected-wine = ไม่สามารถดาวน์โหลดเวอร์ชัน wine ที่เลือกไปได้
+downloading-failed = การดาวน์โหลดล้มเหลว
+unpacking-failed = การแกะไฟล์ล้มเหลว
+
+kill-game-process-failed = ไม่สามารถฆ่ากระบวนการของเกมได้
+
+game-file-repairing-error = ไม่สามารถซ่อมแซมไฟล์เกมได้
+integrity-files-getting-error = ไม่สามารถรับไฟล์การตรวจสอบความสมบูรณ์ได้
+
+background-downloading-failed = ดาวน์โหลดภาพพื้นหลังไม่สำเร็จ
+components-index-sync-failed = ไม่สามารถซิงค์ index ส่วนประกอบ
+components-index-verify-failed = ไม่สามารถตรวจสอบ index ส่วนประกอบได้
+config-update-error = บันทึกการกำหนดค่าไม่สำเร็จ
+wine-prefix-update-failed = ไม่สามารถอัปเดตการตั้งค่า Wine
+dxvk-install-failed = ติดตั้ง DXVK ไม่สำเร็จ
+voice-package-deletion-error = ลบแพ็คเกจเสียงไม่สำเร็จ
+
+game-diff-finding-error = ไม่พบความแตกต่างของเกม
+patch-info-fetching-error = ไม่สามารถเรียกข้อมูลแพตช์ได้
+launcher-state-updating-error = อัปเดตสถานะ launcher ไม่สำเร็จ
+
+package-not-available = ไม่พบแพ็คเกจนี้: {$package}
+wine-download-error = ดาวน์โหลด Wine ไม่สำเร็จ
+wine-unpack-errror = ไม่สามารถแกะไฟล์ Wine ได้
+wine-install-failed = ไม่สามารถติดตั้ง Wine ได้
+dxvk-download-error = ดาวน์โหลด DXVK ไม่สำเร็จ
+dxvk-unpack-error = ไม่สามารถแกะไฟล์ DXVK ได้
+dxvk-apply-error = ไม่สามารถติดตั้ง DXVK ได้
+
+downloaded-wine-list-failed = ไม่สามารถแสดงเวอร์ชัน Wine ที่ดาวน์โหลดไปแล้วได้
+
+patch-sync-failed = ไม่สามารถซิงค์โฟลเดอร์แพตช์ได้
+patch-state-check-failed = ไม่สามารถตรวจสอบสถานะโฟลเดอร์แพตช์ได้
+game-patching-error = ไม่สามารถแพตช์เกมได้
+
+# Disable telemetry
+
+telemetry-servers-disabling-error = ไม่สามารถปิดใช้งานเซิร์ฟเวอร์การวัดและส่งข้อมูล
+
+# Sandbox
+
+documentation-url-open-failed = ไม่สามารถเปิด URL เอกสารประกอบ
+
+# Game
+
+game-session-add-failed = ไม่สามารถเพิ่มเซสชันเกมได้
+game-session-update-failed = ไม่สามารถอัปเดตเซสชันเกมได้
+game-session-remove-failed = ไม่สามารถลบเซสชันเกมได้
+game-session-set-current-failed = ไม่สามารถตั้งเซสชันเกมปัจจุบันได้
+game-session-apply-failed = ไม่สามารถติดตั้งเซสชันเกมได้
+
+# Enhancements
+
+discord-rpc-icons-fetch-failed = ไม่สามารถดึงไอคอน Discord RPC
+discord-rpc-icon-download-failed = ไม่สามารถดาวน์โหลดไอคอน Discord RPC
diff --git a/assets/locales/th/first_run.ftl b/assets/locales/th/first_run.ftl
new file mode 100644
index 0000000..696a456
--- /dev/null
+++ b/assets/locales/th/first_run.ftl
@@ -0,0 +1,64 @@
+welcome = ยินดีต้อนรับ
+
+welcome-page-message =
+ สวัสดี! ยินดีต้อนรับสู่ An Anime Game Launcher
+
+ เราจำเป็นต้องเตรียมบางสิ่งและดาวน์โหลดส่วนประกอบเริ่มต้นก่อนที่คุณจะสามารถเล่นเกมได้
+
+tos-violation-warning = คำเตือนการละเมิดข้อตกลงการใช้บริการของเกม
+
+tos-violation-warning-message =
+ Launcher นี้เป็นเครื่องมือที่ไม่การเกี่ยวข้องแต่อย่างใดกับ {company-name} หรือ {company-alter-name}.
+
+ เครื่องมือนี้ออกแบบมาเพื่ออำนวยความสะดวกในการเล่น {game-name} บน Linux และสร้างขึ้นโดยมีวัตถุประสงค์เพียงอย่างเดียวในการติดตั้งและรันเกมโดยมีความยุ่งยากที่น้อยลง
+
+ Launcher นี้ทำงานได้โดยใช้คอมโพเนนต์ที่มีอยู่แล้ว ผู้ใช้จึงจะได้รับประสบการณ์ที่เรียบง่าย
+
+ อย่างไรก็ตาม ส่วนประกอบบางอย่างที่ใช้อาจฝ่าฝืนข้อกำหนดในการให้บริการของ {company-name} สำหรับเกม {game-name}
+
+ หากคุณใช้ Launcher นี้ บัญชีของคุณอาจถูกระบุว่าไม่เป็นไปตามข้อกำหนดของ {company-name}/{company-alter-name}.
+
+ หากเกิดเหตุการณ์เช่นนี้ เนื่องจากบัญชีของคุณไม่ปฏิบัติตามข้อกำหนด, {company-name}/{company-alter-name} จึงมีอิสระที่จะทำสิ่งที่พวกเขาอยาก รวมถึงการแบนบัญชีของคุณ
+
+ หากคุณเข้าใจถึงความเสี่ยงในการพยายามเล่นเกมอย่างไม่เป็นทางการ ให้กด ตกลง เพื่อดำเนินการต่อ
+
+tos-dialog-title = คุณแน่ใจหรือว่าคุณเข้าใจสิ่งที่เราพูด?
+tos-dialog-message =
+ 1. อย่าเผยแพร่ข้อมูลใดๆ เกี่ยวกับโครงการนี้
+ 2. อย่าใช้มันในทางที่ผิดโดยใช้ไคลเอนต์ดัดแปลง
+ 3. ถามคำถามเป็นพิเศษในเซิร์ฟเวอร์ Discord หรือ Matrix ของเรา
+
+
+dependencies = โปรแกรมที่จำเป็น
+missing-dependencies-title = คุณขาดโปรแกรมที่จำเป็น!
+missing-dependencies-message = คุณต้องติดตั้งแพ็คเกจบางอย่างให้กับระบบของคุณก่อนที่จะดำเนินการติดตั้งต่อ
+
+
+default-paths = เส้นทางเริ่มต้น
+choose-default-paths = เลือกเส้นทางเริ่มต้น
+show-all-folders = ฉันรู้ว่าฉันกำลังทำอะไรอยู่
+show-all-folders-subtitle = แสดงการตั้งค่าการเลือกเส้นทางเพิ่มเติม (ทำตามที่ฉันบอก...)
+runners-folder = โฟลเดอร์ Runners
+dxvks-folder = โฟลเดอร์ DXVKs
+wine-prefix-folder = โฟลเดอร์ prefix ของ Wine
+global-game-installation-folder = โฟลเดอร์การติดตั้งเวอร์ชันเกมสากล
+chinese-game-installation-folder = โฟลเดอร์การติดตั้งเวอร์ชันเกมจีน
+fps-unlocker-folder = โฟลเดอร์ FPS Unlocker
+components-index = Index ส่วนประกอบ
+patch-folder = โฟลเดอร์แพทช์
+temp-folder = โฟลเดอร์ชั่วคราว
+
+migrate = ย้าย
+
+
+select-voice-packages = เลือกแพ็คเกจภาษาเสียง
+
+
+download-components = ดาวน์โหลดส่วนประกอบ
+download-dxvk = ดาวน์โหลด DXVK
+apply-dxvk = ติดตั้ง DXVK
+
+
+finish = สำเร็จ
+finish-title = ทุกอย่างเสร็จแล้ว!
+finish-message = ดาวน์โหลดส่วนประกอบพื้นฐานทั้งหมดแล้ว ตอนนี้คุณสามารถรีสตาร์ท Launcher และดาวน์โหลดเกมได้ ยินดีต้อนรับสู่ club ของเรา!
diff --git a/assets/locales/th/game.ftl b/assets/locales/th/game.ftl
new file mode 100644
index 0000000..f8f46ae
--- /dev/null
+++ b/assets/locales/th/game.ftl
@@ -0,0 +1,7 @@
+game-sessions = เซสชันเกม
+
+active-sessions = เซสชันที่ใช้งานอยู่
+active-session-description = เซสชั่นเกมที่เลือกในปัจจุบัน อัปเดตหลังจากเปิดตัวเกมแต่ละครั้ง
+
+update-session = อัปเดตเซสชันโดยใช้ค่าตั้งค่า Wine ปัจจุบัน
+delete-session = ลบเซสชัน
diff --git a/assets/locales/th/gamescope.ftl b/assets/locales/th/gamescope.ftl
new file mode 100644
index 0000000..6531a85
--- /dev/null
+++ b/assets/locales/th/gamescope.ftl
@@ -0,0 +1,16 @@
+game-resolution = ความละเอียดของเกม
+gamescope-resolution = ความละเอียดของ Gamescope
+
+upscaling = การเพิ่มขนาดความละเอียด
+
+integer-scaling = มาตราส่วนจำนวนเต็ม
+integer-scaling-description = เปลี่ยนแต่ละพิกเซลเป็นกลุ่มสี่เหลี่ยมจัตุรัสหรือสี่เหลี่ยมของจำนวนเต็มของพิกเซลสีเดียวกัน ป้องกันการสูญเสียความคมชัดเมื่อปรับขนาด Full HD เป็น 4K
+gamescope-fsr-description = เทคนิคการขยายขนาดที่พัฒนาโดย AMD เพื่อคุณภาพการขยายขนาดที่ดีขึ้น
+nis-description = เทคนิคการขยายขนาดโอเพ่นซอร์สที่พัฒนาโดย Nvidia เป็นทางเลือกข้ามผู้จำหน่ายและมีค่าใช้จ่ายต่ำแทนโซลูชัน DLSS ที่เป็นกรรมสิทธิ์ ซึ่งหมายความว่าใช้งานได้กับ AMD และ Intel GPU รวมถึง Nvidia GPU
+
+other-settings = การตั้งค่าอื่นๆ
+framerate-limit = ขีดจำกัดเฟรมเรต
+unfocused-framerate-limit = เฟรมเรทจำกัดขณะไม่ได้โฟกัส
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/th/general.ftl b/assets/locales/th/general.ftl
new file mode 100644
index 0000000..6e6655a
--- /dev/null
+++ b/assets/locales/th/general.ftl
@@ -0,0 +1,70 @@
+appearance = รูปร่าง
+modern = โมเดิร์น
+classic = คลาสสิค
+update-background = อัพเดตภาพพื้นหลัง
+update-background-description = ดาวน์โหลดภาพพื้นหลังสำหรับ launcher คุณสามารถปิดการใช้งานเพื่อใช้รูปภาพที่คุณกำหนดเองแทนได้
+
+launcher-language = ภาษาของ launcher
+launcher-language-description = ใช้หลังจากรีสตาร์ท launcher
+
+game-edition = ฉบับเกม
+global = สากล
+china = จีน
+
+game-environment = สภาพแวดล้อมของเกม
+game-environment-description = รับคุณสมบัติเฉพาะ เช่น วิธีการชำระเงินอื่นๆ
+
+game-voiceovers = ภาษาพากย์เสียงเกม
+game-voiceovers-description = ภาษาเสียงพากย์เกมที่ดาวน์โหลดได้ คุณสามารถเลือกในการตั้งค่าเกม
+english = ภาษาอังกฤษ
+japanese = ภาษาญี่ปุ่น
+korean = ภาษาเกาหลี
+chinese = ภาษาจีน
+
+migrate-installation = ย้ายการติดตั้งเกม
+migrate-installation-description = เปิดหน้าต่างพิเศษที่คุณสามารถเปลี่ยนโฟลเดอร์การติดตั้งเกมของคุณได้
+repair-game = ซ่อมแซมการติดตั้งเกม
+
+status = สถานะ
+
+game-version = เวอร์ชันเกม
+game-not-installed = ยังไม่ได้ติดตั้ง
+
+game-predownload-available = มีการอัปเดตเกมให้ดาวน์โหลดได้ล่วงหน้าแล้ว: {$old} -> {$new}
+game-update-available = มีอัปเดตเวอร์ชันเกมใหม่: {$old} -> {$new}
+game-outdated = เวอร์ชันเกมล้าสมัยเกินไปและไม่สามารถอัปเดตได้. เวอร์ชันล่าสุด: {$latest}
+
+player-patch-version = เวอร์ชั่นแพทช์
+player-patch-version-description = แพทช์หลักที่ให้คุณเล่นเกมบน Linux
+
+patch-not-available = ไม่พร้อมใช้งาน
+patch-not-available-tooltip = ไม่สามารถเข้าถึงเซิร์ฟเวอร์แพทช์ได้
+
+patch-outdated = แพทช์ล้าสมัย ({$current})
+patch-outdated-tooltip = แพทช์ล้าสมัยแล้ว: {$current} -> {$latest}
+
+patch-preparation = เตรียมการ
+patch-preparation-tooltip = แพทช์อยู่ระหว่างการพัฒนา
+
+patch-testing-tooltip = มีแพทช์ทดสอบให้ใช้งาน
+patch-not-applied-tooltip = แพทช์ยังไม่มีการติดตั้ง
+
+apply-main-patch = ติดตั้งแพทช์หลัก
+apply-main-patch-description = การทดลอง. การปิดใช้งานจะทำให้คุณสามารถรันเกมได้โดยไม่ต้องใช้แพตช์ สิ่งนี้อาจไม่ทำงานหรือต้องมีการแก้ไขไฟล์ด้วยตนเอง ใใช้เฉพาะเมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่
+
+disable-mhypbase = ปิดการใช้งาน mhypbase
+disable-mhypbase-description = การทดลอง. หากเปิดใช้งาน launcher จะปิดใช้งาน mhypbase.dll ในระหว่างการติดตั้งแพตช์หลัก ซึ่งในปัจจุบันเทียบเท่ากับแพตช์ xlua ปรับปรุงประสิทธิภาพและลดการใช้งาน CPU
+
+ask-superuser-permissions = ขอสิทธิ์ผู้ใช้ขั้นสูง (superuser)
+ask-superuser-permissions-description = Launcher จะใช้ไฟล์เหล่านี้เพื่ออัปเดตไฟล์โฮสต์ของคุณโดยอัตโนมัติ สิ่งนี้ไม่จำเป็นในรุ่น flatpak
+
+launcher-behavior = พฤติกรรม Launcher
+launcher-behavior-description = หน้าต่าง Launcher ควรทำอย่างไรเมื่อเริ่มเกม
+
+wine-tools = เครื่องมือ Wine
+command-line = Command line
+registry-editor = Registry editor
+explorer = Explorer
+task-manager = Task manager
+configuration = Configuration
+debugger = Debugger
diff --git a/assets/locales/th/main.ftl b/assets/locales/th/main.ftl
new file mode 100644
index 0000000..fec17b0
--- /dev/null
+++ b/assets/locales/th/main.ftl
@@ -0,0 +1,76 @@
+custom = กำหนดเอง
+none = ไม่ใช้
+default = ค่าเริ่มต้น
+details = รายละเอียด
+options = ตัวเลือก
+
+width = ความกว้าง
+height = ความสูง
+
+# Menu items
+
+launcher-folder = โฟลเดอร์ Launcher
+game-folder = โฟลเดอร์เกม
+config-file = ไฟล์ Config
+debug-file = ไฟล์ Debug
+wish-url = เปิด URL การอธิษฐาน
+about = เกี่ยวกับ
+
+
+close = ปิด
+hide = ซ่อน
+nothing = ไม่ทำอะไร
+save = บันทึก
+continue = ดำเนินการต่อ
+resume = ดำเนินการต่อ
+exit = ออก
+check = ตรวจสอบ
+restart = เริ่มต้นใหม่
+agree = ตกลง
+
+
+loading-data = กำลังโหลดข้อมูล
+downloading-background-picture = กำลังดาวน์โหลดภาพพื้นหลัง
+updating-components-index = กำลังอัปเดต index ส่วนประกอบ
+loading-game-version = กำลังโหลดเวอร์ชั่นเกม
+loading-patch-status = กำลังโหลดสถานะแพทช์
+loading-launcher-state = กำลังโหลดสถานะ launcher
+loading-launcher-state--game = กำลังโหลดสถานะ launcher: กำลังตรวจสอบเวอร์ชันเกม
+loading-launcher-state--voice = กำลังโหลดสถานะ launcher: กำลังตรวจสอบภาษาพากย์เสียง {$locale}
+loading-launcher-state--patch = กำลังโหลดสถานะ launcher: กำลังตรวจสอบแพตช์ที่ติดตั้ง
+
+
+checking-free-space = กำลังตรวจสอบพื้นที่ว่าง
+downloading = กำลังดาวน์โหลด
+updating-permissions = กำลังอัปเดตสิทธิ์
+unpacking = กำลังแกะ
+verifying-files = กำลังตรวจสอบไฟล์
+repairing-files = กำลังซ่อมแซมไฟล์
+migrating-folders = กำลังย้ายโฟลเดอร์
+applying-hdiff = กำลังติดตั้งแพตช์ hdiff
+removing-outdated = กำลังลบไฟล์ที่ล้าสมัย
+
+
+components-index-updated = อัปเดตส่วนประกอบแล้ว
+
+
+launch = เริ่มเกมส์
+migrate-folders = ย้ายโฟลเดอร์
+migrate-folders-tooltip = อัพเดตโครงสร้างโฟลเดอร์เกม
+apply-patch = ติดตั้งแพทช์
+disable-telemetry = ปิดใช้งานการวัดและส่งข้อมูล
+download-wine = ดาวน์โหลด Wine
+create-prefix = สร้างการตั้งค่า Wine
+update = อัปเดต
+download = ดาวน์โหลด
+predownload-update = ดาวน์โหลดล่วงหน้า {$version} อัปเดต ({$size})
+
+kill-game-process = ฆ่ากระบวนการเกม
+
+main-window--patch-unavailable-tooltip = เซิร์ฟเวอร์แพตช์ไม่พร้อมใช้งานและ launcher ไม่สามารถตรวจสอบสถานะการแพตช์ของเกมได้ คุณสามารถรันเกมได้แต่ต้องยอมรับความเสี่ยงเอง
+main-window--patch-outdated-tooltip = โแพตช์ล้าสมัยหรืออยู่ในสถานะเตรียมการ ดังนั้นจึงไม่สามารถใช้งานได้ โปรดกลับมาใหม่ในภายหลังเพื่อดูสถานะ
+main-window--version-outdated-tooltip = เวอร์ชันล้าสมัยเกินไปและไม่สามารถอัปเดตได้
+
+preferences = การตั้งค่า
+general = ทั่วไป
+enhancements = การปรับปรุง
diff --git a/assets/locales/th/sandbox.ftl b/assets/locales/th/sandbox.ftl
new file mode 100644
index 0000000..8889db5
--- /dev/null
+++ b/assets/locales/th/sandbox.ftl
@@ -0,0 +1,28 @@
+sandbox = แซนด์บ็อกซ์
+sandbox-description = รันเกมที่แยกออกจากระบบ เพื่อป้องกันไม่ให้เข้าถึงข้อมูลส่วนบุคคลของคุณ
+
+enable-sandboxing = เปิดใช้งานแซนด์บ็อกซ์
+enable-sandboxing-description = รันเกมในระบบไฟล์รูทของคุณแบบอ่านได้อย่างเดียว
+
+hide-home-directory = ซ่อนโฮมไดเร็กตอรี่
+hide-home-directory-description = ซ่อนโฟลเดอร์ /home, /var/home/$USER และ $HOME ของคุณจากเกม
+
+hostname = ชื่อโฮสต์
+additional-arguments = arguments เพิ่มเติม
+
+private-directories = ไดเรกทอรีส่วนตัว
+private-directories-description = โฟลเดอร์เหล่านี้จะถูกแทนที่ด้วยระบบไฟล์เสมือนที่ว่างเปล่า (tmpfs) และไฟล์เหล่านั้นจะไม่สามารถเข้าถึงได้โดยเกมแซนด์บ็อกซ์
+
+path = เส้นทาง
+
+shared-directories = ไดเรกทอรีใช้ร่วมกัน
+shared-directories-description = ไดเร็กทอรีเหล่านี้จะเชื่อมโยงกับไดเร็กทอรีในระบบโฮสต์ของคุณ
+
+original-path = เส้นทางเดิม
+new-path = เส้นทางใหม่
+
+read-only = อ่านได้เท่านั้น
+read-only-description = ห้ามเกมเขียนข้อมูลใดๆ ลงในไดเร็กทอรีนี้
+
+symlinks = Symlinks
+symlinks-description = สร้าง Symbolic Link จากตำแหน่งเดิมไปยังตำแหน่งใหม่ภายในแซนด์บ็อกซ์ของคุณ
diff --git a/assets/locales/tr/gamescope.ftl b/assets/locales/tr/gamescope.ftl
index 221969c..f19da2e 100644
--- a/assets/locales/tr/gamescope.ftl
+++ b/assets/locales/tr/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = DLSS teknolojisine düşük maliyetli bir alternatif olarak Nv
other-settings = Diğer ayarlar
framerate-limit = Kare hızı limiti
unfocused-framerate-limit = Odakta değilken kare hızı limiti
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/uk/gamescope.ftl b/assets/locales/uk/gamescope.ftl
index 28a657b..b94a9a9 100644
--- a/assets/locales/uk/gamescope.ftl
+++ b/assets/locales/uk/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = Відкрита техніка масштабування з
other-settings = Інші налаштування
framerate-limit = Обмеження кількості кадрів
unfocused-framerate-limit = Обмеження кількості кадрів поза фокусом
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/vi/gamescope.ftl b/assets/locales/vi/gamescope.ftl
index 6ced83c..2edf20b 100644
--- a/assets/locales/vi/gamescope.ftl
+++ b/assets/locales/vi/gamescope.ftl
@@ -11,3 +11,6 @@ nis-description = Một kỹ thuật nâng cấp mã nguồn mở do Nvidia phá
other-settings = Cài đặt khác
framerate-limit = Giới hạn tốc độ khung hình
unfocused-framerate-limit = Giới hạn tốc độ khung hình khi không tập trung
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/locales/zh-cn/gamescope.ftl b/assets/locales/zh-cn/gamescope.ftl
index 1c3f462..282801b 100644
--- a/assets/locales/zh-cn/gamescope.ftl
+++ b/assets/locales/zh-cn/gamescope.ftl
@@ -1,6 +1,11 @@
game-resolution = 游戏分辨率
gamescope-resolution = Gamescope 分辨率
+
+integer-scaling = 整数倍数缩放
+
other-settings = 其它设置
framerate-limit = 帧率限制
unfocused-framerate-limit = 切出游戏帧率限制
-integer-scaling = 整数倍数缩放
+
+force-grab-cursor = Force grab cursor
+force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
diff --git a/assets/resources.xml b/assets/resources.xml
index 362d796..9beeedb 100644
--- a/assets/resources.xml
+++ b/assets/resources.xml
@@ -26,6 +26,7 @@
images/icons/list-add-symbolic.svg
images/icons/view-refresh-symbolic.svg
images/icons/applications-games-symbolic.svg
+ images/icons/applications-system-symbolic.svg
images/icons/applications-graphics-symbolic.svg
images/icons/go-next-symbolic.svg
images/icons/dialog-information-symbolic.svg
diff --git a/src/i18n.rs b/src/i18n.rs
index 0f0cb7c..2d62374 100644
--- a/src/i18n.rs
+++ b/src/i18n.rs
@@ -27,7 +27,8 @@ pub const SUPPORTED_LANGUAGES: &[LanguageIdentifier] = &[
langid!("pl-pl"),
langid!("vi-vn"),
langid!("nl-nl"),
- langid!("uk-ua")
+ langid!("uk-ua"),
+ langid!("th-th")
];
pub static mut LANG: LanguageIdentifier = langid!("en-us");
@@ -105,9 +106,7 @@ macro_rules! tr {
use fluent_templates::Loader;
#[allow(unused_unsafe)]
- $crate::i18n::LOCALES
- .lookup(unsafe { &$crate::i18n::LANG }, $id)
- .expect(&format!("Failed to find a message with given id: {}", stringify!($id)))
+ $crate::i18n::LOCALES.lookup(unsafe { &$crate::i18n::LANG }, $id)
}
};
@@ -125,9 +124,7 @@ macro_rules! tr {
)*
#[allow(unused_unsafe)]
- $crate::i18n::LOCALES
- .lookup_complete(unsafe { &$crate::i18n::LANG }, $id, Some(&args))
- .expect(&format!("Failed to find a message with given id: {}", stringify!($id)))
+ $crate::i18n::LOCALES.lookup_complete(unsafe { &$crate::i18n::LANG }, $id, Some(&args))
}
};
}
diff --git a/src/main.rs b/src/main.rs
index eb8b96d..525fcdf 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -70,6 +70,36 @@ lazy_static::lazy_static! {
///
/// Standard is `$HOME/.local/share/anime-game-launcher/.first-run`
pub static ref FIRST_RUN_FILE: PathBuf = LAUNCHER_FOLDER.join(".first-run");
+
+ /// Global app's css
+ static ref GLOBAL_CSS: String = format!("
+ progressbar > text {{
+ margin-bottom: 4px;
+ }}
+
+ window.classic-style {{
+ background: url(\"file://{}\");
+ background-repeat: no-repeat;
+ background-size: cover;
+ }}
+
+ window.classic-style progressbar {{
+ background-color: #00000020;
+ border-radius: 16px;
+ padding: 8px 16px;
+ }}
+
+ window.classic-style progressbar:hover {{
+ background-color: #00000060;
+ color: #ffffff;
+ transition-duration: 0.5s;
+ transition-timing-function: linear;
+ }}
+
+ .round-bin {{
+ border-radius: 24px;
+ }}
+ ", BACKGROUND_FILE.to_string_lossy());
}
fn main() -> anyhow::Result<()> {
@@ -105,22 +135,24 @@ fn main() -> anyhow::Result<()> {
let mut no_verbose_tracing = false;
let args = std::env::args().collect::>();
+ let mut gtk_args = Vec::new();
// Parse arguments
for i in 0..args.len() {
- if args[i] == "--debug" {
- force_debug = true;
- } else if args[i] == "--run-game" {
- run_game = true;
- } else if args[i] == "--just-run-game" {
- just_run_game = true;
- } else if args[i] == "--no-verbose-tracing" {
- no_verbose_tracing = true;
- } else if args[i] == "--session" {
- // Switch active session prior running the app
- if let Some(session) = args.get(i + 1) {
- Sessions::set_current(session.to_owned())?;
- }
+ match args[i].as_str() {
+ "--debug" => force_debug = true,
+ "--run-game" => run_game = true,
+ "--just-run-game" => just_run_game = true,
+ "--no-verbose-tracing" => no_verbose_tracing = true,
+
+ "--session" => {
+ // Switch active session prior running the app
+ if let Some(session) = args.get(i + 1) {
+ Sessions::set_current(session.to_owned())?;
+ }
+ },
+
+ arg => gtk_args.push(arg.to_string())
}
}
@@ -170,36 +202,6 @@ fn main() -> anyhow::Result<()> {
gtk::glib::set_application_name("An Anime Game Launcher");
gtk::glib::set_program_name(Some("An Anime Game Launcher"));
- // Set global css
- relm4::set_global_css(&format!("
- progressbar > text {{
- margin-bottom: 4px;
- }}
-
- window.classic-style {{
- background: url(\"file://{}\");
- background-repeat: no-repeat;
- background-size: cover;
- }}
-
- window.classic-style progressbar {{
- background-color: #00000020;
- border-radius: 16px;
- padding: 8px 16px;
- }}
-
- window.classic-style progressbar:hover {{
- background-color: #00000060;
- color: #ffffff;
- transition-duration: 0.5s;
- transition-timing-function: linear;
- }}
-
- .round-bin {{
- border-radius: 24px;
- }}
- ", BACKGROUND_FILE.to_string_lossy()));
-
// Set UI language
let lang = CONFIG.launcher.language.parse().expect("Wrong language format used in config");
@@ -210,7 +212,11 @@ fn main() -> anyhow::Result<()> {
// Run FirstRun window if .first-run file persist
if FIRST_RUN_FILE.exists() {
// Create the app
- let app = RelmApp::new(APP_ID);
+ let app = RelmApp::new(APP_ID)
+ .with_args(gtk_args);
+
+ // Set global css
+ app.set_global_css(&GLOBAL_CSS);
// Show first run window
app.run::(());
@@ -240,7 +246,11 @@ fn main() -> anyhow::Result<()> {
}
// Create the app
- let app = RelmApp::new(APP_ID);
+ let app = RelmApp::new(APP_ID)
+ .with_args(gtk_args);
+
+ // Set global css
+ app.set_global_css(&GLOBAL_CSS);
// Show main window
app.run::(());
diff --git a/src/ui/about.rs b/src/ui/about.rs
index e681af1..3df62ec 100644
--- a/src/ui/about.rs
+++ b/src/ui/about.rs
@@ -77,7 +77,9 @@ impl SimpleComponent for AboutDialog {
"日本語 — @zozonteq https://github.com/zozonteq",
"한국어 — @project-dy https://github.com/project-dy",
"Indonesia — @yumekarisu https://github.com/yumekarisu",
- "Tiếng Việt — Nguyễn Hữu Chánh https://github.com/Chanhnh"
+ "Tiếng Việt — Nguyễn Hữu Chánh https://github.com/Chanhnh",
+ "Українська — Іван Потієнко https://github.com/xxanqw",
+ "ไทย — @thegooglerider https://github.com/TheGoogleRider2"
].join("\n"),
set_debug_info: &[
@@ -92,10 +94,28 @@ impl SimpleComponent for AboutDialog {
set_release_notes_version: &APP_VERSION,
set_release_notes: &[
+ "Added
",
+
+ "",
+ "- Bundle applications-system-symbolic icon to the app
",
+ "- Added force grab cursor option to the gamescope settings
",
+ "- Added Thai
",
+ "- Added Ukrainian
",
+ "
",
+
"Changed
",
"",
- "- Replaced FPS unlocker by a custom one
",
+ "- Update wish url
",
+ "- Updated dependencies
",
+ "- Improved app args parsing
",
+ "- Updated locales
",
+ "
",
+
+ "Fixed
",
+
+ "",
+ "- Fixed GtkSwitch UI state representation
",
"
"
].join("\n"),
@@ -113,11 +133,7 @@ impl SimpleComponent for AboutDialog {
}
}
- fn init(
- _init: Self::Init,
- root: &Self::Root,
- sender: ComponentSender,
- ) -> ComponentParts {
+ fn init(_init: Self::Init, root: Self::Root, sender: ComponentSender) -> ComponentParts {
tracing::info!("Initializing about dialog");
let model = Self {
diff --git a/src/ui/first_run/default_paths.rs b/src/ui/first_run/default_paths.rs
index 6885af2..3967da2 100644
--- a/src/ui/first_run/default_paths.rs
+++ b/src/ui/first_run/default_paths.rs
@@ -287,11 +287,7 @@ impl SimpleAsyncComponent for DefaultPathsApp {
}
}
- async fn init(
- init: Self::Init,
- root: Self::Root,
- _sender: AsyncComponentSender,
- ) -> AsyncComponentParts {
+ async fn init(init: Self::Init, root: Self::Root, _sender: AsyncComponentSender) -> AsyncComponentParts {
let model = Self {
progress_bar: ProgressBar::builder()
.launch(ProgressBarInit {
diff --git a/src/ui/first_run/dependencies.rs b/src/ui/first_run/dependencies.rs
index 0605581..e43883a 100644
--- a/src/ui/first_run/dependencies.rs
+++ b/src/ui/first_run/dependencies.rs
@@ -135,11 +135,7 @@ impl SimpleAsyncComponent for DependenciesApp {
}
}
- async fn init(
- _init: Self::Init,
- root: Self::Root,
- _sender: AsyncComponentSender,
- ) -> AsyncComponentParts {
+ async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender) -> AsyncComponentParts {
let distro = whatadistro::identify();
let model = Self {
diff --git a/src/ui/first_run/download_components.rs b/src/ui/first_run/download_components.rs
index 5e8168f..3ea61a2 100644
--- a/src/ui/first_run/download_components.rs
+++ b/src/ui/first_run/download_components.rs
@@ -264,11 +264,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
}
}
- async fn init(
- _init: Self::Init,
- root: Self::Root,
- sender: AsyncComponentSender,
- ) -> AsyncComponentParts {
+ async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender) -> AsyncComponentParts {
let model = Self {
progress_bar: ProgressBar::builder()
.launch(ProgressBarInit {
diff --git a/src/ui/first_run/finish.rs b/src/ui/first_run/finish.rs
index ea2163c..e69ab96 100644
--- a/src/ui/first_run/finish.rs
+++ b/src/ui/first_run/finish.rs
@@ -68,11 +68,7 @@ impl SimpleAsyncComponent for FinishApp {
}
}
- async fn init(
- _init: Self::Init,
- root: Self::Root,
- _sender: AsyncComponentSender,
- ) -> AsyncComponentParts {
+ async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender) -> AsyncComponentParts {
let model = Self;
let widgets = view_output!();
diff --git a/src/ui/first_run/main.rs b/src/ui/first_run/main.rs
index a34a5f9..089f32a 100644
--- a/src/ui/first_run/main.rs
+++ b/src/ui/first_run/main.rs
@@ -115,11 +115,7 @@ impl SimpleComponent for FirstRunApp {
}
}
- fn init(
- _parent: Self::Init,
- root: &Self::Root,
- sender: ComponentSender,
- ) -> ComponentParts {
+ fn init(_parent: Self::Init, root: Self::Root, sender: ComponentSender) -> ComponentParts {
tracing::info!("Initializing first run window");
let toast_overlay = adw::ToastOverlay::new();
diff --git a/src/ui/first_run/select_voiceovers.rs b/src/ui/first_run/select_voiceovers.rs
index 4ea632b..b92aace 100644
--- a/src/ui/first_run/select_voiceovers.rs
+++ b/src/ui/first_run/select_voiceovers.rs
@@ -51,7 +51,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp {
#[local_ref]
add_suffix = english -> gtk::Switch {
set_valign: gtk::Align::Center,
- set_state: true
+ set_active: true
}
},
@@ -110,11 +110,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp {
}
}
- async fn init(
- _init: Self::Init,
- root: Self::Root,
- _sender: AsyncComponentSender,
- ) -> AsyncComponentParts {
+ async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender) -> AsyncComponentParts {
let model = Self {
english: gtk::Switch::new(),
japanese: gtk::Switch::new(),
diff --git a/src/ui/first_run/welcome.rs b/src/ui/first_run/welcome.rs
index 829df0b..6bfcd15 100644
--- a/src/ui/first_run/welcome.rs
+++ b/src/ui/first_run/welcome.rs
@@ -68,11 +68,7 @@ impl SimpleAsyncComponent for WelcomeApp {
}
}
- async fn init(
- _init: Self::Init,
- root: Self::Root,
- _sender: AsyncComponentSender,
- ) -> AsyncComponentParts {
+ async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender) -> AsyncComponentParts {
let model = Self;
let widgets = view_output!();
diff --git a/src/ui/main/mod.rs b/src/ui/main/mod.rs
index bfdab28..67965a3 100644
--- a/src/ui/main/mod.rs
+++ b/src/ui/main/mod.rs
@@ -625,11 +625,7 @@ impl SimpleComponent for App {
}
}
- fn init(
- _init: Self::Init,
- root: &Self::Root,
- sender: ComponentSender,
- ) -> ComponentParts {
+ fn init(_init: Self::Init, root: Self::Root, sender: ComponentSender) -> ComponentParts {
tracing::info!("Initializing main window");
let model = App {
@@ -763,7 +759,7 @@ impl SimpleComponent for App {
let web_cache = String::from_utf8_lossy(&web_cache);
// https://webstatic-sea.[ho-yo-ver-se].com/[ge-nsh-in]/event/e20190909gacha-v2/index.html?......
- if let Some(url) = web_cache.lines().rev().find(|line| line.contains("gacha-v2/index.html")) {
+ if let Some(url) = web_cache.lines().rev().find(|line| line.contains("gacha-v3/index.html")) {
let url_begin_pos = url.find("https://").unwrap();
let url_end_pos = url_begin_pos + url[url_begin_pos..].find("\0\0\0\0").unwrap();
diff --git a/src/ui/migrate_installation.rs b/src/ui/migrate_installation.rs
index 6f115e6..a31a98f 100644
--- a/src/ui/migrate_installation.rs
+++ b/src/ui/migrate_installation.rs
@@ -36,11 +36,7 @@ impl SimpleComponent for MigrateInstallationApp {
}
}
- fn init(
- _init: Self::Init,
- root: &Self::Root,
- _sender: ComponentSender,
- ) -> ComponentParts {
+ fn init(_init: Self::Init, root: Self::Root, _sender: ComponentSender) -> ComponentParts {
tracing::info!("Initializing migration window");
let model = Self {
diff --git a/src/ui/preferences/enhancements/environment.rs b/src/ui/preferences/enhancements/environment.rs
index f7d925b..4a0f6cc 100644
--- a/src/ui/preferences/enhancements/environment.rs
+++ b/src/ui/preferences/enhancements/environment.rs
@@ -71,91 +71,82 @@ impl SimpleAsyncComponent for EnvironmentPage {
type Output = EnhancementsAppMsg;
view! {
- gtk::Box {
- set_orientation: gtk::Orientation::Vertical,
+ adw::NavigationPage {
+ #[wrap(Some)]
+ set_child = >k::Box {
+ set_orientation: gtk::Orientation::Vertical,
- adw::HeaderBar {
- #[wrap(Some)]
- set_title_widget = &adw::WindowTitle {
- set_title: &tr!("environment")
+ adw::HeaderBar {
+ #[wrap(Some)]
+ set_title_widget = &adw::WindowTitle {
+ set_title: &tr!("environment")
+ }
},
- pack_start = >k::Button {
- set_icon_name: "go-previous-symbolic",
+ adw::PreferencesPage {
+ set_title: &tr!("environment"),
+ set_icon_name: Some("document-properties-symbolic"),
- connect_clicked[sender] => move |_| {
- sender.output(EnhancementsAppMsg::OpenMainPage).unwrap();
- }
- }
- },
+ add = &adw::PreferencesGroup {
+ set_title: &tr!("game-command"),
+ set_description: Some(&tr!("game-command-description")),
- adw::PreferencesPage {
- set_title: &tr!("environment"),
- set_icon_name: Some("document-properties-symbolic"),
+ adw::EntryRow {
+ set_title: "%command%",
+ set_text: CONFIG.game.command.as_ref().unwrap_or(&String::new()).trim(),
- add = &adw::PreferencesGroup {
- set_title: &tr!("game-command"),
- set_description: Some(&tr!("game-command-description")),
+ connect_changed => |entry| {
+ if let Ok(mut config) = Config::get() {
+ let command = entry.text().trim().to_string();
- adw::EntryRow {
- set_title: "%command%",
- set_text: CONFIG.game.command.as_ref().unwrap_or(&String::new()).trim(),
+ config.game.command = if command.is_empty() {
+ None
+ } else {
+ Some(command)
+ };
- connect_changed => |entry| {
- if let Ok(mut config) = Config::get() {
- let command = entry.text().trim().to_string();
-
- config.game.command = if command.is_empty() {
- None
- } else {
- Some(command)
- };
-
- Config::update(config);
+ Config::update(config);
+ }
}
}
- }
- },
+ },
- add = &adw::PreferencesGroup {
- set_title: &tr!("new-variable"),
+ add = &adw::PreferencesGroup {
+ set_title: &tr!("new-variable"),
- #[wrap(Some)]
- set_header_suffix = >k::Button {
- add_css_class: "flat",
+ #[wrap(Some)]
+ set_header_suffix = >k::Button {
+ add_css_class: "flat",
- set_valign: gtk::Align::Center,
+ set_valign: gtk::Align::Center,
- adw::ButtonContent {
- set_icon_name: "list-add-symbolic",
- set_label: &tr!("add")
+ adw::ButtonContent {
+ set_icon_name: "list-add-symbolic",
+ set_label: &tr!("add")
+ },
+
+ connect_clicked => EnvironmentPageMsg::Add
},
- connect_clicked => EnvironmentPageMsg::Add
+ #[local_ref]
+ name_entry -> adw::EntryRow {
+ set_title: &tr!("name")
+ },
+
+ #[local_ref]
+ value_entry -> adw::EntryRow {
+ set_title: &tr!("value")
+ }
},
#[local_ref]
- name_entry -> adw::EntryRow {
- set_title: &tr!("name")
- },
-
- #[local_ref]
- value_entry -> adw::EntryRow {
- set_title: &tr!("value")
- }
- },
-
- #[local_ref]
- add = variables -> adw::PreferencesGroup {}
+ add = variables -> adw::PreferencesGroup {}
+ }
}
}
}
- async fn init(
- _init: Self::Init,
- root: Self::Root,
- sender: AsyncComponentSender,
- ) -> AsyncComponentParts {
+ async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender) -> AsyncComponentParts {
tracing::info!("Initializing environment settings");
let mut model = Self {
diff --git a/src/ui/preferences/enhancements/game.rs b/src/ui/preferences/enhancements/game.rs
index 081c655..cc262ae 100644
--- a/src/ui/preferences/enhancements/game.rs
+++ b/src/ui/preferences/enhancements/game.rs
@@ -74,11 +74,7 @@ impl AsyncFactoryComponent for GameSession {
}
}
- async fn init_model(
- init: Self::Init,
- _index: &DynamicIndex,
- _sender: AsyncFactorySender,
- ) -> Self {
+ async fn init_model(init: Self::Init, _index: &DynamicIndex, _sender: AsyncFactorySender) -> Self {
init
}
}
@@ -105,57 +101,48 @@ impl SimpleAsyncComponent for GamePage {
type Output = EnhancementsAppMsg;
view! {
- gtk::Box {
- set_orientation: gtk::Orientation::Vertical,
+ adw::NavigationPage {
+ #[wrap(Some)]
+ set_child = >k::Box {
+ set_orientation: gtk::Orientation::Vertical,
- adw::HeaderBar {
- #[wrap(Some)]
- set_title_widget = &adw::WindowTitle {
- set_title: &tr!("game")
+ adw::HeaderBar {
+ #[wrap(Some)]
+ set_title_widget = &adw::WindowTitle {
+ set_title: &tr!("game")
+ }
},
- pack_start = >k::Button {
- set_icon_name: "go-previous-symbolic",
+ adw::PreferencesPage {
+ set_title: &tr!("game"),
+ set_icon_name: Some("applications-games-symbolic"),
- connect_clicked[sender] => move |_| {
- sender.output(EnhancementsAppMsg::OpenMainPage).unwrap();
- }
- }
- },
+ add = &adw::PreferencesGroup {
+ set_title: &tr!("game-sessions"),
- adw::PreferencesPage {
- set_title: &tr!("game"),
- set_icon_name: Some("applications-games-symbolic"),
+ #[local_ref]
+ session_name_entry -> adw::EntryRow {
+ set_title: &tr!("name"),
- add = &adw::PreferencesGroup {
- set_title: &tr!("game-sessions"),
+ add_suffix = >k::Button {
+ set_icon_name: "list-add-symbolic",
+ add_css_class: "flat",
+
+ set_valign: gtk::Align::Center,
+
+ connect_clicked => GamePageMsg::AddSession
+ }
+ }
+ },
#[local_ref]
- session_name_entry -> adw::EntryRow {
- set_title: &tr!("name"),
-
- add_suffix = >k::Button {
- set_icon_name: "list-add-symbolic",
- add_css_class: "flat",
-
- set_valign: gtk::Align::Center,
-
- connect_clicked => GamePageMsg::AddSession
- }
- }
- },
-
- #[local_ref]
- add = sessions -> adw::PreferencesGroup {},
+ add = sessions -> adw::PreferencesGroup {},
+ }
}
}
}
- async fn init(
- _init: Self::Init,
- root: Self::Root,
- sender: AsyncComponentSender,
- ) -> AsyncComponentParts {
+ async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender) -> AsyncComponentParts {
tracing::info!("Initializing game settings");
let mut model = Self {
diff --git a/src/ui/preferences/enhancements/mod.rs b/src/ui/preferences/enhancements/mod.rs
index 7a097d3..12b92ef 100644
--- a/src/ui/preferences/enhancements/mod.rs
+++ b/src/ui/preferences/enhancements/mod.rs
@@ -17,6 +17,8 @@ use anime_launcher_sdk::anime_game_core::installer::downloader::Downloader;
use anime_launcher_sdk::discord_rpc::DiscordRpc;
use anime_launcher_sdk::is_available;
+use enum_ordinalize::Ordinalize;
+
pub mod game;
pub mod sandbox;
pub mod environment;
@@ -232,12 +234,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = >k::Switch {
set_valign: gtk::Align::Center,
- set_state: CONFIG.game.wine.borderless,
+ set_active: CONFIG.game.wine.borderless,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
- config.game.wine.borderless = switch.state();
+ config.game.wine.borderless = switch.is_active();
Config::update(config);
}
@@ -277,12 +279,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = >k::Switch {
set_valign: gtk::Align::Center,
- set_state: CONFIG.game.wine.virtual_desktop.enabled,
+ set_active: CONFIG.game.wine.virtual_desktop.enabled,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
- config.game.wine.virtual_desktop.enabled = switch.state();
+ config.game.wine.virtual_desktop.enabled = switch.is_active();
Config::update(config);
}
@@ -298,12 +300,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = >k::Switch {
set_valign: gtk::Align::Center,
- set_state: CONFIG.game.wine.drives.drive_c,
+ set_active: CONFIG.game.wine.drives.drive_c,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
- config.game.wine.drives.drive_c = switch.state();
+ config.game.wine.drives.drive_c = switch.is_active();
Config::update(config);
}
@@ -343,12 +345,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = >k::Switch {
set_valign: gtk::Align::Center,
- set_state: CONFIG.game.wine.drives.game_folder.is_some(),
+ set_active: CONFIG.game.wine.drives.game_folder.is_some(),
connect_state_notify[map_game_folder_row] => move |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
- if switch.state() {
+ if switch.is_active() {
config.game.wine.drives.game_folder = Some(AllowedDrives::list()[map_game_folder_row.selected() as usize]);
} else {
config.game.wine.drives.game_folder = None;
@@ -415,12 +417,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = >k::Switch {
set_valign: gtk::Align::Center,
- set_state: CONFIG.game.enhancements.fsr.enabled,
+ set_active: CONFIG.game.enhancements.fsr.enabled,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
- config.game.enhancements.fsr.enabled = switch.state();
+ config.game.enhancements.fsr.enabled = switch.is_active();
Config::update(config);
}
@@ -438,12 +440,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = >k::Switch {
set_valign: gtk::Align::Center,
- set_state: CONFIG.game.enhancements.gamemode,
+ set_active: CONFIG.game.enhancements.gamemode,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
- config.game.enhancements.gamemode = switch.state();
+ config.game.enhancements.gamemode = switch.is_active();
Config::update(config);
}
@@ -470,12 +472,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = >k::Switch {
set_valign: gtk::Align::Center,
- set_state: CONFIG.game.enhancements.gamescope.enabled,
+ set_active: CONFIG.game.enhancements.gamescope.enabled,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
- config.game.enhancements.gamescope.enabled = switch.state();
+ config.game.enhancements.gamescope.enabled = switch.is_active();
Config::update(config);
}
@@ -494,12 +496,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = >k::Switch {
set_valign: gtk::Align::Center,
- set_state: CONFIG.launcher.discord_rpc.enabled,
+ set_active: CONFIG.launcher.discord_rpc.enabled,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
- config.launcher.discord_rpc.enabled = switch.state();
+ config.launcher.discord_rpc.enabled = switch.is_active();
Config::update(config);
}
@@ -588,12 +590,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
add_suffix = >k::Switch {
set_valign: gtk::Align::Center,
- set_state: CONFIG.game.enhancements.fps_unlocker.enabled,
+ set_active: CONFIG.game.enhancements.fps_unlocker.enabled,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
- config.game.enhancements.fps_unlocker.enabled = switch.state();
+ config.game.enhancements.fps_unlocker.enabled = switch.is_active();
Config::update(config);
}
@@ -627,13 +629,13 @@ impl SimpleAsyncComponent for EnhancementsApp {
},
#[local_ref]
- game_page -> gtk::Box {},
+ game_page -> adw::NavigationPage,
#[local_ref]
- sandbox_page -> gtk::Box {},
+ sandbox_page -> adw::NavigationPage,
#[local_ref]
- environment_page -> gtk::Box {}
+ environment_page -> adw::NavigationPage,
}
async fn init(
@@ -769,28 +771,28 @@ impl SimpleAsyncComponent for EnhancementsApp {
PREFERENCES_WINDOW.as_ref()
.unwrap_unchecked()
.widget()
- .close_subpage();
+ .pop_subpage();
}
EnhancementsAppMsg::OpenGameSettingsPage => unsafe {
PREFERENCES_WINDOW.as_ref()
.unwrap_unchecked()
.widget()
- .present_subpage(self.game_page.widget());
+ .push_subpage(self.game_page.widget());
}
EnhancementsAppMsg::OpenSandboxSettingsPage => unsafe {
PREFERENCES_WINDOW.as_ref()
.unwrap_unchecked()
.widget()
- .present_subpage(self.sandbox_page.widget());
+ .push_subpage(self.sandbox_page.widget());
}
EnhancementsAppMsg::OpenEnvironmentSettingsPage => unsafe {
PREFERENCES_WINDOW.as_ref()
.unwrap_unchecked()
.widget()
- .present_subpage(self.environment_page.widget());
+ .push_subpage(self.environment_page.widget());
}
EnhancementsAppMsg::Toast { title, description } => {
diff --git a/src/ui/preferences/enhancements/sandbox.rs b/src/ui/preferences/enhancements/sandbox.rs
index 8aa3b7f..9c84b92 100644
--- a/src/ui/preferences/enhancements/sandbox.rs
+++ b/src/ui/preferences/enhancements/sandbox.rs
@@ -98,235 +98,226 @@ impl SimpleAsyncComponent for SandboxPage {
type Output = EnhancementsAppMsg;
view! {
- gtk::Box {
- set_orientation: gtk::Orientation::Vertical,
-
- adw::HeaderBar {
- #[wrap(Some)]
- set_title_widget = &adw::WindowTitle {
- set_title: &tr!("sandbox")
- },
-
- pack_start = >k::Button {
- set_icon_name: "go-previous-symbolic",
-
- connect_clicked[sender] => move |_| {
- sender.output(EnhancementsAppMsg::OpenMainPage).unwrap();
- }
- }
- },
-
- adw::PreferencesPage {
- set_title: &tr!("sandbox"),
- set_icon_name: Some("folder-symbolic"),
-
- set_sensitive: is_available("bwrap"),
-
- add = &adw::PreferencesGroup {
- set_title: &tr!("sandbox"),
- set_description: Some(&tr!("sandbox-description")),
-
- adw::ActionRow {
- set_title: &tr!("enable-sandboxing"),
- set_subtitle: &tr!("enable-sandboxing-description"),
-
- add_suffix = >k::Switch {
- set_valign: gtk::Align::Center,
-
- set_state: CONFIG.sandbox.enabled,
-
- connect_state_notify => |switch| {
- if is_ready() {
- if let Ok(mut config) = Config::get() {
- config.sandbox.enabled = switch.state();
-
- Config::update(config);
- }
- }
- }
- }
- },
-
- adw::ActionRow {
- set_title: &tr!("hide-home-directory"),
- set_subtitle: &tr!("hide-home-directory-description"),
-
- add_suffix = >k::Switch {
- set_valign: gtk::Align::Center,
-
- set_state: CONFIG.sandbox.isolate_home,
-
- connect_state_notify => |switch| {
- if is_ready() {
- if let Ok(mut config) = Config::get() {
- config.sandbox.isolate_home = switch.state();
-
- Config::update(config);
- }
- }
- }
- }
- },
-
- adw::EntryRow {
- set_title: &tr!("hostname"),
- set_text: CONFIG.sandbox.hostname.as_ref().unwrap_or(&String::new()).trim(),
-
- connect_changed => |entry| {
- if let Ok(mut config) = Config::get() {
- let command = entry.text().trim().to_string();
-
- config.sandbox.hostname = if command.is_empty() {
- None
- } else {
- Some(command)
- };
-
- Config::update(config);
- }
- }
- },
-
- adw::EntryRow {
- set_title: &tr!("additional-arguments"),
- set_text: CONFIG.sandbox.args.as_ref().unwrap_or(&String::new()).trim(),
-
- connect_changed => |entry| {
- if let Ok(mut config) = Config::get() {
- let command = entry.text().trim().to_string();
-
- config.sandbox.args = if command.is_empty() {
- None
- } else {
- Some(command)
- };
-
- Config::update(config);
- }
- },
-
- add_suffix = >k::Button {
- set_icon_name: "dialog-information-symbolic",
- add_css_class: "flat",
-
- set_valign: gtk::Align::Center,
-
- connect_clicked[sender] => move |_| {
- if let Err(err) = open::that("https://man.archlinux.org/man/bwrap.1") {
- sender.output(EnhancementsAppMsg::Toast {
- title: tr!("documentation-url-open-failed"),
- description: Some(err.to_string())
- }).unwrap();
- }
- }
- }
- }
- },
-
- add = &adw::PreferencesGroup {
- set_title: &tr!("private-directories"),
- set_description: Some(&tr!("private-directories-description")),
-
- #[local_ref]
- private_path_entry -> adw::EntryRow {
- set_title: &tr!("path"),
-
- add_suffix = >k::Button {
- set_icon_name: "list-add-symbolic",
- add_css_class: "flat",
-
- set_valign: gtk::Align::Center,
-
- connect_clicked => SandboxPageMsg::AddPrivate
- }
- }
- },
-
- #[local_ref]
- add = private_paths -> adw::PreferencesGroup {},
-
- add = &adw::PreferencesGroup {
- set_title: &tr!("shared-directories"),
- set_description: Some(&tr!("shared-directories-description")),
+ adw::NavigationPage {
+ #[wrap(Some)]
+ set_child = >k::Box {
+ set_orientation: gtk::Orientation::Vertical,
+ adw::HeaderBar {
#[wrap(Some)]
- set_header_suffix = >k::Button {
- add_css_class: "flat",
+ set_title_widget = &adw::WindowTitle {
+ set_title: &tr!("sandbox")
+ }
+ },
- set_valign: gtk::Align::Center,
+ adw::PreferencesPage {
+ set_title: &tr!("sandbox"),
+ set_icon_name: Some("folder-symbolic"),
- adw::ButtonContent {
- set_icon_name: "list-add-symbolic",
- set_label: &tr!("add")
+ set_sensitive: is_available("bwrap"),
+
+ add = &adw::PreferencesGroup {
+ set_title: &tr!("sandbox"),
+ set_description: Some(&tr!("sandbox-description")),
+
+ adw::ActionRow {
+ set_title: &tr!("enable-sandboxing"),
+ set_subtitle: &tr!("enable-sandboxing-description"),
+
+ add_suffix = >k::Switch {
+ set_valign: gtk::Align::Center,
+
+ set_active: CONFIG.sandbox.enabled,
+
+ connect_state_notify => |switch| {
+ if is_ready() {
+ if let Ok(mut config) = Config::get() {
+ config.sandbox.enabled = switch.is_active();
+
+ Config::update(config);
+ }
+ }
+ }
+ }
},
- connect_clicked => SandboxPageMsg::AddShared
+ adw::ActionRow {
+ set_title: &tr!("hide-home-directory"),
+ set_subtitle: &tr!("hide-home-directory-description"),
+
+ add_suffix = >k::Switch {
+ set_valign: gtk::Align::Center,
+
+ set_active: CONFIG.sandbox.isolate_home,
+
+ connect_state_notify => |switch| {
+ if is_ready() {
+ if let Ok(mut config) = Config::get() {
+ config.sandbox.isolate_home = switch.is_active();
+
+ Config::update(config);
+ }
+ }
+ }
+ }
+ },
+
+ adw::EntryRow {
+ set_title: &tr!("hostname"),
+ set_text: CONFIG.sandbox.hostname.as_ref().unwrap_or(&String::new()).trim(),
+
+ connect_changed => |entry| {
+ if let Ok(mut config) = Config::get() {
+ let command = entry.text().trim().to_string();
+
+ config.sandbox.hostname = if command.is_empty() {
+ None
+ } else {
+ Some(command)
+ };
+
+ Config::update(config);
+ }
+ }
+ },
+
+ adw::EntryRow {
+ set_title: &tr!("additional-arguments"),
+ set_text: CONFIG.sandbox.args.as_ref().unwrap_or(&String::new()).trim(),
+
+ connect_changed => |entry| {
+ if let Ok(mut config) = Config::get() {
+ let command = entry.text().trim().to_string();
+
+ config.sandbox.args = if command.is_empty() {
+ None
+ } else {
+ Some(command)
+ };
+
+ Config::update(config);
+ }
+ },
+
+ add_suffix = >k::Button {
+ set_icon_name: "dialog-information-symbolic",
+ add_css_class: "flat",
+
+ set_valign: gtk::Align::Center,
+
+ connect_clicked[sender] => move |_| {
+ if let Err(err) = open::that("https://man.archlinux.org/man/bwrap.1") {
+ sender.output(EnhancementsAppMsg::Toast {
+ title: tr!("documentation-url-open-failed"),
+ description: Some(err.to_string())
+ }).unwrap();
+ }
+ }
+ }
+ }
},
- #[local_ref]
- shared_path_from_entry -> adw::EntryRow {
- set_title: &tr!("original-path")
- },
-
- #[local_ref]
- shared_path_to_entry -> adw::EntryRow {
- set_title: &tr!("new-path")
- },
-
- adw::ActionRow {
- set_title: &tr!("read-only"),
- set_subtitle: &tr!("read-only-description"),
+ add = &adw::PreferencesGroup {
+ set_title: &tr!("private-directories"),
+ set_description: Some(&tr!("private-directories-description")),
#[local_ref]
- add_suffix = read_only_switch -> gtk::Switch {
- set_valign: gtk::Align::Center
+ private_path_entry -> adw::EntryRow {
+ set_title: &tr!("path"),
+
+ add_suffix = >k::Button {
+ set_icon_name: "list-add-symbolic",
+ add_css_class: "flat",
+
+ set_valign: gtk::Align::Center,
+
+ connect_clicked => SandboxPageMsg::AddPrivate
+ }
}
- }
- },
+ },
- #[local_ref]
- add = shared_paths -> adw::PreferencesGroup {},
+ #[local_ref]
+ add = private_paths -> adw::PreferencesGroup {},
- add = &adw::PreferencesGroup {
- set_title: &tr!("symlinks"),
- set_description: Some(&tr!("symlinks-description")),
+ add = &adw::PreferencesGroup {
+ set_title: &tr!("shared-directories"),
+ set_description: Some(&tr!("shared-directories-description")),
- #[wrap(Some)]
- set_header_suffix = >k::Button {
- add_css_class: "flat",
+ #[wrap(Some)]
+ set_header_suffix = >k::Button {
+ add_css_class: "flat",
- set_valign: gtk::Align::Center,
+ set_valign: gtk::Align::Center,
- adw::ButtonContent {
- set_icon_name: "list-add-symbolic",
- set_label: &tr!("add")
+ adw::ButtonContent {
+ set_icon_name: "list-add-symbolic",
+ set_label: &tr!("add")
+ },
+
+ connect_clicked => SandboxPageMsg::AddShared
},
- connect_clicked => SandboxPageMsg::AddSymlink
+ #[local_ref]
+ shared_path_from_entry -> adw::EntryRow {
+ set_title: &tr!("original-path")
+ },
+
+ #[local_ref]
+ shared_path_to_entry -> adw::EntryRow {
+ set_title: &tr!("new-path")
+ },
+
+ adw::ActionRow {
+ set_title: &tr!("read-only"),
+ set_subtitle: &tr!("read-only-description"),
+
+ #[local_ref]
+ add_suffix = read_only_switch -> gtk::Switch {
+ set_valign: gtk::Align::Center
+ }
+ }
},
#[local_ref]
- symlink_path_from_entry -> adw::EntryRow {
- set_title: &tr!("original-path")
+ add = shared_paths -> adw::PreferencesGroup {},
+
+ add = &adw::PreferencesGroup {
+ set_title: &tr!("symlinks"),
+ set_description: Some(&tr!("symlinks-description")),
+
+ #[wrap(Some)]
+ set_header_suffix = >k::Button {
+ add_css_class: "flat",
+
+ set_valign: gtk::Align::Center,
+
+ adw::ButtonContent {
+ set_icon_name: "list-add-symbolic",
+ set_label: &tr!("add")
+ },
+
+ connect_clicked => SandboxPageMsg::AddSymlink
+ },
+
+ #[local_ref]
+ symlink_path_from_entry -> adw::EntryRow {
+ set_title: &tr!("original-path")
+ },
+
+ #[local_ref]
+ symlink_path_to_entry -> adw::EntryRow {
+ set_title: &tr!("new-path")
+ }
},
#[local_ref]
- symlink_path_to_entry -> adw::EntryRow {
- set_title: &tr!("new-path")
- }
- },
-
- #[local_ref]
- add = symlink_paths -> adw::PreferencesGroup {}
+ add = symlink_paths -> adw::PreferencesGroup {}
+ }
}
}
}
- async fn init(
- _init: Self::Init,
- root: Self::Root,
- sender: AsyncComponentSender,
- ) -> AsyncComponentParts {
+ async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender) -> AsyncComponentParts {
tracing::info!("Initializing sandbox settings");
let mut model = Self {
diff --git a/src/ui/preferences/gamescope.rs b/src/ui/preferences/gamescope.rs
index 8a4163b..eeecb39 100644
--- a/src/ui/preferences/gamescope.rs
+++ b/src/ui/preferences/gamescope.rs
@@ -6,6 +6,8 @@ use anime_launcher_sdk::genshin::config::Config;
use anime_launcher_sdk::config::schema_blanks::prelude::*;
+use enum_ordinalize::Ordinalize;
+
use crate::*;
pub struct GamescopeApp;
@@ -128,13 +130,13 @@ impl SimpleAsyncComponent for GamescopeApp {
add_suffix = >k::Switch {
set_valign: gtk::Align::Center,
- set_state: CONFIG.game.enhancements.gamescope.integer_scaling,
+ set_active: CONFIG.game.enhancements.gamescope.integer_scaling,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
- config.game.enhancements.gamescope.integer_scaling = switch.state();
-
+ config.game.enhancements.gamescope.integer_scaling = switch.is_active();
+
Config::update(config);
}
}
@@ -148,13 +150,13 @@ impl SimpleAsyncComponent for GamescopeApp {
add_suffix = >k::Switch {
set_valign: gtk::Align::Center,
- set_state: CONFIG.game.enhancements.gamescope.fsr,
+ set_active: CONFIG.game.enhancements.gamescope.fsr,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
- config.game.enhancements.gamescope.fsr = switch.state();
-
+ config.game.enhancements.gamescope.fsr = switch.is_active();
+
Config::update(config);
}
}
@@ -168,13 +170,13 @@ impl SimpleAsyncComponent for GamescopeApp {
add_suffix = >k::Switch {
set_valign: gtk::Align::Center,
- set_state: CONFIG.game.enhancements.gamescope.nis,
+ set_active: CONFIG.game.enhancements.gamescope.nis,
connect_state_notify => |switch| {
if is_ready() {
if let Ok(mut config) = Config::get() {
- config.game.enhancements.gamescope.nis = switch.state();
-
+ config.game.enhancements.gamescope.nis = switch.is_active();
+
Config::update(config);
}
}
@@ -250,17 +252,33 @@ impl SimpleAsyncComponent for GamescopeApp {
}
}
}
+ },
+
+ adw::ActionRow {
+ set_title: &tr!("force-grab-cursor"),
+ set_subtitle: &tr!("force-grab-cursor-description"),
+
+ add_suffix = >k::Switch {
+ set_valign: gtk::Align::Center,
+ set_active: CONFIG.game.enhancements.gamescope.force_grab_cursor,
+
+ connect_state_notify => |switch| {
+ if is_ready() {
+ if let Ok(mut config) = Config::get() {
+ config.game.enhancements.gamescope.force_grab_cursor = switch.is_active();
+
+ Config::update(config);
+ }
+ }
+ }
+ }
}
}
}
}
}
- async fn init(
- _init: Self::Init,
- root: Self::Root,
- _sender: AsyncComponentSender,
- ) -> AsyncComponentParts {
+ async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender) -> AsyncComponentParts {
tracing::info!("Initializing gamescope settings");
let model = Self;
diff --git a/src/ui/preferences/general/components.rs b/src/ui/preferences/general/components.rs
index bf8dfff..7eb7c26 100644
--- a/src/ui/preferences/general/components.rs
+++ b/src/ui/preferences/general/components.rs
@@ -49,202 +49,193 @@ impl SimpleAsyncComponent for ComponentsPage {
type Output = GeneralAppMsg;
view! {
- gtk::Box {
- set_orientation: gtk::Orientation::Vertical,
+ adw::NavigationPage {
+ #[wrap(Some)]
+ set_child = >k::Box {
+ set_orientation: gtk::Orientation::Vertical,
- adw::HeaderBar {
- #[wrap(Some)]
- set_title_widget = &adw::WindowTitle {
- set_title: &tr!("components")
+ adw::HeaderBar {
+ #[wrap(Some)]
+ set_title_widget = &adw::WindowTitle {
+ set_title: &tr!("components")
+ }
},
- pack_start = >k::Button {
- set_icon_name: "go-previous-symbolic",
+ adw::PreferencesPage {
+ add = &adw::PreferencesGroup {
+ set_title: &tr!("wine-version"),
- connect_clicked[sender] => move |_| {
- sender.output(GeneralAppMsg::OpenMainPage).unwrap();
- }
+ adw::ComboRow {
+ set_title: &tr!("selected-version"),
+
+ #[watch]
+ #[block_signal(wine_selected_notify)]
+ set_model: Some(>k::StringList::new(&model.downloaded_wine_versions.iter().map(|(version, _)| version.title.as_str()).collect::>())),
+
+ #[watch]
+ #[block_signal(wine_selected_notify)]
+ set_selected: model.selected_wine_version,
+
+ #[watch]
+ set_activatable: !model.selecting_wine_version,
+
+ connect_selected_notify[sender] => move |row| {
+ if is_ready() {
+ sender.input(ComponentsPageMsg::SelectWine(row.selected() as usize));
+ }
+ } @wine_selected_notify,
+
+ add_suffix = >k::Spinner {
+ set_spinning: true,
+
+ #[watch]
+ set_visible: model.selecting_wine_version
+ }
+ },
+
+ adw::ActionRow {
+ set_title: &tr!("recommended-only"),
+ set_subtitle: &tr!("wine-recommended-description"),
+
+ add_suffix = >k::Switch {
+ set_valign: gtk::Align::Center,
+
+ #[block_signal(wine_recommended_notify)]
+ set_active: true,
+
+ connect_state_notify[sender] => move |switch| {
+ if is_ready() {
+ sender.input(ComponentsPageMsg::WineRecommendedOnly(switch.is_active()));
+ }
+ } @wine_recommended_notify
+ }
+ }
+ },
+
+ add = &adw::PreferencesGroup {
+ add = model.wine_components.widget(),
+ },
+
+ add = &adw::PreferencesGroup {
+ set_title: &tr!("wine-options"),
+
+ adw::ActionRow {
+ set_title: &tr!("wine-use-shared-libraries"),
+ set_subtitle: &tr!("wine-use-shared-libraries-description"),
+
+ add_suffix = >k::Switch {
+ set_valign: gtk::Align::Center,
+
+ #[block_signal(wine_shared_libraries_notify)]
+ set_active: CONFIG.game.wine.shared_libraries.wine,
+
+ connect_state_notify => |switch| {
+ if is_ready() {
+ if let Ok(mut config) = Config::get() {
+ config.game.wine.shared_libraries.wine = switch.is_active();
+
+ Config::update(config);
+ }
+ }
+ } @wine_shared_libraries_notify
+ }
+ },
+
+ adw::ActionRow {
+ set_title: &tr!("gstreamer-use-shared-libraries"),
+ set_subtitle: &tr!("gstreamer-use-shared-libraries-description"),
+
+ add_suffix = >k::Switch {
+ set_valign: gtk::Align::Center,
+
+ #[block_signal(gstreamer_shared_libraries_notify)]
+ set_active: CONFIG.game.wine.shared_libraries.gstreamer,
+
+ connect_state_notify => |switch| {
+ if is_ready() {
+ if let Ok(mut config) = Config::get() {
+ config.game.wine.shared_libraries.gstreamer = switch.is_active();
+
+ Config::update(config);
+ }
+ }
+ } @gstreamer_shared_libraries_notify
+ }
+ }
+ },
+
+ add = &adw::PreferencesGroup {
+ set_title: &tr!("dxvk-version"),
+
+ #[watch]
+ set_description: Some(&if !model.allow_dxvk_selection {
+ tr!("dxvk-selection-disabled")
+ } else {
+ String::new()
+ }),
+
+ #[watch]
+ set_sensitive: model.allow_dxvk_selection,
+
+ adw::ComboRow {
+ set_title: &tr!("selected-version"),
+
+ #[watch]
+ #[block_signal(dxvk_selected_notify)]
+ set_model: Some(>k::StringList::new(&model.downloaded_dxvk_versions.iter().map(|version| version.name.as_str()).collect::>())),
+
+ #[watch]
+ #[block_signal(dxvk_selected_notify)]
+ set_selected: model.selected_dxvk_version,
+
+ #[watch]
+ set_activatable: !model.selecting_dxvk_version,
+
+ connect_selected_notify[sender] => move |row| {
+ if is_ready() {
+ sender.input(ComponentsPageMsg::SelectDxvk(row.selected() as usize));
+ }
+ } @dxvk_selected_notify,
+
+ add_suffix = >k::Spinner {
+ set_spinning: true,
+
+ #[watch]
+ set_visible: model.selecting_dxvk_version
+ }
+ },
+
+ adw::ActionRow {
+ set_title: &tr!("recommended-only"),
+ set_subtitle: &tr!("dxvk-recommended-description"),
+
+ add_suffix = >k::Switch {
+ set_valign: gtk::Align::Center,
+
+ #[block_signal(dxvk_recommended_notify)]
+ set_active: true,
+
+ connect_state_notify[sender] => move |switch| {
+ if is_ready() {
+ sender.input(ComponentsPageMsg::DxvkRecommendedOnly(switch.is_active()));
+ }
+ } @dxvk_recommended_notify
+ }
+ }
+ },
+
+ add = &adw::PreferencesGroup {
+ #[watch]
+ set_sensitive: model.allow_dxvk_selection,
+
+ add = model.dxvk_components.widget(),
+ },
}
- },
-
- adw::PreferencesPage {
- add = &adw::PreferencesGroup {
- set_title: &tr!("wine-version"),
-
- adw::ComboRow {
- set_title: &tr!("selected-version"),
-
- #[watch]
- #[block_signal(wine_selected_notify)]
- set_model: Some(>k::StringList::new(&model.downloaded_wine_versions.iter().map(|(version, _)| version.title.as_str()).collect::>())),
-
- #[watch]
- #[block_signal(wine_selected_notify)]
- set_selected: model.selected_wine_version,
-
- #[watch]
- set_activatable: !model.selecting_wine_version,
-
- connect_selected_notify[sender] => move |row| {
- if is_ready() {
- sender.input(ComponentsPageMsg::SelectWine(row.selected() as usize));
- }
- } @wine_selected_notify,
-
- add_suffix = >k::Spinner {
- set_spinning: true,
-
- #[watch]
- set_visible: model.selecting_wine_version
- }
- },
-
- adw::ActionRow {
- set_title: &tr!("recommended-only"),
- set_subtitle: &tr!("wine-recommended-description"),
-
- add_suffix = >k::Switch {
- set_valign: gtk::Align::Center,
-
- #[block_signal(wine_recommended_notify)]
- set_state: true,
-
- connect_state_notify[sender] => move |switch| {
- if is_ready() {
- sender.input(ComponentsPageMsg::WineRecommendedOnly(switch.state()));
- }
- } @wine_recommended_notify
- }
- }
- },
-
- add = &adw::PreferencesGroup {
- add = model.wine_components.widget(),
- },
-
- add = &adw::PreferencesGroup {
- set_title: &tr!("wine-options"),
-
- adw::ActionRow {
- set_title: &tr!("wine-use-shared-libraries"),
- set_subtitle: &tr!("wine-use-shared-libraries-description"),
-
- add_suffix = >k::Switch {
- set_valign: gtk::Align::Center,
-
- #[block_signal(wine_shared_libraries_notify)]
- set_state: CONFIG.game.wine.shared_libraries.wine,
-
- connect_state_notify => |switch| {
- if is_ready() {
- if let Ok(mut config) = Config::get() {
- config.game.wine.shared_libraries.wine = switch.state();
-
- Config::update(config);
- }
- }
- } @wine_shared_libraries_notify
- }
- },
-
- adw::ActionRow {
- set_title: &tr!("gstreamer-use-shared-libraries"),
- set_subtitle: &tr!("gstreamer-use-shared-libraries-description"),
-
- add_suffix = >k::Switch {
- set_valign: gtk::Align::Center,
-
- #[block_signal(gstreamer_shared_libraries_notify)]
- set_state: CONFIG.game.wine.shared_libraries.gstreamer,
-
- connect_state_notify => |switch| {
- if is_ready() {
- if let Ok(mut config) = Config::get() {
- config.game.wine.shared_libraries.gstreamer = switch.state();
-
- Config::update(config);
- }
- }
- } @gstreamer_shared_libraries_notify
- }
- }
- },
-
- add = &adw::PreferencesGroup {
- set_title: &tr!("dxvk-version"),
-
- #[watch]
- set_description: Some(&if !model.allow_dxvk_selection {
- tr!("dxvk-selection-disabled")
- } else {
- String::new()
- }),
-
- #[watch]
- set_sensitive: model.allow_dxvk_selection,
-
- adw::ComboRow {
- set_title: &tr!("selected-version"),
-
- #[watch]
- #[block_signal(dxvk_selected_notify)]
- set_model: Some(>k::StringList::new(&model.downloaded_dxvk_versions.iter().map(|version| version.name.as_str()).collect::>())),
-
- #[watch]
- #[block_signal(dxvk_selected_notify)]
- set_selected: model.selected_dxvk_version,
-
- #[watch]
- set_activatable: !model.selecting_dxvk_version,
-
- connect_selected_notify[sender] => move |row| {
- if is_ready() {
- sender.input(ComponentsPageMsg::SelectDxvk(row.selected() as usize));
- }
- } @dxvk_selected_notify,
-
- add_suffix = >k::Spinner {
- set_spinning: true,
-
- #[watch]
- set_visible: model.selecting_dxvk_version
- }
- },
-
- adw::ActionRow {
- set_title: &tr!("recommended-only"),
- set_subtitle: &tr!("dxvk-recommended-description"),
-
- add_suffix = >k::Switch {
- set_valign: gtk::Align::Center,
-
- #[block_signal(dxvk_recommended_notify)]
- set_state: true,
-
- connect_state_notify[sender] => move |switch| {
- if is_ready() {
- sender.input(ComponentsPageMsg::DxvkRecommendedOnly(switch.state()));
- }
- } @dxvk_recommended_notify
- }
- }
- },
-
- add = &adw::PreferencesGroup {
- #[watch]
- set_sensitive: model.allow_dxvk_selection,
-
- add = model.dxvk_components.widget(),
- },
}
}
}
- async fn init(
- _init: Self::Init,
- root: Self::Root,
- sender: AsyncComponentSender,
- ) -> AsyncComponentParts {
+ async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender) -> AsyncComponentParts {
tracing::info!("Initializing general settings -> components page");
let model = Self {
diff --git a/src/ui/preferences/general/mod.rs b/src/ui/preferences/general/mod.rs
index 1300115..c092a75 100644
--- a/src/ui/preferences/general/mod.rs
+++ b/src/ui/preferences/general/mod.rs
@@ -232,7 +232,7 @@ impl SimpleAsyncComponent for GeneralApp {
connect_state_notify => |switch| {
#[allow(unused_must_use)]
- if switch.state() {
+ if switch.is_active() {
std::fs::remove_file(KEEP_BACKGROUND_FILE.as_path());
} else {
std::fs::write(KEEP_BACKGROUND_FILE.as_path(), "");
@@ -528,7 +528,7 @@ impl SimpleAsyncComponent for GeneralApp {
},
#[local_ref]
- components_page -> gtk::Box {}
+ components_page -> adw::NavigationPage,
}
async fn init(
@@ -664,14 +664,14 @@ impl SimpleAsyncComponent for GeneralApp {
PREFERENCES_WINDOW.as_ref()
.unwrap_unchecked()
.widget()
- .close_subpage();
+ .pop_subpage();
}
GeneralAppMsg::OpenComponentsPage => unsafe {
PREFERENCES_WINDOW.as_ref()
.unwrap_unchecked()
.widget()
- .present_subpage(self.components_page.widget());
+ .push_subpage(self.components_page.widget());
}
#[allow(unused_must_use)]
diff --git a/src/ui/preferences/main.rs b/src/ui/preferences/main.rs
index f065666..d5004e2 100644
--- a/src/ui/preferences/main.rs
+++ b/src/ui/preferences/main.rs
@@ -68,11 +68,7 @@ impl SimpleAsyncComponent for PreferencesApp {
}
}
- async fn init(
- parent: Self::Init,
- root: Self::Root,
- sender: AsyncComponentSender,
- ) -> AsyncComponentParts {
+ async fn init(parent: Self::Init, root: Self::Root, sender: AsyncComponentSender) -> AsyncComponentParts {
tracing::info!("Initializing preferences window");
let model = Self {