mirror of
https://github.com/gopher64/gopher64.git
synced 2026-07-11 01:25:20 +02:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 81cc78ce90 | |||
| e8a7abffe3 | |||
| f7ad6a4b0d | |||
| 1bfb50de8a | |||
| 3bc7c96191 | |||
| 032bf1acf3 | |||
| 8bc765c1a3 | |||
| da061240af | |||
| 407a1b967c | |||
| ad756cd6bd | |||
| 6e11bc18d6 | |||
| c8eee9f727 | |||
| 01a53ce1c0 | |||
| 0eddf31f92 | |||
| e257ba717b | |||
| 7a797165fd |
Generated
+206
-174
@@ -351,9 +351,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.102"
|
||||
version = "1.0.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
||||
checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
|
||||
|
||||
[[package]]
|
||||
name = "arbitrary"
|
||||
@@ -363,9 +363,9 @@ checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1"
|
||||
|
||||
[[package]]
|
||||
name = "arc-swap"
|
||||
version = "1.9.1"
|
||||
version = "1.9.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207"
|
||||
checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b"
|
||||
dependencies = [
|
||||
"rustversion",
|
||||
]
|
||||
@@ -389,9 +389,9 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"
|
||||
|
||||
[[package]]
|
||||
name = "arrayvec"
|
||||
version = "0.7.7"
|
||||
version = "0.7.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe"
|
||||
checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56"
|
||||
|
||||
[[package]]
|
||||
name = "as-raw-xcb-connection"
|
||||
@@ -864,7 +864,7 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"regex",
|
||||
"rustc-hash 2.1.2",
|
||||
"rustc-hash 2.1.3",
|
||||
"shlex 1.3.0",
|
||||
"syn",
|
||||
]
|
||||
@@ -1077,9 +1077,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
|
||||
|
||||
[[package]]
|
||||
name = "bytes"
|
||||
version = "1.12.0"
|
||||
version = "1.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593"
|
||||
checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
|
||||
|
||||
[[package]]
|
||||
name = "bzip2"
|
||||
@@ -1161,9 +1161,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.65"
|
||||
version = "1.2.66"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96"
|
||||
checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"jobserver",
|
||||
@@ -1606,18 +1606,18 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-channel"
|
||||
version = "0.5.15"
|
||||
version = "0.5.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
|
||||
checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.6"
|
||||
version = "0.8.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
|
||||
checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb"
|
||||
dependencies = [
|
||||
"crossbeam-epoch",
|
||||
"crossbeam-utils",
|
||||
@@ -1625,18 +1625,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-epoch"
|
||||
version = "0.9.18"
|
||||
version = "0.9.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
|
||||
checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.21"
|
||||
version = "0.8.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||
checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17"
|
||||
|
||||
[[package]]
|
||||
name = "crunchy"
|
||||
@@ -2189,14 +2189,16 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "exr"
|
||||
version = "1.74.0"
|
||||
version = "1.74.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be"
|
||||
checksum = "6be87932f10230a4339ab394edd8e4611fcb72553d8295b4d52ea55249b3daa5"
|
||||
dependencies = [
|
||||
"bit_field",
|
||||
"half",
|
||||
"lebe",
|
||||
"miniz_oxide",
|
||||
"num-complex",
|
||||
"pulp",
|
||||
"rayon-core",
|
||||
"smallvec",
|
||||
"zune-inflate",
|
||||
@@ -2618,8 +2620,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ggrs"
|
||||
version = "0.12.0"
|
||||
source = "git+https://github.com/gschup/ggrs.git#d260417700bef25482ba0861587905f643385e14"
|
||||
version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "672a16c1d778ad2d7a6218700ba0863a9e510e9446b08f3644460a9884aed048"
|
||||
dependencies = [
|
||||
"bincode 1.3.3",
|
||||
"bitfield-rle",
|
||||
@@ -2772,7 +2775,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "gopher64"
|
||||
version = "1.1.32"
|
||||
version = "1.1.34"
|
||||
dependencies = [
|
||||
"bindgen",
|
||||
"cc",
|
||||
@@ -2789,12 +2792,12 @@ dependencies = [
|
||||
"mimalloc",
|
||||
"open",
|
||||
"postcard",
|
||||
"rand 0.10.1",
|
||||
"quick-xml 0.41.0",
|
||||
"rand 0.10.2",
|
||||
"regex",
|
||||
"reqwest",
|
||||
"rfd",
|
||||
"rustc-hash 2.1.2",
|
||||
"sdl3-image-sys",
|
||||
"rustc-hash 2.1.3",
|
||||
"sdl3-src",
|
||||
"sdl3-sys",
|
||||
"sdl3-ttf-sys",
|
||||
@@ -3069,9 +3072,9 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
|
||||
|
||||
[[package]]
|
||||
name = "hybrid-array"
|
||||
version = "0.4.12"
|
||||
version = "0.4.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da"
|
||||
checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c"
|
||||
dependencies = [
|
||||
"typenum",
|
||||
]
|
||||
@@ -3155,9 +3158,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "i-slint-backend-android-activity"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3a69c405bd541532766a2d059ae21c562191881d2394fe112fc97f3aa9708a94"
|
||||
checksum = "9805bcdcbeea6626a0054347ee55d2424e0d5574b563472719d3fc7a11852242"
|
||||
dependencies = [
|
||||
"android-activity 0.5.2",
|
||||
"android-activity 0.6.1",
|
||||
@@ -3172,9 +3175,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "i-slint-backend-linuxkms"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "54e6cb54b264cac4aa4968d6b5d4f4240a89ae8d9153659391ac57b6e4757a9f"
|
||||
checksum = "68e76f2b13846ca54bba6b8eb3b5454b26879ad987396d0a2d8abedc31a6c469"
|
||||
dependencies = [
|
||||
"calloop 0.14.4",
|
||||
"cfg_aliases",
|
||||
@@ -3189,9 +3192,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "i-slint-backend-selector"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "74e252fd16064a10f7a0f105fef01b634cc6b6bebb0331f2cdc6da94e15d326d"
|
||||
checksum = "2247a4590a02a466b2f4916cc789dfe66247f6af826f00eb84a2685259a45c1c"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"cfg_aliases",
|
||||
@@ -3206,9 +3209,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "i-slint-backend-winit"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a66940b16cbc6f6fc14363c8dd220497b503946146408907ecf071fdd6794973"
|
||||
checksum = "a27c7e8f53418d3017362465367b6612b6e439a68097d627d1b91c94b885f0a6"
|
||||
dependencies = [
|
||||
"accesskit",
|
||||
"accesskit_winit",
|
||||
@@ -3249,9 +3252,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "i-slint-common"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4be292acd6d591cf376f2338786b0c95faddb79fdbce4ff89f840daf2d7bac4"
|
||||
checksum = "52e63f8ea55ba21e44567ae67d2b01a4f5d09bb1fab693b1e6c79d96bef9e456"
|
||||
dependencies = [
|
||||
"derive_more",
|
||||
"fontique",
|
||||
@@ -3266,9 +3269,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "i-slint-compiler"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "290c2247e87d3653b9b7c3bc1cbe19647b2f93a4b99a40aae6a7140717700d37"
|
||||
checksum = "45ea275b15a425c7f2f77481151e1f5f8f1ea83feae580273090ef6b9e192218"
|
||||
dependencies = [
|
||||
"annotate-snippets",
|
||||
"by_address",
|
||||
@@ -3299,9 +3302,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "i-slint-core"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b7d306bc9d6fe1d1fd5e775837ec1fa1e41d1c8063789181b7de631bd5db41c"
|
||||
checksum = "4e407dc2bd5385dcbdd9c1cf927213d2e4bacda667545abf8839c60f8290f754"
|
||||
dependencies = [
|
||||
"auto_enums",
|
||||
"bitflags 2.13.0",
|
||||
@@ -3351,9 +3354,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "i-slint-core-macros"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4e66e7fc31239ceba98646825614df8148abc30f8326296c4d762008cc22ddff"
|
||||
checksum = "3a842640da4c4d0909d25cc5a51e1f9cde02bd48f7fdfa94df10d595d4e3c80a"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"serde_json",
|
||||
@@ -3362,9 +3365,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "i-slint-renderer-femtovg"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c1a430c5adbd652119a5d37673b424ce3516903e192d73848919153e503c6d4d"
|
||||
checksum = "78d0d99a18d66738b684758fe8460743a0aa0f64a96e05940942231a340085b1"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"const-field-offset",
|
||||
@@ -3385,9 +3388,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "i-slint-renderer-skia"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e1c8e1e1351ed5d3b40211b5a6e5a8597cd541726f94b880ed71693bdbe519c4"
|
||||
checksum = "7b6eed7f3f0a9a3d3ca6e8b9d4ca233371d989351fdb2a7ab88ec368b99e7b57"
|
||||
dependencies = [
|
||||
"ash",
|
||||
"bytemuck",
|
||||
@@ -3426,9 +3429,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "i-slint-renderer-software"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c5b4d1e212e5eed5a2ea7b7c693f152e6a50df84e2305060de13557e4b864d18"
|
||||
checksum = "73496f164f8e471877c35e0fadb996dcc674922712abd9c2be2cbe80c58859bd"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"clru",
|
||||
@@ -3945,11 +3948,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "jobserver"
|
||||
version = "0.1.34"
|
||||
version = "0.1.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
|
||||
checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3"
|
||||
dependencies = [
|
||||
"getrandom 0.3.4",
|
||||
"getrandom 0.4.3",
|
||||
"libc",
|
||||
]
|
||||
|
||||
@@ -4074,14 +4077,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "libredox"
|
||||
version = "0.1.17"
|
||||
version = "0.1.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3"
|
||||
checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652"
|
||||
dependencies = [
|
||||
"bitflags 2.13.0",
|
||||
"libc",
|
||||
"plain",
|
||||
"redox_syscall 0.8.1",
|
||||
"redox_syscall 0.9.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -4215,9 +4218,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "lzma-rust2"
|
||||
version = "0.16.4"
|
||||
version = "0.16.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ce716bf1a316f47a280fc76295f6495b5bea4752bca01c3b3885e101b1c23c02"
|
||||
checksum = "ca93e534d1142d1d0dcca6d25fe302508a5dfb40b302802904577725ea0b695b"
|
||||
dependencies = [
|
||||
"sha2 0.11.0",
|
||||
]
|
||||
@@ -4288,9 +4291,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.8.2"
|
||||
version = "2.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
|
||||
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
||||
|
||||
[[package]]
|
||||
name = "memmap2"
|
||||
@@ -4412,9 +4415,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "naga"
|
||||
version = "29.0.3"
|
||||
version = "29.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0dd91265cc2454558f659b3b4b9640f0ddb8cc6521277f166b8a8c181c898079"
|
||||
checksum = "b2bf919621e7975acb27d881bae2fb993e0d45c8e0446e85e6272971e00dc8df"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"bit-set",
|
||||
@@ -4579,14 +4582,24 @@ checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.6"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
|
||||
checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-complex"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-conv"
|
||||
version = "0.2.2"
|
||||
@@ -5065,13 +5078,12 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
|
||||
|
||||
[[package]]
|
||||
name = "open"
|
||||
version = "5.3.5"
|
||||
version = "5.3.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2fbaa89d2ddc8473c78a3adf69eea8cffa28c483b8e02a971ef31527cd0fc92c"
|
||||
checksum = "cd8d3b65c44123a56e0133d2cd06ce4361bd3ca99d41198b2f25e3c3db9b8b4a"
|
||||
dependencies = [
|
||||
"is-wsl",
|
||||
"libc",
|
||||
"pathdiff",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -5269,12 +5281,6 @@ version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec"
|
||||
|
||||
[[package]]
|
||||
name = "pathdiff"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
|
||||
|
||||
[[package]]
|
||||
name = "pbkdf2"
|
||||
version = "0.13.0"
|
||||
@@ -5670,10 +5676,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae"
|
||||
|
||||
[[package]]
|
||||
name = "pxfm"
|
||||
version = "0.1.29"
|
||||
name = "pulp"
|
||||
version = "0.22.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f"
|
||||
checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"cfg-if",
|
||||
"libm",
|
||||
"num-complex",
|
||||
"paste",
|
||||
"pulp-wasm-simd-flag",
|
||||
"raw-cpuid",
|
||||
"reborrow",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pulp-wasm-simd-flag"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740"
|
||||
|
||||
[[package]]
|
||||
name = "pxfm"
|
||||
version = "0.1.30"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea"
|
||||
|
||||
[[package]]
|
||||
name = "qoi"
|
||||
@@ -5697,7 +5726,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quick-xml"
|
||||
version = "0.41.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -5723,9 +5760,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
|
||||
|
||||
[[package]]
|
||||
name = "rancor"
|
||||
version = "0.1.1"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a063ea72381527c2a0561da9c80000ef822bdd7c3241b1cc1b12100e3df081ee"
|
||||
checksum = "daff8b7b3ccf5f7ba270b3e7a0a4d4c701c5797e38dec27c7e2c3dbb830fed1c"
|
||||
dependencies = [
|
||||
"ptr_meta",
|
||||
]
|
||||
@@ -5753,9 +5790,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.10.1"
|
||||
version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
|
||||
checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80"
|
||||
dependencies = [
|
||||
"chacha20 0.10.1",
|
||||
"getrandom 0.4.3",
|
||||
@@ -5863,6 +5900,15 @@ dependencies = [
|
||||
"rgb",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "raw-cpuid"
|
||||
version = "11.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186"
|
||||
dependencies = [
|
||||
"bitflags 2.13.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "raw-window-handle"
|
||||
version = "0.6.2"
|
||||
@@ -5925,6 +5971,12 @@ dependencies = [
|
||||
"font-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "reborrow"
|
||||
version = "0.5.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430"
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.4.1"
|
||||
@@ -5945,9 +5997,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.8.1"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b44b894f2a6e36457d665d1e08c3866add6ed5e70050c1b4ba8a8ddedb02ce7"
|
||||
checksum = "c5102a6aaa05aa011a238e178e6bca86d2cb56fc9f586d37cb80f5bca6e07759"
|
||||
dependencies = [
|
||||
"bitflags 2.13.0",
|
||||
]
|
||||
@@ -5965,9 +6017,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.12.4"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba"
|
||||
checksum = "2a0e75113e14dc5acb068cd0786884f214f1312650a3d36d269f5c4f3cdee8a2"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -5977,9 +6029,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.14"
|
||||
version = "0.4.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
||||
checksum = "1f388202e4b80542a0921078cc23b6333bcf1409c1e3f86404cae4766a6131db"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -5994,9 +6046,9 @@ checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
|
||||
|
||||
[[package]]
|
||||
name = "rend"
|
||||
version = "0.5.3"
|
||||
version = "0.5.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cadadef317c2f20755a64d7fdc48f9e7178ee6b0e1f7fce33fa60f1d68a276e6"
|
||||
checksum = "663ba70707f96e871406fe10d68128412e619b06d1d47cb91c3a4c6501176240"
|
||||
dependencies = [
|
||||
"bytecheck",
|
||||
]
|
||||
@@ -6126,9 +6178,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rkyv"
|
||||
version = "0.8.16"
|
||||
version = "0.8.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "73389e0c99e664f919275ab5b5b0471391fe9a8de61e1dff9b1eaf56a90f16e3"
|
||||
checksum = "815cc8a37159a463064825246cadb07961e25cd9885908606f6d08a98d8f8874"
|
||||
dependencies = [
|
||||
"bytecheck",
|
||||
"bytes",
|
||||
@@ -6145,9 +6197,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rkyv_derive"
|
||||
version = "0.8.16"
|
||||
version = "0.8.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5d2ed0b54125315fb36bd021e82d314d1c126548f871634b483f46b31d13cac6"
|
||||
checksum = "c0ed1a78a1b19d184b0daa629dd9a024573173ec7d485b287cb369fb3607cc1c"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -6228,9 +6280,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
||||
|
||||
[[package]]
|
||||
name = "rustc-hash"
|
||||
version = "2.1.2"
|
||||
version = "2.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
|
||||
checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
|
||||
|
||||
[[package]]
|
||||
name = "rustc_version"
|
||||
@@ -6313,9 +6365,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustls-pki-types"
|
||||
version = "1.14.1"
|
||||
version = "1.15.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9"
|
||||
checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046"
|
||||
dependencies = [
|
||||
"zeroize",
|
||||
]
|
||||
@@ -6343,9 +6395,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.22"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
||||
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
|
||||
|
||||
[[package]]
|
||||
name = "rustybuzz"
|
||||
@@ -6430,37 +6482,17 @@ dependencies = [
|
||||
"tiny-skia 0.11.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sdl3-image-src"
|
||||
version = "3.4.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fe273101c7dab94551183212eee9adef1a7bf274d407f0b7bfe72482960ab25c"
|
||||
|
||||
[[package]]
|
||||
name = "sdl3-image-sys"
|
||||
version = "0.6.4+SDL-image-3.4.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a445f781b39a1c1bc751f5f4612191e0402006e35ad5d02d9193281afad1cf4"
|
||||
dependencies = [
|
||||
"cmake",
|
||||
"pkg-config",
|
||||
"rpkg-config",
|
||||
"sdl3-image-src",
|
||||
"sdl3-sys",
|
||||
"vcpkg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sdl3-src"
|
||||
version = "3.4.10"
|
||||
version = "3.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed4dcad85f1657d3424642ca2ed8f9f185212975baefda8972ac606494755a62"
|
||||
checksum = "1f0adb191c684688f845f1dab6f5a2b36428885d01aa3afd7ec32faa3fb0b7ca"
|
||||
|
||||
[[package]]
|
||||
name = "sdl3-sys"
|
||||
version = "0.6.6+SDL-3.4.10"
|
||||
version = "0.6.7+SDL-3.4.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "04e7f134def04ed72e6f55187c6c29c72f7dab5d359c4be0dd49c9b97fef59c7"
|
||||
checksum = "e89cde1ff23eb110e348da9b5be904381235163272a424938a2c99c86ea33041"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"cmake",
|
||||
@@ -6648,9 +6680,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "sevenz-rust2"
|
||||
version = "0.21.1"
|
||||
version = "0.21.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "081a399c6762c4a9bda9233f502aca74b6ca6a0caaff4d218b12887eac4b6adc"
|
||||
checksum = "0b5d71c87d24cb22976f3f6e6c2c9296ef1f6958394e2b868d56ca01b082798a"
|
||||
dependencies = [
|
||||
"aes 0.9.1",
|
||||
"bzip2",
|
||||
@@ -6832,9 +6864,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
||||
|
||||
[[package]]
|
||||
name = "slint"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a54a407d1a0cbaa71d830ae7c236064b171368ea18db3b51ea3f2ce3f19519ee"
|
||||
checksum = "ce12038f57f8f3a423564b0c9301a2ab3fda4246e4cbadd6b97acf9124bdc315"
|
||||
dependencies = [
|
||||
"const-field-offset",
|
||||
"i-slint-backend-android-activity",
|
||||
@@ -6855,9 +6887,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "slint-build"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fc34415cacfde72e062d7e9c2bdd764429f5946870647c9f605fb7066a82015c"
|
||||
checksum = "76684c11441f775b10bbc7b0e6b3016a39f17efdd659ffca112f17cfd6bdaed1"
|
||||
dependencies = [
|
||||
"derive_more",
|
||||
"fontique",
|
||||
@@ -6868,9 +6900,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "slint-macros"
|
||||
version = "1.17.0"
|
||||
version = "1.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b74e0f959111e906199c743a3d7d59926f9d47823b462f6e6555bf8777275749"
|
||||
checksum = "9f2a763e72e1e53c496f571d36327e777da1eb0d9e58fceb83890c2a83ee7223"
|
||||
dependencies = [
|
||||
"i-slint-compiler",
|
||||
"proc-macro2",
|
||||
@@ -7367,9 +7399,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "time"
|
||||
version = "0.3.51"
|
||||
version = "0.3.53"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327"
|
||||
checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50"
|
||||
dependencies = [
|
||||
"deranged",
|
||||
"js-sys",
|
||||
@@ -7388,9 +7420,9 @@ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
|
||||
|
||||
[[package]]
|
||||
name = "time-macros"
|
||||
version = "0.2.30"
|
||||
version = "0.2.31"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935"
|
||||
checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f"
|
||||
dependencies = [
|
||||
"num-conv",
|
||||
"time-core",
|
||||
@@ -8254,7 +8286,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quick-xml",
|
||||
"quick-xml 0.39.4",
|
||||
"quote",
|
||||
]
|
||||
|
||||
@@ -8502,9 +8534,9 @@ checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
|
||||
|
||||
[[package]]
|
||||
name = "wgpu"
|
||||
version = "29.0.3"
|
||||
version = "29.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb3feacc458f7bee8bc1737149b42b6c731aa461039a4264a67bb6681646b250"
|
||||
checksum = "76e8840e1ba2881d4cbb18d2147627a56af426ff064c0401eb0c8410c6325d07"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"bitflags 2.13.0",
|
||||
@@ -8532,9 +8564,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-core"
|
||||
version = "29.0.3"
|
||||
version = "29.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02da3ad1b568337f25513b317870960ef87073ea0945502e44b864b67a8c77b7"
|
||||
checksum = "2f519832254e56965a9940c4af57dcb75f702b6f6fa4a0b172f685395843a4d7"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"bit-set",
|
||||
@@ -8565,36 +8597,36 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-core-deps-apple"
|
||||
version = "29.0.3"
|
||||
version = "29.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "62e51b5447e144b3dbba4feb01f80f4fa21696fa0cd99afb2c3df1affd6fdb28"
|
||||
checksum = "f5e39e26c4c0e07589e67d18546cf79ff45383659fc72fca4dd293358a0347f3"
|
||||
dependencies = [
|
||||
"wgpu-hal",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-core-deps-emscripten"
|
||||
version = "29.0.3"
|
||||
version = "29.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3487cd6293a963bc5c0c0396f6a2192043c50003c07f4efdccbad3d90ec9d819"
|
||||
checksum = "01e09be551dc939498bdd5f6b2c66e55ab275dad25825267a08605a80fc9f0af"
|
||||
dependencies = [
|
||||
"wgpu-hal",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-core-deps-windows-linux-android"
|
||||
version = "29.0.3"
|
||||
version = "29.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1bfb01076d0aa08b0ba9bd741e178b5cc440f5abe99d9581323a4c8b5d1a1916"
|
||||
checksum = "4e592c1bbef6ad047647ae6e666ebd8cee7a32bb4544d9700ec96cbf73230257"
|
||||
dependencies = [
|
||||
"wgpu-hal",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-hal"
|
||||
version = "29.0.3"
|
||||
version = "29.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "31f8e1a9e7a8512f276f7c62e018c7fa8d60954303fed2e5750114332049193f"
|
||||
checksum = "97ace1c17727311c22a46e4e3faf56ea6de81af99dcc839bdfb54857b94d448d"
|
||||
dependencies = [
|
||||
"android_system_properties",
|
||||
"arrayvec",
|
||||
@@ -8646,9 +8678,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-naga-bridge"
|
||||
version = "29.0.3"
|
||||
version = "29.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "59c654c483f058800972c3645e95388a7eca31bf9fe1933bc20e036588a0be02"
|
||||
checksum = "95226013f547544b223281cd16a4fb549aa9dcb562adbda0faae4c73ffbbc161"
|
||||
dependencies = [
|
||||
"naga",
|
||||
"wgpu-types",
|
||||
@@ -8656,9 +8688,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-types"
|
||||
version = "29.0.3"
|
||||
version = "29.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a9bcc31518a0e9735aefebedb5f7a9ef3ed1c42549c9f4c882fa9060ceaac639"
|
||||
checksum = "84bf84cd9ca8ca45e2b223a3868f1adf9bfc0c66aeac212e76ee7e40fdadf8f5"
|
||||
dependencies = [
|
||||
"bitflags 2.13.0",
|
||||
"bytemuck",
|
||||
@@ -9345,9 +9377,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zbus"
|
||||
version = "5.16.0"
|
||||
version = "5.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285"
|
||||
checksum = "a28b97f866896a4be7aefd2b5a8e01bb6773d19a775d54ab28b4d094b9a4480e"
|
||||
dependencies = [
|
||||
"async-broadcast",
|
||||
"async-executor",
|
||||
@@ -9404,9 +9436,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zbus_macros"
|
||||
version = "5.16.0"
|
||||
version = "5.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6"
|
||||
checksum = "5e05ad887425eecf5e8384dc2406a4a9313eb73468712fc1cdea362eb4fe0469"
|
||||
dependencies = [
|
||||
"proc-macro-crate",
|
||||
"proc-macro2",
|
||||
@@ -9419,9 +9451,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zbus_names"
|
||||
version = "4.3.2"
|
||||
version = "4.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d"
|
||||
checksum = "1039ca249fee9559680f3a9f05b55e0761fee51af4f6c1e7d8c1f31e549721d2"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"winnow",
|
||||
@@ -9430,12 +9462,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zbus_xml"
|
||||
version = "5.1.1"
|
||||
version = "5.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a8067892e940ed1727dea64690378601603b31d62dfde019a5335fbb7c0e0ed9"
|
||||
checksum = "59ab0513c0a66a60a8718d5ad712a5094845a20d95b5c1c81e2bd8e904a52b4f"
|
||||
dependencies = [
|
||||
"quick-xml",
|
||||
"serde",
|
||||
"winnow",
|
||||
"zbus_names",
|
||||
"zvariant",
|
||||
]
|
||||
@@ -9448,18 +9480,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524"
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.52"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f"
|
||||
checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.8.52"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930"
|
||||
checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -9571,9 +9603,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zlib-rs"
|
||||
version = "0.6.4"
|
||||
version = "0.6.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "977347db8caa080403f6b6b7c1cda9479a8e869316f7e13a59b19076a40f94e3"
|
||||
checksum = "b142a20ec14a91d5bc708c1dc21b080c550113d8aa77afa29635673a65dd02c5"
|
||||
|
||||
[[package]]
|
||||
name = "zmij"
|
||||
@@ -9647,9 +9679,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zvariant"
|
||||
version = "5.12.0"
|
||||
version = "5.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0"
|
||||
checksum = "7cf057bb00bf5c9ad77abb6147b0ca4818236a1858416e9d988e40d6322fefa7"
|
||||
dependencies = [
|
||||
"endi",
|
||||
"enumflags2",
|
||||
@@ -9661,9 +9693,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zvariant_derive"
|
||||
version = "5.12.0"
|
||||
version = "5.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737"
|
||||
checksum = "8118ca6bda77bfc0ab51d660db0c955f2505eef854c9a449435bccb616933b31"
|
||||
dependencies = [
|
||||
"proc-macro-crate",
|
||||
"proc-macro2",
|
||||
@@ -9674,9 +9706,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zvariant_utils"
|
||||
version = "3.4.0"
|
||||
version = "3.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6"
|
||||
checksum = "90cb9383f9b45290407a1258b202d3f8f01db719eb60b4e4055c6375af4fc7c7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
||||
+4
-5
@@ -1,8 +1,8 @@
|
||||
[package]
|
||||
name = "gopher64"
|
||||
version = "1.1.32"
|
||||
version = "1.1.34"
|
||||
edition = "2024"
|
||||
rust-version = "1.96.0"
|
||||
rust-version = "1.97.0"
|
||||
|
||||
[features]
|
||||
default = ["gui"]
|
||||
@@ -26,7 +26,7 @@ mimalloc = "0.1"
|
||||
regex = "1.11"
|
||||
tokio-tungstenite = { version = "0.29", features = ["native-tls-vendored"] }
|
||||
matchbox_socket = "0.14"
|
||||
ggrs = { git = "https://github.com/gschup/ggrs.git", features = ["sync-send"] }
|
||||
ggrs = { version = "0.13", features = ["sync-send"] }
|
||||
rustc-hash = "2.1"
|
||||
futures = "0.3"
|
||||
rand = { version = "0.10", features = ["serde"] }
|
||||
@@ -36,6 +36,7 @@ postcard = { version = "1.1", features = ["use-std"] }
|
||||
clap = { version = "4.5", features = ["derive"] }
|
||||
reqwest = { version = "0.13", default-features = false, features = ["native-tls-vendored", "charset", "http2", "system-proxy", "json", "query"] }
|
||||
discord-rich-presence = "1.1"
|
||||
quick-xml = "0.41"
|
||||
|
||||
[target.'cfg(not(target_os = "android"))'.dependencies]
|
||||
slint = { version = "1.16", default-features = false, features = ["compat-1-2", "std", "unstable-winit-030", "backend-winit", "renderer-femtovg-wgpu", "accessibility"], optional = true }
|
||||
@@ -44,14 +45,12 @@ dirs = "6.0"
|
||||
open = { version = "5.3", optional = true }
|
||||
sdl3-sys = { version = "0.6", features = ["build-from-source-static"] }
|
||||
sdl3-ttf-sys = { version = "0.6", features = ["build-static-vendored", "no-sdlttf-harfbuzz", "no-sdlttf-plutosvg"] }
|
||||
sdl3-image-sys = { version = "0.6", features = ["build-static-vendored"] }
|
||||
|
||||
[target.'cfg(target_os = "android")'.dependencies]
|
||||
slint = { version = "1.16", default-features = false, features = ["compat-1-2", "std", "backend-android-activity-06", "accessibility"], optional = true }
|
||||
jni = "0.22"
|
||||
sdl3-sys = { version = "0.6", features = ["build-from-source"] }
|
||||
sdl3-ttf-sys = { version = "0.6", features = ["build-from-source", "no-sdlttf-harfbuzz", "no-sdlttf-plutosvg"] }
|
||||
sdl3-image-sys = { version = "0.6", features = ["build-from-source"] }
|
||||
|
||||
[build-dependencies]
|
||||
winresource = "0.1"
|
||||
|
||||
@@ -68,7 +68,9 @@ flatpak run --filesystem=host:ro io.github.gopher64.gopher64 /path/to/rom.z64
|
||||
|
||||
## contributing
|
||||
|
||||
I am very open to contributions! Please contact me via a GitHub issue or Discord (loganmc10) before doing substantial work on a PR.
|
||||
PRs that are vibe coded and/or co-authored by AI agents (Plan/Agent mode) are not permitted. If you are going to submit a PR, it should be scoped to a single feature/improvement.
|
||||
|
||||
Please contact me via a GitHub issue or Discord (loganmc10) before doing substantial work on a PR.
|
||||
|
||||
## license
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@ class N64Activity : SDLActivity() {
|
||||
override fun getLibraries(): Array<String> = arrayOf(
|
||||
"SDL3",
|
||||
"SDL3_ttf",
|
||||
"SDL3_image",
|
||||
"gopher64"
|
||||
)
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gopher64\n"
|
||||
"POT-Creation-Date: 2026-06-16 12:26+0000\n"
|
||||
"POT-Creation-Date: 2026-06-30 09:43+0000\n"
|
||||
"PO-Revision-Date: 2026-05-11 12:00+0000\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: German\n"
|
||||
@@ -47,37 +47,37 @@ msgctxt "About"
|
||||
msgid "Donate (via GitHub)"
|
||||
msgstr "Spenden (über GitHub)"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:148
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
msgctxt "Menu"
|
||||
msgid "Local Game"
|
||||
msgstr "Lokales Spiel"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:152
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
msgctxt "Menu"
|
||||
msgid "Controller Config"
|
||||
msgstr "Controller-Konfiguration"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:156
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
msgctxt "Menu"
|
||||
msgid "Netplay"
|
||||
msgstr "Netplay"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:160
|
||||
#: src/ui/gui/appwindow.slint:176
|
||||
msgctxt "Menu"
|
||||
msgid "Cheats"
|
||||
msgstr "Cheats"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
#: src/ui/gui/appwindow.slint:180
|
||||
msgctxt "Menu"
|
||||
msgid "RetroAchievements"
|
||||
msgstr "RetroAchievements"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
#: src/ui/gui/appwindow.slint:184
|
||||
msgctxt "Menu"
|
||||
msgid "Settings"
|
||||
msgstr "Einstellungen"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
#: src/ui/gui/appwindow.slint:188
|
||||
msgctxt "Menu"
|
||||
msgid "About"
|
||||
msgstr "Über"
|
||||
@@ -486,71 +486,101 @@ msgctxt "RetroAchievements"
|
||||
msgid "View Supported Games"
|
||||
msgstr "Unterstützte Spiele anzeigen"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:24
|
||||
#: src/ui/gui/settings_page.slint:25
|
||||
msgctxt "Settings"
|
||||
msgid "Settings"
|
||||
msgstr "Einstellungen"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:35
|
||||
#: src/ui/gui/settings_page.slint:32
|
||||
msgctxt "Settings"
|
||||
msgid "Game"
|
||||
msgstr "Spiel"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:38
|
||||
msgctxt "Settings"
|
||||
msgid "Resolution:"
|
||||
msgstr "Auflösung:"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:49
|
||||
#: src/ui/gui/settings_page.slint:51
|
||||
msgctxt "Settings"
|
||||
msgid "SSAA downscaling"
|
||||
msgstr "SSAA-Herunterskalierung"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:57
|
||||
#: src/ui/gui/settings_page.slint:59
|
||||
msgctxt "Settings"
|
||||
msgid "Integer Scaling"
|
||||
msgstr "Pixelgenaue Skalierung"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:65
|
||||
#: src/ui/gui/settings_page.slint:67
|
||||
msgctxt "Settings"
|
||||
msgid "Fullscreen"
|
||||
msgstr "Vollbild"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:73
|
||||
#: src/ui/gui/settings_page.slint:75
|
||||
msgctxt "Settings"
|
||||
msgid "Widescreen (stretch)"
|
||||
msgstr "16:9 (gestreckt)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:81
|
||||
#: src/ui/gui/settings_page.slint:83
|
||||
msgctxt "Settings"
|
||||
msgid "VSync"
|
||||
msgstr "VSync"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:89
|
||||
#: src/ui/gui/settings_page.slint:91
|
||||
msgctxt "Settings"
|
||||
msgid "Apply CRT shader"
|
||||
msgstr "CRT-Shader anwenden"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:101
|
||||
#: src/ui/gui/settings_page.slint:103
|
||||
msgctxt "Settings"
|
||||
msgid "Overclock N64 CPU (may cause bugs)"
|
||||
msgstr "N64-CPU übertakten (kann Fehler verursachen)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:109
|
||||
#: src/ui/gui/settings_page.slint:111
|
||||
msgctxt "Settings"
|
||||
msgid "Disable Expansion Pak"
|
||||
msgstr "Expansion Pak deaktivieren"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:117
|
||||
#: src/ui/gui/settings_page.slint:119
|
||||
msgctxt "Settings"
|
||||
msgid "Enable Rewind"
|
||||
msgstr "Rewind aktivieren"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:125
|
||||
#: src/ui/gui/settings_page.slint:127
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate UNFLoader"
|
||||
msgstr "UNFLoader emulieren"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:133
|
||||
#: src/ui/gui/settings_page.slint:135
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate VRU"
|
||||
msgstr "VRU emulieren"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:144
|
||||
msgctxt "Settings"
|
||||
msgid "UI"
|
||||
msgstr "Benutzeroberfläche"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:150
|
||||
msgctxt "Settings"
|
||||
msgid "Theme:"
|
||||
msgstr "Thema:"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Dark"
|
||||
msgstr "Dunkel"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Light"
|
||||
msgstr "Hell"
|
||||
|
||||
#: src/ui/gui/vru_dialog.slint:7
|
||||
msgctxt "VruDialog"
|
||||
msgid "What Would You Like To Say?"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gopher64\n"
|
||||
"POT-Creation-Date: 2026-06-16 12:26+0000\n"
|
||||
"POT-Creation-Date: 2026-06-30 09:43+0000\n"
|
||||
"PO-Revision-Date: 2026-05-11 12:00+0000\n"
|
||||
"Last-Translator: Gemini\n"
|
||||
"Language-Team: Spanish (Spain)\n"
|
||||
@@ -47,37 +47,37 @@ msgctxt "About"
|
||||
msgid "Donate (via GitHub)"
|
||||
msgstr "Donar (a través de GitHub)"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:148
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
msgctxt "Menu"
|
||||
msgid "Local Game"
|
||||
msgstr "Juego local"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:152
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
msgctxt "Menu"
|
||||
msgid "Controller Config"
|
||||
msgstr "Config. del mando"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:156
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
msgctxt "Menu"
|
||||
msgid "Netplay"
|
||||
msgstr "Netplay"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:160
|
||||
#: src/ui/gui/appwindow.slint:176
|
||||
msgctxt "Menu"
|
||||
msgid "Cheats"
|
||||
msgstr "Trucos"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
#: src/ui/gui/appwindow.slint:180
|
||||
msgctxt "Menu"
|
||||
msgid "RetroAchievements"
|
||||
msgstr "RetroAchievements"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
#: src/ui/gui/appwindow.slint:184
|
||||
msgctxt "Menu"
|
||||
msgid "Settings"
|
||||
msgstr "Ajustes"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
#: src/ui/gui/appwindow.slint:188
|
||||
msgctxt "Menu"
|
||||
msgid "About"
|
||||
msgstr "Acerca de"
|
||||
@@ -399,8 +399,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Configurar un retardo de entrada demasiado bajo hará que el juego se "
|
||||
"ralentice.\n"
|
||||
"Puedes reducir el retardo de entrada en el juego pulsando Alt+[ y "
|
||||
"aumentarlo con Alt+]."
|
||||
"Puedes reducir el retardo de entrada en el juego pulsando Alt+[ y aumentarlo "
|
||||
"con Alt+]."
|
||||
|
||||
#: src/ui/gui/netplay_wait.slint:101
|
||||
msgctxt "NetplayWait"
|
||||
@@ -487,71 +487,101 @@ msgctxt "RetroAchievements"
|
||||
msgid "View Supported Games"
|
||||
msgstr "Ver juegos compatibles"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:24
|
||||
#: src/ui/gui/settings_page.slint:25
|
||||
msgctxt "Settings"
|
||||
msgid "Settings"
|
||||
msgstr "Ajustes"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:35
|
||||
#: src/ui/gui/settings_page.slint:32
|
||||
msgctxt "Settings"
|
||||
msgid "Game"
|
||||
msgstr "Juego"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:38
|
||||
msgctxt "Settings"
|
||||
msgid "Resolution:"
|
||||
msgstr "Resolución:"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:49
|
||||
#: src/ui/gui/settings_page.slint:51
|
||||
msgctxt "Settings"
|
||||
msgid "SSAA downscaling"
|
||||
msgstr "Reducción de escala SSAA"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:57
|
||||
#: src/ui/gui/settings_page.slint:59
|
||||
msgctxt "Settings"
|
||||
msgid "Integer Scaling"
|
||||
msgstr "Escalado por enteros"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:65
|
||||
#: src/ui/gui/settings_page.slint:67
|
||||
msgctxt "Settings"
|
||||
msgid "Fullscreen"
|
||||
msgstr "Pantalla completa"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:73
|
||||
#: src/ui/gui/settings_page.slint:75
|
||||
msgctxt "Settings"
|
||||
msgid "Widescreen (stretch)"
|
||||
msgstr "Pantalla ancha (estirado)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:81
|
||||
#: src/ui/gui/settings_page.slint:83
|
||||
msgctxt "Settings"
|
||||
msgid "VSync"
|
||||
msgstr "Sincronización vertical (VSync)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:89
|
||||
#: src/ui/gui/settings_page.slint:91
|
||||
msgctxt "Settings"
|
||||
msgid "Apply CRT shader"
|
||||
msgstr "Aplicar sombreador CRT"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:101
|
||||
#: src/ui/gui/settings_page.slint:103
|
||||
msgctxt "Settings"
|
||||
msgid "Overclock N64 CPU (may cause bugs)"
|
||||
msgstr "Overclock CPU N64 (puede causar errores)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:109
|
||||
#: src/ui/gui/settings_page.slint:111
|
||||
msgctxt "Settings"
|
||||
msgid "Disable Expansion Pak"
|
||||
msgstr "Desactivar Expansion Pak"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:117
|
||||
#: src/ui/gui/settings_page.slint:119
|
||||
msgctxt "Settings"
|
||||
msgid "Enable Rewind"
|
||||
msgstr "Activar rebobinado"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:125
|
||||
#: src/ui/gui/settings_page.slint:127
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate UNFLoader"
|
||||
msgstr "Emular UNFLoader"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:133
|
||||
#: src/ui/gui/settings_page.slint:135
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate VRU"
|
||||
msgstr "Emular VRU"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:144
|
||||
msgctxt "Settings"
|
||||
msgid "UI"
|
||||
msgstr "Interfaz"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:150
|
||||
msgctxt "Settings"
|
||||
msgid "Theme:"
|
||||
msgstr "Tema:"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "System"
|
||||
msgstr "Sistema"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Dark"
|
||||
msgstr "Oscuro"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Light"
|
||||
msgstr "Claro"
|
||||
|
||||
#: src/ui/gui/vru_dialog.slint:7
|
||||
msgctxt "VruDialog"
|
||||
msgid "What Would You Like To Say?"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gopher64\n"
|
||||
"POT-Creation-Date: 2026-06-16 12:26+0000\n"
|
||||
"POT-Creation-Date: 2026-06-30 09:43+0000\n"
|
||||
"PO-Revision-Date: 2026-05-11 12:00+0000\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: French (France)\n"
|
||||
@@ -47,37 +47,37 @@ msgctxt "About"
|
||||
msgid "Donate (via GitHub)"
|
||||
msgstr "Faire un don (via GitHub)"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:148
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
msgctxt "Menu"
|
||||
msgid "Local Game"
|
||||
msgstr "Jeu local"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:152
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
msgctxt "Menu"
|
||||
msgid "Controller Config"
|
||||
msgstr "Configuration manette"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:156
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
msgctxt "Menu"
|
||||
msgid "Netplay"
|
||||
msgstr "Netplay"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:160
|
||||
#: src/ui/gui/appwindow.slint:176
|
||||
msgctxt "Menu"
|
||||
msgid "Cheats"
|
||||
msgstr "Triche"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
#: src/ui/gui/appwindow.slint:180
|
||||
msgctxt "Menu"
|
||||
msgid "RetroAchievements"
|
||||
msgstr "RetroAchievements"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
#: src/ui/gui/appwindow.slint:184
|
||||
msgctxt "Menu"
|
||||
msgid "Settings"
|
||||
msgstr "Paramètres"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
#: src/ui/gui/appwindow.slint:188
|
||||
msgctxt "Menu"
|
||||
msgid "About"
|
||||
msgstr "À propos"
|
||||
@@ -399,8 +399,8 @@ msgid ""
|
||||
"Alt+]."
|
||||
msgstr ""
|
||||
"Régler le délai d'entrée trop bas provoquera des ralentissements.\n"
|
||||
"Vous pouvez diminuer le délai d'entrée en jeu avec Alt+[ et l'augmenter "
|
||||
"avec Alt+]."
|
||||
"Vous pouvez diminuer le délai d'entrée en jeu avec Alt+[ et l'augmenter avec "
|
||||
"Alt+]."
|
||||
|
||||
#: src/ui/gui/netplay_wait.slint:101
|
||||
msgctxt "NetplayWait"
|
||||
@@ -487,71 +487,101 @@ msgctxt "RetroAchievements"
|
||||
msgid "View Supported Games"
|
||||
msgstr "Voir les jeux pris en charge"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:24
|
||||
#: src/ui/gui/settings_page.slint:25
|
||||
msgctxt "Settings"
|
||||
msgid "Settings"
|
||||
msgstr "Paramètres"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:35
|
||||
#: src/ui/gui/settings_page.slint:32
|
||||
msgctxt "Settings"
|
||||
msgid "Game"
|
||||
msgstr "Jeu"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:38
|
||||
msgctxt "Settings"
|
||||
msgid "Resolution:"
|
||||
msgstr "Résolution :"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:49
|
||||
#: src/ui/gui/settings_page.slint:51
|
||||
msgctxt "Settings"
|
||||
msgid "SSAA downscaling"
|
||||
msgstr "Réduction SSAA"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:57
|
||||
#: src/ui/gui/settings_page.slint:59
|
||||
msgctxt "Settings"
|
||||
msgid "Integer Scaling"
|
||||
msgstr "Mise à l'échelle par entiers"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:65
|
||||
#: src/ui/gui/settings_page.slint:67
|
||||
msgctxt "Settings"
|
||||
msgid "Fullscreen"
|
||||
msgstr "Plein écran"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:73
|
||||
#: src/ui/gui/settings_page.slint:75
|
||||
msgctxt "Settings"
|
||||
msgid "Widescreen (stretch)"
|
||||
msgstr "Écran large (étiré)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:81
|
||||
#: src/ui/gui/settings_page.slint:83
|
||||
msgctxt "Settings"
|
||||
msgid "VSync"
|
||||
msgstr "Synchro verticale"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:89
|
||||
#: src/ui/gui/settings_page.slint:91
|
||||
msgctxt "Settings"
|
||||
msgid "Apply CRT shader"
|
||||
msgstr "Appliquer le filtre CRT"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:101
|
||||
#: src/ui/gui/settings_page.slint:103
|
||||
msgctxt "Settings"
|
||||
msgid "Overclock N64 CPU (may cause bugs)"
|
||||
msgstr "Surcharger le CPU N64 (risque de bugs)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:109
|
||||
#: src/ui/gui/settings_page.slint:111
|
||||
msgctxt "Settings"
|
||||
msgid "Disable Expansion Pak"
|
||||
msgstr "Désactiver l'Expansion Pak"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:117
|
||||
#: src/ui/gui/settings_page.slint:119
|
||||
msgctxt "Settings"
|
||||
msgid "Enable Rewind"
|
||||
msgstr "Activer le rembobinage"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:125
|
||||
#: src/ui/gui/settings_page.slint:127
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate UNFLoader"
|
||||
msgstr "Émuler UNFLoader"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:133
|
||||
#: src/ui/gui/settings_page.slint:135
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate VRU"
|
||||
msgstr "Émuler le VRU"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:144
|
||||
msgctxt "Settings"
|
||||
msgid "UI"
|
||||
msgstr "Interface"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:150
|
||||
msgctxt "Settings"
|
||||
msgid "Theme:"
|
||||
msgstr "Thème :"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "System"
|
||||
msgstr "Système"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Dark"
|
||||
msgstr "Sombre"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Light"
|
||||
msgstr "Clair"
|
||||
|
||||
#: src/ui/gui/vru_dialog.slint:7
|
||||
msgctxt "VruDialog"
|
||||
msgid "What Would You Like To Say?"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2026-06-16 12:26+0000\n"
|
||||
"POT-Creation-Date: 2026-06-30 09:43+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -47,37 +47,37 @@ msgctxt "About"
|
||||
msgid "Donate (via GitHub)"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/appwindow.slint:148
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
msgctxt "Menu"
|
||||
msgid "Local Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/appwindow.slint:152
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
msgctxt "Menu"
|
||||
msgid "Controller Config"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/appwindow.slint:156
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
msgctxt "Menu"
|
||||
msgid "Netplay"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/appwindow.slint:160
|
||||
#: src/ui/gui/appwindow.slint:176
|
||||
msgctxt "Menu"
|
||||
msgid "Cheats"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
#: src/ui/gui/appwindow.slint:180
|
||||
msgctxt "Menu"
|
||||
msgid "RetroAchievements"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
#: src/ui/gui/appwindow.slint:184
|
||||
msgctxt "Menu"
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
#: src/ui/gui/appwindow.slint:188
|
||||
msgctxt "Menu"
|
||||
msgid "About"
|
||||
msgstr ""
|
||||
@@ -480,71 +480,101 @@ msgctxt "RetroAchievements"
|
||||
msgid "View Supported Games"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:24
|
||||
#: src/ui/gui/settings_page.slint:25
|
||||
msgctxt "Settings"
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:35
|
||||
#: src/ui/gui/settings_page.slint:32
|
||||
msgctxt "Settings"
|
||||
msgid "Game"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:38
|
||||
msgctxt "Settings"
|
||||
msgid "Resolution:"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:49
|
||||
#: src/ui/gui/settings_page.slint:51
|
||||
msgctxt "Settings"
|
||||
msgid "SSAA downscaling"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:57
|
||||
#: src/ui/gui/settings_page.slint:59
|
||||
msgctxt "Settings"
|
||||
msgid "Integer Scaling"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:65
|
||||
#: src/ui/gui/settings_page.slint:67
|
||||
msgctxt "Settings"
|
||||
msgid "Fullscreen"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:73
|
||||
#: src/ui/gui/settings_page.slint:75
|
||||
msgctxt "Settings"
|
||||
msgid "Widescreen (stretch)"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:81
|
||||
#: src/ui/gui/settings_page.slint:83
|
||||
msgctxt "Settings"
|
||||
msgid "VSync"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:89
|
||||
#: src/ui/gui/settings_page.slint:91
|
||||
msgctxt "Settings"
|
||||
msgid "Apply CRT shader"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:101
|
||||
#: src/ui/gui/settings_page.slint:103
|
||||
msgctxt "Settings"
|
||||
msgid "Overclock N64 CPU (may cause bugs)"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:109
|
||||
#: src/ui/gui/settings_page.slint:111
|
||||
msgctxt "Settings"
|
||||
msgid "Disable Expansion Pak"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:117
|
||||
#: src/ui/gui/settings_page.slint:119
|
||||
msgctxt "Settings"
|
||||
msgid "Enable Rewind"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:125
|
||||
#: src/ui/gui/settings_page.slint:127
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate UNFLoader"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:133
|
||||
#: src/ui/gui/settings_page.slint:135
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate VRU"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:144
|
||||
msgctxt "Settings"
|
||||
msgid "UI"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:150
|
||||
msgctxt "Settings"
|
||||
msgid "Theme:"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "System"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Dark"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Light"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui/gui/vru_dialog.slint:7
|
||||
msgctxt "VruDialog"
|
||||
msgid "What Would You Like To Say?"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gopher64\n"
|
||||
"POT-Creation-Date: 2026-06-16 12:26+0000\n"
|
||||
"POT-Creation-Date: 2026-06-30 09:43+0000\n"
|
||||
"PO-Revision-Date: 2026-05-11 12:00+0000\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Japanese\n"
|
||||
@@ -47,37 +47,37 @@ msgctxt "About"
|
||||
msgid "Donate (via GitHub)"
|
||||
msgstr "GitHubで寄付"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:148
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
msgctxt "Menu"
|
||||
msgid "Local Game"
|
||||
msgstr "ローカルゲーム"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:152
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
msgctxt "Menu"
|
||||
msgid "Controller Config"
|
||||
msgstr "コントローラー設定"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:156
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
msgctxt "Menu"
|
||||
msgid "Netplay"
|
||||
msgstr "ネットプレイ"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:160
|
||||
#: src/ui/gui/appwindow.slint:176
|
||||
msgctxt "Menu"
|
||||
msgid "Cheats"
|
||||
msgstr "チート"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
#: src/ui/gui/appwindow.slint:180
|
||||
msgctxt "Menu"
|
||||
msgid "RetroAchievements"
|
||||
msgstr "RetroAchievements"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
#: src/ui/gui/appwindow.slint:184
|
||||
msgctxt "Menu"
|
||||
msgid "Settings"
|
||||
msgstr "設定"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
#: src/ui/gui/appwindow.slint:188
|
||||
msgctxt "Menu"
|
||||
msgid "About"
|
||||
msgstr "バージョン情報"
|
||||
@@ -483,71 +483,101 @@ msgctxt "RetroAchievements"
|
||||
msgid "View Supported Games"
|
||||
msgstr "対応ゲームを表示"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:24
|
||||
#: src/ui/gui/settings_page.slint:25
|
||||
msgctxt "Settings"
|
||||
msgid "Settings"
|
||||
msgstr "設定"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:35
|
||||
#: src/ui/gui/settings_page.slint:32
|
||||
msgctxt "Settings"
|
||||
msgid "Game"
|
||||
msgstr "ゲーム"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:38
|
||||
msgctxt "Settings"
|
||||
msgid "Resolution:"
|
||||
msgstr "解像度:"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:49
|
||||
#: src/ui/gui/settings_page.slint:51
|
||||
msgctxt "Settings"
|
||||
msgid "SSAA downscaling"
|
||||
msgstr "SSAAダウンスケール"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:57
|
||||
#: src/ui/gui/settings_page.slint:59
|
||||
msgctxt "Settings"
|
||||
msgid "Integer Scaling"
|
||||
msgstr "整数倍スケーリング"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:65
|
||||
#: src/ui/gui/settings_page.slint:67
|
||||
msgctxt "Settings"
|
||||
msgid "Fullscreen"
|
||||
msgstr "全画面表示"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:73
|
||||
#: src/ui/gui/settings_page.slint:75
|
||||
msgctxt "Settings"
|
||||
msgid "Widescreen (stretch)"
|
||||
msgstr "ワイド画面(伸ばす)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:81
|
||||
#: src/ui/gui/settings_page.slint:83
|
||||
msgctxt "Settings"
|
||||
msgid "VSync"
|
||||
msgstr "垂直同期(VSync)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:89
|
||||
#: src/ui/gui/settings_page.slint:91
|
||||
msgctxt "Settings"
|
||||
msgid "Apply CRT shader"
|
||||
msgstr "CRTシェーダーを適用"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:101
|
||||
#: src/ui/gui/settings_page.slint:103
|
||||
msgctxt "Settings"
|
||||
msgid "Overclock N64 CPU (may cause bugs)"
|
||||
msgstr "N64のCPUをオーバークロック(不具合の原因になることがあります)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:109
|
||||
#: src/ui/gui/settings_page.slint:111
|
||||
msgctxt "Settings"
|
||||
msgid "Disable Expansion Pak"
|
||||
msgstr "拡張パックを無効にする"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:117
|
||||
#: src/ui/gui/settings_page.slint:119
|
||||
msgctxt "Settings"
|
||||
msgid "Enable Rewind"
|
||||
msgstr "巻き戻しを有効にする"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:125
|
||||
#: src/ui/gui/settings_page.slint:127
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate UNFLoader"
|
||||
msgstr "UNFLoaderをエミュレート"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:133
|
||||
#: src/ui/gui/settings_page.slint:135
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate VRU"
|
||||
msgstr "VRUをエミュレート"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:144
|
||||
msgctxt "Settings"
|
||||
msgid "UI"
|
||||
msgstr "UI"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:150
|
||||
msgctxt "Settings"
|
||||
msgid "Theme:"
|
||||
msgstr "テーマ:"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "System"
|
||||
msgstr "システム"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Dark"
|
||||
msgstr "ダーク"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Light"
|
||||
msgstr "ライト"
|
||||
|
||||
#: src/ui/gui/vru_dialog.slint:7
|
||||
msgctxt "VruDialog"
|
||||
msgid "What Would You Like To Say?"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gopher64\n"
|
||||
"POT-Creation-Date: 2026-06-16 12:26+0000\n"
|
||||
"POT-Creation-Date: 2026-06-30 09:43+0000\n"
|
||||
"PO-Revision-Date: 2026-05-11 12:00+0000\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Dutch (Netherlands)\n"
|
||||
@@ -47,37 +47,37 @@ msgctxt "About"
|
||||
msgid "Donate (via GitHub)"
|
||||
msgstr "Doneren (via GitHub)"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:148
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
msgctxt "Menu"
|
||||
msgid "Local Game"
|
||||
msgstr "Lokaal spel"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:152
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
msgctxt "Menu"
|
||||
msgid "Controller Config"
|
||||
msgstr "Controllerconfiguratie"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:156
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
msgctxt "Menu"
|
||||
msgid "Netplay"
|
||||
msgstr "Netplay"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:160
|
||||
#: src/ui/gui/appwindow.slint:176
|
||||
msgctxt "Menu"
|
||||
msgid "Cheats"
|
||||
msgstr "Cheats"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
#: src/ui/gui/appwindow.slint:180
|
||||
msgctxt "Menu"
|
||||
msgid "RetroAchievements"
|
||||
msgstr "RetroAchievements"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
#: src/ui/gui/appwindow.slint:184
|
||||
msgctxt "Menu"
|
||||
msgid "Settings"
|
||||
msgstr "Instellingen"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
#: src/ui/gui/appwindow.slint:188
|
||||
msgctxt "Menu"
|
||||
msgid "About"
|
||||
msgstr "Over"
|
||||
@@ -486,71 +486,101 @@ msgctxt "RetroAchievements"
|
||||
msgid "View Supported Games"
|
||||
msgstr "Ondersteunde spellen bekijken"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:24
|
||||
#: src/ui/gui/settings_page.slint:25
|
||||
msgctxt "Settings"
|
||||
msgid "Settings"
|
||||
msgstr "Instellingen"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:35
|
||||
#: src/ui/gui/settings_page.slint:32
|
||||
msgctxt "Settings"
|
||||
msgid "Game"
|
||||
msgstr "Spel"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:38
|
||||
msgctxt "Settings"
|
||||
msgid "Resolution:"
|
||||
msgstr "Resolutie:"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:49
|
||||
#: src/ui/gui/settings_page.slint:51
|
||||
msgctxt "Settings"
|
||||
msgid "SSAA downscaling"
|
||||
msgstr "SSAA-downscaling"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:57
|
||||
#: src/ui/gui/settings_page.slint:59
|
||||
msgctxt "Settings"
|
||||
msgid "Integer Scaling"
|
||||
msgstr "Schalen in hele getallen"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:65
|
||||
#: src/ui/gui/settings_page.slint:67
|
||||
msgctxt "Settings"
|
||||
msgid "Fullscreen"
|
||||
msgstr "Volledig scherm"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:73
|
||||
#: src/ui/gui/settings_page.slint:75
|
||||
msgctxt "Settings"
|
||||
msgid "Widescreen (stretch)"
|
||||
msgstr "Breedbeeld (uitgerekt)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:81
|
||||
#: src/ui/gui/settings_page.slint:83
|
||||
msgctxt "Settings"
|
||||
msgid "VSync"
|
||||
msgstr "VSync"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:89
|
||||
#: src/ui/gui/settings_page.slint:91
|
||||
msgctxt "Settings"
|
||||
msgid "Apply CRT shader"
|
||||
msgstr "CRT-shader toepassen"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:101
|
||||
#: src/ui/gui/settings_page.slint:103
|
||||
msgctxt "Settings"
|
||||
msgid "Overclock N64 CPU (may cause bugs)"
|
||||
msgstr "N64-CPU overklokken (kan bugs veroorzaken)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:109
|
||||
#: src/ui/gui/settings_page.slint:111
|
||||
msgctxt "Settings"
|
||||
msgid "Disable Expansion Pak"
|
||||
msgstr "Expansion Pak uitschakelen"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:117
|
||||
#: src/ui/gui/settings_page.slint:119
|
||||
msgctxt "Settings"
|
||||
msgid "Enable Rewind"
|
||||
msgstr "Terugspoelen inschakelen"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:125
|
||||
#: src/ui/gui/settings_page.slint:127
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate UNFLoader"
|
||||
msgstr "UNFLoader emuleren"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:133
|
||||
#: src/ui/gui/settings_page.slint:135
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate VRU"
|
||||
msgstr "VRU emuleren"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:144
|
||||
msgctxt "Settings"
|
||||
msgid "UI"
|
||||
msgstr "Interface"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:150
|
||||
msgctxt "Settings"
|
||||
msgid "Theme:"
|
||||
msgstr "Thema:"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "System"
|
||||
msgstr "Systeem"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Dark"
|
||||
msgstr "Donker"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Light"
|
||||
msgstr "Licht"
|
||||
|
||||
#: src/ui/gui/vru_dialog.slint:7
|
||||
msgctxt "VruDialog"
|
||||
msgid "What Would You Like To Say?"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2026-06-16 12:26+0000\n"
|
||||
"POT-Creation-Date: 2026-06-30 09:43+0000\n"
|
||||
"PO-Revision-Date: 2026-05-11 18:11-3000\n"
|
||||
"Last-Translator: EDUARDO CARVALHO <eduardotcarvalho@gmail.com>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -10,7 +10,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: src/ui/gui/about_page.slint:17
|
||||
msgctxt "NewVersionButton"
|
||||
@@ -47,37 +47,37 @@ msgctxt "About"
|
||||
msgid "Donate (via GitHub)"
|
||||
msgstr "Doações (via GitHub)"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:148
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
msgctxt "Menu"
|
||||
msgid "Local Game"
|
||||
msgstr "Jogo Local"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:152
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
msgctxt "Menu"
|
||||
msgid "Controller Config"
|
||||
msgstr "Configurar Controle"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:156
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
msgctxt "Menu"
|
||||
msgid "Netplay"
|
||||
msgstr "Netplay"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:160
|
||||
#: src/ui/gui/appwindow.slint:176
|
||||
msgctxt "Menu"
|
||||
msgid "Cheats"
|
||||
msgstr "Trapaças"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
#: src/ui/gui/appwindow.slint:180
|
||||
msgctxt "Menu"
|
||||
msgid "RetroAchievements"
|
||||
msgstr "RetroAchievements"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
#: src/ui/gui/appwindow.slint:184
|
||||
msgctxt "Menu"
|
||||
msgid "Settings"
|
||||
msgstr "Configurações"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
#: src/ui/gui/appwindow.slint:188
|
||||
msgctxt "Menu"
|
||||
msgid "About"
|
||||
msgstr "Sobre"
|
||||
@@ -180,7 +180,7 @@ msgstr "Abrir ROM"
|
||||
#: src/ui/gui/localgame_page.slint:37
|
||||
msgctxt "LocalGame"
|
||||
msgid "Open Saves Folder"
|
||||
msgstr "Abrir Partes de Saves"
|
||||
msgstr "Abrir Pasta de Saves"
|
||||
|
||||
#: src/ui/gui/localgame_page.slint:54
|
||||
msgctxt "LocalGame"
|
||||
@@ -200,7 +200,7 @@ msgstr "Nome da Sessão:"
|
||||
#: src/ui/gui/netplay_create.slint:26
|
||||
msgctxt "NetplayCreate"
|
||||
msgid "Enter session name"
|
||||
msgstr "Insira nome da sessão:"
|
||||
msgstr "Insira nome da sessão"
|
||||
|
||||
#: src/ui/gui/netplay_create.slint:36
|
||||
msgctxt "NetplayCreate"
|
||||
@@ -364,7 +364,7 @@ msgstr "Nome do Jogo:"
|
||||
#: src/ui/gui/netplay_wait.slint:45
|
||||
msgctxt "NetplayWait"
|
||||
msgid "Player 1:"
|
||||
msgstr "Jogador 1"
|
||||
msgstr "Jogador 1:"
|
||||
|
||||
#: src/ui/gui/netplay_wait.slint:49
|
||||
msgctxt "NetplayWait"
|
||||
@@ -399,8 +399,8 @@ msgid ""
|
||||
"Alt+]."
|
||||
msgstr ""
|
||||
"Definir o atraso de entrada muito baixo causará lag no jogo.\n"
|
||||
"Você pode diminuir o atraso de entrada no jogo pressionando Alt+[ e "
|
||||
"aumentá-lo com Alt+]."
|
||||
"Você pode diminuir o atraso de entrada no jogo pressionando Alt+[ e aumentá-"
|
||||
"lo com Alt+]."
|
||||
|
||||
#: src/ui/gui/netplay_wait.slint:101
|
||||
msgctxt "NetplayWait"
|
||||
@@ -487,71 +487,101 @@ msgctxt "RetroAchievements"
|
||||
msgid "View Supported Games"
|
||||
msgstr "Ver Jogos com Suporte"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:24
|
||||
#: src/ui/gui/settings_page.slint:25
|
||||
msgctxt "Settings"
|
||||
msgid "Settings"
|
||||
msgstr "Configurações"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:35
|
||||
#: src/ui/gui/settings_page.slint:32
|
||||
msgctxt "Settings"
|
||||
msgid "Game"
|
||||
msgstr "Jogo"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:38
|
||||
msgctxt "Settings"
|
||||
msgid "Resolution:"
|
||||
msgstr "Resolução:"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:49
|
||||
#: src/ui/gui/settings_page.slint:51
|
||||
msgctxt "Settings"
|
||||
msgid "SSAA downscaling"
|
||||
msgstr "Redução de SSAA"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:57
|
||||
#: src/ui/gui/settings_page.slint:59
|
||||
msgctxt "Settings"
|
||||
msgid "Integer Scaling"
|
||||
msgstr "Proporção Íntegra"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:65
|
||||
#: src/ui/gui/settings_page.slint:67
|
||||
msgctxt "Settings"
|
||||
msgid "Fullscreen"
|
||||
msgstr "Tela Cheia"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:73
|
||||
#: src/ui/gui/settings_page.slint:75
|
||||
msgctxt "Settings"
|
||||
msgid "Widescreen (stretch)"
|
||||
msgstr "Widescreen (esticar)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:81
|
||||
#: src/ui/gui/settings_page.slint:83
|
||||
msgctxt "Settings"
|
||||
msgid "VSync"
|
||||
msgstr "VSync"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:89
|
||||
#: src/ui/gui/settings_page.slint:91
|
||||
msgctxt "Settings"
|
||||
msgid "Apply CRT shader"
|
||||
msgstr "Aplicar filtro de CRT"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:101
|
||||
#: src/ui/gui/settings_page.slint:103
|
||||
msgctxt "Settings"
|
||||
msgid "Overclock N64 CPU (may cause bugs)"
|
||||
msgstr "Overclock da CPU do N64 (pode causar bugs)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:109
|
||||
#: src/ui/gui/settings_page.slint:111
|
||||
msgctxt "Settings"
|
||||
msgid "Disable Expansion Pak"
|
||||
msgstr "Desabilitar Expansion Pak"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:117
|
||||
#: src/ui/gui/settings_page.slint:119
|
||||
msgctxt "Settings"
|
||||
msgid "Enable Rewind"
|
||||
msgstr "Habilitar rebobinamento"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:125
|
||||
#: src/ui/gui/settings_page.slint:127
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate UNFLoader"
|
||||
msgstr "Emular UNFLoader"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:133
|
||||
#: src/ui/gui/settings_page.slint:135
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate VRU"
|
||||
msgstr "Emular VRU"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:144
|
||||
msgctxt "Settings"
|
||||
msgid "UI"
|
||||
msgstr "Interface"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:150
|
||||
msgctxt "Settings"
|
||||
msgid "Theme:"
|
||||
msgstr "Tema:"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "System"
|
||||
msgstr "Sistema"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Dark"
|
||||
msgstr "Escuro"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Light"
|
||||
msgstr "Claro"
|
||||
|
||||
#: src/ui/gui/vru_dialog.slint:7
|
||||
msgctxt "VruDialog"
|
||||
msgid "What Would You Like To Say?"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gopher64\n"
|
||||
"POT-Creation-Date: 2026-06-16 12:26+0000\n"
|
||||
"POT-Creation-Date: 2026-06-30 09:43+0000\n"
|
||||
"PO-Revision-Date: 2026-05-11 12:00+0000\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Russian\n"
|
||||
@@ -10,7 +10,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: src/ui/gui/about_page.slint:17
|
||||
msgctxt "NewVersionButton"
|
||||
@@ -47,37 +48,37 @@ msgctxt "About"
|
||||
msgid "Donate (via GitHub)"
|
||||
msgstr "Пожертвовать (через GitHub)"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:148
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
msgctxt "Menu"
|
||||
msgid "Local Game"
|
||||
msgstr "Локальная игра"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:152
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
msgctxt "Menu"
|
||||
msgid "Controller Config"
|
||||
msgstr "Настройка контроллера"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:156
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
msgctxt "Menu"
|
||||
msgid "Netplay"
|
||||
msgstr "Сетевая игра"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:160
|
||||
#: src/ui/gui/appwindow.slint:176
|
||||
msgctxt "Menu"
|
||||
msgid "Cheats"
|
||||
msgstr "Читы"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:164
|
||||
#: src/ui/gui/appwindow.slint:180
|
||||
msgctxt "Menu"
|
||||
msgid "RetroAchievements"
|
||||
msgstr "RetroAchievements"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:168
|
||||
#: src/ui/gui/appwindow.slint:184
|
||||
msgctxt "Menu"
|
||||
msgid "Settings"
|
||||
msgstr "Настройки"
|
||||
|
||||
#: src/ui/gui/appwindow.slint:172
|
||||
#: src/ui/gui/appwindow.slint:188
|
||||
msgctxt "Menu"
|
||||
msgid "About"
|
||||
msgstr "О программе"
|
||||
@@ -485,71 +486,101 @@ msgctxt "RetroAchievements"
|
||||
msgid "View Supported Games"
|
||||
msgstr "Просмотреть поддерживаемые игры"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:24
|
||||
#: src/ui/gui/settings_page.slint:25
|
||||
msgctxt "Settings"
|
||||
msgid "Settings"
|
||||
msgstr "Настройки"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:35
|
||||
#: src/ui/gui/settings_page.slint:32
|
||||
msgctxt "Settings"
|
||||
msgid "Game"
|
||||
msgstr "Игра"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:38
|
||||
msgctxt "Settings"
|
||||
msgid "Resolution:"
|
||||
msgstr "Разрешение:"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:49
|
||||
#: src/ui/gui/settings_page.slint:51
|
||||
msgctxt "Settings"
|
||||
msgid "SSAA downscaling"
|
||||
msgstr "SSAA даунскейлинг"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:57
|
||||
#: src/ui/gui/settings_page.slint:59
|
||||
msgctxt "Settings"
|
||||
msgid "Integer Scaling"
|
||||
msgstr "Целочисленное масштабирование"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:65
|
||||
#: src/ui/gui/settings_page.slint:67
|
||||
msgctxt "Settings"
|
||||
msgid "Fullscreen"
|
||||
msgstr "Полноэкранный режим"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:73
|
||||
#: src/ui/gui/settings_page.slint:75
|
||||
msgctxt "Settings"
|
||||
msgid "Widescreen (stretch)"
|
||||
msgstr "Широкоэкранный режим (растянуто)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:81
|
||||
#: src/ui/gui/settings_page.slint:83
|
||||
msgctxt "Settings"
|
||||
msgid "VSync"
|
||||
msgstr "Вертикальная синхронизация"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:89
|
||||
#: src/ui/gui/settings_page.slint:91
|
||||
msgctxt "Settings"
|
||||
msgid "Apply CRT shader"
|
||||
msgstr "Применить шейдер ЭЛТ"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:101
|
||||
#: src/ui/gui/settings_page.slint:103
|
||||
msgctxt "Settings"
|
||||
msgid "Overclock N64 CPU (may cause bugs)"
|
||||
msgstr "Разгон процессора N64 (может вызвать ошибки)"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:109
|
||||
#: src/ui/gui/settings_page.slint:111
|
||||
msgctxt "Settings"
|
||||
msgid "Disable Expansion Pak"
|
||||
msgstr "Отключить Expansion Pak"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:117
|
||||
#: src/ui/gui/settings_page.slint:119
|
||||
msgctxt "Settings"
|
||||
msgid "Enable Rewind"
|
||||
msgstr "Включить перемотку назад"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:125
|
||||
#: src/ui/gui/settings_page.slint:127
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate UNFLoader"
|
||||
msgstr "Эмулировать UNFLoader"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:133
|
||||
#: src/ui/gui/settings_page.slint:135
|
||||
msgctxt "Settings"
|
||||
msgid "Emulate VRU"
|
||||
msgstr "Эмулировать VRU"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:144
|
||||
msgctxt "Settings"
|
||||
msgid "UI"
|
||||
msgstr "Интерфейс"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:150
|
||||
msgctxt "Settings"
|
||||
msgid "Theme:"
|
||||
msgstr "Тема:"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "System"
|
||||
msgstr "Система"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Dark"
|
||||
msgstr "Тёмная"
|
||||
|
||||
#: src/ui/gui/settings_page.slint:154
|
||||
msgctxt "Settings"
|
||||
msgid "Light"
|
||||
msgstr "Светлая"
|
||||
|
||||
#: src/ui/gui/vru_dialog.slint:7
|
||||
msgctxt "VruDialog"
|
||||
msgid "What Would You Like To Say?"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 1.0 MiB |
@@ -335,11 +335,11 @@ static void rdp_new_processor() {
|
||||
gfx_info.RDRAM_SIZE / 2, flags);
|
||||
g_tmem = processor->get_tmem();
|
||||
if (!g_tmem) {
|
||||
printf("Failed to get tmem\n");
|
||||
LOGE("Failed to get tmem\n");
|
||||
}
|
||||
g_hidden_rdram = processor->begin_read_hidden_rdram();
|
||||
if (!g_hidden_rdram) {
|
||||
printf("Failed to get hidden_rdram\n");
|
||||
LOGE("Failed to get hidden_rdram\n");
|
||||
}
|
||||
|
||||
sync_signal = 0;
|
||||
@@ -376,7 +376,7 @@ void rdp_init(void *_window, GFX_INFO _gfx_info, const void *font,
|
||||
SDL_SyncWindow(window);
|
||||
bool result = SDL_AddEventWatch(sdl_event_filter, nullptr);
|
||||
if (!result) {
|
||||
printf("Could not add event watch.\n");
|
||||
LOGE("Could not add event watch.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -692,7 +692,10 @@ void rdp_update_screen() {
|
||||
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED) {
|
||||
return;
|
||||
}
|
||||
wsi->end_frame();
|
||||
if (!wsi->end_frame()) {
|
||||
LOGE("End frame failed\n");
|
||||
SDL_PumpEvents(); // For Android to trigger pause event
|
||||
}
|
||||
wsi->begin_frame();
|
||||
}
|
||||
|
||||
@@ -787,7 +790,7 @@ uint32_t pixel_size(uint32_t pixel_type, uint32_t area) {
|
||||
case 3:
|
||||
return area * 4;
|
||||
default:
|
||||
printf("Invalid pixel size: %u\n", pixel_type);
|
||||
LOGE("Invalid pixel size: %u\n", pixel_type);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ uint32_t SDL_WSIPlatform::get_surface_height() {
|
||||
|
||||
bool SDL_WSIPlatform::alive(Vulkan::WSI &wsi) { return true; }
|
||||
|
||||
void SDL_WSIPlatform::poll_input() {}
|
||||
void SDL_WSIPlatform::poll_input() { SDL_PumpEvents(); }
|
||||
|
||||
void SDL_WSIPlatform::poll_input_async(Granite::InputTrackerHandler *handler) {}
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@ void ra_welcome(const char **game_title, const char **game_image_url) {
|
||||
|
||||
int message_length = snprintf(
|
||||
buffer, sizeof(buffer), "%s\nMode: %s\n", game->title,
|
||||
rc_client_get_hardcore_enabled(g_client) ? "Hardcore" : "Softcore");
|
||||
rc_client_get_hardcore_enabled(g_client) ? "Hardcore" : "Casual");
|
||||
|
||||
if (summary.num_core_achievements != 0) {
|
||||
snprintf(buffer + message_length, sizeof(buffer) - message_length,
|
||||
|
||||
+1
-1
@@ -1,2 +1,2 @@
|
||||
[toolchain]
|
||||
channel = "1.96.0"
|
||||
channel = "1.97.0"
|
||||
|
||||
@@ -59,7 +59,7 @@ pub fn process(device: &mut device::Device, channel: usize) {
|
||||
let input = if let Some(netplay) = &mut device.netplay {
|
||||
netplay.inputs[channel].0
|
||||
} else {
|
||||
ui::input::get(&mut device.ui, channel, device.speed_limiter.frame_counter)
|
||||
ui::input::get(&mut device.ui, channel)
|
||||
};
|
||||
|
||||
device.pif.ram[offset..offset + 4].copy_from_slice(&input.data.to_ne_bytes());
|
||||
|
||||
@@ -118,7 +118,6 @@ pub fn write_regs(device: &mut device::Device, address: u64, value: u32, mask: u
|
||||
pub fn update_screen(device: &mut device::Device) {
|
||||
if !netplay::in_rollback(device.netplay.as_ref()) {
|
||||
ui::video::render_frame();
|
||||
unsafe { sdl3_sys::events::SDL_PumpEvents() };
|
||||
}
|
||||
|
||||
let (speed_limiter_toggled, paused) = ui::video::check_callback(device);
|
||||
|
||||
+20
-9
@@ -22,6 +22,8 @@ pub struct Args {
|
||||
#[arg(short, long)]
|
||||
pub fullscreen: bool,
|
||||
#[arg(long)]
|
||||
pub widescreen: bool,
|
||||
#[arg(long)]
|
||||
pub overclock: Option<bool>,
|
||||
#[arg(long)]
|
||||
pub disable_expansion_pak: Option<bool>,
|
||||
@@ -128,8 +130,6 @@ pub fn run(args: Args, arg_count: usize) -> std::io::Result<()> {
|
||||
ui::sdl_hints();
|
||||
|
||||
if let Some(game) = args.game {
|
||||
ui::disable_auto_update_joysticks();
|
||||
|
||||
let file_path = std::path::Path::new(&game).to_path_buf();
|
||||
let Some(rom_contents) = device::get_rom_contents(&file_path) else {
|
||||
return Err(Error::other(format!(
|
||||
@@ -163,15 +163,22 @@ pub fn run(args: Args, arg_count: usize) -> std::io::Result<()> {
|
||||
|
||||
let mut device = device::Device::new(true);
|
||||
|
||||
device.ui.config.recent_roms.retain(|x| *x != game);
|
||||
device.ui.config.recent_roms.insert(0, game);
|
||||
device.ui.config.recent_roms.truncate(5);
|
||||
device.ui.config.ui.recent_roms.retain(|x| *x != game);
|
||||
device.ui.config.ui.recent_roms.insert(0, game);
|
||||
device.ui.config.ui.recent_roms.truncate(5);
|
||||
|
||||
if args.fullscreen {
|
||||
device.ui.video.fullscreen = true;
|
||||
} else {
|
||||
device.ui.video.fullscreen = device.ui.config.video.fullscreen;
|
||||
}
|
||||
|
||||
if args.widescreen {
|
||||
device.ui.video.widescreen = true;
|
||||
} else {
|
||||
device.ui.video.widescreen = device.ui.config.video.widescreen;
|
||||
}
|
||||
|
||||
let overclock = args
|
||||
.overclock
|
||||
.unwrap_or(device.ui.config.emulation.overclock);
|
||||
@@ -286,11 +293,11 @@ pub fn run(args: Args, arg_count: usize) -> std::io::Result<()> {
|
||||
let mut config = ui::config::Config::new();
|
||||
|
||||
if let Some(profile) = args.configure_input_profile {
|
||||
ui::input::configure_input_profile(
|
||||
ui::input_profile::configure_input_profile(
|
||||
&mut config,
|
||||
profile,
|
||||
args.use_dinput,
|
||||
args.deadzone.unwrap_or(ui::input::DEADZONE_DEFAULT),
|
||||
args.deadzone.unwrap_or(ui::input_profile::DEADZONE_DEFAULT),
|
||||
);
|
||||
|
||||
ui::sdl_close();
|
||||
@@ -334,8 +341,10 @@ pub fn run(args: Args, arg_count: usize) -> std::io::Result<()> {
|
||||
#[cfg(feature = "gui")]
|
||||
{
|
||||
let app = ui::gui::AppWindow::new().unwrap();
|
||||
let no_intro_map =
|
||||
std::sync::Arc::new(tokio::sync::Mutex::new(rustc_hash::FxHashMap::default()));
|
||||
set_app_id();
|
||||
ui::gui::app_window(&app, false);
|
||||
ui::gui::app_window(&app, false, no_intro_map);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -380,7 +389,9 @@ fn android_main(app: slint::android::AndroidApp) {
|
||||
std::fs::create_dir_all(dirs.data_dir.join("saves")).unwrap();
|
||||
std::fs::create_dir_all(dirs.data_dir.join("states")).unwrap();
|
||||
|
||||
ui::gui::app_window(&app_window, true);
|
||||
let no_intro_map =
|
||||
std::sync::Arc::new(tokio::sync::Mutex::new(rustc_hash::FxHashMap::default()));
|
||||
ui::gui::app_window(&app_window, true, no_intro_map);
|
||||
close_tx.send(()).unwrap();
|
||||
*android::WEAK_SLINT_WINDOW.lock().unwrap() = None;
|
||||
*android::ANDROID_APP.lock().unwrap() = None;
|
||||
|
||||
+1
-2
@@ -340,7 +340,7 @@ fn process_netplay(device: &mut device::Device) {
|
||||
fn advance_frame(device: &mut device::Device) {
|
||||
let netplay = device.netplay.as_mut().unwrap();
|
||||
let local_input = if netplay.session.current_frame() > netplay.session.max_prediction() as i32 {
|
||||
ui::input::get(&mut device.ui, 0, device.speed_limiter.frame_counter)
|
||||
ui::input::get(&mut device.ui, 0)
|
||||
} else {
|
||||
//workaround for disabled rollback
|
||||
ui::input::InputData::default()
|
||||
@@ -486,7 +486,6 @@ pub fn init(
|
||||
message_timer = std::time::Instant::now();
|
||||
}
|
||||
|
||||
unsafe { sdl3_sys::events::SDL_PumpEvents() };
|
||||
ui::video::render_frame();
|
||||
ui::video::update_screen();
|
||||
std::thread::sleep(std::time::Duration::from_millis(10));
|
||||
|
||||
@@ -7,6 +7,7 @@ pub mod config;
|
||||
#[cfg(feature = "gui")]
|
||||
pub mod gui;
|
||||
pub mod input;
|
||||
pub mod input_profile;
|
||||
#[cfg(feature = "gui")]
|
||||
pub mod netplay;
|
||||
#[cfg(feature = "gui")]
|
||||
@@ -49,7 +50,6 @@ unsafe impl Sync for Audio {}
|
||||
#[derive(Default)]
|
||||
pub struct Input {
|
||||
pub keyboard_state: *const bool,
|
||||
pub last_polled: u64,
|
||||
pub controllers: [input::Controllers; 4],
|
||||
}
|
||||
|
||||
@@ -68,6 +68,7 @@ pub struct Storage {
|
||||
pub struct Video {
|
||||
pub window: *mut sdl3_sys::video::SDL_Window,
|
||||
pub fullscreen: bool,
|
||||
pub widescreen: bool,
|
||||
pub fps_tx: Option<tokio::sync::mpsc::UnboundedSender<bool>>,
|
||||
pub fps_rx: Option<tokio::sync::mpsc::UnboundedReceiver<bool>>,
|
||||
pub vis_tx: Option<tokio::sync::mpsc::UnboundedSender<bool>>,
|
||||
@@ -120,16 +121,6 @@ pub fn sdl_hints() {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn disable_auto_update_joysticks() {
|
||||
unsafe {
|
||||
let hint = std::ffi::CString::new("0").unwrap();
|
||||
sdl3_sys::everything::SDL_SetHint(
|
||||
sdl3_sys::everything::SDL_HINT_AUTO_UPDATE_JOYSTICKS,
|
||||
hint.as_ptr(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn sdl_init(flag: sdl3_sys::init::SDL_InitFlags) {
|
||||
unsafe {
|
||||
if sdl3_sys::init::SDL_WasInit(flag) == 0 && !sdl3_sys::init::SDL_InitSubSystem(flag) {
|
||||
@@ -195,7 +186,6 @@ impl Ui {
|
||||
let (vis_tx, vis_rx) = tokio::sync::mpsc::unbounded_channel();
|
||||
Ui {
|
||||
input: Input {
|
||||
last_polled: 0,
|
||||
controllers: [
|
||||
input::Controllers {
|
||||
game_controller: std::ptr::null_mut(),
|
||||
@@ -278,6 +268,7 @@ impl Ui {
|
||||
video: Video {
|
||||
window: std::ptr::null_mut(),
|
||||
fullscreen: false,
|
||||
widescreen: false,
|
||||
fps_tx: Some(fps_tx),
|
||||
fps_rx: Some(fps_rx),
|
||||
vis_tx: Some(vis_tx),
|
||||
|
||||
+6
-2
@@ -3,17 +3,21 @@ use crate::ui::gui::AppWindow;
|
||||
use crate::{cheats, device};
|
||||
use slint::ComponentHandle;
|
||||
|
||||
pub fn cheats_window(app: &AppWindow) {
|
||||
pub fn cheats_window(
|
||||
app: &AppWindow,
|
||||
no_intro_map: std::sync::Arc<tokio::sync::Mutex<rustc_hash::FxHashMap<String, String>>>,
|
||||
) {
|
||||
let weak = app.as_weak();
|
||||
app.on_cheats_select_rom_clicked(move |rom_dir| {
|
||||
let select_rom = ui::gui::select_rom(rom_dir);
|
||||
let weak = weak.clone();
|
||||
let no_intro_map = no_intro_map.clone();
|
||||
tokio::spawn(async move {
|
||||
if let Some(file) = select_rom.await
|
||||
&& let Some(rom_contents) = device::get_rom_contents(&file)
|
||||
{
|
||||
let game_crc = ui::storage::get_game_crc(&rom_contents);
|
||||
let game_name = ui::storage::get_game_name(&rom_contents);
|
||||
let game_name = ui::gui::get_nointro_name(&rom_contents, no_intro_map).await;
|
||||
weak.upgrade_in_event_loop(move |handle| {
|
||||
handle.set_cheat_game_name(game_name.into());
|
||||
})
|
||||
|
||||
+32
-18
@@ -1,34 +1,36 @@
|
||||
use crate::ui;
|
||||
|
||||
#[derive(Copy, Clone, serde::Serialize, serde::Deserialize)]
|
||||
#[derive(Clone, serde::Serialize, serde::Deserialize)]
|
||||
pub struct InputKeyButton {
|
||||
pub enabled: bool,
|
||||
pub id: i32,
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Copy, Clone, serde::Serialize, serde::Deserialize)]
|
||||
#[derive(PartialEq, Clone, serde::Serialize, serde::Deserialize)]
|
||||
pub struct InputControllerAxis {
|
||||
pub enabled: bool,
|
||||
pub id: i32,
|
||||
pub axis: i16,
|
||||
pub initial_state: i16,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, serde::Serialize, serde::Deserialize)]
|
||||
#[derive(Clone, serde::Serialize, serde::Deserialize)]
|
||||
pub struct InputJoystickHat {
|
||||
pub enabled: bool,
|
||||
pub id: i32,
|
||||
pub direction: u8,
|
||||
}
|
||||
|
||||
#[derive(serde::Serialize, serde::Deserialize)]
|
||||
#[derive(Clone, serde::Serialize, serde::Deserialize)]
|
||||
pub enum InputItem {
|
||||
Key(InputKeyButton),
|
||||
ControllerButton(InputKeyButton),
|
||||
ControllerAxis(InputControllerAxis),
|
||||
JoystickButton(InputKeyButton),
|
||||
JoystickHat(InputJoystickHat),
|
||||
JoystickAxis(InputControllerAxis),
|
||||
}
|
||||
|
||||
#[derive(Clone, serde::Serialize, serde::Deserialize)]
|
||||
pub struct InputProfile {
|
||||
pub keys: [InputKeyButton; ui::input::PROFILE_SIZE],
|
||||
pub controller_buttons: [InputKeyButton; ui::input::PROFILE_SIZE],
|
||||
pub controller_axis: [InputControllerAxis; ui::input::PROFILE_SIZE],
|
||||
pub joystick_buttons: [InputKeyButton; ui::input::PROFILE_SIZE],
|
||||
pub joystick_hat: [InputJoystickHat; ui::input::PROFILE_SIZE],
|
||||
pub joystick_axis: [InputControllerAxis; ui::input::PROFILE_SIZE],
|
||||
pub inputs: [[Option<InputItem>; 2]; ui::input_profile::PROFILE_SIZE],
|
||||
pub dinput: bool,
|
||||
pub deadzone: i32,
|
||||
}
|
||||
@@ -69,13 +71,19 @@ pub struct Cheats {
|
||||
pub cheats: rustc_hash::FxHashMap<String, rustc_hash::FxHashMap<String, Option<String>>>,
|
||||
}
|
||||
|
||||
#[derive(Default, serde::Serialize, serde::Deserialize)]
|
||||
pub struct Ui {
|
||||
pub theme: i32,
|
||||
pub rom_dir: std::path::PathBuf,
|
||||
pub recent_roms: Vec<String>,
|
||||
}
|
||||
|
||||
#[derive(Default, serde::Serialize, serde::Deserialize)]
|
||||
pub struct Config {
|
||||
pub input: Input,
|
||||
pub video: Video,
|
||||
pub emulation: Emulation,
|
||||
pub rom_dir: std::path::PathBuf,
|
||||
pub recent_roms: Vec<String>,
|
||||
pub ui: Ui,
|
||||
#[serde(skip)]
|
||||
write_to_disk: bool,
|
||||
}
|
||||
@@ -154,7 +162,10 @@ impl Config {
|
||||
}
|
||||
|
||||
let mut input_profiles = std::collections::BTreeMap::new();
|
||||
input_profiles.insert("default".to_string(), ui::input::get_default_profile());
|
||||
input_profiles.insert(
|
||||
"default".to_string(),
|
||||
ui::input_profile::get_default_profile(),
|
||||
);
|
||||
Config {
|
||||
input: input_data.unwrap_or(Input {
|
||||
input_profile_binding: [
|
||||
@@ -186,8 +197,11 @@ impl Config {
|
||||
usb: false,
|
||||
rewind: false,
|
||||
},
|
||||
rom_dir: std::path::PathBuf::new(),
|
||||
recent_roms: Vec::new(),
|
||||
ui: Ui {
|
||||
theme: 0,
|
||||
rom_dir: std::path::PathBuf::new(),
|
||||
recent_roms: Vec::new(),
|
||||
},
|
||||
write_to_disk: true,
|
||||
}
|
||||
}
|
||||
|
||||
+79
-6
@@ -1,3 +1,4 @@
|
||||
use crate::device;
|
||||
use crate::retroachievements;
|
||||
use crate::ui;
|
||||
#[cfg(target_os = "android")]
|
||||
@@ -112,6 +113,7 @@ fn local_game_window(app: &AppWindow, config: &ui::config::Config) {
|
||||
app.set_recent_roms(slint::ModelRc::from(std::rc::Rc::new(
|
||||
slint::VecModel::from(
|
||||
config
|
||||
.ui
|
||||
.recent_roms
|
||||
.iter()
|
||||
.filter(|x| rom_exists(x))
|
||||
@@ -179,6 +181,7 @@ fn settings_window(app: &AppWindow, config: &ui::config::Config) {
|
||||
app.set_widescreen(config.video.widescreen);
|
||||
app.set_vsync(config.video.vsync);
|
||||
app.set_apply_crt_shader(config.video.crt);
|
||||
app.set_theme(config.ui.theme);
|
||||
app.set_overclock_n64_cpu(config.emulation.overclock);
|
||||
app.set_disable_expansion_pak(config.emulation.disable_expansion_pak);
|
||||
app.set_emulate_usb(config.emulation.usb);
|
||||
@@ -192,7 +195,7 @@ fn settings_window(app: &AppWindow, config: &ui::config::Config) {
|
||||
};
|
||||
app.set_resolution(combobox_value);
|
||||
|
||||
if let Some(rom_dir_str) = config.rom_dir.to_str() {
|
||||
if let Some(rom_dir_str) = config.ui.rom_dir.to_str() {
|
||||
app.set_rom_dir(rom_dir_str.into());
|
||||
}
|
||||
}
|
||||
@@ -344,7 +347,7 @@ fn controller_window(app: &AppWindow, config: &ui::config::Config) {
|
||||
app.on_input_profile_button_clicked(move || {
|
||||
weak_app
|
||||
.upgrade_in_event_loop(move |handle| {
|
||||
handle.set_input_deadzone(ui::input::DEADZONE_DEFAULT);
|
||||
handle.set_input_deadzone(ui::input_profile::DEADZONE_DEFAULT);
|
||||
handle.set_input_profile_name(String::new().into());
|
||||
handle.set_input_dinput(false);
|
||||
handle.set_show_input_profile(true);
|
||||
@@ -444,13 +447,14 @@ fn controller_window(app: &AppWindow, config: &ui::config::Config) {
|
||||
|
||||
pub fn save_settings(app: &AppWindow) {
|
||||
let mut config = ui::config::Config::new();
|
||||
config.rom_dir = app.get_rom_dir().to_string().into();
|
||||
config.ui.rom_dir = app.get_rom_dir().to_string().into();
|
||||
config.video.integer_scaling = app.get_integer_scaling();
|
||||
config.video.ssaa = app.get_ssaa();
|
||||
config.video.fullscreen = app.get_fullscreen();
|
||||
config.video.widescreen = app.get_widescreen();
|
||||
config.video.vsync = app.get_vsync();
|
||||
config.video.crt = app.get_apply_crt_shader();
|
||||
config.ui.theme = app.get_theme();
|
||||
config.emulation.overclock = app.get_overclock_n64_cpu();
|
||||
config.emulation.disable_expansion_pak = app.get_disable_expansion_pak();
|
||||
config.emulation.usb = app.get_emulate_usb();
|
||||
@@ -521,7 +525,16 @@ fn about_window(app: &AppWindow) {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn app_window(app: &AppWindow, is_android: bool) {
|
||||
pub fn app_window(
|
||||
app: &AppWindow,
|
||||
is_android: bool,
|
||||
no_intro_map: std::sync::Arc<tokio::sync::Mutex<rustc_hash::FxHashMap<String, String>>>,
|
||||
) {
|
||||
let no_intro_map_clone = no_intro_map.clone();
|
||||
tokio::spawn(async move {
|
||||
load_no_intro(no_intro_map_clone).await;
|
||||
});
|
||||
|
||||
retroachievements::init_client(false, false, false);
|
||||
app.set_is_android(is_android);
|
||||
about_window(app);
|
||||
@@ -532,8 +545,8 @@ pub fn app_window(app: &AppWindow, is_android: bool) {
|
||||
controller_window(app, &config);
|
||||
local_game_window(app, &config);
|
||||
}
|
||||
ui::netplay::netplay_window(app);
|
||||
ui::cheats::cheats_window(app);
|
||||
ui::netplay::netplay_window(app, no_intro_map.clone());
|
||||
ui::cheats::cheats_window(app, no_intro_map);
|
||||
|
||||
#[cfg(not(target_os = "android"))]
|
||||
{
|
||||
@@ -657,6 +670,66 @@ pub fn update_recent_roms(app: &AppWindow, file_path: std::path::PathBuf) {
|
||||
app.set_recent_roms(slint::ModelRc::from(std::rc::Rc::new(recent_roms)));
|
||||
}
|
||||
|
||||
pub async fn get_nointro_name(
|
||||
rom: &[u8],
|
||||
no_intro_map: std::sync::Arc<tokio::sync::Mutex<rustc_hash::FxHashMap<String, String>>>,
|
||||
) -> String {
|
||||
let hash = device::cart::rom::calculate_hash(rom).to_lowercase();
|
||||
if let Some(name) = no_intro_map.lock().await.get(&hash) {
|
||||
name.clone()
|
||||
} else {
|
||||
ui::storage::get_game_name(rom)
|
||||
}
|
||||
}
|
||||
|
||||
async fn load_no_intro(
|
||||
no_intro_map: std::sync::Arc<tokio::sync::Mutex<rustc_hash::FxHashMap<String, String>>>,
|
||||
) {
|
||||
let mut reader = quick_xml::Reader::from_str(include_str!(
|
||||
"../../data/ui/Nintendo - Nintendo 64 (DB Export) (20260609-194259).xml"
|
||||
));
|
||||
let mut current_game = String::new();
|
||||
let mut map = no_intro_map.lock().await;
|
||||
let mut xml_version = quick_xml::XmlVersion::Implicit1_0;
|
||||
loop {
|
||||
match reader.read_event() {
|
||||
Ok(quick_xml::events::Event::Decl(e)) => {
|
||||
if let Ok(version) = e.xml_version() {
|
||||
xml_version = version;
|
||||
}
|
||||
}
|
||||
Ok(quick_xml::events::Event::Start(e)) => {
|
||||
if e.name().as_ref() == b"game"
|
||||
&& let Ok(Some(name_attribute)) = e.try_get_attribute("name")
|
||||
&& let Ok(normalized_value) = name_attribute.normalized_value(xml_version)
|
||||
{
|
||||
current_game = normalized_value.into_owned();
|
||||
}
|
||||
}
|
||||
Ok(quick_xml::events::Event::End(e)) => {
|
||||
if e.name().as_ref() == b"game" {
|
||||
current_game.clear();
|
||||
}
|
||||
}
|
||||
Ok(quick_xml::events::Event::Empty(e)) => {
|
||||
if e.name().as_ref() == b"file"
|
||||
&& let Ok(Some(format_attribute)) = e.try_get_attribute("format")
|
||||
&& let Ok(normalized_value) = format_attribute.normalized_value(xml_version)
|
||||
&& normalized_value.as_ref() == "BigEndian"
|
||||
&& let Ok(Some(sha256_attribute)) = e.try_get_attribute("sha256")
|
||||
&& let Ok(normalized_sha256) = sha256_attribute.normalized_value(xml_version)
|
||||
&& !current_game.is_empty()
|
||||
{
|
||||
map.insert(normalized_sha256.to_lowercase(), current_game.clone());
|
||||
}
|
||||
}
|
||||
Err(e) => panic!("Error at position {}: {:?}", reader.error_position(), e),
|
||||
Ok(quick_xml::events::Event::Eof) => break,
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn select_rom(rom_dir: slint::SharedString) -> Option<std::path::PathBuf> {
|
||||
#[cfg(target_os = "android")]
|
||||
return ui::android::select_rom(rom_dir).await;
|
||||
|
||||
@@ -61,10 +61,11 @@ export component AppWindow inherits Window {
|
||||
in-out property ra_challenge <=> RAData.challenge;
|
||||
in-out property ra_leaderboard <=> RAData.leaderboard;
|
||||
in-out property ra_rich_presence <=> RAData.rich_presence;
|
||||
in-out property ra_softcore_only <=> RAData.ra_softcore_only;
|
||||
in-out property ra_casual_only <=> RAData.ra_casual_only;
|
||||
out property ra_not_logged_in <=> RAData.not_logged_in;
|
||||
in-out property integer_scaling <=> SettingsData.integer_scaling;
|
||||
in-out property ssaa <=> SettingsData.ssaa;
|
||||
in-out property theme <=> SettingsData.theme;
|
||||
in-out property fullscreen <=> SettingsData.fullscreen;
|
||||
in-out property widescreen <=> SettingsData.widescreen;
|
||||
in-out property vsync <=> SettingsData.vsync;
|
||||
@@ -131,6 +132,21 @@ export component AppWindow inherits Window {
|
||||
private property <length> safe-bottom: root.safe-area-insets.bottom;
|
||||
private property <length> safe-width: root.width - root.safe-left - root.safe-right;
|
||||
private property <length> safe-height: root.height - root.safe-top - root.safe-bottom;
|
||||
function apply_theme() {
|
||||
if (root.theme == 1) {
|
||||
Palette.color-scheme = ColorScheme.dark;
|
||||
} else if (root.theme == 2) {
|
||||
Palette.color-scheme = ColorScheme.light;
|
||||
} else {
|
||||
Palette.color-scheme = ColorScheme.unknown;
|
||||
}
|
||||
}
|
||||
init => {
|
||||
apply_theme();
|
||||
}
|
||||
changed theme => {
|
||||
apply_theme();
|
||||
}
|
||||
|
||||
min-width: 320px;
|
||||
min-height: 240px;
|
||||
|
||||
@@ -12,7 +12,7 @@ export global RAData {
|
||||
in-out property <bool> rich_presence;
|
||||
in-out property <bool> ra_logging_in;
|
||||
in-out property <bool> ra_show_profile;
|
||||
in-out property <bool> ra_softcore_only;
|
||||
in-out property <bool> ra_casual_only;
|
||||
in-out property <string> ra_username;
|
||||
in-out property <string> ra_password;
|
||||
in-out property <string> current_user_message;
|
||||
@@ -47,7 +47,7 @@ export component RetroAchievements inherits Page {
|
||||
ra_toggled(RAData.enabled,RAData.hardcore,RAData.challenge,RAData.leaderboard,RAData.rich_presence);
|
||||
}
|
||||
}
|
||||
if !RAData.ra_softcore_only: Switch {
|
||||
if !RAData.ra_casual_only: Switch {
|
||||
text: @tr("Hardcore mode");
|
||||
checked: RAData.hardcore;
|
||||
enabled: RAData.enabled;
|
||||
|
||||
+131
-105
@@ -1,7 +1,7 @@
|
||||
// Copyright © SixtyFPS GmbH <info@slint.dev>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import { ComboBox, HorizontalBox, VerticalBox, Switch } from "std-widgets.slint";
|
||||
import { GroupBox, ComboBox, HorizontalBox, VerticalBox, Switch } from "std-widgets.slint";
|
||||
import { Page } from "page.slint";
|
||||
|
||||
export global SettingsData {
|
||||
@@ -14,6 +14,7 @@ export global SettingsData {
|
||||
in-out property <bool> overclock_n64_cpu;
|
||||
in-out property <bool> disable_expansion_pak;
|
||||
in-out property <int> resolution;
|
||||
in-out property <int> theme;
|
||||
in-out property <bool> emulate_usb;
|
||||
in-out property <bool> rewind;
|
||||
in-out property <bool> emulate_vru;
|
||||
@@ -23,117 +24,142 @@ export global SettingsData {
|
||||
export component Settings inherits Page {
|
||||
title: @tr("Settings");
|
||||
|
||||
VerticalBox {
|
||||
alignment: start;
|
||||
HorizontalBox {
|
||||
alignment: center;
|
||||
VerticalBox {
|
||||
alignment: start;
|
||||
HorizontalBox {
|
||||
HorizontalBox {
|
||||
alignment: center;
|
||||
VerticalBox {
|
||||
alignment: start;
|
||||
GroupBox {
|
||||
title: @tr("Game");
|
||||
VerticalBox {
|
||||
alignment: start;
|
||||
Text {
|
||||
text: @tr("Resolution:");
|
||||
vertical-alignment: center;
|
||||
HorizontalBox {
|
||||
alignment: start;
|
||||
Text {
|
||||
text: @tr("Resolution:");
|
||||
vertical-alignment: center;
|
||||
}
|
||||
ComboBox {
|
||||
model: ["1x", "2x", "4x", "8x"];
|
||||
current-index: SettingsData.resolution;
|
||||
selected => {
|
||||
SettingsData.resolution = self.current-index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ComboBox {
|
||||
model: ["1x", "2x", "4x", "8x"];
|
||||
current-index: SettingsData.resolution;
|
||||
selected => {
|
||||
SettingsData.resolution = self.current-index;
|
||||
Switch {
|
||||
text: @tr("SSAA downscaling");
|
||||
checked: SettingsData.ssaa;
|
||||
toggled => {
|
||||
SettingsData.ssaa = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Integer Scaling");
|
||||
checked: SettingsData.integer_scaling;
|
||||
toggled => {
|
||||
SettingsData.integer_scaling = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Fullscreen");
|
||||
checked: SettingsData.fullscreen;
|
||||
toggled => {
|
||||
SettingsData.fullscreen = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Widescreen (stretch)");
|
||||
checked: SettingsData.widescreen;
|
||||
toggled => {
|
||||
SettingsData.widescreen = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("VSync");
|
||||
checked: SettingsData.vsync;
|
||||
toggled => {
|
||||
SettingsData.vsync = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Apply CRT shader");
|
||||
checked: SettingsData.apply_crt_shader;
|
||||
toggled => {
|
||||
SettingsData.apply_crt_shader = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Overclock N64 CPU (may cause bugs)");
|
||||
checked: SettingsData.overclock_n64_cpu;
|
||||
toggled => {
|
||||
SettingsData.overclock_n64_cpu = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Disable Expansion Pak");
|
||||
checked: SettingsData.disable_expansion_pak;
|
||||
toggled => {
|
||||
SettingsData.disable_expansion_pak = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Enable Rewind");
|
||||
checked: SettingsData.rewind;
|
||||
toggled => {
|
||||
SettingsData.rewind = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Emulate UNFLoader");
|
||||
checked: SettingsData.emulate_usb;
|
||||
toggled => {
|
||||
SettingsData.emulate_usb = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Emulate VRU");
|
||||
checked: SettingsData.emulate_vru;
|
||||
toggled => {
|
||||
SettingsData.emulate_vru = self.checked;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("SSAA downscaling");
|
||||
checked: SettingsData.ssaa;
|
||||
toggled => {
|
||||
SettingsData.ssaa = self.checked;
|
||||
}
|
||||
GroupBox {
|
||||
title: @tr("UI");
|
||||
VerticalBox {
|
||||
alignment: start;
|
||||
HorizontalBox {
|
||||
alignment: start;
|
||||
Text {
|
||||
text: @tr("Theme:");
|
||||
vertical-alignment: center;
|
||||
}
|
||||
ComboBox {
|
||||
model: [@tr("System"), @tr("Dark"), @tr("Light")];
|
||||
current-index: SettingsData.theme;
|
||||
selected => {
|
||||
SettingsData.theme = self.current-index;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Integer Scaling");
|
||||
checked: SettingsData.integer_scaling;
|
||||
toggled => {
|
||||
SettingsData.integer_scaling = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Fullscreen");
|
||||
checked: SettingsData.fullscreen;
|
||||
toggled => {
|
||||
SettingsData.fullscreen = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Widescreen (stretch)");
|
||||
checked: SettingsData.widescreen;
|
||||
toggled => {
|
||||
SettingsData.widescreen = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("VSync");
|
||||
checked: SettingsData.vsync;
|
||||
toggled => {
|
||||
SettingsData.vsync = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Apply CRT shader");
|
||||
checked: SettingsData.apply_crt_shader;
|
||||
toggled => {
|
||||
SettingsData.apply_crt_shader = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Overclock N64 CPU (may cause bugs)");
|
||||
checked: SettingsData.overclock_n64_cpu;
|
||||
toggled => {
|
||||
SettingsData.overclock_n64_cpu = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Disable Expansion Pak");
|
||||
checked: SettingsData.disable_expansion_pak;
|
||||
toggled => {
|
||||
SettingsData.disable_expansion_pak = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Enable Rewind");
|
||||
checked: SettingsData.rewind;
|
||||
toggled => {
|
||||
SettingsData.rewind = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Emulate UNFLoader");
|
||||
checked: SettingsData.emulate_usb;
|
||||
toggled => {
|
||||
SettingsData.emulate_usb = self.checked;
|
||||
}
|
||||
}
|
||||
|
||||
Switch {
|
||||
text: @tr("Emulate VRU");
|
||||
checked: SettingsData.emulate_vru;
|
||||
toggled => {
|
||||
SettingsData.emulate_vru = self.checked;
|
||||
Rectangle {
|
||||
height: 40px; // so the combobox isn't cut off
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+170
-819
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,929 @@
|
||||
use crate::ui;
|
||||
|
||||
const R_DPAD: usize = 0;
|
||||
const L_DPAD: usize = 1;
|
||||
const D_DPAD: usize = 2;
|
||||
const U_DPAD: usize = 3;
|
||||
pub const START_BUTTON: usize = 4;
|
||||
pub const Z_TRIG: usize = 5;
|
||||
pub const B_BUTTON: usize = 6;
|
||||
const A_BUTTON: usize = 7;
|
||||
const R_CBUTTON: usize = 8;
|
||||
pub const L_CBUTTON: usize = 9;
|
||||
const D_CBUTTON: usize = 10;
|
||||
const U_CBUTTON: usize = 11;
|
||||
pub const R_TRIG: usize = 12;
|
||||
pub const L_TRIG: usize = 13;
|
||||
pub const AXIS_RIGHT: usize = 14;
|
||||
pub const AXIS_LEFT: usize = 15;
|
||||
pub const AXIS_DOWN: usize = 16;
|
||||
pub const AXIS_UP: usize = 17;
|
||||
pub const HOTKEY: usize = 18;
|
||||
pub const PROFILE_SIZE: usize = 19;
|
||||
|
||||
pub const DEADZONE_DEFAULT: i32 = 5;
|
||||
|
||||
const GATHER_TIME: usize = 5;
|
||||
|
||||
pub fn configure_input_profile(
|
||||
config: &mut ui::config::Config,
|
||||
profile_name: String,
|
||||
dinput: bool,
|
||||
deadzone: i32,
|
||||
) {
|
||||
ui::sdl_init(sdl3_sys::init::SDL_INIT_VIDEO);
|
||||
ui::sdl_init(sdl3_sys::init::SDL_INIT_GAMEPAD);
|
||||
ui::ttf_init();
|
||||
|
||||
if profile_name == "default" {
|
||||
eprintln!("Profile name cannot be default");
|
||||
return;
|
||||
}
|
||||
if profile_name.is_empty() {
|
||||
eprintln!("Profile name cannot be empty");
|
||||
return;
|
||||
}
|
||||
|
||||
let mut profile = if let Some(profile) = config.input.input_profiles.get(&profile_name) {
|
||||
profile.clone()
|
||||
} else {
|
||||
ui::config::InputProfile {
|
||||
inputs: [const { [None, None] }; PROFILE_SIZE],
|
||||
dinput,
|
||||
deadzone,
|
||||
}
|
||||
};
|
||||
|
||||
let mut open_joysticks: Vec<*mut sdl3_sys::joystick::SDL_Joystick> = Vec::new();
|
||||
let mut open_controllers: Vec<*mut sdl3_sys::gamepad::SDL_Gamepad> = Vec::new();
|
||||
|
||||
for joystick in ui::input::get_joysticks().iter() {
|
||||
if !dinput {
|
||||
let controller = unsafe { sdl3_sys::gamepad::SDL_OpenGamepad(*joystick) };
|
||||
if !controller.is_null() {
|
||||
open_controllers.push(controller);
|
||||
}
|
||||
} else {
|
||||
let joystick = unsafe { sdl3_sys::joystick::SDL_OpenJoystick(*joystick) };
|
||||
if !joystick.is_null() {
|
||||
open_joysticks.push(joystick);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let title = std::ffi::CString::new("configure input profile").unwrap();
|
||||
let mut window: *mut sdl3_sys::video::SDL_Window = std::ptr::null_mut();
|
||||
let mut renderer: *mut sdl3_sys::render::SDL_Renderer = std::ptr::null_mut();
|
||||
#[cfg(target_os = "android")]
|
||||
let window_flags = sdl3_sys::video::SDL_WINDOW_FULLSCREEN;
|
||||
#[cfg(not(target_os = "android"))]
|
||||
let window_flags = sdl3_sys::video::SDL_WindowFlags(0);
|
||||
if !unsafe {
|
||||
sdl3_sys::render::SDL_CreateWindowAndRenderer(
|
||||
title.as_ptr(),
|
||||
852,
|
||||
480,
|
||||
window_flags,
|
||||
&mut window,
|
||||
&mut renderer,
|
||||
)
|
||||
} {
|
||||
panic!("Could not create window and renderer")
|
||||
}
|
||||
if !unsafe { sdl3_sys::video::SDL_ShowWindow(window) } {
|
||||
panic!("Could not show window")
|
||||
}
|
||||
|
||||
let text_engine = unsafe { sdl3_ttf_sys::ttf::TTF_CreateRendererTextEngine(renderer) };
|
||||
let font = unsafe {
|
||||
let font_bytes = include_bytes!("../../data/ui/RobotoMono-Regular.ttf");
|
||||
sdl3_ttf_sys::ttf::TTF_OpenFontIO(
|
||||
sdl3_sys::everything::SDL_IOFromConstMem(
|
||||
font_bytes.as_ptr() as *const std::ffi::c_void,
|
||||
font_bytes.len(),
|
||||
),
|
||||
true,
|
||||
12.0,
|
||||
)
|
||||
};
|
||||
|
||||
set_font_size(window, font);
|
||||
|
||||
if draw_profile_screen(window, renderer, text_engine, font, &mut profile, dinput) {
|
||||
profile.deadzone = deadzone;
|
||||
profile.dinput = dinput;
|
||||
config.input.input_profiles.insert(profile_name, profile);
|
||||
}
|
||||
|
||||
for joystick in open_joysticks {
|
||||
unsafe { sdl3_sys::joystick::SDL_CloseJoystick(joystick) }
|
||||
}
|
||||
for controller in open_controllers {
|
||||
unsafe { sdl3_sys::gamepad::SDL_CloseGamepad(controller) }
|
||||
}
|
||||
|
||||
unsafe {
|
||||
sdl3_ttf_sys::ttf::TTF_CloseFont(font);
|
||||
sdl3_ttf_sys::ttf::TTF_DestroyRendererTextEngine(text_engine);
|
||||
sdl3_sys::render::SDL_DestroyRenderer(renderer);
|
||||
sdl3_sys::video::SDL_DestroyWindow(window);
|
||||
}
|
||||
}
|
||||
|
||||
fn set_font_size(window: *mut sdl3_sys::video::SDL_Window, font: *mut sdl3_ttf_sys::ttf::TTF_Font) {
|
||||
let mut rect: sdl3_sys::rect::SDL_Rect = Default::default();
|
||||
unsafe {
|
||||
sdl3_ttf_sys::ttf::TTF_SetFontSize(font, 12.0);
|
||||
sdl3_sys::video::SDL_GetWindowSafeArea(window, &mut rect)
|
||||
};
|
||||
let num_rows = PROFILE_SIZE + 2;
|
||||
let min_row_height = rect.h / num_rows as i32;
|
||||
while unsafe { sdl3_ttf_sys::ttf::TTF_GetFontLineSkip(font) } < min_row_height {
|
||||
unsafe {
|
||||
let font_size = sdl3_ttf_sys::ttf::TTF_GetFontSize(font);
|
||||
sdl3_ttf_sys::ttf::TTF_SetFontSize(font, font_size + 0.5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn reset_gather(auto_advance: bool) -> (usize, Option<std::time::Instant>) {
|
||||
if auto_advance {
|
||||
(GATHER_TIME, Some(std::time::Instant::now()))
|
||||
} else {
|
||||
(0, None)
|
||||
}
|
||||
}
|
||||
|
||||
fn advance_cursor(
|
||||
selected: &mut (usize, usize),
|
||||
auto_advance: &mut bool,
|
||||
) -> (usize, Option<std::time::Instant>) {
|
||||
selected.0 += 1;
|
||||
if selected.0 == PROFILE_SIZE {
|
||||
*auto_advance = false;
|
||||
}
|
||||
reset_gather(*auto_advance)
|
||||
}
|
||||
|
||||
fn draw_profile_screen(
|
||||
window: *mut sdl3_sys::video::SDL_Window,
|
||||
renderer: *mut sdl3_sys::render::SDL_Renderer,
|
||||
text_engine: *mut sdl3_ttf_sys::ttf::TTF_TextEngine,
|
||||
font: *mut sdl3_ttf_sys::ttf::TTF_Font,
|
||||
profile: &mut ui::config::InputProfile,
|
||||
dinput: bool,
|
||||
) -> bool {
|
||||
let mut selected: (usize, usize) = (0, 0);
|
||||
let mut auto_advance = dinput && !unsafe { sdl3_sys::keyboard::SDL_HasKeyboard() };
|
||||
|
||||
let (mut gather, mut gather_timer) = reset_gather(auto_advance);
|
||||
loop {
|
||||
if let Some(timer) = gather_timer
|
||||
&& timer.elapsed() > std::time::Duration::from_secs(1)
|
||||
{
|
||||
gather -= 1;
|
||||
if gather > 0 {
|
||||
gather_timer = Some(std::time::Instant::now());
|
||||
} else {
|
||||
(gather, gather_timer) = reset_gather(auto_advance);
|
||||
}
|
||||
}
|
||||
let mut event: sdl3_sys::events::SDL_Event = Default::default();
|
||||
|
||||
if unsafe { sdl3_sys::events::SDL_WaitEventTimeout(&mut event, 20) } {
|
||||
match event.event_type() {
|
||||
sdl3_sys::events::SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED => {
|
||||
set_font_size(window, font);
|
||||
}
|
||||
sdl3_sys::events::SDL_EVENT_WINDOW_CLOSE_REQUESTED => break,
|
||||
sdl3_sys::events::SDL_EVENT_GAMEPAD_BUTTON_DOWN => {
|
||||
if gather == 0 {
|
||||
match sdl3_sys::gamepad::SDL_GamepadButton(
|
||||
unsafe { event.gbutton.button } as i32
|
||||
) {
|
||||
sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_DPAD_DOWN => {
|
||||
move_down(&mut selected);
|
||||
}
|
||||
sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_DPAD_UP => {
|
||||
move_up(&mut selected);
|
||||
}
|
||||
sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_DPAD_LEFT => {
|
||||
move_left(&mut selected);
|
||||
}
|
||||
sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_DPAD_RIGHT => {
|
||||
move_right(&mut selected);
|
||||
}
|
||||
sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_WEST
|
||||
| sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_NORTH => {
|
||||
delete_binding(selected, profile);
|
||||
}
|
||||
sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_SOUTH
|
||||
| sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_EAST
|
||||
if select_or_save(selected, &mut gather, &mut gather_timer) =>
|
||||
{
|
||||
return true;
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
} else if !dinput {
|
||||
profile.inputs[selected.0][selected.1] = Some(
|
||||
ui::config::InputItem::ControllerButton(ui::config::InputKeyButton {
|
||||
id: i32::from(unsafe { event.gbutton.button }),
|
||||
}),
|
||||
);
|
||||
(gather, gather_timer) = advance_cursor(&mut selected, &mut auto_advance);
|
||||
}
|
||||
}
|
||||
sdl3_sys::events::SDL_EVENT_KEY_DOWN => {
|
||||
let scancode = unsafe { event.key }.scancode;
|
||||
if gather == 0 || scancode == sdl3_sys::scancode::SDL_SCANCODE_AC_BACK {
|
||||
match scancode {
|
||||
sdl3_sys::scancode::SDL_SCANCODE_AC_BACK => break,
|
||||
sdl3_sys::scancode::SDL_SCANCODE_DOWN => {
|
||||
move_down(&mut selected);
|
||||
}
|
||||
sdl3_sys::scancode::SDL_SCANCODE_UP => {
|
||||
move_up(&mut selected);
|
||||
}
|
||||
sdl3_sys::scancode::SDL_SCANCODE_LEFT => {
|
||||
move_left(&mut selected);
|
||||
}
|
||||
sdl3_sys::scancode::SDL_SCANCODE_RIGHT => {
|
||||
move_right(&mut selected);
|
||||
}
|
||||
sdl3_sys::scancode::SDL_SCANCODE_DELETE
|
||||
| sdl3_sys::scancode::SDL_SCANCODE_BACKSPACE => {
|
||||
delete_binding(selected, profile);
|
||||
}
|
||||
sdl3_sys::scancode::SDL_SCANCODE_RETURN
|
||||
if select_or_save(selected, &mut gather, &mut gather_timer) =>
|
||||
{
|
||||
return true;
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
} else {
|
||||
if scancode != sdl3_sys::scancode::SDL_SCANCODE_LALT
|
||||
&& scancode != sdl3_sys::scancode::SDL_SCANCODE_RALT
|
||||
&& !unsafe { event.key }.repeat
|
||||
{
|
||||
profile.inputs[selected.0][selected.1] =
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(scancode),
|
||||
}));
|
||||
(gather, gather_timer) =
|
||||
advance_cursor(&mut selected, &mut auto_advance);
|
||||
}
|
||||
}
|
||||
}
|
||||
sdl3_sys::events::SDL_EVENT_GAMEPAD_AXIS_MOTION => {
|
||||
let axis_value = unsafe { event.gaxis }.value;
|
||||
let axis = unsafe { event.gaxis }.axis;
|
||||
if !dinput
|
||||
&& gather != 0
|
||||
&& axis_value.saturating_abs() > (i16::MAX as i32 * 3 / 4) as i16
|
||||
{
|
||||
profile.inputs[selected.0][selected.1] =
|
||||
Some(ui::config::InputItem::ControllerAxis(
|
||||
ui::config::InputControllerAxis {
|
||||
id: i32::from(axis),
|
||||
axis: axis_value.signum(),
|
||||
initial_state: 0,
|
||||
},
|
||||
));
|
||||
(gather, gather_timer) = advance_cursor(&mut selected, &mut auto_advance);
|
||||
}
|
||||
}
|
||||
sdl3_sys::events::SDL_EVENT_JOYSTICK_BUTTON_DOWN => {
|
||||
if dinput {
|
||||
if gather == 0 {
|
||||
if let Some(ui::config::InputItem::JoystickButton(joystick_button)) =
|
||||
&profile.inputs[D_DPAD][0]
|
||||
&& joystick_button.id == unsafe { event.jbutton.button } as i32
|
||||
{
|
||||
move_down(&mut selected);
|
||||
} else if let Some(ui::config::InputItem::JoystickButton(
|
||||
joystick_button,
|
||||
)) = &profile.inputs[U_DPAD][0]
|
||||
&& joystick_button.id == unsafe { event.jbutton.button } as i32
|
||||
{
|
||||
move_up(&mut selected);
|
||||
} else if let Some(ui::config::InputItem::JoystickButton(
|
||||
joystick_button,
|
||||
)) = &profile.inputs[L_DPAD][0]
|
||||
&& joystick_button.id == unsafe { event.jbutton.button } as i32
|
||||
{
|
||||
move_left(&mut selected);
|
||||
} else if let Some(ui::config::InputItem::JoystickButton(
|
||||
joystick_button,
|
||||
)) = &profile.inputs[R_DPAD][0]
|
||||
&& joystick_button.id == unsafe { event.jbutton.button } as i32
|
||||
{
|
||||
move_right(&mut selected);
|
||||
} else if let Some(ui::config::InputItem::JoystickButton(
|
||||
joystick_button,
|
||||
)) = &profile.inputs[B_BUTTON][0]
|
||||
&& joystick_button.id == unsafe { event.jbutton.button } as i32
|
||||
{
|
||||
delete_binding(selected, profile);
|
||||
} else if let Some(ui::config::InputItem::JoystickButton(
|
||||
joystick_button,
|
||||
)) = &profile.inputs[A_BUTTON][0]
|
||||
&& joystick_button.id == unsafe { event.jbutton.button } as i32
|
||||
&& select_or_save(selected, &mut gather, &mut gather_timer)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
profile.inputs[selected.0][selected.1] = Some(
|
||||
ui::config::InputItem::JoystickButton(ui::config::InputKeyButton {
|
||||
id: i32::from(unsafe { event.jbutton.button }),
|
||||
}),
|
||||
);
|
||||
(gather, gather_timer) =
|
||||
advance_cursor(&mut selected, &mut auto_advance);
|
||||
}
|
||||
}
|
||||
}
|
||||
sdl3_sys::events::SDL_EVENT_JOYSTICK_HAT_MOTION => {
|
||||
let state = unsafe { event.jhat.value };
|
||||
let hat = unsafe { event.jhat.hat };
|
||||
if dinput {
|
||||
if gather == 0 {
|
||||
if let Some(ui::config::InputItem::JoystickHat(joystick_hat)) =
|
||||
&profile.inputs[D_DPAD][0]
|
||||
&& joystick_hat.id == hat as i32
|
||||
&& joystick_hat.direction == state
|
||||
{
|
||||
move_down(&mut selected);
|
||||
} else if let Some(ui::config::InputItem::JoystickHat(joystick_hat)) =
|
||||
&profile.inputs[U_DPAD][0]
|
||||
&& joystick_hat.id == hat as i32
|
||||
&& joystick_hat.direction == state
|
||||
{
|
||||
move_up(&mut selected);
|
||||
} else if let Some(ui::config::InputItem::JoystickHat(joystick_hat)) =
|
||||
&profile.inputs[L_DPAD][0]
|
||||
&& joystick_hat.id == hat as i32
|
||||
&& joystick_hat.direction == state
|
||||
{
|
||||
move_left(&mut selected);
|
||||
} else if let Some(ui::config::InputItem::JoystickHat(joystick_hat)) =
|
||||
&profile.inputs[R_DPAD][0]
|
||||
&& joystick_hat.id == hat as i32
|
||||
&& joystick_hat.direction == state
|
||||
{
|
||||
move_right(&mut selected);
|
||||
} else if let Some(ui::config::InputItem::JoystickHat(joystick_hat)) =
|
||||
&profile.inputs[B_BUTTON][0]
|
||||
&& joystick_hat.id == hat as i32
|
||||
&& joystick_hat.direction == state
|
||||
{
|
||||
delete_binding(selected, profile);
|
||||
} else if let Some(ui::config::InputItem::JoystickHat(joystick_hat)) =
|
||||
&profile.inputs[A_BUTTON][0]
|
||||
&& joystick_hat.id == hat as i32
|
||||
&& joystick_hat.direction == state
|
||||
&& select_or_save(selected, &mut gather, &mut gather_timer)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
} else if state != sdl3_sys::joystick::SDL_HAT_CENTERED {
|
||||
profile.inputs[selected.0][selected.1] = Some(
|
||||
ui::config::InputItem::JoystickHat(ui::config::InputJoystickHat {
|
||||
id: hat as i32,
|
||||
direction: state,
|
||||
}),
|
||||
);
|
||||
(gather, gather_timer) =
|
||||
advance_cursor(&mut selected, &mut auto_advance);
|
||||
}
|
||||
}
|
||||
}
|
||||
sdl3_sys::events::SDL_EVENT_JOYSTICK_AXIS_MOTION => {
|
||||
let axis_value = unsafe { event.jaxis }.value;
|
||||
let axis = unsafe { event.jaxis }.axis;
|
||||
let mut initial_state = 0;
|
||||
let has_initial_state = unsafe {
|
||||
sdl3_sys::joystick::SDL_GetJoystickAxisInitialState(
|
||||
sdl3_sys::joystick::SDL_GetJoystickFromID(event.jaxis.which),
|
||||
axis as i32,
|
||||
&mut initial_state,
|
||||
)
|
||||
};
|
||||
initial_state = if has_initial_state {
|
||||
if initial_state < i16::MIN / 2 {
|
||||
i16::MIN
|
||||
} else if initial_state > i16::MAX / 2 {
|
||||
i16::MAX
|
||||
} else {
|
||||
0
|
||||
}
|
||||
} else {
|
||||
0
|
||||
};
|
||||
if dinput && gather != 0 && axis_value.abs_diff(initial_state) > (u16::MAX / 4)
|
||||
{
|
||||
profile.inputs[selected.0][selected.1] = Some(
|
||||
ui::config::InputItem::JoystickAxis(ui::config::InputControllerAxis {
|
||||
id: i32::from(axis),
|
||||
axis: axis_value.signum(),
|
||||
initial_state,
|
||||
}),
|
||||
);
|
||||
(gather, gather_timer) = advance_cursor(&mut selected, &mut auto_advance);
|
||||
}
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
unsafe {
|
||||
sdl3_sys::everything::SDL_RenderClear(renderer);
|
||||
let ttf_text =
|
||||
sdl3_ttf_sys::ttf::TTF_CreateText(text_engine, font, std::ptr::null(), 0);
|
||||
render_screen(window, renderer, ttf_text, font, profile, selected, gather);
|
||||
sdl3_ttf_sys::ttf::TTF_DestroyText(ttf_text);
|
||||
sdl3_sys::render::SDL_RenderPresent(renderer);
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn move_left(selected: &mut (usize, usize)) {
|
||||
selected.1 = selected.1.saturating_sub(1)
|
||||
}
|
||||
|
||||
fn move_right(selected: &mut (usize, usize)) {
|
||||
selected.1 = selected.1.saturating_add(1).min(1)
|
||||
}
|
||||
|
||||
fn move_up(selected: &mut (usize, usize)) {
|
||||
selected.0 = selected.0.saturating_sub(1)
|
||||
}
|
||||
|
||||
fn move_down(selected: &mut (usize, usize)) {
|
||||
selected.0 = selected.0.saturating_add(1).min(PROFILE_SIZE)
|
||||
}
|
||||
|
||||
fn delete_binding(selected: (usize, usize), profile: &mut ui::config::InputProfile) {
|
||||
if selected.0 < PROFILE_SIZE {
|
||||
profile.inputs[selected.0][selected.1] = None;
|
||||
}
|
||||
}
|
||||
|
||||
fn select_or_save(
|
||||
selected: (usize, usize),
|
||||
gather: &mut usize,
|
||||
gather_timer: &mut Option<std::time::Instant>,
|
||||
) -> bool {
|
||||
if selected.0 == PROFILE_SIZE {
|
||||
return true;
|
||||
} else {
|
||||
*gather = GATHER_TIME;
|
||||
*gather_timer = Some(std::time::Instant::now());
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn render_screen(
|
||||
window: *mut sdl3_sys::video::SDL_Window,
|
||||
renderer: *mut sdl3_sys::render::SDL_Renderer,
|
||||
ttf_text: *mut sdl3_ttf_sys::ttf::TTF_Text,
|
||||
font: *mut sdl3_ttf_sys::ttf::TTF_Font,
|
||||
profile: &ui::config::InputProfile,
|
||||
selected: (usize, usize),
|
||||
gather: usize,
|
||||
) {
|
||||
let mut rect: sdl3_sys::rect::SDL_Rect = Default::default();
|
||||
unsafe { sdl3_sys::video::SDL_GetWindowSafeArea(window, &mut rect) };
|
||||
|
||||
let row_height = unsafe { sdl3_ttf_sys::ttf::TTF_GetFontLineSkip(font) } as usize;
|
||||
let key_labels: [&str; PROFILE_SIZE] = [
|
||||
"D Right",
|
||||
"D Left",
|
||||
"D Down",
|
||||
"D Up",
|
||||
"Start",
|
||||
"Z",
|
||||
"B",
|
||||
"A",
|
||||
"C Right",
|
||||
"C Left",
|
||||
"C Down",
|
||||
"C Up",
|
||||
"R",
|
||||
"L",
|
||||
"Control Stick Right",
|
||||
"Control Stick Left",
|
||||
"Control Stick Down",
|
||||
"Control Stick Up",
|
||||
"Hotkey Activator",
|
||||
];
|
||||
|
||||
// headers
|
||||
unsafe {
|
||||
sdl3_ttf_sys::ttf::TTF_SetFontStyle(
|
||||
font,
|
||||
sdl3_ttf_sys::ttf::TTF_STYLE_BOLD | sdl3_ttf_sys::ttf::TTF_STYLE_UNDERLINE,
|
||||
);
|
||||
let c_text = std::ffi::CString::new("Inputs").unwrap();
|
||||
sdl3_ttf_sys::ttf::TTF_SetTextString(ttf_text, c_text.as_ptr(), 0);
|
||||
sdl3_ttf_sys::ttf::TTF_DrawRendererText(ttf_text, rect.x as f32, rect.y as f32);
|
||||
|
||||
let c_text = std::ffi::CString::new("Binding 1").unwrap();
|
||||
sdl3_ttf_sys::ttf::TTF_SetTextString(ttf_text, c_text.as_ptr(), 0);
|
||||
sdl3_ttf_sys::ttf::TTF_DrawRendererText(
|
||||
ttf_text,
|
||||
rect.x as f32 + (rect.w / 3) as f32 * 1.0,
|
||||
rect.y as f32,
|
||||
);
|
||||
|
||||
let c_text = std::ffi::CString::new("Binding 2").unwrap();
|
||||
sdl3_ttf_sys::ttf::TTF_SetTextString(ttf_text, c_text.as_ptr(), 0);
|
||||
sdl3_ttf_sys::ttf::TTF_DrawRendererText(
|
||||
ttf_text,
|
||||
rect.x as f32 + (rect.w / 3) as f32 * 2.0,
|
||||
rect.y as f32,
|
||||
);
|
||||
sdl3_ttf_sys::ttf::TTF_SetFontStyle(font, sdl3_ttf_sys::ttf::TTF_STYLE_NORMAL);
|
||||
}
|
||||
|
||||
for (i, label) in key_labels.iter().enumerate() {
|
||||
let c_text = std::ffi::CString::new(*label).unwrap();
|
||||
unsafe {
|
||||
sdl3_ttf_sys::ttf::TTF_SetTextString(ttf_text, c_text.as_ptr(), 0);
|
||||
sdl3_ttf_sys::ttf::TTF_DrawRendererText(
|
||||
ttf_text,
|
||||
rect.x as f32,
|
||||
rect.y as f32 + ((i + 1) * row_height) as f32,
|
||||
);
|
||||
|
||||
let binding_1 =
|
||||
std::ffi::CString::new(get_binding_text(&profile.inputs[i][0])).unwrap();
|
||||
sdl3_ttf_sys::ttf::TTF_SetTextString(ttf_text, binding_1.as_ptr(), 0);
|
||||
draw_binding_text(renderer, ttf_text, rect, row_height, selected, gather, i, 0);
|
||||
|
||||
let binding_2 =
|
||||
std::ffi::CString::new(get_binding_text(&profile.inputs[i][1])).unwrap();
|
||||
sdl3_ttf_sys::ttf::TTF_SetTextString(ttf_text, binding_2.as_ptr(), 0);
|
||||
draw_binding_text(renderer, ttf_text, rect, row_height, selected, gather, i, 1);
|
||||
}
|
||||
}
|
||||
let c_text = std::ffi::CString::new("Save and Exit").unwrap();
|
||||
unsafe {
|
||||
sdl3_ttf_sys::ttf::TTF_SetFontStyle(font, sdl3_ttf_sys::ttf::TTF_STYLE_BOLD);
|
||||
sdl3_ttf_sys::ttf::TTF_SetTextString(ttf_text, c_text.as_ptr(), 0);
|
||||
let (mut text_w, mut text_h) = (0, 0);
|
||||
sdl3_ttf_sys::ttf::TTF_GetTextSize(ttf_text, &mut text_w, &mut text_h);
|
||||
|
||||
if selected.0 == PROFILE_SIZE {
|
||||
draw_highlight(
|
||||
renderer,
|
||||
rect.x as f32 + (rect.w - text_w) as f32 / 2.0,
|
||||
rect.y as f32 + ((PROFILE_SIZE + 1) * row_height) as f32,
|
||||
text_w,
|
||||
text_h,
|
||||
);
|
||||
}
|
||||
|
||||
sdl3_ttf_sys::ttf::TTF_DrawRendererText(
|
||||
ttf_text,
|
||||
rect.x as f32 + (rect.w - text_w) as f32 / 2.0,
|
||||
rect.y as f32 + ((PROFILE_SIZE + 1) * row_height) as f32,
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
fn draw_highlight(
|
||||
renderer: *mut sdl3_sys::render::SDL_Renderer,
|
||||
x: f32,
|
||||
y: f32,
|
||||
text_w: i32,
|
||||
text_h: i32,
|
||||
) {
|
||||
unsafe {
|
||||
sdl3_sys::render::SDL_SetRenderDrawColor(renderer, 50, 100, 180, 255);
|
||||
|
||||
let highlight = sdl3_sys::rect::SDL_FRect {
|
||||
x,
|
||||
y,
|
||||
w: text_w as f32,
|
||||
h: text_h as f32,
|
||||
};
|
||||
sdl3_sys::render::SDL_RenderFillRect(renderer, &highlight);
|
||||
sdl3_sys::render::SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
fn draw_binding_text(
|
||||
renderer: *mut sdl3_sys::render::SDL_Renderer,
|
||||
ttf_text: *mut sdl3_ttf_sys::ttf::TTF_Text,
|
||||
rect: sdl3_sys::rect::SDL_Rect,
|
||||
row_height: usize,
|
||||
selected: (usize, usize),
|
||||
gather: usize,
|
||||
i: usize,
|
||||
binding: usize,
|
||||
) {
|
||||
unsafe {
|
||||
if selected.0 == i && selected.1 == binding {
|
||||
if gather > 0 {
|
||||
let gather_text = std::ffi::CString::new(format!("{}...", gather)).unwrap();
|
||||
sdl3_ttf_sys::ttf::TTF_SetTextString(ttf_text, gather_text.as_ptr(), 0);
|
||||
}
|
||||
let (mut text_w, mut text_h) = (0, 0);
|
||||
sdl3_ttf_sys::ttf::TTF_GetTextSize(ttf_text, &mut text_w, &mut text_h);
|
||||
draw_highlight(
|
||||
renderer,
|
||||
rect.x as f32 + (rect.w / 3) as f32 * if selected.1 == 0 { 1.0 } else { 2.0 },
|
||||
rect.y as f32 + ((i + 1) * row_height) as f32,
|
||||
text_w,
|
||||
text_h,
|
||||
);
|
||||
}
|
||||
sdl3_ttf_sys::ttf::TTF_DrawRendererText(
|
||||
ttf_text,
|
||||
rect.x as f32 + (rect.w / 3) as f32 * (binding as f32 + 1.0),
|
||||
rect.y as f32 + ((i + 1) * row_height) as f32,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
fn get_binding_text(binding: &Option<ui::config::InputItem>) -> String {
|
||||
if let Some(binding) = binding {
|
||||
match binding {
|
||||
ui::config::InputItem::Key(key) => {
|
||||
return unsafe {
|
||||
std::ffi::CStr::from_ptr(sdl3_sys::keyboard::SDL_GetScancodeName(
|
||||
sdl3_sys::scancode::SDL_Scancode(key.id),
|
||||
))
|
||||
.to_str()
|
||||
.unwrap()
|
||||
.to_string()
|
||||
};
|
||||
}
|
||||
ui::config::InputItem::ControllerButton(controller_button) => {
|
||||
return unsafe {
|
||||
std::ffi::CStr::from_ptr(sdl3_sys::gamepad::SDL_GetGamepadStringForButton(
|
||||
sdl3_sys::gamepad::SDL_GamepadButton(controller_button.id),
|
||||
))
|
||||
.to_str()
|
||||
.unwrap()
|
||||
.to_string()
|
||||
};
|
||||
}
|
||||
ui::config::InputItem::ControllerAxis(controller_axis) => {
|
||||
return unsafe {
|
||||
let axis =
|
||||
std::ffi::CStr::from_ptr(sdl3_sys::gamepad::SDL_GetGamepadStringForAxis(
|
||||
sdl3_sys::gamepad::SDL_GamepadAxis(controller_axis.id),
|
||||
))
|
||||
.to_str()
|
||||
.unwrap()
|
||||
.to_string();
|
||||
let direction = if controller_axis.axis > 0 { "+" } else { "-" };
|
||||
format!("{} {}", axis, direction)
|
||||
};
|
||||
}
|
||||
ui::config::InputItem::JoystickButton(joystick_button) => {
|
||||
return format!("Joystick Button {}", joystick_button.id);
|
||||
}
|
||||
ui::config::InputItem::JoystickHat(joystick_hat) => {
|
||||
let direction = match joystick_hat.direction {
|
||||
1 => "Up",
|
||||
2 => "Right",
|
||||
4 => "Down",
|
||||
8 => "Left",
|
||||
_ => "Unknown",
|
||||
};
|
||||
return format!("Joystick Hat {} {}", joystick_hat.id, direction);
|
||||
}
|
||||
ui::config::InputItem::JoystickAxis(joystick_axis) => {
|
||||
let direction = if joystick_axis.axis > 0 { "+" } else { "-" };
|
||||
return format!("Joystick Axis {} {}", joystick_axis.id, direction);
|
||||
}
|
||||
}
|
||||
}
|
||||
"(unset)".to_string()
|
||||
}
|
||||
|
||||
pub fn get_default_profile() -> ui::config::InputProfile {
|
||||
let mut inputs: [[Option<ui::config::InputItem>; 2]; PROFILE_SIZE] =
|
||||
[const { [None, None] }; PROFILE_SIZE];
|
||||
|
||||
inputs[R_DPAD] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_D),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerButton(
|
||||
ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_DPAD_RIGHT),
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[L_DPAD] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_A),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerButton(
|
||||
ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_DPAD_LEFT),
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[D_DPAD] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_S),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerButton(
|
||||
ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_DPAD_DOWN),
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[U_DPAD] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_W),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerButton(
|
||||
ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_DPAD_UP),
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[START_BUTTON] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_RETURN),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerButton(
|
||||
ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_START),
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[Z_TRIG] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_Z),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerAxis(
|
||||
ui::config::InputControllerAxis {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_AXIS_LEFT_TRIGGER),
|
||||
axis: 1,
|
||||
initial_state: 0,
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[B_BUTTON] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_LCTRL),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerButton(
|
||||
ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_WEST),
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[A_BUTTON] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_LSHIFT),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerButton(
|
||||
ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_SOUTH),
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[R_CBUTTON] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_L),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerAxis(
|
||||
ui::config::InputControllerAxis {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_AXIS_RIGHTX),
|
||||
axis: 1,
|
||||
initial_state: 0,
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[L_CBUTTON] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_J),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerAxis(
|
||||
ui::config::InputControllerAxis {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_AXIS_RIGHTX),
|
||||
axis: -1,
|
||||
initial_state: 0,
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[D_CBUTTON] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_K),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerAxis(
|
||||
ui::config::InputControllerAxis {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_AXIS_RIGHTY),
|
||||
axis: 1,
|
||||
initial_state: 0,
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[U_CBUTTON] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_I),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerAxis(
|
||||
ui::config::InputControllerAxis {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_AXIS_RIGHTY),
|
||||
axis: -1,
|
||||
initial_state: 0,
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[R_TRIG] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_C),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerButton(
|
||||
ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER),
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[L_TRIG] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_X),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerButton(
|
||||
ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_LEFT_SHOULDER),
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[AXIS_LEFT] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_LEFT),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerAxis(
|
||||
ui::config::InputControllerAxis {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_AXIS_LEFTX),
|
||||
axis: -1,
|
||||
initial_state: 0,
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[AXIS_RIGHT] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_RIGHT),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerAxis(
|
||||
ui::config::InputControllerAxis {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_AXIS_LEFTX),
|
||||
axis: 1,
|
||||
initial_state: 0,
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[AXIS_UP] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_UP),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerAxis(
|
||||
ui::config::InputControllerAxis {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_AXIS_LEFTY),
|
||||
axis: -1,
|
||||
initial_state: 0,
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[AXIS_DOWN] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_DOWN),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerAxis(
|
||||
ui::config::InputControllerAxis {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_AXIS_LEFTY),
|
||||
axis: 1,
|
||||
initial_state: 0,
|
||||
},
|
||||
)),
|
||||
];
|
||||
inputs[HOTKEY] = [
|
||||
Some(ui::config::InputItem::Key(ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::scancode::SDL_SCANCODE_COMMA),
|
||||
})),
|
||||
Some(ui::config::InputItem::ControllerButton(
|
||||
ui::config::InputKeyButton {
|
||||
id: i32::from(sdl3_sys::gamepad::SDL_GAMEPAD_BUTTON_BACK),
|
||||
},
|
||||
)),
|
||||
];
|
||||
|
||||
ui::config::InputProfile {
|
||||
inputs,
|
||||
dinput: false,
|
||||
deadzone: DEADZONE_DEFAULT,
|
||||
}
|
||||
}
|
||||
+14
-4
@@ -65,13 +65,17 @@ struct NetplayPingMessage {
|
||||
num_of_peers: usize,
|
||||
}
|
||||
|
||||
fn select_rom(weak: slint::Weak<AppWindow>, rom_dir: slint::SharedString) {
|
||||
fn select_rom(
|
||||
weak: slint::Weak<AppWindow>,
|
||||
rom_dir: slint::SharedString,
|
||||
no_intro_map: std::sync::Arc<tokio::sync::Mutex<rustc_hash::FxHashMap<String, String>>>,
|
||||
) {
|
||||
let select_rom = ui::gui::select_rom(rom_dir);
|
||||
tokio::spawn(async move {
|
||||
if let Some(file) = select_rom.await {
|
||||
if let Some(rom_contents) = device::get_rom_contents(&file) {
|
||||
let hash = device::cart::rom::calculate_hash(&rom_contents);
|
||||
let mut game_name = ui::storage::get_game_name(&rom_contents);
|
||||
let mut game_name = ui::gui::get_nointro_name(&rom_contents, no_intro_map).await;
|
||||
let pal = device::cart::rom::is_system_pal(&rom_contents);
|
||||
let game_crc = ui::storage::get_game_crc(&rom_contents);
|
||||
let cheats = ui::config::Cheats::new();
|
||||
@@ -108,6 +112,7 @@ fn select_rom(weak: slint::Weak<AppWindow>, rom_dir: slint::SharedString) {
|
||||
});
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
fn setup_callbacks(
|
||||
app: &AppWindow,
|
||||
netplay_write_sender: &tokio::sync::broadcast::Sender<Option<NetplayLobbyMessage>>,
|
||||
@@ -116,6 +121,7 @@ fn setup_callbacks(
|
||||
netplay_write_receiver: &tokio::sync::broadcast::Receiver<Option<NetplayLobbyMessage>>,
|
||||
close_ping_tx: &tokio::sync::broadcast::Sender<()>,
|
||||
close_ping_rx: &tokio::sync::broadcast::Receiver<()>,
|
||||
no_intro_map: std::sync::Arc<tokio::sync::Mutex<rustc_hash::FxHashMap<String, String>>>,
|
||||
) {
|
||||
let weak = app.as_weak();
|
||||
let netplay_write_sender_create_session = netplay_write_sender.clone();
|
||||
@@ -238,7 +244,7 @@ fn setup_callbacks(
|
||||
|
||||
let weak_app = app.as_weak();
|
||||
app.on_netplay_select_rom(move |rom_dir| {
|
||||
select_rom(weak_app.clone(), rom_dir);
|
||||
select_rom(weak_app.clone(), rom_dir, no_intro_map.clone());
|
||||
});
|
||||
|
||||
let weak_app = app.as_weak();
|
||||
@@ -992,7 +998,10 @@ fn setup_join_window(
|
||||
app.invoke_netplay_refresh_sessions();
|
||||
}
|
||||
|
||||
pub fn netplay_window(app: &AppWindow) {
|
||||
pub fn netplay_window(
|
||||
app: &AppWindow,
|
||||
no_intro_map: std::sync::Arc<tokio::sync::Mutex<rustc_hash::FxHashMap<String, String>>>,
|
||||
) {
|
||||
let (netplay_read_sender, netplay_read_receiver): (
|
||||
tokio::sync::broadcast::Sender<Option<NetplayLobbyMessage>>,
|
||||
tokio::sync::broadcast::Receiver<Option<NetplayLobbyMessage>>,
|
||||
@@ -1016,5 +1025,6 @@ pub fn netplay_window(app: &AppWindow) {
|
||||
&netplay_write_receiver,
|
||||
&close_ping_tx,
|
||||
&close_ping_rx,
|
||||
no_intro_map,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ pub fn ra_window(app: &ui::gui::AppWindow) {
|
||||
}
|
||||
|
||||
if !cfg!(ra_hardcore_enabled) {
|
||||
app.set_ra_softcore_only(true);
|
||||
app.set_ra_casual_only(true);
|
||||
}
|
||||
|
||||
if app.get_ra_enabled() && !app.get_ra_username().is_empty() {
|
||||
|
||||
+4
-40
@@ -20,8 +20,8 @@ fn build_gfx_info(device: &mut device::Device, netplay: bool) -> GFX_INFO {
|
||||
DPC_END_REG: &mut device.rdp.regs_dpc[device::rdp::DPC_END_REG],
|
||||
DPC_STATUS_REG: &mut device.rdp.regs_dpc[device::rdp::DPC_STATUS_REG],
|
||||
PAL: device.cart.pal,
|
||||
widescreen: device.ui.config.video.widescreen,
|
||||
fullscreen: device.ui.video.fullscreen,
|
||||
widescreen: device.ui.video.widescreen,
|
||||
vsync: if !netplay {
|
||||
device.ui.config.video.vsync
|
||||
} else {
|
||||
@@ -56,14 +56,14 @@ pub fn init(device: &mut device::Device, netplay: bool) {
|
||||
2
|
||||
};
|
||||
if device.cart.pal {
|
||||
window_width = if device.ui.config.video.widescreen {
|
||||
window_width = if device.ui.video.widescreen {
|
||||
PAL_WIDESCREEN_WIDTH * scale
|
||||
} else {
|
||||
PAL_STANDARD_WIDTH * scale
|
||||
};
|
||||
window_height = PAL_HEIGHT * scale;
|
||||
} else {
|
||||
window_width = if device.ui.config.video.widescreen {
|
||||
window_width = if device.ui.video.widescreen {
|
||||
NTSC_WIDESCREEN_WIDTH * scale
|
||||
} else {
|
||||
NTSC_STANDARD_WIDTH * scale
|
||||
@@ -182,16 +182,14 @@ pub fn load_state(device: &mut device::Device, rdp_state: *const u8) {
|
||||
pub fn pause_loop(ui: &mut ui::Ui, frame_time: f64) {
|
||||
let mut paused = true;
|
||||
let mut frame_advance = false;
|
||||
let mut pause_counter = 0;
|
||||
while paused && !frame_advance {
|
||||
std::thread::sleep(std::time::Duration::from_secs_f64(frame_time));
|
||||
ui::input::get(ui, 0, pause_counter); // to gather hotkey input
|
||||
unsafe { sdl3_sys::events::SDL_PumpEvents() };
|
||||
ui::input::get(ui, 0); // to gather hotkey input
|
||||
retroachievements::do_idle();
|
||||
let callback = unsafe { rdp_check_callback() };
|
||||
paused = callback.paused;
|
||||
frame_advance = callback.frame_advance;
|
||||
pause_counter += 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,37 +274,3 @@ pub fn onscreen_message(message: &str, milliseconds: MESSAGE_LENGTH) {
|
||||
rdp_onscreen_message(c_message.as_ptr(), milliseconds)
|
||||
};
|
||||
}
|
||||
|
||||
pub fn draw_text(
|
||||
text: &str,
|
||||
renderer: *mut sdl3_sys::render::SDL_Renderer,
|
||||
image_texture: *mut sdl3_sys::render::SDL_Texture,
|
||||
text_engine: *mut sdl3_ttf_sys::ttf::TTF_TextEngine,
|
||||
font: *mut sdl3_ttf_sys::ttf::TTF_Font,
|
||||
) {
|
||||
unsafe {
|
||||
let (mut w, mut h) = (0, 0);
|
||||
sdl3_sys::render::SDL_GetRenderOutputSize(renderer, &mut w, &mut h);
|
||||
|
||||
let c_text = std::ffi::CString::new(text).unwrap();
|
||||
let ttf_text = sdl3_ttf_sys::ttf::TTF_CreateText(text_engine, font, c_text.as_ptr(), 0);
|
||||
|
||||
sdl3_sys::everything::SDL_RenderClear(renderer);
|
||||
let rect = sdl3_sys::rect::SDL_FRect {
|
||||
x: 0.0,
|
||||
y: 0.0,
|
||||
w: w as f32,
|
||||
h: (h - sdl3_ttf_sys::ttf::TTF_GetFontHeight(font)) as f32,
|
||||
};
|
||||
sdl3_sys::render::SDL_RenderTexture(renderer, image_texture, std::ptr::null(), &rect);
|
||||
let (mut text_w, mut text_h) = (0, 0);
|
||||
sdl3_ttf_sys::ttf::TTF_GetTextSize(ttf_text, &mut text_w, &mut text_h);
|
||||
sdl3_ttf_sys::ttf::TTF_DrawRendererText(
|
||||
ttf_text,
|
||||
(w / 2 - text_w / 2) as f32,
|
||||
(h - text_h) as f32,
|
||||
);
|
||||
sdl3_sys::render::SDL_RenderPresent(renderer);
|
||||
sdl3_ttf_sys::ttf::TTF_DestroyText(ttf_text);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user