Compare commits
591 commits
98421be00c
...
c562a217fc
Author | SHA1 | Date | |
---|---|---|---|
XargonWan | c562a217fc | ||
91a9a9cf3b | |||
bd3a43573c | |||
5220c36a7c | |||
37180e2e37 | |||
6f59a815ad | |||
74c75341b0 | |||
b579f50936 | |||
807eb20094 | |||
8ca828d356 | |||
d16ae0a175 | |||
98e0cf6ea8 | |||
1b8f51ac23 | |||
a54c2891f6 | |||
4497d86852 | |||
97c3c5c5cf | |||
dab35970ab | |||
9a9a371c5d | |||
f0ea55b9f2 | |||
6c6dc82ef6 | |||
fbbfec6274 | |||
487a842f36 | |||
8c9d9d51fc | |||
3baf505351 | |||
26b7945171 | |||
0c5e296103 | |||
8326c0bbee | |||
a924b84dca | |||
c013f7ba7d | |||
f09f4838f1 | |||
b26da9d80d | |||
697c3fb74f | |||
2d34ab6fb4 | |||
8428a2c0a3 | |||
c9522b029b | |||
27a8bd867c | |||
572cd9b8b0 | |||
9aab182c5c | |||
d8e52a616c | |||
fbf40c177b | |||
049ec88a4a | |||
ae5002c59f | |||
03c821a6e5 | |||
4c5cabc5fc | |||
1a4648622a | |||
bdd93d86ea | |||
59dd4c58d5 | |||
d380db8a1f | |||
ce580a269f | |||
89ce634bcb | |||
3c06f06ee8 | |||
c95dd349bb | |||
0cd15194b4 | |||
4af72384db | |||
91edbddc66 | |||
f20f9158b7 | |||
12d2541f2d | |||
c53e25fdb2 | |||
bd6a6ca919 | |||
a7d87580b6 | |||
f5f6a18e50 | |||
27d0887f1a | |||
4ce33fa646 | |||
3c8fa752b2 | |||
8f835ff5b3 | |||
fb773da199 | |||
77d27db8cb | |||
9bc20fb18a | |||
3dcc7be790 | |||
56996c0a26 | |||
ed7e9558cb | |||
7bcd8290b9 | |||
e9d128a6ec | |||
eae5dfc310 | |||
ac963843f6 | |||
d54dcaef39 | |||
3310dff8e3 | |||
5beb8e5a34 | |||
d14cfd4e7e | |||
45fc13a43e | |||
ed1d15dbac | |||
f3d3f5363d | |||
d523910aa7 | |||
f400ba78d7 | |||
0d761db5e6 | |||
fdd0232cbb | |||
f1caaf9ff1 | |||
9d4da523b5 | |||
cc1c034525 | |||
e14452c48a | |||
0fa691d9fa | |||
7a350ae93c | |||
7f9860e0b3 | |||
54dee3ac57 | |||
bc13c93c53 | |||
ce0d51663c | |||
2a0d7867f4 | |||
ca132c0ce7 | |||
80e7b442d3 | |||
98d36d56cc | |||
86fad10a6c | |||
d48c5616fa | |||
4b2d3b283c | |||
6f62ea96c8 | |||
3ba46470da | |||
fe5a4ca86f | |||
6fb90e593f | |||
91caa23aec | |||
9566ecb490 | |||
a463b6fa2d | |||
31c8e76e47 | |||
7502649fc0 | |||
a2063f4b5a | |||
c33ee569f4 | |||
c2ae6468fe | |||
6614b8a1c7 | |||
f485f83d0d | |||
6a521ffb68 | |||
4fa953dc0d | |||
fb9aeddfab | |||
8d23e474d9 | |||
738d2a39c3 | |||
670acfca07 | |||
947f252cb2 | |||
52966534d4 | |||
c4ef9e2e7f | |||
4b24cb0d4e | |||
5300e54295 | |||
d1f9dc7e23 | |||
bc0b8a4ad3 | |||
8b459af323 | |||
e357c14c37 | |||
0d07da2a88 | |||
842c9966eb | |||
a7c1d463ca | |||
2d09905584 | |||
a2061e4711 | |||
f07e612f47 | |||
1747ca0393 | |||
ccf5e3de36 | |||
0e692be641 | |||
fd65e3d559 | |||
efa71da31a | |||
1acab82dc9 | |||
5a04e95a6a | |||
7ae17e8f17 | |||
fb0ab44469 | |||
66c939b00c | |||
548aef50ee | |||
f48e68c5e9 | |||
e69210204f | |||
511bb52f83 | |||
ad30e5c4e6 | |||
7958af9d7f | |||
d16b6aad72 | |||
a653294eb7 | |||
7927dbb8c5 | |||
d579c0a01e | |||
79e87d7855 | |||
67b955e460 | |||
6a5dc5fdb2 | |||
142b1c5d40 | |||
9ebf166d58 | |||
02e766a193 | |||
e33b2123e5 | |||
17c59f8730 | |||
a99e01edfa | |||
0aab42cf8e | |||
904a8f5c5d | |||
9d64a2feab | |||
cd89aa749c | |||
599865a6de | |||
a05903dd52 | |||
e34fbb9115 | |||
56c8c11783 | |||
c80ba5be86 | |||
281b967e8f | |||
f3af0e246c | |||
15f6d8730a | |||
640d1cd3ee | |||
c8feeaf479 | |||
be1017dbc3 | |||
e9f4b4b261 | |||
1b70d815dd | |||
7bcbc16bf2 | |||
2428735b66 | |||
3928b616c6 | |||
a79e757f86 | |||
580f075d85 | |||
45ca74a1f6 | |||
a03cf10400 | |||
737d75f0fc | |||
c10c3c6a0b | |||
039bb6e35a | |||
babbfaccc9 | |||
5d340f7bbf | |||
1123fb3524 | |||
0512c2632d | |||
38faa8a661 | |||
05f7608de9 | |||
52a7854d37 | |||
61935e54d8 | |||
84d5750215 | |||
ea06223b42 | |||
c2a61f7a08 | |||
b721055bcb | |||
ebbfaf25ab | |||
42fdd6500b | |||
4032f4440f | |||
d12c0483de | |||
a2c9c7d884 | |||
6a19cdc40b | |||
298fd0f7d6 | |||
266a3e4651 | |||
8874690ef6 | |||
98bf9251d5 | |||
e08f270aa2 | |||
9a18a5c816 | |||
6672aee6c5 | |||
d4e53a53f0 | |||
4d245c955f | |||
63e9586d88 | |||
57a821e717 | |||
18eade57ad | |||
2446e9d91c | |||
f845b5f031 | |||
ff091a9d83 | |||
965ece8a85 | |||
d4a0f32dd0 | |||
8997cf2209 | |||
b9b870942e | |||
c9a2fd8396 | |||
366477fa72 | |||
eecd84ac09 | |||
3f4ed60649 | |||
ec4a1cb3de | |||
1c11625c4f | |||
19b4fc960f | |||
620861ebd1 | |||
8791c66b13 | |||
ac3fe9de51 | |||
7e0f10ec94 | |||
058ab4f9f3 | |||
860e9919ab | |||
0b25ad5cfa | |||
cb42ef652a | |||
9351718f23 | |||
fc68595a47 | |||
d52d692804 | |||
32f206f36f | |||
74dfa5239f | |||
db6c9801dc | |||
193af56e40 | |||
f9401529d1 | |||
068b7c6bfd | |||
d15dd28e26 | |||
76e29d534d | |||
f7cc0f6ace | |||
ae779a42e6 | |||
b71b0d1abf | |||
2bba50c25c | |||
8c59b072b1 | |||
3d5890cb91 | |||
a6a74fcc44 | |||
f528775cf3 | |||
ea023b8e34 | |||
20293e1c03 | |||
f7496141f4 | |||
03ce48da81 | |||
2079b4c964 | |||
c0d9fa12f1 | |||
51cb73b987 | |||
7992dbcf01 | |||
b9f8d4cfdd | |||
ce3d50d2b3 | |||
b0a7e76974 | |||
256ed24621 | |||
fc40308cd7 | |||
03c6fb3297 | |||
a5a4937011 | |||
5a2e6ec537 | |||
c630ad091c | |||
03149d0b33 | |||
7e9590d7c3 | |||
8689b3aecf | |||
3a5c4a7605 | |||
3f2f8f9b57 | |||
3552c6e228 | |||
bd6956d52f | |||
338843ce46 | |||
3f5e277cd6 | |||
330f36ee14 | |||
2a9ab5ea88 | |||
302f6e0fc5 | |||
eccc5095fb | |||
3f8abb0807 | |||
1d3b2f8066 | |||
0723ae8364 | |||
9be6cdc42b | |||
17f55fd8cf | |||
a841d4175a | |||
3d0701f288 | |||
aba1163c44 | |||
75fdd94d45 | |||
b0616fcbb1 | |||
b697dc2a52 | |||
8ee7b6f118 | |||
5b7becf446 | |||
ccf680b433 | |||
8ff6f50635 | |||
5776d37d54 | |||
3defff515d | |||
7353f04e66 | |||
3adee7c863 | |||
a9956e2f07 | |||
c15eff8994 | |||
0347a276ea | |||
2d84fa78db | |||
544abf1e81 | |||
9c07456d21 | |||
7791859d14 | |||
f6b3f11714 | |||
92c3696843 | |||
c63184f010 | |||
de317b4c91 | |||
22478ed145 | |||
2bbcdd375c | |||
6ad96ba252 | |||
3afe2bacc3 | |||
ee61283e2b | |||
b2e796c664 | |||
2c95d5a7d6 | |||
a7d673f541 | |||
03f6567dd5 | |||
16697c0503 | |||
91d3f3a43a | |||
b288bd172c | |||
14c4e00bf2 | |||
5d653a9e93 | |||
2e01613e41 | |||
c873441851 | |||
7a8bd97226 | |||
75b93794b0 | |||
4931ea9749 | |||
b4b498ba29 | |||
908788da25 | |||
c87d2e7584 | |||
09d16e9c16 | |||
b3ac8b6320 | |||
9e7b02291b | |||
45091547b7 | |||
b1adbc0f2a | |||
81bc30cc26 | |||
84e850a507 | |||
412e74738a | |||
82f6686cbf | |||
7a3a8f8042 | |||
dff85c46a6 | |||
f6c4acf2d7 | |||
6185eeb0cc | |||
c1218d5033 | |||
73b7f34f50 | |||
539cdd8146 | |||
71ccaf193e | |||
f9d5b2b12e | |||
d52e175896 | |||
4c1b5fde3c | |||
84ddb1c136 | |||
24418417eb | |||
456f9be771 | |||
192035e16a | |||
7e4a88a144 | |||
440f45fff8 | |||
be0971cd3a | |||
c6a1924682 | |||
9caf43a095 | |||
5c846257b0 | |||
4dba11dc50 | |||
cd04c97fc3 | |||
9703531273 | |||
3b5d5a7da4 | |||
428bbc1416 | |||
9eac172000 | |||
fcbcae1e77 | |||
73067f76a3 | |||
2ebb41a316 | |||
3ba6ebb37f | |||
b93e24295e | |||
1f847fff8a | |||
a8ccd77aa7 | |||
f792e9665c | |||
7bdd015f03 | |||
0d41632352 | |||
f48689a427 | |||
4d4c493116 | |||
71e1bab958 | |||
b1a1f2dbd8 | |||
a6e3f638bf | |||
9300f00b94 | |||
d5b075b4d8 | |||
5b35a6ac91 | |||
0cf89ea875 | |||
ab2d5d998e | |||
dd436bbda8 | |||
fa763336e0 | |||
5ac4c390d5 | |||
e83f738073 | |||
26d229e159 | |||
076709b239 | |||
d55ddf61c5 | |||
c9bc2b7695 | |||
f4bc3a1cf4 | |||
7d8b89ee00 | |||
7db5895c86 | |||
d0bb8968b0 | |||
f08528711b | |||
20cb280b97 | |||
ea2f29a5c9 | |||
f4d1534bab | |||
2d991a52b9 | |||
f84caff123 | |||
733c46eff2 | |||
a1e31331b5 | |||
39e0a1773b | |||
b8bae01c38 | |||
b076933623 | |||
d86923fb98 | |||
298b371715 | |||
1f605347c3 | |||
afea0eace9 | |||
0582856b84 | |||
5fefb5960b | |||
2dc805bcbd | |||
75bff1f0df | |||
bb22747a1b | |||
f1ee285b3e | |||
335b3dd4ff | |||
01406c27c3 | |||
0b5b0e0572 | |||
7ef8f6cc28 | |||
ff3e1c3a72 | |||
2cf591f99d | |||
d3e2e5085b | |||
324d83ffd9 | |||
873a8e5d96 | |||
8d5dcb494a | |||
611b8bfdd7 | |||
38d232769c | |||
48585d5ca5 | |||
fedc264087 | |||
27c01e3b1e | |||
72ee58e748 | |||
9207004bd2 | |||
ddbbf06fe7 | |||
47a8363f32 | |||
13fadd1658 | |||
ad2dd1832f | |||
3d687357bc | |||
35f51e6904 | |||
085b3da8e0 | |||
8ca231ceb4 | |||
2bbb2ba0cc | |||
5bea1dfb8b | |||
b067481f3f | |||
7ea52c13a5 | |||
cac5ec0402 | |||
be3aea7845 | |||
f7be57336b | |||
8a56304eba | |||
fa355cdb8f | |||
062288ad07 | |||
c8259aa792 | |||
bcf902b46d | |||
14b65cb2e4 | |||
5e3d07bb56 | |||
5e1d7c6a87 | |||
cd863de77b | |||
b13c3ee582 | |||
42f7e46d08 | |||
a1cb6ce4c4 | |||
e47225d436 | |||
d0605ea650 | |||
4ffc5d6bf9 | |||
9a78863f03 | |||
4ae460b41a | |||
f9886b904f | |||
c8bbebffac | |||
554593e542 | |||
e8a7ba6ad4 | |||
c2beb86bcc | |||
84f296badd | |||
b5b36e09b3 | |||
557748970a | |||
d2d4b6d45c | |||
db072d7318 | |||
e7170c45e4 | |||
6766fd2ca1 | |||
d1427a1ea3 | |||
abfa5ba0e8 | |||
ac7f912654 | |||
f5dbaa3224 | |||
a1617c51f1 | |||
6d7135fc08 | |||
7ac69f9371 | |||
f088658004 | |||
7f4f06eedc | |||
badbc2fb3a | |||
74e9c62534 | |||
be95b494dc | |||
f6db47510d | |||
4c3a95d537 | |||
e0c57b068d | |||
9e8143820e | |||
3c3143bad7 | |||
a6ef256a49 | |||
b18423d25a | |||
59507ecc0c | |||
bb9b09ef89 | |||
196e0d1031 | |||
a5b1b17c2c | |||
602b37febe | |||
8c0bfa2e3b | |||
6d9a95a667 | |||
c56b8d9230 | |||
18f5f3e164 | |||
95433503e5 | |||
ab39b3759e | |||
a5c07b5b38 | |||
43060f9b41 | |||
7b4cfefbc4 | |||
706727ff96 | |||
009b5b8d33 | |||
311ad93337 | |||
36215d9d67 | |||
a252ec0e4e | |||
80bf0c320a | |||
1df2641e0c | |||
6b541ad501 | |||
1700bb195c | |||
661bb5d539 | |||
dfc217d006 | |||
12e1a683e5 | |||
0094a32d8e | |||
eeccee307d | |||
e3148e6cda | |||
2d3a559cee | |||
74691c8951 | |||
91333b5273 | |||
63729cce19 | |||
302305b3ee | |||
552f540a49 | |||
51c9507b87 | |||
272e5834e0 | |||
c70684e654 | |||
6256f44455 | |||
c576968e65 | |||
fec433d4b2 | |||
ec8a49623a | |||
b7b873e553 | |||
82bd856366 | |||
38a99abf79 | |||
56c7d4cf95 | |||
5cd635b138 | |||
10e398b23a | |||
4ce33e6961 | |||
39e11b270f | |||
c74e30d593 | |||
eb75f79b70 | |||
cfa53c5097 | |||
4ddf13a833 | |||
2aa52d69e5 | |||
0c3d1bf880 | |||
33ab4b4088 | |||
5feef892c0 | |||
6ec18005d6 | |||
1befae20e9 | |||
b8e3656547 | |||
aa3eaf69aa | |||
28380963a0 | |||
cd7b393375 | |||
ecf3ea2984 | |||
64ecbb5dde | |||
82b21ec1eb | |||
592f132dcd | |||
ebd1662ad5 | |||
990e26369d | |||
1898a161b4 | |||
14064ac603 | |||
8b5a447da6 | |||
8d4322ca8f | |||
81e6b81a04 |
|
@ -4,8 +4,7 @@ This document contains information specific to the Android release, for more gen
|
|||
|
||||
It's also generally recommended to read the [Frequently Asked Questions (FAQ) for Android](FAQ-ANDROID.md) document prior to diving into the information in this document.
|
||||
|
||||
You can buy the Android APK from our Patreon page: \
|
||||
https://www.patreon.com/es_de
|
||||
You can buy the Android APK via [Patreon](https://www.patreon.com/es_de), the [Samsung Galaxy Store](https://galaxystore.samsung.com/detail/org.es_de.frontend.galaxy) or [Huawei AppGallery](https://appgallery.huawei.com/#/app/C111315115)
|
||||
|
||||
Table of contents:
|
||||
|
||||
|
@ -186,6 +185,14 @@ Also be aware that the version check that runs on app startup may not be able to
|
|||
|
||||
It's generally a very good idea to import your native Android apps into ES-DE prior to setting it as the home app, this way you can easily access things like the Settings app. Note however that even if you somehow lock yourself out of the system by setting ES-DE as the home app and not having any native apps added you can still always access the Settings app via the Android notification shade. On most devices you access this by swiping down from the top of the screen. After swiping down, just select the cogwheel icon to start the Settings app. From there you can change the home app to something else than ES-DE, should you need to.
|
||||
|
||||
## Running ES-DE in multi-window mode
|
||||
|
||||
On tablets and other devices that support it, ES-DE can be run in multi-window mode. This does come with some caveats though, most importantly that changing to or from multi-window mode or changing the size of the ES-DE window when running in multi-window mode will trigger a reload of the application. When this happens any menu that is open will get unceremoniously closed, so make sure to never do this when for instance the scraper or theme downloader is running as they will get instantly stopped.
|
||||
|
||||
Also be aware that running in multi-window mode obviously changes the ES-DE window size and therefore likely the window aspect ratio as well, so it may not look good with some themes that do not support the new aspect ratio.
|
||||
|
||||
Finally, multi-window mode doesn't work when ES-DE has been set as the home app as Android does not allow that.
|
||||
|
||||
## Known ES-DE problems
|
||||
|
||||
* Poor performance/low frame rate after startup on some devices, which seems to happen randomly and is usually resolved by itself within 10 to 30 seconds.
|
||||
|
@ -215,6 +222,12 @@ If you prefer to apply the NetherSX2 patch yourself (i.e. build the APK) then yo
|
|||
|
||||
https://github.com/Trixarian/NetherSX2-patch
|
||||
|
||||
### Cemu
|
||||
|
||||
This emulator can be downloaded from the following GitHub site. Note that this repository is not from the official Cemu project, we consider Cemu as experimental on Android for the time being.
|
||||
|
||||
https://github.com/SSimco/Cemu/releases
|
||||
|
||||
### Citra
|
||||
|
||||
The original Citra emulator project is no longer alive, but there is a fork that should work as a drop-in replacement. The Citra MMJ fork is also a viable alternative. Both of these emulators are available for download from their GitHub sites.
|
||||
|
@ -302,8 +315,9 @@ https://github.com/jtothebell/fake-08/releases
|
|||
|
||||
### Flycast
|
||||
|
||||
Flycast is not available on the Play store or the F-Droid store, but it can be downloaded from their GitHub site.
|
||||
This emulator can be installed from the Play store or it can be downloaded from their GitHub site.
|
||||
|
||||
https://play.google.com/store/apps/details?id=com.flycast.emulator \
|
||||
https://github.com/flyinghead/flycast/releases
|
||||
|
||||
### fMSX
|
||||
|
@ -371,6 +385,12 @@ For some systems you will need to explictly set the _Start_ and _Select_ buttons
|
|||
|
||||
There are a few more things that you may need to configure for some systems, but that's beyond the scope of this document and should be covered by the MAME emulator documentation.
|
||||
|
||||
### Mandarine
|
||||
|
||||
This emulator which is forked from Citra can be downloaded from their GitHub site.
|
||||
|
||||
https://github.com/mandarine3ds/mandarine/releases
|
||||
|
||||
### MasterGear
|
||||
|
||||
This emulator can be installed from the Play store as a paid app.
|
||||
|
@ -547,6 +567,7 @@ This is clearly not a complete list of Android devices, but rather those we know
|
|||
| Anbernic | RG ARC | 12 | Yes | None | LineageOS |
|
||||
| Anbernic | RG Cube | 13 | Yes | None | |
|
||||
| AYANEO | Pocket Air | 12 | Yes | None | |
|
||||
| AYANEO | Pocket Micro | 13 | Yes | None | |
|
||||
| AYANEO | Pocket S | 13 | Yes | None | |
|
||||
| Ayn | Odin (Base/Pro) | 10 | Yes | None | |
|
||||
| Ayn | Odin Lite | 11 | Yes | None | |
|
||||
|
@ -561,7 +582,7 @@ This is clearly not a complete list of Android devices, but rather those we know
|
|||
| Google | Pixel 7 Pro | 13 | Yes | None | |
|
||||
| Google | Pixel 8 Pro | 14 | Yes | None | |
|
||||
| Google | Pixel Fold | 14 | Yes | None | |
|
||||
| Google | Pixel Tablet | 14 | Yes | None | |
|
||||
| Google | Pixel Tablet | 14, 15 | Yes | None | |
|
||||
| GPD | XD Plus | 11 | Yes | None | LineageOS |
|
||||
| Honor | 20 lite | 10 | Yes | None | |
|
||||
| Honor | Magic5 Pro | 13 | Yes | None | |
|
||||
|
@ -615,8 +636,8 @@ This is clearly not a complete list of Android devices, but rather those we know
|
|||
| Samsung | Galaxy A71 5G | 13 | Yes | None | |
|
||||
| Samsung | Galaxy M52 5G | 13 | Yes | None | |
|
||||
| Samsung | Galaxy Note 9 | 10 | Yes | None | |
|
||||
| Samsung | Galaxy Note 20 | 13 | No | Fails at configurator/onboarding | |
|
||||
| Samsung | Galaxy Note 20 Ultra 5G | 13 | Yes | None | |
|
||||
| Samsung | Galaxy Note 20 | 13 | Yes | None | The configurator/onboarding may fail if the device is in portrait mode, so always use landscape mode when running through the initial setup |
|
||||
| Samsung | Galaxy Note 20 Ultra 5G | 13 | Yes | None | The configurator/onboarding may fail if the device is in portrait mode, so always use landscape mode when running through the initial setup |
|
||||
| Samsung | Galaxy S9+ | 10 | Yes | None | |
|
||||
| Samsung | Galaxy S10 | 12 | Yes | None | |
|
||||
| Samsung | Galaxy S20 | 13 | Yes | None | |
|
||||
|
@ -758,7 +779,7 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
|
|||
| naomi | Sega NAOMI | Flycast | Flycast **(Standalone)** | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
|
||||
| naomi2 | Sega NAOMI 2 | Flycast | Flycast **(Standalone)** | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
|
||||
| naomigd | Sega NAOMI GD-ROM | Flycast | Flycast **(Standalone)** | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
|
||||
| n3ds | Nintendo 3DS | Citra | Citra **(Standalone)**,<br>Citra Canary **(Standalone)**,<br>Citra MMJ **(Standalone)**,<br>Lime3DS **(Standalone)**,<br>Panda3DS **(Standalone)** | No | Single ROM file |
|
||||
| n3ds | Nintendo 3DS | Citra | Citra **(Standalone)**,<br>Citra Canary **(Standalone)**,<br>Citra MMJ **(Standalone)**,<br>Mandarine **(Standalone)**,<br>Lime3DS **(Standalone)**,<br>Panda3DS **(Standalone)** | No | Single ROM file |
|
||||
| n64 | Nintendo 64 | Mupen64Plus-Next | M64Plus FZ **(Standalone)**,<br>Mupen64Plus AE **(Standalone)**,<br>ParaLLEl N64 | No | Single archive or ROM file |
|
||||
| n64dd | Nintendo 64DD | Mupen64Plus-Next | M64Plus FZ **(Standalone)**,<br>Mupen64Plus AE **(Standalone)**,<br>ParaLLEl N64 | Yes | |
|
||||
| nds | Nintendo DS | melonDS DS | melonDS,<br>melonDS **(Standalone)**,<br>melonDS Nightly **(Standalone)**,<br>DeSmuME,<br>DeSmuME 2015,<br>DraStic **(Standalone)**,<br>NooDS **(Standalone)** | No | Single archive or ROM file |
|
||||
|
@ -835,7 +856,7 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
|
|||
| vsmile | VTech V.Smile | MAME4droid 2024 **(Standalone)** | | Yes | Single archive or ROM file |
|
||||
| wasm4 | WASM-4 Fantasy Console | WASM-4 | | No | Single .wasm file |
|
||||
| wii | Nintendo Wii | Dolphin | Dolphin **(Standalone)**,<br>Dolphin MMJR **(Standalone)**,<br>Dolphin MMJR2 **(Standalone)** | No | |
|
||||
| wiiu | Nintendo Wii U | _Placeholder_ | | | |
|
||||
| wiiu | Nintendo Wii U | Cemu **(Standalone)** | | No | See the specific _Nintendo Wii U_ section in the user guide |
|
||||
| windows | Microsoft Windows | Winlator Cmod Glibc **(Standalone)** | Winlator Cmod PRoot **(Standalone)** | No | See the _Winlator_ section elsewhere in this document |
|
||||
| windows3x | Microsoft Windows 3.x | DOSBox-Pure | | No | |
|
||||
| windows9x | Microsoft Windows 9x | DOSBox-Pure | | No | |
|
||||
|
|
11
ANDROID.md
|
@ -4,8 +4,7 @@ This document contains information specific to the Android release, for more gen
|
|||
|
||||
It's also generally recommended to read the [Frequently Asked Questions (FAQ) for Android](FAQ-ANDROID.md) document prior to diving into the information in this document.
|
||||
|
||||
You can buy the Android APK from our Patreon page: \
|
||||
https://www.patreon.com/es_de
|
||||
You can buy the Android APK via [Patreon](https://www.patreon.com/es_de), the [Samsung Galaxy Store](https://galaxystore.samsung.com/detail/org.es_de.frontend.galaxy) or [Huawei AppGallery](https://appgallery.huawei.com/#/app/C111315115)
|
||||
|
||||
Table of contents:
|
||||
|
||||
|
@ -302,8 +301,9 @@ https://github.com/jtothebell/fake-08/releases
|
|||
|
||||
### Flycast
|
||||
|
||||
Flycast is not available on the Play store or the F-Droid store, but it can be downloaded from their GitHub site.
|
||||
This emulator can be installed from the Play store or it can be downloaded from their GitHub site.
|
||||
|
||||
https://play.google.com/store/apps/details?id=com.flycast.emulator \
|
||||
https://github.com/flyinghead/flycast/releases
|
||||
|
||||
### fMSX
|
||||
|
@ -547,6 +547,7 @@ This is clearly not a complete list of Android devices, but rather those we know
|
|||
| Anbernic | RG ARC | 12 | Yes | None | LineageOS |
|
||||
| Anbernic | RG Cube | 13 | Yes | None | |
|
||||
| AYANEO | Pocket Air | 12 | Yes | None | |
|
||||
| AYANEO | Pocket Micro | 13 | Yes | None | |
|
||||
| AYANEO | Pocket S | 13 | Yes | None | |
|
||||
| Ayn | Odin (Base/Pro) | 10 | Yes | None | |
|
||||
| Ayn | Odin Lite | 11 | Yes | None | |
|
||||
|
@ -615,8 +616,8 @@ This is clearly not a complete list of Android devices, but rather those we know
|
|||
| Samsung | Galaxy A71 5G | 13 | Yes | None | |
|
||||
| Samsung | Galaxy M52 5G | 13 | Yes | None | |
|
||||
| Samsung | Galaxy Note 9 | 10 | Yes | None | |
|
||||
| Samsung | Galaxy Note 20 | 13 | No | Fails at configurator/onboarding | |
|
||||
| Samsung | Galaxy Note 20 Ultra 5G | 13 | Yes | None | |
|
||||
| Samsung | Galaxy Note 20 | 13 | Yes | None | The configurator/onboarding may fail if the device is in portrait mode, so always use landscape mode when running through the initial setup |
|
||||
| Samsung | Galaxy Note 20 Ultra 5G | 13 | Yes | None | The configurator/onboarding may fail if the device is in portrait mode, so always use landscape mode when running through the initial setup |
|
||||
| Samsung | Galaxy S9+ | 10 | Yes | None | |
|
||||
| Samsung | Galaxy S10 | 12 | Yes | None | |
|
||||
| Samsung | Galaxy S20 | 13 | Yes | None | |
|
||||
|
|
49
CHANGELOG.md
|
@ -6,19 +6,66 @@
|
|||
|
||||
### Release overview
|
||||
|
||||
3.1 maintenance release.
|
||||
This release adds support for four more languages, reduces the memory footprint under some circumstances and enables a few more emulators.
|
||||
|
||||
On Android the default audio driver has been changed from AAudio to OpenSL ES which should decrease audio latency on many devices. There is however a new menu entry in the Sound settings menu that makes it possible to easily revert to AAudio in case of issues with the OpenSL ES driver. Also for Android there is now experimental support for running ES-DE in multi-window mode on tablets and other devices that support this.
|
||||
|
||||
In addition to the above there are a number of bug fixes and other minor improvements.
|
||||
|
||||
### Detailed list of changes
|
||||
|
||||
* Added translations for Catalan (ca_ES)
|
||||
* Added translations for German (de_DE)
|
||||
* Added translations for Dutch (nl_NL)
|
||||
* Added translations for Korean (ko_KR)
|
||||
* Decreased the memory footprint under some circumstances by completely freeing up video player resources after finishing view transitions
|
||||
* The Git index stat cache is now refreshed for all themes when starting the theme downloader (this speeds up the inventory under some circumstances)
|
||||
* Added Mandarine standalone as an alternative emulator for the n3ds system
|
||||
* (Android) Changed the default audio driver from AAudio to OpenSL ES
|
||||
* (Android) Added an audio driver menu option to the Sound settings menu
|
||||
* (Android) Added experimental support for running in multi-window mode
|
||||
* (Android) Directories for corrupt themes are now automatically removed when the theme downloader is started
|
||||
* (Android) Added experimental support for the Nintendo Wii U (wiiu) game system
|
||||
* (Android) Changed Flycast standalone to use %ROMSAF% instead of %ROM% as the latter caused game launching to fail on some devices
|
||||
* (Android) Added support for launching individual games directly with EKA2L1 for the ngage system
|
||||
* (Android) Adjusted the layout for the onboarding configurator to look better on screens with wider aspect ratios
|
||||
* (Android) Added exception handling to the onboarding configurator for broken devices where the SAF directory picker is missing
|
||||
* (Android) The storage permission now only needs to be granted once in the onboarding configurator as indicated with an "Already granted" button
|
||||
* (Android) Added a temporary workaround to avoid crashes on non-character keyboard input when editing text (caused by a bug in the SDL library)
|
||||
* (Android) Updated a number of Java and Kotlin dependencies to the latest stable versions
|
||||
* (Android) Removed the built-in application update check for the Samsung Galaxy Store and Huawei AppGallery builds
|
||||
* (Linux) Added support for the AppImage release of melonDS
|
||||
* (Windows) Added Yaba Sanshiro 2 standalone as an alternative emulator for the saturn and saturnjp systems
|
||||
* (Windows) Added BeebEm standalone as an alternative emulator for the bbcmicro system
|
||||
* (Windows) Added a find rule for the SSE2 build of DuckStation
|
||||
* Added the -f flag for fullscreen mode for melonDS standalone on Linux, macOS and Windows
|
||||
* Added support to the theme downloader for detecting and handling theme repository URL changes
|
||||
* Added a "textBackgroundCornerRadius" property to the carousel element
|
||||
* Added a "textBackgroundCornerRadius" property to the grid element
|
||||
* Made the "backgroundCornerRadius" and "selectorCornerRadius" properties for the grid element apply also to colored rectangles
|
||||
* (modern-es-de) Replaced some legacy carousel icons
|
||||
* Added the Nanum Square Neo Korean font
|
||||
* Updated SDL to 2.30.9 on Android, Windows, macOS and the Linux AppImage builds
|
||||
* Updated the MAME index files to include ROMs up to MAME version 0.271
|
||||
* Bundled the September 2024 release of the Mozilla TLS/SSL certificates
|
||||
* (Windows) Updated OpenSSL to 3.4.0
|
||||
|
||||
### Bug fixes
|
||||
|
||||
* Pressing the "Clear" button in the text editor and then entering some value in the input field crashed the application
|
||||
* Placing a directory with no access permissions inside a system folder crashed the application on startup
|
||||
* (Android) Audio was not working correctly on some Android 15 devices (fixed by updating SDL to 2.30.9)
|
||||
* (Android) Switching from ES-DE to another app and back again while the "no ROMs" dialog was shown crashed the application
|
||||
* (Android) Switching from ES-DE to the home app and back again while the onboarding configurator was running crashed the application
|
||||
* (Windows) The video and slideshow screensavers didn't work if a custom game media directory had been configured
|
||||
* There was a regression where filesystem case-sensitivity was not considered when looking for media files for the screensaver
|
||||
* Invalid popup notifications were sometimes shown after a download error message had been displayed in the theme downloader
|
||||
* Attempting to view media for a game that had no downloaded media paused the playback of all static theme videos
|
||||
* Pasting text into a text edit field would make the cursor jump to an incorrect position
|
||||
* Newly entered ScreenScraper username and password values were positioned incorrectly vertically in the account settings menu
|
||||
* (Windows) Translations didn't work correctly for some text
|
||||
* (linear-es-de) The carousel icon for tanodragon was incorrectly showing the dragon32 system
|
||||
* (modern-es-de) The carousel icon for tanodragon was incorrectly showing the dragon32 system
|
||||
|
||||
## Version 3.1.0 / 3.1.0-32
|
||||
|
||||
|
|
|
@ -19,6 +19,8 @@ Nils Bonenberger
|
|||
|
||||
**English (United Kingdom)** \
|
||||
Weestuarty \
|
||||
**Catalan** \
|
||||
Johnnydement \
|
||||
**German** \
|
||||
Thorsten \
|
||||
Pest \
|
||||
|
@ -28,6 +30,8 @@ Dani (stshunz) \
|
|||
Fredy27 (neuromancer974) \
|
||||
**Italian** \
|
||||
Viler \
|
||||
**Dutch**\
|
||||
Stefan VDB\
|
||||
**Polish** \
|
||||
kycho \
|
||||
**Portuguese (Brazil)** \
|
||||
|
|
|
@ -16,7 +16,7 @@ The Android release specifically is not free, it's a paid app available for purc
|
|||
|
||||
## I bought ES-DE on Patreon, how do I get access to future releases?
|
||||
|
||||
When a new release is available you will be sent a download link to the email address you used to sign up for Patreon. Note that if you pay once on Patreon and cancel your paid membership you'll get one month of access to all posts and content, and when this month has passed you will no longer have access. This is how the Patreon platform works, and it's the reason why updates are distributed via email. As indicated in the welcome message when you join the ES-DE Patreon it's a good idea to save the download link so you have it available if you need to download the APK again.
|
||||
When a new release is available you will be sent a download link to the email address you used to sign up for Patreon. Note that if you pay once on Patreon and cancel your paid membership you'll get one month of access to all posts and content, and when this month has passed you will no longer have access. This is how the Patreon platform works, and it's the reason why updates are distributed via email. As indicated in the welcome message when you join the ES-DE Patreon it's a good idea to save the download link so you have it available if you need to download the APK again. It's also possible to resend the latest update email to yourself using our self-service tool which can be found at https://resend.es-de.org
|
||||
|
||||
## Can I use ES-DE on more than a single Android device or do I need to buy it multiple times?
|
||||
|
||||
|
|
6
HAIKU.md
|
@ -1,8 +1,8 @@
|
|||
# ES-DE Frontend - Haiku documentation
|
||||
|
||||
Note that support for Haiku is currently experimental as the operating system itself is experimental.
|
||||
ES-DE is available via HaikuDepot but if you still want to build it yourself then you can find detailed instructions in the _Building on Haiku_ section of the [INSTALL.md](INSTALL.md#building-on-haiku) document.
|
||||
|
||||
There are currently no pre-built packages available so you'll need to build ES-DE yourself. Detailed instructions are available in the _Building on Haiku_ section of the [INSTALL-DEV.md](INSTALL-DEV.md#building-on-haiku) document.
|
||||
Note that support for Haiku is currently experimental as the operating system itself is experimental.
|
||||
|
||||
Table of contents:
|
||||
|
||||
|
@ -14,6 +14,8 @@ Table of contents:
|
|||
|
||||
* There is no 3D acceleration as the operating system does not support that
|
||||
|
||||
* ES-DE may crash or behave strange when used on Haiku Nightly (i.e. it's due to operating system issues, make sure to run R1/beta5 which should work fine)
|
||||
|
||||
## Emulator problems
|
||||
|
||||
In contrast with all other platforms which ES-DE runs on, on Haiku emulators which are not working correctly are still included in the configuration. This is done with the belief that things will improve in the future as the operating system matures.
|
||||
|
|
|
@ -80,13 +80,6 @@ pkg install llvm-devel git pkgconf cmake gettext harfbuzz icu sdl2 ffmpeg freeim
|
|||
|
||||
Clang/LLVM and curl should already be included in the base OS installation.
|
||||
|
||||
Note that there is a strange issue specifically on FreeBSD 14.1 where the rlottie library refuses to build. This can be resolved by the following workaround:
|
||||
```
|
||||
echo > external/rlottie/format
|
||||
```
|
||||
|
||||
It's not clear yet whether this is a compiler bug or some other issue.
|
||||
|
||||
**Cloning and compiling ES-DE**
|
||||
|
||||
To clone the source repository, run the following:
|
||||
|
@ -451,12 +444,10 @@ Run the following to build the .hpkg package:
|
|||
|
||||
```
|
||||
cd ~
|
||||
git clone https://github.com/haikuports/haikuports.git --depth=50
|
||||
mkdir haikuports/games-emulation/es-de
|
||||
git clone https://github.com/leonstyhre/haikuports.git --depth=50
|
||||
pkgman install haikuporter
|
||||
cp /boot/system/settings/haikuports.conf ~/config/settings/
|
||||
cd emulationstation-de
|
||||
cp es-app/assets/es_de-3.1.0.recipe ~/haikuports/games-emulation/es-de
|
||||
haikuporter --purge es_de
|
||||
haikuporter -S --no-source-packages --get-dependencies -j8 es_de
|
||||
```
|
||||
|
||||
|
@ -698,13 +689,14 @@ Windows 10 SDK (10.0.20348.0)
|
|||
|
||||
The Windows SDK version is important, it has to be this precise version or some dependencies may not build correctly.
|
||||
|
||||
In addition to the above you need to install Python. Make sure to get it from https://www.python.org as the version in the Microsoft Store does not seem to work correctly. In the installer make sure to include _py launcher_ and also tick the option to add Python to the environment variables. Python is important because otherwise the ICU library will not build correctly.
|
||||
|
||||
It's strongly recommended to also install Jom, which is a drop-in replacement for nmake that offers support for building in parallel using multiple CPU cores:\
|
||||
https://wiki.qt.io/Jom
|
||||
|
||||
As well you may need to install the latest version of Microsoft Visual C++ Redistributable which can be downloaded here:\
|
||||
https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redis
|
||||
|
||||
|
||||
The way the MSVC environment works is that a specific developer shell is provided where the build environment is properly configured. You open this from the Start menu via `Visual Studio 2022` -> `Visual Studio tools` -> `VC` -> `x64 Native Tools Command Prompt for VS 2022 Current`.
|
||||
|
||||
It's important to choose the x64-specific shell and not the x86 variant, as ES-DE will only compile as a 64-bit application.
|
||||
|
|
|
@ -449,12 +449,10 @@ Run the following to build the .hpkg package:
|
|||
|
||||
```
|
||||
cd ~
|
||||
git clone https://github.com/haikuports/haikuports.git --depth=50
|
||||
mkdir haikuports/games-emulation/es-de
|
||||
git clone https://github.com/leonstyhre/haikuports.git --depth=50
|
||||
pkgman install haikuporter
|
||||
cp /boot/system/settings/haikuports.conf ~/config/settings/
|
||||
cd emulationstation-de
|
||||
cp es-app/assets/es_de-3.1.0.recipe ~/haikuports/games-emulation/es-de
|
||||
haikuporter --purge es_de
|
||||
haikuporter -S --no-source-packages --get-dependencies -j8 es_de
|
||||
```
|
||||
|
||||
|
@ -696,13 +694,14 @@ Windows 10 SDK (10.0.20348.0)
|
|||
|
||||
The Windows SDK version is important, it has to be this precise version or some dependencies may not build correctly.
|
||||
|
||||
In addition to the above you need to install Python. Make sure to get it from https://www.python.org as the version in the Microsoft Store does not seem to work correctly. In the installer make sure to include _py launcher_ and also tick the option to add Python to the environment variables. Python is important because otherwise the ICU library will not build correctly.
|
||||
|
||||
It's strongly recommended to also install Jom, which is a drop-in replacement for nmake that offers support for building in parallel using multiple CPU cores:\
|
||||
https://wiki.qt.io/Jom
|
||||
|
||||
As well you may need to install the latest version of Microsoft Visual C++ Redistributable which can be downloaded here:\
|
||||
https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redis
|
||||
|
||||
|
||||
The way the MSVC environment works is that a specific developer shell is provided where the build environment is properly configured. You open this from the Start menu via `Visual Studio 2022` -> `Visual Studio tools` -> `VC` -> `x64 Native Tools Command Prompt for VS 2022 Current`.
|
||||
|
||||
It's important to choose the x64-specific shell and not the x86 variant, as ES-DE will only compile as a 64-bit application.
|
||||
|
|
|
@ -15,7 +15,6 @@ A more detailed breakdown can be found on the [Kanban](https://gitlab.com/es-de/
|
|||
**User interface**
|
||||
|
||||
* Menu reorganization, possibly adding basic/advanced modes
|
||||
* Animated menu elements like switches and tick boxes
|
||||
* Simple file browsing component
|
||||
|
||||
**Theme engine**
|
||||
|
|
|
@ -276,7 +276,7 @@ Here is a very simple theme that changes the color of the game name text:
|
|||
|
||||
## How it works
|
||||
|
||||
All configuration must be contained within a `<theme>` tag pair. That is true for each separate .xml file used to build the completely theme.
|
||||
All configuration must be contained within a `<theme>` tag pair. That is true for each separate .xml file used to build the complete theme.
|
||||
|
||||
The `<view>` tag pair refers to the available views within ES-DE, which is either _system_ or _gamelist_. There is a special _all_ view available as well, but that is only used for defining the navigation sounds as these are always applied globally to both view types.
|
||||
|
||||
|
@ -714,6 +714,7 @@ Here's an example configuration:
|
|||
<gameCounterPos>0.4 0.6437</gameCounterPos>
|
||||
<gameNameFontSize>0.006</gameNameFontSize>
|
||||
</variables>
|
||||
</fontSize>
|
||||
<fontSize name="small, x-small">
|
||||
<variables>
|
||||
<publisherFontSize>0.011</publisherFontSize>
|
||||
|
@ -726,6 +727,7 @@ Here's an example configuration:
|
|||
<size>1 0.056</size>
|
||||
<fontSize>${gameCounterFontSize}</fontSize>
|
||||
</text>
|
||||
</view>
|
||||
<view name="gamelist">
|
||||
<text name="gameName">
|
||||
<pos>0.2 0.3412</pos>
|
||||
|
@ -755,10 +757,12 @@ The following languages are supported:
|
|||
| :------------ | :----------------------- | :----------------------- |
|
||||
| en_US | English (United States) | English (United States) |
|
||||
| en_GB | English (United Kingdom) | English (United Kingdom) |
|
||||
| ca_ES | Catalan | Català |
|
||||
| de_DE | German | Deutsch |
|
||||
| es_ES | Spanish (Spain) | Español (España) |
|
||||
| fr_FR | French | Français |
|
||||
| it_IT | Italian | Italiano |
|
||||
| nl_NL | Dutch | Nederlands |
|
||||
| pl_PL | Polish | Polski |
|
||||
| pt_BR | Portuguese (Brazil) | Português (Brasil) |
|
||||
| ro_RO | Romanian | Română |
|
||||
|
@ -1897,6 +1901,11 @@ Properties:
|
|||
- This property makes it possible to size the text relative to the overall item size. If using this and also defining a text background color using `textBackgroundColor` or `textSelectedBackgroundColor` then this color will still fill the entire item size.
|
||||
- Minimum value is `0.2` and maximum value is `1`
|
||||
- Default is `1`
|
||||
* `textBackgroundCornerRadius` - type: FLOAT
|
||||
- Setting this property higher than zero applies rounded corners to the text background, assuming it has a color set. The radius is a percentage of the screen width. Note that the maximum allowed value is quite arbitrary as the renderer will in practice limit the maximum roundness so it can never go beyond half the text background height.
|
||||
- Minimum value is `0` and maximum value is `0.5`
|
||||
- Default is `0` (corners are not rounded)
|
||||
- This property can only be used if `textBackgroundColor` has a value defined.
|
||||
* `textColor` - type: COLOR
|
||||
- Default is `000000FF`
|
||||
* `textBackgroundColor` - type: COLOR
|
||||
|
@ -2103,7 +2112,7 @@ Properties:
|
|||
- Minimum value is `0.2` and maximum value is `1`
|
||||
- Default is `1`
|
||||
* `backgroundCornerRadius` - type: FLOAT
|
||||
- Setting this property higher than zero applies rounded corners to the image defined by `backgroundImage`. The radius is a percentage of the screen width and not directly related to the image size. This makes it possible to apply identically sized corners regardless of image dimensions. The size is calculated internally with `itemScale` and `backgroundRelativeScale` set to `1`. Note that the maximum allowed value is quite arbitrary as the renderer will in practice limit the maximum roundness so it can never go beyond half the width or height. It means that setting this property sufficiently high will turn a perfectly square image into a perfectly round one.
|
||||
- Setting this property higher than zero applies rounded corners to the image defined by `backgroundImage`, or to the colored rectangle if `backgroundColor` has been defined without using a background image. The radius is a percentage of the screen width and not directly related to the background size. This makes it possible to apply identically sized corners regardless of image dimensions. The size is calculated internally with `itemScale` and `backgroundRelativeScale` set to `1`. Note that the maximum allowed value is quite arbitrary as the renderer will in practice limit the maximum roundness so it can never go beyond half the width or height. It means that setting this property sufficiently high will turn a perfectly square background into a perfectly round one.
|
||||
- Minimum value is `0` and maximum value is `0.5`
|
||||
- Default is `0` (corners are not rounded)
|
||||
* `backgroundColor` - type: COLOR
|
||||
|
@ -2126,7 +2135,7 @@ Properties:
|
|||
- Valid values are `bottom`, `middle` or `top`
|
||||
- Default is `top`
|
||||
* `selectorCornerRadius` - type: FLOAT
|
||||
- Setting this property higher than zero applies rounded corners to the image defined by `backgroundImage`. The radius is a percentage of the screen width and not directly related to the image size. This makes it possible to apply identically sized corners regardless of image dimensions. The size is calculated internally with `itemScale` and `selectorRelativeScale` set to `1`. Note that the maximum allowed value is quite arbitrary as the renderer will in practice limit the maximum roundness so it can never go beyond half the width or height. It means that setting this property sufficiently high will turn a perfectly square image into a perfectly round one.
|
||||
- Setting this property higher than zero applies rounded corners to the image defined by `selectorImage`, or to the colored rectangle if `selectorColor` has been defined without using a selector image. The radius is a percentage of the screen width and not directly related to the selector size. This makes it possible to apply identically sized corners regardless of image dimensions. The size is calculated internally with `itemScale` and `selectorRelativeScale` set to `1`. Note that the maximum allowed value is quite arbitrary as the renderer will in practice limit the maximum roundness so it can never go beyond half the width or height. It means that setting this property sufficiently high will turn a perfectly square selector into a perfectly round one.
|
||||
- Minimum value is `0` and maximum value is `0.5`
|
||||
- Default is `0` (corners are not rounded)
|
||||
* `selectorColor` - type: COLOR
|
||||
|
@ -2146,6 +2155,11 @@ Properties:
|
|||
- This property makes it possible to size the text relative to the overall item size.
|
||||
- Minimum value is `0.2` and maximum value is `1`
|
||||
- Default is `1`
|
||||
* `textBackgroundCornerRadius` - type: FLOAT
|
||||
- Setting this property higher than zero applies rounded corners to the text background, assuming it has a color set. The radius is a percentage of the screen width. Note that the maximum allowed value is quite arbitrary as the renderer will in practice limit the maximum roundness so it can never go beyond half the text background height.
|
||||
- Minimum value is `0` and maximum value is `0.5`
|
||||
- Default is `0` (corners are not rounded)
|
||||
- This property can only be used if `textBackgroundColor` has a value defined.
|
||||
* `textColor` - type: COLOR
|
||||
- Default is `000000FF`
|
||||
* `textBackgroundColor` - type: COLOR
|
||||
|
|
|
@ -274,7 +274,7 @@ Here is a very simple theme that changes the color of the game name text:
|
|||
|
||||
## How it works
|
||||
|
||||
All configuration must be contained within a `<theme>` tag pair. That is true for each separate .xml file used to build the completely theme.
|
||||
All configuration must be contained within a `<theme>` tag pair. That is true for each separate .xml file used to build the complete theme.
|
||||
|
||||
The `<view>` tag pair refers to the available views within ES-DE, which is either _system_ or _gamelist_. There is a special _all_ view available as well, but that is only used for defining the navigation sounds as these are always applied globally to both view types.
|
||||
|
||||
|
@ -712,6 +712,7 @@ Here's an example configuration:
|
|||
<gameCounterPos>0.4 0.6437</gameCounterPos>
|
||||
<gameNameFontSize>0.006</gameNameFontSize>
|
||||
</variables>
|
||||
</fontSize>
|
||||
<fontSize name="small, x-small">
|
||||
<variables>
|
||||
<publisherFontSize>0.011</publisherFontSize>
|
||||
|
@ -724,6 +725,7 @@ Here's an example configuration:
|
|||
<size>1 0.056</size>
|
||||
<fontSize>${gameCounterFontSize}</fontSize>
|
||||
</text>
|
||||
</view>
|
||||
<view name="gamelist">
|
||||
<text name="gameName">
|
||||
<pos>0.2 0.3412</pos>
|
||||
|
|
|
@ -243,6 +243,8 @@ Just make sure to never place games or other resources on network shares using t
|
|||
|
||||
Also make sure that you don't use the exFAT filesystem as its very poor disk I/O performance will make ES-DE run really slowly. Using this filesystem will make the theme downloader fail as well.
|
||||
|
||||
There is also a limitation in Windows where the complete file path can't exceed 260 characters. So if you have files with extremely long names ES-DE may state that there are file permission problems for various operations such as when scraping or when running the orphaned data cleanup utility. In this case simply renaming the problematic game files to use shorter names should resolve the situation. If you use the portable release of ES-DE you could also relocate the entire application directory closer to the root of the filesystem to have shorter overall paths.
|
||||
|
||||
In order for ES-DE to run, graphics drivers with OpenGL support have to be installed. If not, the application simply won't start. For really old graphics cards the available drivers may not provide an OpenGL version that is modern enough for ES-DE to work, and in this case a last resort solution would be to install the _Mesa3D for Windows_ library which provides software-based OpenGL rendering. The 64-bit version of this library can be downloaded from https://fdossena.com/?p=mesa/index.frag and you simply extract the opengl32.dll file into the ES-DE installation directory. Just be aware that the performance may be quite bad.
|
||||
|
||||
On some GPUs with buggy drivers, ES-DE may only display a black screen on startup or when launching a game. The problem can be worked around by specifying a window size for ES-DE that is a single pixel wider than the actual screen resolution. So for example for a 1280x800 display, the resolution can be set to 1281x800 and then rendering should work correctly. This is applied using the --resolution command line option, for example:
|
||||
|
@ -314,7 +316,7 @@ The Android port of ES-DE is quite different than the other versions, so it has
|
|||
|
||||
## Specific notes for Haiku
|
||||
|
||||
The [Haiku](https://www.haiku-os.org) port of ES-DE is currently experimental as the OS itself is experimental and has some issues. Still most functionality in ES-DE is working and there is support for a quite large number of systems and emulators. If you're interested in Haiku it's for sure worth trying it out. See the dedicated [HAIKU.md](HAIKU.md) document for more details.
|
||||
The [Haiku](https://www.haiku-os.org) port of ES-DE is currently experimental as the OS itself is experimental and has some issues. Still most functionality is working and there is support for a quite large number of systems and emulators. If you're interested in Haiku it's for sure worth trying it out as ES-DE can be easily installed via HaikuDepot. See the dedicated [HAIKU.md](HAIKU.md) document for more details.
|
||||
|
||||
## Specific notes for Raspberry Pi
|
||||
|
||||
|
@ -600,6 +602,8 @@ Themes are downloaded from their respective GitHub or GitLab sites using _Git_ (
|
|||
|
||||
If you have manually downloaded any of the themes from the [official themes list](https://gitlab.com/es-de/themes/themes-list) then these would need to be downloaded again as they will not contain the necessary information required by the theme downloader. A dialog will be presented to inform you about this and the theme directory will be renamed by adding the _DISABLED extension to its name. To conserve disk space it's a good idea to manually delete these _DISABLED directories outside of ES-DE. Alternatively you could just completely delete the theme from the user interface using the _Y_ button and start a fresh download.
|
||||
|
||||
On Android specifically all theme directories that were previously renamed with the _DISABLED suffix are automatically deleted every time the theme downloader is started. This is the case as Android prevents direct access to the theme directory due to it being located on application-internal storage, meaning it's not possible to manually delete these directories.
|
||||
|
||||
If you have customized a theme by for instance modifying any of its XML files, then this will be highlighted with an exclamation mark and the text _LOCAL CHANGES_ in the theme downloader interface. If you attempt to fetch updates for such a theme you will be asked a question of whether to overwrite your local changes, or whether to cancel. If you have however added additional files to the theme that are not included in the theme repository, then these will not interfere and you can go ahead and fetch theme updates without any risk of having your local files being deleted. But there is a special (although unlikely) situation, if you add files that are not part of the theme repository but that are later added by the theme developer as well, then your local copies of any such files will be ovewritten when fetching theme updates.
|
||||
|
||||
In worst case there could be a situation where a repository is corrupted and the theme downloader can't properly identify or handle the corruption. In this case you will have to rename or delete that directory. This could also apply to the actual themes list repository. The latter is named _themes-list_ so by just deleting this directory (i.e. `~/ES-DE/themes/themes-list`) you'll reset the theme downloader to its initial state.
|
||||
|
@ -700,8 +704,10 @@ The following emulators are supported in AppImage format when using the bundled
|
|||
| macintosh | SheepShaver | SheepShaver*.AppImage |
|
||||
| n3ds | Citra | citra-qt*.AppImage |
|
||||
| n3ds | Lime3DS | lime3ds.AppImage |
|
||||
| n3ds | Mandarine | mandarine-qt.AppImage |
|
||||
| n3ds | Panda3DS | Alber-*.AppImage |
|
||||
| n64/n64dd | Rosalie's Mupen GUI | RMG*.AppImage |
|
||||
| nds | melonDS | melonDS*.AppImage |
|
||||
| ngage/symbian | EKA2L1 | EKA2L1*.AppImage |
|
||||
| ps2 | PCSX2 | pcsx2*.AppImage |
|
||||
| ps2 | Play! | Play!*.AppImage |
|
||||
|
@ -2529,17 +2535,15 @@ As the Nokia N-Gage was running Symbian it may seem like the _ngage_ and _symbia
|
|||
|
||||
**Android**
|
||||
|
||||
For the symbian system it's possible to launch individual games directly from ES-DE, but for the ngage system this is unfortunately not possible. Instead the EKA2L1 user interface will open on game launch and you need to manually start your game from inside the emulator. For both the symbian and ngage systems all games need to be installed upfront in EKA2L1.
|
||||
For both the ngage and symbian systems it's possible to launch individual games directly from ES-DE, although they need to be installed upfront in EKA2L1.
|
||||
|
||||
For N-Gage games it's a good idea to just create empty dummy files with the .ngage file extensions inside the ROMs/ngage directory. These will then appear as indvidual games inside ES-DE and you can add metadata to them, scrape them etc.
|
||||
|
||||
For Symbian games you can export JSON launch files from EKA2L1 that can be run directly from ES-DE. Just open EKA2L1, long press the game icon and select _Create launch file_ from the popup list. Then just select the ROMs/symbian directory and the file will be saved there and game launching from ES-DE will work as expected.
|
||||
After installing the games in EKA2L1, long press the game icon and select _Create launch file_ from the popup list which will export a JSON file for the game. Then select the directory where the file should be saved, i.e. ROMs/ngage or ROMs/symbian. Following this, game launching from ES-DE will work as expected.
|
||||
|
||||
Here's an example setup:
|
||||
```
|
||||
/storage/emulated/0/ROMs/ngage/Asphalt 2.ngage
|
||||
/storage/emulated/0/ROMs/ngage/Bomberman.ngage
|
||||
/storage/emulated/0/ROMs/ngage/CallofDuty.ngage
|
||||
/storage/emulated/0/ROMs/ngage/Asphalt 2.json
|
||||
/storage/emulated/0/ROMs/ngage/Bomberman.json
|
||||
/storage/emulated/0/ROMs/ngage/CallofDuty.json
|
||||
/storage/emulated/0/ROMs/symbian/Animal Farm.json
|
||||
/storage/emulated/0/ROMs/symbian/AnotherWorld.json
|
||||
```
|
||||
|
@ -3458,6 +3462,10 @@ Whether to use a shader to render a slight horizontal blur which somewhat simula
|
|||
|
||||
Various sound settings.
|
||||
|
||||
**Audio driver (requires restart)** _(Android only)_
|
||||
|
||||
This setting makes it possible to select between the _OpenSL ES_ and _AAudio_ audio drivers. Note that this is a preference only, if OpenSL ES is not available on your device then ES-DE will automatically revert to using AAudio and log that a fallback took place to the es_log.txt file. It's generally recommended to keep the driver set to its default value OpenSL ES as that offers lower audio latency for most devices.
|
||||
|
||||
**System volume** _(Linux and Windows only)_
|
||||
|
||||
As the name implies, this sets the overall system volume and not the volume specifically for ES-DE. The volume change is applied when leaving the sound settings menu and not immediately when moving the slider.
|
||||
|
@ -3991,7 +3999,7 @@ The collection will now be created and the collection edit mode will be entered.
|
|||
|
||||
Removing a game works the same way, just press _Y_ to remove it if it's already present in your collection. You can do this either from the gamelist where the game was added, or from the collection itself.
|
||||
|
||||
Only files can be part of collections, not folders. Games marked as hidden or to not be counted as games can't be added either.
|
||||
Only files can be part of collections, not folders. Games marked as hidden or set to not be counted as games can't be added either.
|
||||
|
||||
During the time that the collection is being edited, any game that is part of the collection is marked with a leading tick symbol in the game name if a textlist is used, and a _collection_ badge is displayed for the currently selected game as well (assuming the theme support badges).
|
||||
|
||||
|
@ -4109,7 +4117,7 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
|
|||
| atarist | Atari ST [also STE and Falcon] | Hatari | Hatari **(Standalone)** | Yes | Single archive or image file for single-diskette games, .m3u playlist for multi-diskette games |
|
||||
| atarixe | Atari XE | Atari800 | Atari800 **(Standalone)**,<br>Altirra **(Standalone)** [W] | Yes except for Altirra | |
|
||||
| atomiswave | Sammy Corporation Atomiswave | Flycast | Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Demul **(Standalone)** [W] | Depends | Single archive file |
|
||||
| bbcmicro | Acorn Computers BBC Micro | MAME **(Standalone)** | | Yes | Single archive or diskette image file |
|
||||
| bbcmicro | Acorn Computers BBC Micro | MAME **(Standalone)** | BeebEm **(Standalone)** [W] | Yes | Single archive (MAME only) or diskette image file |
|
||||
| c64 | Commodore 64 | VICE x64sc Accurate | VICE x64sc Accurate **(Standalone)**,<br>VICE x64 Fast,<br>VICE x64 SuperCPU,<br>VICE x128,<br>Frodo | No | Single archive or image file for tape, cartridge or single-diskette games, .m3u playlist for multi-diskette games |
|
||||
| cdimono1 | Philips CD-i | SAME CDi | CDi 2015 @,<br>MAME **(Standalone)** | Yes | Single .bin/.cue pair |
|
||||
| cdtv | Commodore CDTV | PUAE | PUAE 2021,<br>FS-UAE **(Standalone)**,<br>Amiberry **(Standalone)** [LM] | Yes | See the specific _Commodore Amiga and CDTV_ section elsewhere in this guide |
|
||||
|
@ -4179,7 +4187,7 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
|
|||
| msxturbor | MSX Turbo R | blueMSX | openMSX **(Standalone)**,<br>openMSX No Machine **(Standalone)** | Yes | |
|
||||
| mugen | M.U.G.E.N Game Engine | Ikemen GO **(Standalone)** | | No | See the specific _M.U.G.E.N Game Engine_ section elsewhere in this guide |
|
||||
| multivision | Othello Multivision | Gearsystem | Mesen **(Standalone)** [LW] | No | Single archive or ROM file |
|
||||
| n3ds | Nintendo 3DS | Citra [LW],<br>Citra **(Standalone)** [M] | Citra 2018 [LW],<br>Citra **(Standalone)** [LW],<br>Lime3DS **(Standalone)**,<br>Panda3DS **(Standalone)** | No | Single ROM file |
|
||||
| n3ds | Nintendo 3DS | Citra [LW],<br>Citra **(Standalone)** [M] | Citra 2018 [LW],<br>Citra **(Standalone)** [LW]<br>Mandarine **(Standalone)**,<br>Lime3DS **(Standalone)**,<br>Panda3DS **(Standalone)** | No | Single ROM file |
|
||||
| n64 | Nintendo 64 | Mupen64Plus-Next | Mupen64Plus **(Standalone)**,<br>ParaLLEl N64,<br>simple64 **(Standalone)** [LW],<br>Rosalie's Mupen GUI **(Standalone)** [LW],<br>Project64 **(Standalone)** [W],<br>ares **(Standalone)**,<br>sixtyforce **(Standalone)** [M] | No | Single archive or ROM file |
|
||||
| n64dd | Nintendo 64DD | ParaLLEl N64 [LW],<br>Mupen64Plus-Next [M] | Mupen64Plus-Next [LW],<br>ParaLLEl N64 [M],<br>Rosalie's Mupen GUI **(Standalone)** [LW],<br>ares **(Standalone)** | Yes | See the specific _Nintendo 64DD_ section elsewhere in this guide |
|
||||
| naomi | Sega NAOMI | Flycast | Flycast **(Standalone)**,<br>Flycast Dojo **(Standalone)**,<br>Demul **(Standalone)** [W] | Yes | Single archive file + .chd file in subdirectory if GD-ROM game |
|
||||
|
@ -4218,8 +4226,8 @@ The **@** symbol indicates that the emulator is _deprecated_ and will be removed
|
|||
| quake | Quake | TyrQuake | vitaQuake 2,<br>vitaQuake 2 [Rogue],<br>vitaQuake 2 [Xatrix],<br>vitaQuake 2 [Zaero],<br>vitaQuake 3 [LW],<br> _Shortcut or script_ | No | |
|
||||
| samcoupe | MGT SAM Coupé | SimCoupé **(Standalone)** | | No | Single archive or ROM file |
|
||||
| satellaview | Nintendo Satellaview | Snes9x - Current | Snes9x 2010,<br>Snes9x 2005 Plus,<br>Snes9x **(Standalone)**,<br>bsnes,<br>bsnes-hd,<br>bsnes-mercury Accuracy,<br>bsnes **(Standalone)** [LW],<br>Mesen-S,<br>Mesen **(Standalone)** [LW],<br>ares **(Standalone)** | | |
|
||||
| saturn | Sega Saturn | Beetle Saturn | Kronos [LW],<br>YabaSanshiro [LW],<br>Yabause,<br>Mednafen **(Standalone)**,<br>SSF **(Standalone)** [W] | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games |
|
||||
| saturnjp | Sega Saturn [Japan] | Beetle Saturn | Kronos [LW],<br>YabaSanshiro [LW],<br>Yabause,<br>Mednafen **(Standalone)**,<br>SSF **(Standalone)** [W] | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games |
|
||||
| saturn | Sega Saturn | Beetle Saturn | Kronos [LW],<br>YabaSanshiro [LW],<br>Yaba Sanshiro 2 **(Standalone)** [W],<br>Yabause,<br>Mednafen **(Standalone)**,<br>SSF **(Standalone)** [W] | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games |
|
||||
| saturnjp | Sega Saturn [Japan] | Beetle Saturn | Kronos [LW],<br>YabaSanshiro [LW],<br>Yaba Sanshiro 2 **(Standalone)** [W],<br>Yabause,<br>Mednafen **(Standalone)**,<br>SSF **(Standalone)** [W] | Yes | .chd file for single-disc games, .m3u playlist for multi-disc games |
|
||||
| scummvm | ScummVM Game Engine | ScummVM | ScummVM **(Standalone)** | No | See the specific _ScummVM_ section elsewhere in this guide |
|
||||
| scv | Epoch Super Cassette Vision | MAME - Current | MAME **(Standalone)** | Yes | Single archive or ROM file |
|
||||
| sega32x | Sega Mega Drive 32X | PicoDrive | ares **(Standalone)** | No | Single archive or ROM file |
|
||||
|
|
|
@ -241,6 +241,8 @@ Just make sure to never place games or other resources on network shares using t
|
|||
|
||||
Also make sure that you don't use the exFAT filesystem as its very poor disk I/O performance will make ES-DE run really slowly. Using this filesystem will make the theme downloader fail as well.
|
||||
|
||||
There is also a limitation in Windows where the complete file path can't exceed 260 characters. So if you have files with extremely long names ES-DE may state that there are file permission problems for various operations such as when scraping or when running the orphaned data cleanup utility. In this case simply renaming the problematic game files to use shorter names should resolve the situation. If you use the portable release of ES-DE you could also relocate the entire application directory closer to the root of the filesystem to have shorter overall paths.
|
||||
|
||||
In order for ES-DE to run, graphics drivers with OpenGL support have to be installed. If not, the application simply won't start. For really old graphics cards the available drivers may not provide an OpenGL version that is modern enough for ES-DE to work, and in this case a last resort solution would be to install the _Mesa3D for Windows_ library which provides software-based OpenGL rendering. The 64-bit version of this library can be downloaded from https://fdossena.com/?p=mesa/index.frag and you simply extract the opengl32.dll file into the ES-DE installation directory. Just be aware that the performance may be quite bad.
|
||||
|
||||
On some GPUs with buggy drivers, ES-DE may only display a black screen on startup or when launching a game. The problem can be worked around by specifying a window size for ES-DE that is a single pixel wider than the actual screen resolution. So for example for a 1280x800 display, the resolution can be set to 1281x800 and then rendering should work correctly. This is applied using the --resolution command line option, for example:
|
||||
|
@ -312,7 +314,7 @@ The Android port of ES-DE is quite different than the other versions, so it has
|
|||
|
||||
## Specific notes for Haiku
|
||||
|
||||
The [Haiku](https://www.haiku-os.org) port of ES-DE is currently experimental as the OS itself is experimental and has some issues. Still most functionality in ES-DE is working and there is support for a quite large number of systems and emulators. If you're interested in Haiku it's for sure worth trying it out. See the dedicated [HAIKU.md](HAIKU.md) document for more details.
|
||||
The [Haiku](https://www.haiku-os.org) port of ES-DE is currently experimental as the OS itself is experimental and has some issues. Still most functionality is working and there is support for a quite large number of systems and emulators. If you're interested in Haiku it's for sure worth trying it out as ES-DE can be easily installed via HaikuDepot. See the dedicated [HAIKU.md](HAIKU.md) document for more details.
|
||||
|
||||
## Specific notes for Raspberry Pi
|
||||
|
||||
|
@ -3989,7 +3991,7 @@ The collection will now be created and the collection edit mode will be entered.
|
|||
|
||||
Removing a game works the same way, just press _Y_ to remove it if it's already present in your collection. You can do this either from the gamelist where the game was added, or from the collection itself.
|
||||
|
||||
Only files can be part of collections, not folders. Games marked as hidden or to not be counted as games can't be added either.
|
||||
Only files can be part of collections, not folders. Games marked as hidden or set to not be counted as games can't be added either.
|
||||
|
||||
During the time that the collection is being edited, any game that is part of the collection is marked with a leading tick symbol in the game name if a textlist is used, and a _collection_ badge is displayed for the currently selected game as well (assuming the theme support badges).
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@ Emulators\ArcadeFlashWeb\ArcadeFlashWeb.exe
|
|||
Emulators\ares\ares.exe
|
||||
Emulators\atari800\atari800.exe
|
||||
Emulators\BasiliskII\BasiliskII.exe
|
||||
Emulators\BeebEm\BeebEm.exe
|
||||
Emulators\BigPEmu\BigPEmu.exe
|
||||
Emulators\bsnes\bsnes.exe
|
||||
Emulators\cemu\Cemu.exe
|
||||
|
@ -64,8 +65,8 @@ Emulators\demul\demul.exe
|
|||
Emulators\Dolphin-x64\Dolphin.exe
|
||||
Emulators\dosbox-staging\dosbox.exe
|
||||
Emulators\DOSBox-X\dosbox-x.exe
|
||||
Emulators\duckstation\duckstation-nogui-x64-ReleaseLTCG.exe
|
||||
Emulators\duckstation\duckstation-qt-x64-ReleaseLTCG.exe
|
||||
Emulators\duckstation\duckstation-qt-x64-ReleaseLTCG-SSE2.exe
|
||||
Emulators\EasyRPG\Player.exe
|
||||
Emulators\EKA2L1\eka2l1_qt.exe
|
||||
Emulators\fbneo\fbneo64.exe
|
||||
|
@ -87,6 +88,7 @@ Emulators\KEmulator\KEmulator.exe
|
|||
Emulators\lime3ds\lime3ds.exe
|
||||
Emulators\m2emulator\EMULATOR.EXE
|
||||
Emulators\mame\mame.exe
|
||||
Emulators\mandarine\mandarine-qt.exe
|
||||
Emulators\mednafen\mednafen.exe
|
||||
Emulators\melonDS\melonDS.exe
|
||||
Emulators\Mesen\Mesen.exe
|
||||
|
@ -143,4 +145,5 @@ Emulators\xenia\xenia.exe
|
|||
Emulators\xenia_canary\xenia_canary.exe
|
||||
Emulators\XM6 Pro-68k\XM6.exe
|
||||
Emulators\xroar\xroar.exe
|
||||
Emulators\yabasanshiro\yabasanshiro.exe
|
||||
Emulators\ZEsarUX\zesarux.exe
|
||||
|
|
65
es-app/assets/es-de.rdef.in
Normal file
|
@ -0,0 +1,65 @@
|
|||
resource app_flags B_SINGLE_LAUNCH;
|
||||
|
||||
resource app_version {
|
||||
major = @MAJOR@,
|
||||
middle = @MIDDLE@,
|
||||
minor = @MINOR@,
|
||||
variety = B_APPV_FINAL,
|
||||
internal = 0,
|
||||
short_info = "ES-DE",
|
||||
long_info = "ES-DE Frontend"
|
||||
};
|
||||
|
||||
resource app_signature "@APP_SIGNATURE@";
|
||||
|
||||
resource vector_icon {
|
||||
$"6E6369660503A0001C010004063F05FE04003F05FF05020DCC7DB781CC7DB781"
|
||||
$"CC7DB721CBCEB6D3CC2EB6D3C49DB6D3B63BB6D3BD6CB6D3B5DBB6D3B510B74E"
|
||||
$"B554B70AB489B7D5B37BB8E3B402B85CB337B92720BA0E20B9AE20BEB220C7FB"
|
||||
$"204920C85BB3AEC8A9B34EC8A9BADFC8A9C941C8A9C210C8A9C9A1C8A9CA6CC8"
|
||||
$"2ECA28C872CAF3C7A7CC01C699CB7AC720CC45C655CC7CC56ECC7CC5CECC7CC0"
|
||||
$"CACC7DB781CC7DBC26CC7DB7810217C974C089C974C089C8EDC002C7DF3EC866"
|
||||
$"BF7BC79BBEB0C6B5BE78C715BE78C650BE78C586BE78C5EBBE78C526BE78C4D7"
|
||||
$"BE78C4D7BE78C4D7BE78C553BDFCC50FBE40C6B3BC9CC974B9DBC814BB3BC9B8"
|
||||
$"B997C941B95FC9A1B95FC729B95FC2F9B95FC511B95FC299B95FC1CFB9DBC213"
|
||||
$"B997BD0ABEA0B380C82AB845C365B363C846B333C876B348C861B353C896B3AE"
|
||||
$"C8AAB37EC8AAB3AEC8AAB3AFC8AAB3AEC8AAB5BBC8AAB9D4C8AAB7C7C8AABD45"
|
||||
$"C8AAC428C8AAC0B7C8AA4CC8AAC4D7C8A9C4D7C8A9C4D8C8A9C553C82DC50FC8"
|
||||
$"71C6B4C6CDC974C40CC814C56DC9B8C3C8C9F0C2E2C9F0C342C9F0C27DC9F0C1"
|
||||
$"B3C9F0C218C9F0C153C974C089C9B8C0CDC974C089C974C089C974C089C974C0"
|
||||
$"890222C2F9C104C2F9C104C299C104C1CFC089C213C0CDC148C002C03A3EC0C1"
|
||||
$"BF7BBFF6BEB0BFBEBDC9BFBFBE2ABFBEBD64BFBEBC9ABFBEBCFFBFBEBC3AC03A"
|
||||
$"BB70BFF6BBB4C0C1BAE9C1CFB9DBC148BA62C213B997C2F9B95FC299B95FC511"
|
||||
$"B95FC941B95FC729B95FC9A1B95FC974B9DBC9B8B997C8EDBA62C7DFBB70C866"
|
||||
$"BAE9C79BBBB4C6B5BBECC715BBECC576BBECC2F9BBECC438BBECC299BBECC24B"
|
||||
$"BC9AC24BBC3AC24BBCFFC24BBDC9C24BBD64C24BBE2AC2F9BE78C299BE78C438"
|
||||
$"BE78C6B5BE78C576BE78C715BE78C7DF3EC79BBEB0C866BF7BC974C089C8EDC0"
|
||||
$"02C9B8C0CDC9F0C1B3C9F0C153C9F0C218C9F0C2E2C9F0C27DC9F0C342C974C4"
|
||||
$"0CC9B8C3C8C8EDC493C7DFC5A2C866C51BC79BC5E6C6B5C61DC715C61DC576C6"
|
||||
$"1DC2F9C61DC438C61DC299C61DC1CFC5A2C213C5E6C148C51BC03AC40CC0C1C4"
|
||||
$"93BFF6C3C8C06DC391C00DC391C285C391C6B5C391C49DC391C715C391C764C2"
|
||||
$"E2C764C342C764C27DC764C1B3C764C218C764C153C764C104C764C104C764C1"
|
||||
$"04C6B5C104C715C104C576C104C2F9C104C438C104C2F9C104021B20BF3020BF"
|
||||
$"3020BED020BE7C20BE7F20BE7AB37BBDFCB337BE40B4DCBC9CB79DB9DBB63CBB"
|
||||
$"3BB7E1B997B8C7B95FB867B95FBADFB95FBF0FB95FBCF7B95FBF6FB95FBF42B9"
|
||||
$"DBBF86B997BDE2BB3BBB21BDFCBC81BC9CBADDBE40BAA5BE78BAA5BE78BAA5BE"
|
||||
$"78BB54BE78BAF4BE78BBB9BE78BC83BE78BC1EBE78BCE3BE78BD25BF27BD2CBE"
|
||||
$"C7BD1FBF78BD13C01CBD19BFCABD0DC07CBCE7C0EBBCF9C0D9BCD5C0FCBC4BC1"
|
||||
$"86BC8FC142BBC7C20BBABEC313BB43C28FBA7AC357BA42C390BA42C38FBA41C3"
|
||||
$"90BAF0C391BA8FC391BB4EC391BC0BC391BBACC391BC6BC391BD3AC407BCF3C3"
|
||||
$"C6BDC7C489BEE0C58CBE54C50ABF27C5CDBF5FC606BF61C604BF5DC608BEE0C6"
|
||||
$"85BF24C641BE29C73CBCBCC8A9BD73C7F3B9B7C8AAB3AFC8AAB6B3C8AAB34EC8"
|
||||
$"AA20C7FB20C85B20C50C20BF3020C21E20BF30021DB8C7C391B8C7C391B867C3"
|
||||
$"91B819C2E2B819C342B819C27DB819C1B3B819C218B819C153B8C7C104B867C1"
|
||||
$"04BA06C104BC83C104BB44C104BCE3C104BD31C055BD31C0B6BD31BFF1BD31BF"
|
||||
$"27BD31BF8CBD31BEC7BC83BE78BCE3BE78BB44BE78B8C7BE78BA06BE78B867BE"
|
||||
$"78B819BDC9B819BE2AB819BD64B819BC9AB819BCFFB819BC3AB8C7BBECB867BB"
|
||||
$"ECBA06BBECBC83BBECBB44BBECBCE3BBECBDADBB70BD69BBB4BE34BAE9BF42B9"
|
||||
$"DBBEBBBA62BF86B997BF0FB95FBF6FB95FBCF7B95FB8C7B95FBADFB95FB867B9"
|
||||
$"5FB79DB9DBB7E1B997B716BA62B608BB70B68FBAE9B5C4BBB4B58CBC9AB58CBC"
|
||||
$"3AB58CBEB2B58CC2E2B58CC0CAB58CC342B608C40CB5C4C3C8B68FC494B79DC5"
|
||||
$"A2B716C51BB7E1C5E6B8C7C61DB867C61DBADFC61DBF0FC61DBCF7C61DBF6FC6"
|
||||
$"1DBF42C5A2BF86C5E6BEBBC51BBDADC40CBE34C493BD69C3C8BC83C391BCE3C3"
|
||||
$"91BB44C391B8C7C391BA06C391B8C7C391050A000100000A010101000A020102"
|
||||
$"000A030103000A04010400"
|
||||
};
|
|
@ -11,6 +11,7 @@ SOURCE_URI="https://gitlab.com/es-de/emulationstation-de/-/archive/$srcGitRev/em
|
|||
CHECKSUM_SHA256="52c820beddba7e08014f589120c087d6b84b79a88b6213bf13a4e025fd728285"
|
||||
SOURCE_FILENAME="emulationstation-de-$portVersion-$srcGitRev.tar.gz"
|
||||
SOURCE_DIR="emulationstation-de-$srcGitRev"
|
||||
ADDITIONAL_FILES="es-de.rdef.in"
|
||||
|
||||
ARCHITECTURES="all !x86_gcc2"
|
||||
SECONDARY_ARCHITECTURES="x86"
|
||||
|
@ -48,7 +49,7 @@ BUILD_REQUIRES="
|
|||
devel:libfreeimage$secondaryArchSuffix
|
||||
devel:libfreetype$secondaryArchSuffix
|
||||
devel:libharfbuzz$secondaryArchSuffix
|
||||
devel:libgit2$secondaryArchSuffix
|
||||
devel:libgit2$secondaryArchSuffix >= 1.5
|
||||
devel:libicuuc$secondaryArchSuffix
|
||||
devel:libintl$secondaryArchSuffix
|
||||
devel:libpoppler$secondaryArchSuffix
|
||||
|
@ -57,9 +58,9 @@ BUILD_REQUIRES="
|
|||
"
|
||||
|
||||
BUILD_PREREQUIRES="
|
||||
cmd:cmake
|
||||
cmd:g++$secondaryArchSuffix
|
||||
cmd:ld$secondaryArchSuffix
|
||||
cmd:cmake$secondaryArchSuffix
|
||||
cmd:make
|
||||
cmd:msgfmt$secondaryArchSuffix
|
||||
cmd:pkg_config$secondaryArchSuffix
|
||||
|
@ -67,7 +68,7 @@ BUILD_PREREQUIRES="
|
|||
|
||||
BUILD()
|
||||
{
|
||||
cmake $cmakeDirArgs -DCMAKE_BUILD_TYPE=Release .
|
||||
cmake -DCMAKE_INSTALL_PREFIX=$prefix -DCMAKE_BUILD_TYPE=Release .
|
||||
make $jobArgs
|
||||
}
|
||||
|
||||
|
@ -84,7 +85,7 @@ INSTALL()
|
|||
-e "s|@MAJOR@|$MAJOR|" \
|
||||
-e "s|@MIDDLE@|$MIDDLE|" \
|
||||
-e "s|@MINOR@|$MINOR|" \
|
||||
$sourceDir/es-app/assets/es-de_haiku.rdef.in > es-de.rdef
|
||||
$portDir/additional-files/es-de.rdef.in > es-de.rdef
|
||||
|
||||
addResourcesToBinaries es-de.rdef \
|
||||
"$appsDir"/es-de
|
||||
|
|
|
@ -116,6 +116,11 @@ void ApplicationUpdater::checkForUpdates()
|
|||
|
||||
void ApplicationUpdater::updaterThread()
|
||||
{
|
||||
#if defined(_WIN64)
|
||||
// Workaround for a bug in the libintl library.
|
||||
Utils::Localization::setThreadLocale();
|
||||
#endif
|
||||
|
||||
if (!downloadFile())
|
||||
compareVersions();
|
||||
|
||||
|
|
|
@ -299,10 +299,10 @@ namespace GamelistFileParser
|
|||
// application restart.
|
||||
if (!Settings::getInstance()->getBool("ShowHiddenGames")) {
|
||||
if (file->getHidden()) {
|
||||
LOG(LogDebug) << "GamelistFileParser::parseGamelist(): Skipping hidden "
|
||||
<< (type == GAME ? "file" : "folder") << " entry \""
|
||||
<< file->getName() << "\""
|
||||
<< " (\"" << file->getPath() << "\")";
|
||||
LOG(LogDebug)
|
||||
<< "GamelistFileParser::parseGamelist(): Skipping hidden "
|
||||
<< (type == GAME ? "file" : "folder") << " entry \"" << file->getName()
|
||||
<< "\"" << " (\"" << file->getPath() << "\")";
|
||||
FileData* parent {file->getParent()};
|
||||
delete file;
|
||||
// In case there are no entries left in the folder.
|
||||
|
|
|
@ -31,6 +31,11 @@ MiximageGenerator::MiximageGenerator(FileData* game, std::string& resultMessage)
|
|||
|
||||
void MiximageGenerator::startThread(std::promise<bool>* miximagePromise)
|
||||
{
|
||||
#if defined(_WIN64)
|
||||
// Workaround for a bug in the libintl library.
|
||||
Utils::Localization::setThreadLocale();
|
||||
#endif
|
||||
|
||||
mMiximagePromise = miximagePromise;
|
||||
|
||||
LOG(LogDebug) << "MiximageGenerator::MiximageGenerator(): Creating miximage for \""
|
||||
|
@ -898,8 +903,7 @@ std::string MiximageGenerator::getSavePath() const
|
|||
|
||||
#if defined(__ANDROID__)
|
||||
if (!Utils::FileSystem::exists(path + ".nomedia")) {
|
||||
LOG(LogInfo) << "Creating \"no media\" file \"" << path + ".nomedia"
|
||||
<< "\"...";
|
||||
LOG(LogInfo) << "Creating \"no media\" file \"" << path + ".nomedia" << "\"...";
|
||||
Utils::FileSystem::createEmptyFile(path + ".nomedia");
|
||||
if (!Utils::FileSystem::exists(path + ".nomedia")) {
|
||||
LOG(LogWarning) << "Couldn't create file, permission problems?";
|
||||
|
|
|
@ -156,9 +156,8 @@ bool PDFViewer::startPDFViewer(FileData* game)
|
|||
|
||||
#if (DEBUG_PDF_CONVERSION)
|
||||
LOG(LogDebug) << "Page " << i << ": Orientation: " << mPages[i].orientation << " / "
|
||||
<< "crop box width: " << width << " / "
|
||||
<< "crop box height: " << height << " / "
|
||||
<< "size ratio: " << width / height << " / "
|
||||
<< "crop box width: " << width << " / " << "crop box height: " << height
|
||||
<< " / " << "size ratio: " << width / height << " / "
|
||||
<< "texture size: " << mPages[i].width << "x" << mPages[i].height;
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -410,29 +410,67 @@ void Screensaver::generateImageList()
|
|||
if (!(*it)->isGameSystem() || (*it)->isCollection())
|
||||
continue;
|
||||
|
||||
#if defined(_WIN64)
|
||||
const std::string mediaBaseDir {
|
||||
Utils::String::replace(FileData::getMediaDirectory(), "\\", "/")};
|
||||
#else
|
||||
const std::string mediaBaseDir {FileData::getMediaDirectory()};
|
||||
#endif
|
||||
const std::string mediaDirMiximages {
|
||||
mediaBaseDir + (*it)->getRootFolder()->getSystemName() + "/miximages"};
|
||||
const std::string mediaDirScreenshots {
|
||||
mediaBaseDir + (*it)->getRootFolder()->getSystemName() + "/screenshots"};
|
||||
const std::string mediaDirTitlescreens {
|
||||
mediaBaseDir + (*it)->getRootFolder()->getSystemName() + "/titlescreens"};
|
||||
const std::string mediaDirCovers {mediaBaseDir + (*it)->getRootFolder()->getSystemName() +
|
||||
"/covers"};
|
||||
|
||||
Utils::FileSystem::StringList dirContentMiximages;
|
||||
Utils::FileSystem::StringList dirContentScreenshots;
|
||||
Utils::FileSystem::StringList dirContentTitlescreens;
|
||||
Utils::FileSystem::StringList dirContentCovers;
|
||||
|
||||
// This method of building an inventory of all image files isn't pretty, but to use the
|
||||
// FileData::getImagePath() function leads to unacceptable performance issues on some
|
||||
// platforms like Android that offer very poor disk I/O performance. To instead list
|
||||
// all files recursively is much faster as this avoids stat() function calls which are
|
||||
// very expensive on such problematic platforms.
|
||||
const std::string mediaDirMiximages {
|
||||
FileData::getMediaDirectory() + (*it)->getRootFolder()->getSystemName() + "/miximages"};
|
||||
const std::string mediaDirScreenshots {FileData::getMediaDirectory() +
|
||||
(*it)->getRootFolder()->getSystemName() +
|
||||
"/screenshots"};
|
||||
const std::string mediaDirTitlescreens {FileData::getMediaDirectory() +
|
||||
(*it)->getRootFolder()->getSystemName() +
|
||||
"/titlescreens"};
|
||||
const std::string mediaDirCovers {FileData::getMediaDirectory() +
|
||||
(*it)->getRootFolder()->getSystemName() + "/covers"};
|
||||
const Utils::FileSystem::StringList dirContentMiximages {
|
||||
Utils::FileSystem::getDirContent(mediaDirMiximages, true)};
|
||||
const Utils::FileSystem::StringList dirContentScreenshots {
|
||||
Utils::FileSystem::getDirContent(mediaDirScreenshots, true)};
|
||||
const Utils::FileSystem::StringList dirContentTitlescreens {
|
||||
Utils::FileSystem::getDirContent(mediaDirTitlescreens, true)};
|
||||
const Utils::FileSystem::StringList dirContentCovers {
|
||||
Utils::FileSystem::getDirContent(mediaDirCovers, true)};
|
||||
|
||||
#if defined(_WIN64) || defined(__APPLE__) || defined(__ANDROID__)
|
||||
// Although macOS may have filesystem case-sensitivity enabled it's rare and the impact
|
||||
// would not be severe in this case anyway.
|
||||
const bool caseSensitiveFilesystem {false};
|
||||
#else
|
||||
const bool caseSensitiveFilesystem {true};
|
||||
#endif
|
||||
|
||||
for (auto& entry : Utils::FileSystem::getDirContent(mediaDirMiximages, true)) {
|
||||
if (caseSensitiveFilesystem)
|
||||
dirContentMiximages.emplace_back(entry);
|
||||
else
|
||||
dirContentMiximages.emplace_back(Utils::String::toLower(entry));
|
||||
}
|
||||
|
||||
for (auto& entry : Utils::FileSystem::getDirContent(mediaDirScreenshots, true)) {
|
||||
if (caseSensitiveFilesystem)
|
||||
dirContentScreenshots.emplace_back(entry);
|
||||
else
|
||||
dirContentScreenshots.emplace_back(Utils::String::toLower(entry));
|
||||
}
|
||||
|
||||
for (auto& entry : Utils::FileSystem::getDirContent(mediaDirTitlescreens, true)) {
|
||||
if (caseSensitiveFilesystem)
|
||||
dirContentTitlescreens.emplace_back(entry);
|
||||
else
|
||||
dirContentTitlescreens.emplace_back(Utils::String::toLower(entry));
|
||||
}
|
||||
|
||||
for (auto& entry : Utils::FileSystem::getDirContent(mediaDirCovers, true)) {
|
||||
if (caseSensitiveFilesystem)
|
||||
dirContentCovers.emplace_back(entry);
|
||||
else
|
||||
dirContentCovers.emplace_back(Utils::String::toLower(entry));
|
||||
}
|
||||
|
||||
std::string subFolders;
|
||||
|
||||
|
@ -450,26 +488,38 @@ void Screensaver::generateImageList()
|
|||
const std::string gamePath {subFolders + "/" + (*it2)->getDisplayName()};
|
||||
|
||||
for (auto& extension : FileData::sImageExtensions) {
|
||||
if (std::find(dirContentMiximages.cbegin(), dirContentMiximages.cend(),
|
||||
mediaDirMiximages + gamePath + extension) !=
|
||||
if (std::find(
|
||||
dirContentMiximages.cbegin(), dirContentMiximages.cend(),
|
||||
(caseSensitiveFilesystem ?
|
||||
mediaDirMiximages + gamePath + extension :
|
||||
Utils::String::toLower(mediaDirMiximages + gamePath + extension))) !=
|
||||
dirContentMiximages.cend()) {
|
||||
mImageFiles.push_back((*it2));
|
||||
break;
|
||||
}
|
||||
if (std::find(dirContentScreenshots.cbegin(), dirContentScreenshots.cend(),
|
||||
mediaDirScreenshots + gamePath + extension) !=
|
||||
if (std::find(
|
||||
dirContentScreenshots.cbegin(), dirContentScreenshots.cend(),
|
||||
(caseSensitiveFilesystem ?
|
||||
mediaDirScreenshots + gamePath + extension :
|
||||
Utils::String::toLower(mediaDirScreenshots + gamePath + extension))) !=
|
||||
dirContentScreenshots.cend()) {
|
||||
mImageFiles.push_back((*it2));
|
||||
break;
|
||||
}
|
||||
if (std::find(dirContentTitlescreens.cbegin(), dirContentTitlescreens.cend(),
|
||||
mediaDirTitlescreens + gamePath + extension) !=
|
||||
(caseSensitiveFilesystem ?
|
||||
mediaDirTitlescreens + gamePath + extension :
|
||||
Utils::String::toLower(mediaDirTitlescreens + gamePath +
|
||||
extension))) !=
|
||||
dirContentTitlescreens.cend()) {
|
||||
mImageFiles.push_back((*it2));
|
||||
break;
|
||||
}
|
||||
if (std::find(dirContentCovers.cbegin(), dirContentCovers.cend(),
|
||||
mediaDirCovers + gamePath + extension) != dirContentCovers.cend()) {
|
||||
(caseSensitiveFilesystem ?
|
||||
mediaDirCovers + gamePath + extension :
|
||||
Utils::String::toLower(mediaDirCovers + gamePath +
|
||||
extension))) != dirContentCovers.cend()) {
|
||||
mImageFiles.push_back((*it2));
|
||||
break;
|
||||
}
|
||||
|
@ -490,15 +540,35 @@ void Screensaver::generateVideoList()
|
|||
if (!(*it)->isGameSystem() || (*it)->isCollection())
|
||||
continue;
|
||||
|
||||
#if defined(_WIN64)
|
||||
const std::string mediaBaseDir {
|
||||
Utils::String::replace(FileData::getMediaDirectory(), "\\", "/")};
|
||||
#else
|
||||
const std::string mediaBaseDir {FileData::getMediaDirectory()};
|
||||
#endif
|
||||
const std::string mediaDir {mediaBaseDir + (*it)->getRootFolder()->getSystemName() +
|
||||
"/videos"};
|
||||
Utils::FileSystem::StringList dirContent;
|
||||
|
||||
// This method of building an inventory of all video files isn't pretty, but to use the
|
||||
// FileData::getVideoPath() function leads to unacceptable performance issues on some
|
||||
// platforms like Android that offer very poor disk I/O performance. To instead list
|
||||
// all files recursively is much faster as this avoids stat() function calls which are
|
||||
// very expensive on such problematic platforms.
|
||||
const std::string mediaDir {FileData::getMediaDirectory() +
|
||||
(*it)->getRootFolder()->getSystemName() + "/videos"};
|
||||
const Utils::FileSystem::StringList dirContent {
|
||||
Utils::FileSystem::getDirContent(mediaDir, true)};
|
||||
|
||||
#if defined(_WIN64) || defined(__APPLE__) || defined(__ANDROID__)
|
||||
// Although macOS may have filesystem case-sensitivity enabled it's rare and the impact
|
||||
// would not be severe in this case anyway.
|
||||
const bool caseSensitiveFilesystem {false};
|
||||
#else
|
||||
const bool caseSensitiveFilesystem {true};
|
||||
#endif
|
||||
for (auto& entry : Utils::FileSystem::getDirContent(mediaDir, true)) {
|
||||
if (caseSensitiveFilesystem)
|
||||
dirContent.emplace_back(entry);
|
||||
else
|
||||
dirContent.emplace_back(Utils::String::toLower(entry));
|
||||
}
|
||||
|
||||
std::string subFolders;
|
||||
|
||||
|
@ -517,7 +587,10 @@ void Screensaver::generateVideoList()
|
|||
|
||||
for (auto& extension : FileData::sVideoExtensions) {
|
||||
if (std::find(dirContent.cbegin(), dirContent.cend(),
|
||||
mediaDir + gamePath + extension) != dirContent.cend()) {
|
||||
(caseSensitiveFilesystem ?
|
||||
mediaDir + gamePath + extension :
|
||||
Utils::String::toLower(mediaDir + gamePath + extension))) !=
|
||||
dirContent.cend()) {
|
||||
mVideoFiles.push_back((*it2));
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -596,6 +596,13 @@ bool SystemData::loadConfig()
|
|||
sStartupExitSignal = true;
|
||||
return true;
|
||||
}
|
||||
#if defined(__ANDROID__)
|
||||
if (event.type == SDL_WINDOWEVENT &&
|
||||
event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
|
||||
ViewController::getInstance()->setWindowSizeChanged(
|
||||
static_cast<int>(event.window.data1), static_cast<int>(event.window.data2));
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
std::string name;
|
||||
|
|
|
@ -581,10 +581,12 @@ void GuiMenu::openUIOptions()
|
|||
selectedApplicationLanguage == "en_US");
|
||||
applicationLanguage->add("ENGLISH (UNITED KINGDOM)", "en_GB",
|
||||
selectedApplicationLanguage == "en_GB");
|
||||
applicationLanguage->add("CATALÀ", "ca_ES", selectedApplicationLanguage == "ca_ES");
|
||||
applicationLanguage->add("DEUTSCH", "de_DE", selectedApplicationLanguage == "de_DE");
|
||||
applicationLanguage->add("ESPAÑOL (ESPAÑA)", "es_ES", selectedApplicationLanguage == "es_ES");
|
||||
applicationLanguage->add("FRANÇAIS", "fr_FR", selectedApplicationLanguage == "fr_FR");
|
||||
applicationLanguage->add("ITALIANO", "it_IT", selectedApplicationLanguage == "it_IT");
|
||||
applicationLanguage->add("NEDERLANDS", "nl_NL", selectedApplicationLanguage == "nl_NL");
|
||||
applicationLanguage->add("POLSKI", "pl_PL", selectedApplicationLanguage == "pl_PL");
|
||||
applicationLanguage->add("PORTUGUÊS (BRASIL)", "pt_BR", selectedApplicationLanguage == "pt_BR");
|
||||
applicationLanguage->add("ROMÂNĂ", "ro_RO", selectedApplicationLanguage == "ro_RO");
|
||||
|
@ -1190,6 +1192,26 @@ void GuiMenu::openSoundOptions()
|
|||
{
|
||||
auto s = new GuiSettings(_("SOUND SETTINGS"));
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
// Audio driver.
|
||||
auto audioDriver = std::make_shared<OptionListComponent<std::string>>(getHelpStyle(),
|
||||
_("AUDIO DRIVER"), false);
|
||||
std::string selectedDriver {Settings::getInstance()->getString("AudioDriver")};
|
||||
audioDriver->add("OPENSL ES", "openslES", selectedDriver == "openslES");
|
||||
audioDriver->add("AAUDIO", "AAudio", selectedDriver == "AAudio");
|
||||
// If there are no objects returned, then there must be a manually modified entry in the
|
||||
// configuration file. Simply set the audio driver to "openslES" in this case.
|
||||
if (audioDriver->getSelectedObjects().size() == 0)
|
||||
audioDriver->selectEntry(0);
|
||||
s->addWithLabel(_("AUDIO DRIVER (REQUIRES RESTART)"), audioDriver);
|
||||
s->addSaveFunc([audioDriver, s] {
|
||||
if (audioDriver->getSelected() != Settings::getInstance()->getString("AudioDriver")) {
|
||||
Settings::getInstance()->setString("AudioDriver", audioDriver->getSelected());
|
||||
s->setNeedsSaving();
|
||||
}
|
||||
});
|
||||
#endif
|
||||
|
||||
// TODO: Implement system volume support for macOS and Android.
|
||||
#if !defined(__APPLE__) && !defined(__ANDROID__) && !defined(__FreeBSD__) && !defined(__HAIKU__)
|
||||
// System volume.
|
||||
|
@ -2306,7 +2328,7 @@ void GuiMenu::openQuitMenu()
|
|||
});
|
||||
auto quitText = std::make_shared<TextComponent>(
|
||||
#if not defined RETRODECK
|
||||
("QUIT ES-DE"), Font::get(FONT_SIZE_MEDIUM), mMenuColorPrimary);
|
||||
_("QUIT ES-DE"), Font::get(FONT_SIZE_MEDIUM), mMenuColorPrimary);
|
||||
# else // RetroDECK is defined
|
||||
_("QUIT RETRODECK"), Font::get(FONT_SIZE_MEDIUM), mMenuColorPrimary);
|
||||
#endif
|
||||
|
@ -2362,22 +2384,22 @@ void GuiMenu::addVersionInfo()
|
|||
|
||||
const std::string applicationName {"ES-DE"};
|
||||
|
||||
#if defined(IS_PRERELEASE)
|
||||
#if defined(__ANDROID__)
|
||||
#if defined(IS_PRERELEASE)
|
||||
#if defined(__ANDROID__)
|
||||
mVersion.setText(applicationName + " " + Utils::String::toUpper(PROGRAM_VERSION_STRING) + "-" +
|
||||
std::to_string(ANDROID_VERSION_CODE) + " (Built " + __DATE__ + ")");
|
||||
#else
|
||||
#else
|
||||
mVersion.setText(applicationName + " " + Utils::String::toUpper(PROGRAM_VERSION_STRING) +
|
||||
" (Built " + __DATE__ + ")");
|
||||
#endif
|
||||
#else
|
||||
#if defined(__ANDROID__)
|
||||
#endif
|
||||
#else
|
||||
#if defined(__ANDROID__)
|
||||
mVersion.setText(applicationName + " " + Utils::String::toUpper(PROGRAM_VERSION_STRING) + "-" +
|
||||
std::to_string(ANDROID_VERSION_CODE));
|
||||
#else
|
||||
#else
|
||||
mVersion.setText(applicationName + " " + Utils::String::toUpper(PROGRAM_VERSION_STRING));
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(RETRODECK)
|
||||
// Only execute this block if RETRODECK is defined
|
||||
|
|
|
@ -304,6 +304,11 @@ GuiOrphanedDataCleanup::~GuiOrphanedDataCleanup()
|
|||
|
||||
void GuiOrphanedDataCleanup::cleanupMediaFiles()
|
||||
{
|
||||
#if defined(_WIN64)
|
||||
// Workaround for a bug in the libintl library.
|
||||
Utils::Localization::setThreadLocale();
|
||||
#endif
|
||||
|
||||
LOG(LogInfo) << "GuiOrphanedDataCleanup: Starting cleanup of game media";
|
||||
|
||||
const std::time_t currentTime {
|
||||
|
@ -492,6 +497,11 @@ void GuiOrphanedDataCleanup::cleanupMediaFiles()
|
|||
|
||||
void GuiOrphanedDataCleanup::cleanupGamelists()
|
||||
{
|
||||
#if defined(_WIN64)
|
||||
// Workaround for a bug in the libintl library.
|
||||
Utils::Localization::setThreadLocale();
|
||||
#endif
|
||||
|
||||
LOG(LogInfo) << "GuiOrphanedDataCleanup: Starting cleanup of gamelist.xml files";
|
||||
|
||||
if (!Settings::getInstance()->getBool("ShowHiddenGames")) {
|
||||
|
@ -808,6 +818,11 @@ void GuiOrphanedDataCleanup::cleanupGamelists()
|
|||
|
||||
void GuiOrphanedDataCleanup::cleanupCollections()
|
||||
{
|
||||
#if defined(_WIN64)
|
||||
// Workaround for a bug in the libintl library.
|
||||
Utils::Localization::setThreadLocale();
|
||||
#endif
|
||||
|
||||
LOG(LogInfo)
|
||||
<< "GuiOrphanedDataCleanup: Starting cleanup of custom collections configuration files";
|
||||
|
||||
|
|
|
@ -200,9 +200,13 @@ void GuiSettings::addEditableTextComponent(const std::string label,
|
|||
auto lbl = std::make_shared<TextComponent>(Utils::String::toUpper(label),
|
||||
Font::get(FONT_SIZE_MEDIUM), mMenuColorPrimary,
|
||||
ALIGN_LEFT, ALIGN_CENTER, glm::ivec2 {0, 0});
|
||||
row.addElement(lbl, true);
|
||||
row.addElement(lbl, false);
|
||||
row.addElement(ed, true);
|
||||
|
||||
const float maxLabelWidth {mMenu.getSize().x * 0.65f};
|
||||
lbl->setSize(glm::clamp(lbl->getTextCache()->metrics.size.x, 0.0f, maxLabelWidth),
|
||||
lbl->getSize().y);
|
||||
|
||||
auto spacer = std::make_shared<GuiComponent>();
|
||||
spacer->setSize(Renderer::getScreenWidth() * 0.005f, 0.0f);
|
||||
row.addElement(spacer, false);
|
||||
|
|
|
@ -97,9 +97,9 @@ GuiThemeDownloader::GuiThemeDownloader(std::function<void()> updateCallback)
|
|||
mMenuColorTitle, ALIGN_LEFT);
|
||||
mCenterGrid->setEntry(mDownloadStatus, glm::ivec2 {1, 2}, false, true, glm::ivec2 {2, 1});
|
||||
|
||||
mLocalChanges = std::make_shared<TextComponent>("", Font::get(fontSizeSmall, FONT_PATH_BOLD),
|
||||
mInfoField = std::make_shared<TextComponent>("", Font::get(fontSizeSmall, FONT_PATH_BOLD),
|
||||
mMenuColorTitle, ALIGN_LEFT);
|
||||
mCenterGrid->setEntry(mLocalChanges, glm::ivec2 {3, 2}, false, true, glm::ivec2 {2, 1});
|
||||
mCenterGrid->setEntry(mInfoField, glm::ivec2 {3, 2}, false, true, glm::ivec2 {2, 1});
|
||||
|
||||
mScreenshot = std::make_shared<ImageComponent>();
|
||||
mScreenshot->setLinearInterpolation(true);
|
||||
|
@ -228,6 +228,11 @@ GuiThemeDownloader::~GuiThemeDownloader()
|
|||
|
||||
bool GuiThemeDownloader::fetchRepository(const std::string& repositoryName, bool allowReset)
|
||||
{
|
||||
#if defined(_WIN64)
|
||||
// Workaround for a bug in the libintl library.
|
||||
Utils::Localization::setThreadLocale();
|
||||
#endif
|
||||
|
||||
int errorCode {0};
|
||||
const std::string path {mThemeDirectory + repositoryName};
|
||||
mRepositoryError = RepositoryError::NO_REPO_ERROR;
|
||||
|
@ -435,8 +440,8 @@ bool GuiThemeDownloader::checkLocalChanges(git_repository* repository)
|
|||
// it possible to add custom files to the repository without overwriting these when
|
||||
// pulling theme updates.
|
||||
statusOptions.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR;
|
||||
statusOptions.flags =
|
||||
GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX | GIT_STATUS_OPT_SORT_CASE_SENSITIVELY;
|
||||
statusOptions.flags = GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX |
|
||||
GIT_STATUS_OPT_SORT_CASE_SENSITIVELY | GIT_STATUS_OPT_UPDATE_INDEX;
|
||||
|
||||
errorCode = git_status_list_new(&status, repository, &statusOptions);
|
||||
if (errorCode == 0)
|
||||
|
@ -465,7 +470,8 @@ bool GuiThemeDownloader::checkCorruptRepository(git_repository* repository)
|
|||
#endif
|
||||
statusOptions.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR;
|
||||
statusOptions.flags = GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX |
|
||||
GIT_STATUS_OPT_SORT_CASE_SENSITIVELY | GIT_STATUS_OPT_INCLUDE_UNMODIFIED;
|
||||
GIT_STATUS_OPT_SORT_CASE_SENSITIVELY | GIT_STATUS_OPT_INCLUDE_UNMODIFIED |
|
||||
GIT_STATUS_OPT_UPDATE_INDEX;
|
||||
|
||||
errorCode = git_status_list_new(&status, repository, &statusOptions);
|
||||
if (errorCode == 0)
|
||||
|
@ -492,8 +498,9 @@ void GuiThemeDownloader::makeInventory()
|
|||
const auto themeInventoryTime {std::chrono::system_clock::now()};
|
||||
const std::string path {mThemeDirectory + theme.reponame};
|
||||
theme.invalidRepository = false;
|
||||
theme.corruptRepository = false;
|
||||
theme.shallowRepository = false;
|
||||
theme.corruptRepository = false;
|
||||
theme.wrongUrl = false;
|
||||
theme.manuallyDownloaded = false;
|
||||
theme.hasLocalChanges = false;
|
||||
theme.isCloned = false;
|
||||
|
@ -532,6 +539,17 @@ void GuiThemeDownloader::makeInventory()
|
|||
|
||||
theme.isCloned = true;
|
||||
|
||||
git_remote* gitRemote {nullptr};
|
||||
if (git_remote_lookup(&gitRemote, repository, "origin") == 0) {
|
||||
const std::string clonedUrl {git_remote_url(gitRemote)};
|
||||
git_remote_free(gitRemote);
|
||||
if (theme.url != clonedUrl) {
|
||||
theme.wrongUrl = true;
|
||||
git_repository_free(repository);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (checkLocalChanges(repository))
|
||||
theme.hasLocalChanges = true;
|
||||
else if (git_repository_head_detached(repository))
|
||||
|
@ -765,7 +783,7 @@ void GuiThemeDownloader::populateGUI()
|
|||
if (theme.isCloned)
|
||||
themeName.append(" ").append(ViewController::TICKMARK_CHAR);
|
||||
if (theme.manuallyDownloaded || theme.invalidRepository || theme.corruptRepository ||
|
||||
theme.shallowRepository)
|
||||
theme.shallowRepository || theme.wrongUrl)
|
||||
themeName.append(" ").append(ViewController::CROSSEDCIRCLE_CHAR);
|
||||
if (theme.hasLocalChanges)
|
||||
themeName.append(" ").append(ViewController::EXCLAMATION_CHAR);
|
||||
|
@ -872,6 +890,35 @@ void GuiThemeDownloader::populateGUI()
|
|||
0.75f :
|
||||
0.46f * (1.778f / mRenderer->getScreenAspectRatio()))));
|
||||
}
|
||||
else if (theme.wrongUrl) {
|
||||
mWindow->pushGui(new GuiMsgBox(
|
||||
getHelpStyle(),
|
||||
Utils::String::format(
|
||||
_("THE LOCALLY CLONED REPOSITORY CONTAINS THE WRONG URL WHICH NORMALLY "
|
||||
"MEANS THE THEME HAS BEEN MOVED TO A NEW GIT SITE. A FRESH DOWNLOAD IS "
|
||||
"REQUIRED AND THE OLD THEME DIRECTORY \"%s\" WILL BE RENAMED TO "
|
||||
"\"%s_WRONG_URL_DISABLED\""),
|
||||
std::string {theme.reponame + theme.manualExtension}.c_str(),
|
||||
std::string {theme.reponame + theme.manualExtension}.c_str()),
|
||||
_("PROCEED"),
|
||||
[this, theme] {
|
||||
if (renameDirectory(mThemeDirectory + theme.reponame +
|
||||
theme.manualExtension,
|
||||
"_WRONG_URL_DISABLED")) {
|
||||
return;
|
||||
}
|
||||
std::promise<bool>().swap(mPromise);
|
||||
mFuture = mPromise.get_future();
|
||||
mFetchThread = std::thread(&GuiThemeDownloader::cloneRepository, this,
|
||||
theme.reponame, theme.url);
|
||||
mStatusType = StatusType::STATUS_DOWNLOADING;
|
||||
mStatusText = _("DOWNLOADING THEME");
|
||||
},
|
||||
_("CANCEL"), [] { return; }, "", nullptr, nullptr, false, true,
|
||||
(mRenderer->getIsVerticalOrientation() ?
|
||||
0.75f :
|
||||
0.46f * (1.778f / mRenderer->getScreenAspectRatio()))));
|
||||
}
|
||||
else if (theme.hasLocalChanges) {
|
||||
mWindow->pushGui(new GuiMsgBox(
|
||||
getHelpStyle(),
|
||||
|
@ -933,7 +980,7 @@ void GuiThemeDownloader::updateGUI()
|
|||
if (mThemes[i].isCloned)
|
||||
themeName.append(" ").append(ViewController::TICKMARK_CHAR);
|
||||
if (mThemes[i].manuallyDownloaded || mThemes[i].invalidRepository ||
|
||||
mThemes[i].corruptRepository || mThemes[i].shallowRepository)
|
||||
mThemes[i].corruptRepository || mThemes[i].shallowRepository || mThemes[i].wrongUrl)
|
||||
themeName.append(" ").append(ViewController::CROSSEDCIRCLE_CHAR);
|
||||
if (mThemes[i].hasLocalChanges)
|
||||
themeName.append(" ").append(ViewController::EXCLAMATION_CHAR);
|
||||
|
@ -990,12 +1037,16 @@ void GuiThemeDownloader::updateInfoPane()
|
|||
mDownloadStatus->setColor(mMenuColorPrimary);
|
||||
mDownloadStatus->setOpacity(0.7f);
|
||||
}
|
||||
if (mThemes[mList->getCursorId()].hasLocalChanges) {
|
||||
mLocalChanges->setText(ViewController::EXCLAMATION_CHAR + " " + _("LOCAL CHANGES"));
|
||||
mLocalChanges->setColor(mMenuColorRed);
|
||||
if (mThemes[mList->getCursorId()].wrongUrl) {
|
||||
mInfoField->setText(ViewController::CROSSEDCIRCLE_CHAR + " " + _("WRONG URL"));
|
||||
mInfoField->setColor(mMenuColorRed);
|
||||
}
|
||||
else if (mThemes[mList->getCursorId()].hasLocalChanges) {
|
||||
mInfoField->setText(ViewController::EXCLAMATION_CHAR + " " + _("LOCAL CHANGES"));
|
||||
mInfoField->setColor(mMenuColorRed);
|
||||
}
|
||||
else {
|
||||
mLocalChanges->setText("");
|
||||
mInfoField->setText("");
|
||||
}
|
||||
|
||||
mVariantCount->setText(std::to_string(mThemes[mList->getCursorId()].variants.size()));
|
||||
|
@ -1061,6 +1112,9 @@ void GuiThemeDownloader::setupFullscreenViewer()
|
|||
void GuiThemeDownloader::update(int deltaTime)
|
||||
{
|
||||
if (!mAttemptedFetch) {
|
||||
#if defined(__ANDROID__)
|
||||
removeDisabledRepositories();
|
||||
#endif
|
||||
// We need to run this here instead of from the constructor so that GuiMsgBox will be
|
||||
// on top of the GUI stack if it needs to be displayed.
|
||||
mAttemptedFetch = true;
|
||||
|
@ -1085,6 +1139,7 @@ void GuiThemeDownloader::update(int deltaTime)
|
|||
mWindow->pushGui(new GuiMsgBox(
|
||||
getHelpStyle(), errorMessage, _("OK"), [] { return; }, "", nullptr, "",
|
||||
nullptr, nullptr, true));
|
||||
mRepositoryError = RepositoryError::NO_REPO_ERROR;
|
||||
mMessage = "";
|
||||
getHelpPrompts();
|
||||
}
|
||||
|
@ -1319,7 +1374,7 @@ std::vector<HelpPrompt> GuiThemeDownloader::getHelpPrompts()
|
|||
if (mGrid.getSelectedComponent() == mCenterGrid)
|
||||
prompts.push_back(HelpPrompt("x", _("view screenshots")));
|
||||
|
||||
if (mThemes[mList->getCursorId()].isCloned) {
|
||||
if (mThemes[mList->getCursorId()].isCloned && !mThemes[mList->getCursorId()].wrongUrl) {
|
||||
prompts.push_back(HelpPrompt("a", _("fetch updates")));
|
||||
if (mGrid.getSelectedComponent() == mCenterGrid)
|
||||
prompts.push_back(HelpPrompt("y", _("delete")));
|
||||
|
@ -1335,6 +1390,32 @@ std::vector<HelpPrompt> GuiThemeDownloader::getHelpPrompts()
|
|||
return prompts;
|
||||
}
|
||||
|
||||
void GuiThemeDownloader::removeDisabledRepositories()
|
||||
{
|
||||
const Utils::FileSystem::StringList& dirContent {
|
||||
Utils::FileSystem::getDirContent(mThemeDirectory)};
|
||||
|
||||
std::vector<std::string> disabledDirs;
|
||||
|
||||
for (auto& directory : dirContent) {
|
||||
if (Utils::FileSystem::isRegularFile(directory))
|
||||
continue;
|
||||
if (Utils::FileSystem::getFileName(directory).length() > 9) {
|
||||
if (directory.substr(directory.length() - 9, 9) == "_DISABLED")
|
||||
disabledDirs.emplace_back(directory);
|
||||
}
|
||||
}
|
||||
|
||||
if (disabledDirs.empty())
|
||||
return;
|
||||
|
||||
for (auto& directory : disabledDirs) {
|
||||
LOG(LogInfo) << "GuiThemeDownloader: Removing disabled theme directory \"" << directory
|
||||
<< "\"";
|
||||
Utils::FileSystem::removeDirectory(directory, true);
|
||||
}
|
||||
}
|
||||
|
||||
bool GuiThemeDownloader::fetchThemesList()
|
||||
{
|
||||
const std::string repositoryName {"themes-list"};
|
||||
|
|
|
@ -70,8 +70,9 @@ private:
|
|||
bool newEntry;
|
||||
bool deprecated;
|
||||
bool invalidRepository;
|
||||
bool corruptRepository;
|
||||
bool shallowRepository;
|
||||
bool corruptRepository;
|
||||
bool wrongUrl;
|
||||
bool manuallyDownloaded;
|
||||
bool hasLocalChanges;
|
||||
bool isCloned;
|
||||
|
@ -79,8 +80,9 @@ private:
|
|||
: newEntry {false}
|
||||
, deprecated {false}
|
||||
, invalidRepository {false}
|
||||
, corruptRepository {false}
|
||||
, shallowRepository {false}
|
||||
, corruptRepository {false}
|
||||
, wrongUrl {false}
|
||||
, manuallyDownloaded {false}
|
||||
, hasLocalChanges {false}
|
||||
, isCloned {false}
|
||||
|
@ -88,6 +90,7 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
void removeDisabledRepositories();
|
||||
bool fetchThemesList();
|
||||
bool fetchRepository(const std::string& repositoryName, bool allowReset = false);
|
||||
bool cloneRepository(const std::string& repositoryName, const std::string& url);
|
||||
|
@ -163,7 +166,7 @@ private:
|
|||
std::shared_ptr<TextComponent> mViewerIndicatorLeft;
|
||||
std::shared_ptr<TextComponent> mViewerIndicatorRight;
|
||||
std::shared_ptr<TextComponent> mDownloadStatus;
|
||||
std::shared_ptr<TextComponent> mLocalChanges;
|
||||
std::shared_ptr<TextComponent> mInfoField;
|
||||
std::shared_ptr<TextComponent> mTitle;
|
||||
std::shared_ptr<TextComponent> mVariantsLabel;
|
||||
std::shared_ptr<TextComponent> mColorSchemesLabel;
|
||||
|
|
|
@ -503,6 +503,15 @@ void applicationLoop()
|
|||
if (SDL_PollEvent(&event)) {
|
||||
do {
|
||||
#if defined(__ANDROID__)
|
||||
if (event.type == SDL_WINDOWEVENT &&
|
||||
event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
|
||||
// This covers switching to/from multi-window mode. Note that the reload
|
||||
// mechanism is rather ungraceful as it just forcekills any open windows, which
|
||||
// is problematic if the scraper or theme downloader is running for instance.
|
||||
ViewController::getInstance()->setWindowSizeChanged(
|
||||
static_cast<int>(event.window.data1), static_cast<int>(event.window.data2));
|
||||
ViewController::getInstance()->checkWindowSizeChanged();
|
||||
}
|
||||
// Prevent that button presses get registered immediately when entering the
|
||||
// foreground (which most commonly mean we're returning from a game).
|
||||
// Also perform some other tasks on resume such as resetting timers.
|
||||
|
@ -695,13 +704,6 @@ int main(int argc, char* argv[])
|
|||
Log::open();
|
||||
{
|
||||
|
||||
// const std::string applicationName =
|
||||
// #if defined(RETRODECK)
|
||||
// "RetroDECK";
|
||||
// #else
|
||||
// "ES-DE";
|
||||
// #endif
|
||||
|
||||
const std::string applicationName = "ES-DE";
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
|
@ -882,8 +884,7 @@ const std::string applicationName = "ES-DE";
|
|||
}
|
||||
}
|
||||
if (!Utils::FileSystem::exists(themeDir + "/.nomedia")) {
|
||||
LOG(LogInfo) << "Creating \"no media\" file \"" << themeDir + "/.nomedia"
|
||||
<< "\"...";
|
||||
LOG(LogInfo) << "Creating \"no media\" file \"" << themeDir + "/.nomedia" << "\"...";
|
||||
Utils::FileSystem::createEmptyFile(themeDir + "/.nomedia");
|
||||
if (!Utils::FileSystem::exists(themeDir + "/.nomedia")) {
|
||||
LOG(LogWarning) << "Couldn't create file, permission problems?";
|
||||
|
@ -1037,6 +1038,15 @@ const std::string applicationName = "ES-DE";
|
|||
Utils::Platform::Android::setupFontFiles();
|
||||
Utils::Platform::Android::setupLocalizationFiles();
|
||||
}
|
||||
|
||||
{
|
||||
std::string audioDriver {Settings::getInstance()->getString("AudioDriver")};
|
||||
if (audioDriver != "openslES" && audioDriver != "AAudio")
|
||||
audioDriver = "openslES";
|
||||
|
||||
setenv("SDL_AUDIODRIVER", audioDriver.c_str(), 1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Utils::Localization::setLocale();
|
||||
|
@ -1102,7 +1112,16 @@ const std::string applicationName = "ES-DE";
|
|||
if (Settings::getInstance()->getBool("SplashScreen"))
|
||||
window->renderSplashScreen(Window::SplashScreenState::SCANNING, 0.0f);
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
while (SDL_PollEvent(&event)) {
|
||||
if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
|
||||
ViewController::getInstance()->setWindowSizeChanged(
|
||||
static_cast<int>(event.window.data1), static_cast<int>(event.window.data2));
|
||||
}
|
||||
};
|
||||
#else
|
||||
while (SDL_PollEvent(&event)) {};
|
||||
#endif
|
||||
|
||||
#if defined(_WIN64)
|
||||
// Hide taskbar if the setting for this is enabled.
|
||||
|
@ -1183,8 +1202,7 @@ const std::string applicationName = "ES-DE";
|
|||
#if defined(__ANDROID__)
|
||||
if (!Utils::FileSystem::exists(FileData::getROMDirectory() + ".nomedia")) {
|
||||
LOG(LogInfo) << "Creating \"no media\" file \""
|
||||
<< FileData::getROMDirectory() + ".nomedia"
|
||||
<< "\"...";
|
||||
<< FileData::getROMDirectory() + ".nomedia" << "\"...";
|
||||
Utils::FileSystem::createEmptyFile(FileData::getROMDirectory() + ".nomedia");
|
||||
if (!Utils::FileSystem::exists(FileData::getROMDirectory() + ".nomedia")) {
|
||||
LOG(LogWarning) << "Couldn't create file, permission problems?";
|
||||
|
@ -1251,6 +1269,11 @@ const std::string applicationName = "ES-DE";
|
|||
|
||||
// Main application loop.
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
// If the window size changed during startup then we need to resize and reload.
|
||||
ViewController::getInstance()->checkWindowSizeChanged();
|
||||
#endif
|
||||
|
||||
if (!SystemData::sStartupExitSignal) {
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
emscripten_set_main_loop(&applicationLoop, 0, 1);
|
||||
|
|
|
@ -726,8 +726,7 @@ std::string getSaveAsPath(const ScraperSearchParams& params,
|
|||
|
||||
#if defined(__ANDROID__)
|
||||
if (!Utils::FileSystem::exists(path + ".nomedia")) {
|
||||
LOG(LogInfo) << "Creating \"no media\" file \"" << path + ".nomedia"
|
||||
<< "\"...";
|
||||
LOG(LogInfo) << "Creating \"no media\" file \"" << path + ".nomedia" << "\"...";
|
||||
Utils::FileSystem::createEmptyFile(path + ".nomedia");
|
||||
if (!Utils::FileSystem::exists(path + ".nomedia")) {
|
||||
LOG(LogWarning) << "Couldn't create file, permission problems?";
|
||||
|
|
|
@ -52,6 +52,9 @@ void SystemView::onShow()
|
|||
|
||||
void SystemView::onHide()
|
||||
{
|
||||
if (mPrimary == nullptr || mPrimary->getCursor() + 1 > static_cast<int>(mSystemElements.size()))
|
||||
return;
|
||||
|
||||
for (auto& video : mSystemElements[mPrimary->getCursor()].videoComponents)
|
||||
video->stopVideoPlayer(false);
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "views/ViewController.h"
|
||||
|
||||
#include "ApplicationUpdater.h"
|
||||
#include "AudioManager.h"
|
||||
#include "CollectionSystemsManager.h"
|
||||
#include "FileFilterIndex.h"
|
||||
#include "InputManager.h"
|
||||
|
@ -35,6 +36,10 @@
|
|||
#include "views/GamelistView.h"
|
||||
#include "views/SystemView.h"
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
#include "utils/PlatformUtilAndroid.h"
|
||||
#endif
|
||||
|
||||
ViewController::ViewController() noexcept
|
||||
: mRenderer {Renderer::getInstance()}
|
||||
, mNoGamesMessageBox {nullptr}
|
||||
|
@ -49,6 +54,8 @@ ViewController::ViewController() noexcept
|
|||
, mFadeOpacity {0}
|
||||
, mCancelledTransition {false}
|
||||
, mNextSystem {false}
|
||||
, mWindowChangedWidth {0}
|
||||
, mWindowChangedHeight {0}
|
||||
{
|
||||
mState.viewing = ViewMode::NOTHING;
|
||||
mState.previouslyViewed = ViewMode::NOTHING;
|
||||
|
@ -177,8 +184,7 @@ void ViewController::setMenuColors()
|
|||
|
||||
void ViewController::legacyAppDataDialog()
|
||||
{
|
||||
const std::string upgradeMessage
|
||||
{
|
||||
const std::string upgradeMessage {
|
||||
"AS OF ES-DE 3.0 THE APPLICATION DATA DIRECTORY HAS CHANGED FROM \".emulationstation\" "
|
||||
"to \"ES-DE\"\nPLEASE RENAME YOUR CURRENT DATA DIRECTORY:\n" +
|
||||
#if defined(_WIN64)
|
||||
|
@ -186,12 +192,10 @@ void ViewController::legacyAppDataDialog()
|
|||
"\nTO THE FOLLOWING:\n" +
|
||||
Utils::String::replace(
|
||||
Utils::FileSystem::getParent(Utils::FileSystem::getAppDataDirectory()), "/", "\\") +
|
||||
"\\ES-DE"
|
||||
};
|
||||
"\\ES-DE"};
|
||||
#else
|
||||
Utils::FileSystem::getAppDataDirectory() + "\nTO THE FOLLOWING:\n" +
|
||||
Utils::FileSystem::getParent(Utils::FileSystem::getAppDataDirectory()) + "/ES-DE"
|
||||
};
|
||||
Utils::FileSystem::getParent(Utils::FileSystem::getAppDataDirectory()) + "/ES-DE"};
|
||||
#endif
|
||||
|
||||
mWindow->pushGui(new GuiMsgBox(
|
||||
|
@ -1394,6 +1398,13 @@ void ViewController::preload()
|
|||
SystemData::sStartupExitSignal = true;
|
||||
return;
|
||||
}
|
||||
#if defined(__ANDROID__)
|
||||
if (event.type == SDL_WINDOWEVENT &&
|
||||
event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
|
||||
setWindowSizeChanged(static_cast<int>(event.window.data1),
|
||||
static_cast<int>(event.window.data2));
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
const std::string entryType {(*it)->isCustomCollection() ? "custom collection" : "system"};
|
||||
|
@ -1572,6 +1583,71 @@ void ViewController::reloadAll()
|
|||
updateHelpPrompts();
|
||||
}
|
||||
|
||||
void ViewController::setWindowSizeChanged(const int width, const int height)
|
||||
{
|
||||
#if defined(__ANDROID__)
|
||||
const std::pair<int, int> windowSize {Utils::Platform::Android::getWindowSize()};
|
||||
|
||||
if (windowSize.first == static_cast<int>(mRenderer->getScreenWidth()) &&
|
||||
windowSize.second == static_cast<int>(mRenderer->getScreenHeight())) {
|
||||
mWindowChangedWidth = 0;
|
||||
mWindowChangedHeight = 0;
|
||||
}
|
||||
else {
|
||||
mWindowChangedWidth = windowSize.first;
|
||||
mWindowChangedHeight = windowSize.second;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void ViewController::checkWindowSizeChanged()
|
||||
{
|
||||
if (mWindowChangedWidth == 0 || mWindowChangedHeight == 0)
|
||||
return;
|
||||
|
||||
LOG(LogInfo) << "Window size has changed from " << mRenderer->getScreenWidth() << "x"
|
||||
<< mRenderer->getScreenHeight() << " to " << mWindowChangedWidth << "x"
|
||||
<< mWindowChangedHeight << ", reloading...";
|
||||
|
||||
mWindowChangedWidth = 0;
|
||||
mWindowChangedHeight = 0;
|
||||
|
||||
mWindow->stopInfoPopup();
|
||||
|
||||
if (mState.viewing != ViewController::ViewMode::NOTHING) {
|
||||
mWindow->stopScreensaver();
|
||||
mWindow->stopMediaViewer();
|
||||
mWindow->stopPDFViewer();
|
||||
}
|
||||
|
||||
// This is done quite ungracefully, essentially forcekilling all open windows.
|
||||
while (mWindow->getGuiStackSize() > 1)
|
||||
mWindow->removeGui(mWindow->peekGui());
|
||||
|
||||
AudioManager::getInstance().deinit();
|
||||
mWindow->deinit();
|
||||
SDL_Delay(20);
|
||||
AudioManager::getInstance().init();
|
||||
mWindow->init(true);
|
||||
|
||||
mWindow->setLaunchedGame(false);
|
||||
mWindow->invalidateCachedBackground();
|
||||
mWindow->renderSplashScreen(Window::SplashScreenState::RELOADING, 0.0f);
|
||||
|
||||
if (mState.viewing != ViewController::ViewMode::NOTHING) {
|
||||
reloadAll();
|
||||
goToStart(false);
|
||||
resetCamera();
|
||||
}
|
||||
else {
|
||||
noGamesDialog();
|
||||
}
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
InputOverlay::getInstance().init();
|
||||
#endif
|
||||
}
|
||||
|
||||
void ViewController::rescanROMDirectory()
|
||||
{
|
||||
mWindow->setBlockInput(true);
|
||||
|
|
|
@ -56,6 +56,10 @@ public:
|
|||
// Reload everything with a theme, used when the "Theme" setting changes.
|
||||
void reloadAll();
|
||||
|
||||
// On window size changes we need to deinit/init the application, reload the systems etc.
|
||||
void setWindowSizeChanged(const int width, const int height);
|
||||
void checkWindowSizeChanged();
|
||||
|
||||
// Rescan the ROM directory for any changes to games and systems.
|
||||
void rescanROMDirectory();
|
||||
|
||||
|
@ -86,7 +90,11 @@ public:
|
|||
void pauseViewVideos() override { mCurrentView->pauseViewVideos(); }
|
||||
void muteViewVideos() override { mCurrentView->muteViewVideos(); }
|
||||
// Needed on Android to reset the static image delay timer on activity resume.
|
||||
void resetViewVideosTimer() override { mCurrentView->resetViewVideosTimer(); }
|
||||
void resetViewVideosTimer() override
|
||||
{
|
||||
if (mCurrentView != nullptr)
|
||||
mCurrentView->resetViewVideosTimer();
|
||||
}
|
||||
|
||||
void onFileChanged(FileData* file, bool reloadGamelist);
|
||||
void triggerGameLaunch(FileData* game)
|
||||
|
@ -195,6 +203,8 @@ private:
|
|||
float mFadeOpacity;
|
||||
bool mCancelledTransition; // Needed only for the Fade transition style.
|
||||
bool mNextSystem;
|
||||
int mWindowChangedWidth;
|
||||
int mWindowChangedHeight;
|
||||
};
|
||||
|
||||
#endif // ES_APP_VIEWS_VIEW_CONTROLLER_H
|
||||
|
|
|
@ -36,10 +36,28 @@ void AudioManager::init()
|
|||
{
|
||||
LOG(LogInfo) << "Setting up AudioManager...";
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
if (SDL_InitSubSystem(SDL_INIT_AUDIO) != 0) {
|
||||
LOG(LogError) << "Error initializing SDL audio!\n" << SDL_GetError();
|
||||
if (Settings::getInstance()->getString("AudioDriver") != "AAudio") {
|
||||
LOG(LogWarning) << "Requested OpenSL ES audio driver does not seem to be available, "
|
||||
"reverting to AAudio";
|
||||
setenv("SDL_AUDIODRIVER", "AAudio", 1);
|
||||
if (SDL_InitSubSystem(SDL_INIT_AUDIO) != 0) {
|
||||
LOG(LogError) << "Couldn't initialize SDL audio: " << SDL_GetError();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
LOG(LogError) << "Couldn't initialize SDL audio: " << SDL_GetError();
|
||||
return;
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (SDL_InitSubSystem(SDL_INIT_AUDIO) != 0) {
|
||||
LOG(LogError) << "Couldn't initialize SDL audio: " << SDL_GetError();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
LOG(LogInfo) << "Audio driver: " << SDL_GetCurrentAudioDriver();
|
||||
|
||||
|
|
|
@ -233,6 +233,9 @@ void Settings::setDefaults()
|
|||
mBoolMap["ShowHelpPrompts"] = {true, true};
|
||||
|
||||
// Sound settings.
|
||||
#if defined(__ANDROID__)
|
||||
mStringMap["AudioDriver"] = {"openslES", "openslES"};
|
||||
#endif
|
||||
mIntMap["SoundVolumeNavigation"] = {70, 70};
|
||||
mIntMap["SoundVolumeVideos"] = {80, 80};
|
||||
mBoolMap["ViewsVideoAudio"] = {true, true};
|
||||
|
|
|
@ -106,10 +106,12 @@ std::vector<std::pair<std::string, std::string>> ThemeData::sSupportedLanguages
|
|||
{"automatic", "automatic"},
|
||||
{"en_US", "ENGLISH (UNITED STATES)"},
|
||||
{"en_GB", "ENGLISH (UNITED KINGDOM)"},
|
||||
{"ca_ES", "CATALÀ"},
|
||||
{"de_DE", "DEUTSCH"},
|
||||
{"es_ES", "ESPAÑOL (ESPAÑA)"},
|
||||
{"fr_FR", "FRANÇAIS"},
|
||||
{"it_IT", "ITALIANO"},
|
||||
{"nl_NL", "NEDERLANDS"},
|
||||
{"pl_PL", "POLSKI"},
|
||||
{"pt_BR", "PORTUGUÊS (BRASIL)"},
|
||||
{"ro_RO", "ROMÂNĂ"},
|
||||
|
@ -184,6 +186,7 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
|
|||
{"gradientType", STRING},
|
||||
{"text", STRING},
|
||||
{"textRelativeScale", FLOAT},
|
||||
{"textBackgroundCornerRadius", FLOAT},
|
||||
{"textColor", COLOR},
|
||||
{"textBackgroundColor", COLOR},
|
||||
{"textSelectedColor", COLOR},
|
||||
|
@ -248,6 +251,7 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
|
|||
{"selectorGradientType", STRING},
|
||||
{"text", STRING},
|
||||
{"textRelativeScale", FLOAT},
|
||||
{"textBackgroundCornerRadius", FLOAT},
|
||||
{"textColor", COLOR},
|
||||
{"textBackgroundColor", COLOR},
|
||||
{"textSelectedColor", COLOR},
|
||||
|
|
|
@ -107,7 +107,7 @@ GuiComponent* Window::peekGui()
|
|||
return mGuiStack.back();
|
||||
}
|
||||
|
||||
bool Window::init()
|
||||
bool Window::init(bool resized)
|
||||
{
|
||||
if (!mRenderer->init()) {
|
||||
LOG(LogError) << "Renderer failed to initialize.";
|
||||
|
@ -133,6 +133,9 @@ bool Window::init()
|
|||
mDefaultFonts.push_back(Font::get(FONT_SIZE_LARGE_FIXED));
|
||||
}
|
||||
|
||||
if (resized)
|
||||
Font::updateFontSizes();
|
||||
|
||||
if (mRenderer->getIsVerticalOrientation())
|
||||
mSplash->setResize(mRenderer->getScreenWidth() * 0.8f, 0.0f);
|
||||
else
|
||||
|
|
|
@ -93,7 +93,7 @@ public:
|
|||
int getGuiStackSize() { return static_cast<int>(mGuiStack.size()); }
|
||||
bool isBackgroundDimmed();
|
||||
|
||||
bool init();
|
||||
bool init(bool resized = false);
|
||||
void deinit();
|
||||
|
||||
void input(InputConfig* config, Input input);
|
||||
|
|
|
@ -128,7 +128,8 @@ void TextEditComponent::textInput(const std::string& text, const bool pasting)
|
|||
(pasting && !mMultiLine ? Utils::String::replace(text, "\n", " ") : text));
|
||||
mCursor += static_cast<unsigned int>(
|
||||
(pasting && !mMultiLine ? Utils::String::replace(text, "\n", " ") : text).size());
|
||||
++mCursorShapedText;
|
||||
mCursorShapedText += static_cast<unsigned int>(Utils::String::unicodeLength(
|
||||
(pasting && !mMultiLine ? Utils::String::replace(text, "\n", " ") : text)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -344,6 +345,9 @@ void TextEditComponent::onTextChanged()
|
|||
|
||||
if (mCursor > static_cast<int>(mText.length()))
|
||||
mCursor = static_cast<int>(mText.length());
|
||||
|
||||
if (mCursorShapedText > static_cast<int>(Utils::String::unicodeLength(mText)))
|
||||
mCursorShapedText = static_cast<int>(Utils::String::unicodeLength(mText));
|
||||
}
|
||||
|
||||
void TextEditComponent::onCursorChanged()
|
||||
|
|
|
@ -198,6 +198,7 @@ private:
|
|||
unsigned int mCarouselColorEnd;
|
||||
bool mColorGradientHorizontal;
|
||||
float mTextRelativeScale;
|
||||
float mTextBackgroundCornerRadius;
|
||||
unsigned int mTextColor;
|
||||
unsigned int mTextBackgroundColor;
|
||||
unsigned int mTextSelectedColor;
|
||||
|
@ -276,6 +277,7 @@ CarouselComponent<T>::CarouselComponent()
|
|||
, mCarouselColorEnd {0}
|
||||
, mColorGradientHorizontal {true}
|
||||
, mTextRelativeScale {1.0f}
|
||||
, mTextBackgroundCornerRadius {0.0f}
|
||||
, mTextColor {0x000000FF}
|
||||
, mTextBackgroundColor {0xFFFFFF00}
|
||||
, mTextSelectedColor {0x000000FF}
|
||||
|
@ -386,6 +388,7 @@ void CarouselComponent<T>::addEntry(Entry& entry, const std::shared_ptr<ThemeDat
|
|||
mTextHorizontalScrollDelay, mTextHorizontalScrollGap);
|
||||
if (!mGamelistView)
|
||||
text->setValue(entry.name);
|
||||
text->setBackgroundCornerRadius(mTextBackgroundCornerRadius);
|
||||
text->setColor(mTextColor);
|
||||
text->setBackgroundColor(mTextBackgroundColor);
|
||||
text->setRenderBackground(true);
|
||||
|
@ -1708,6 +1711,12 @@ void CarouselComponent<T>::applyTheme(const std::shared_ptr<ThemeData>& theme,
|
|||
if (elem->has("textRelativeScale"))
|
||||
mTextRelativeScale = glm::clamp(elem->get<float>("textRelativeScale"), 0.2f, 1.0f);
|
||||
|
||||
if (elem->has("textBackgroundCornerRadius")) {
|
||||
mTextBackgroundCornerRadius =
|
||||
glm::clamp(elem->get<float>("textBackgroundCornerRadius"), 0.0f, 0.5f) *
|
||||
(mItemScale >= 1.0f ? mItemScale : 1.0f) * mRenderer->getScreenWidth();
|
||||
}
|
||||
|
||||
if (elem->has("textColor"))
|
||||
mTextColor = elem->get<unsigned int>("textColor");
|
||||
if (elem->has("textBackgroundColor"))
|
||||
|
|
|
@ -177,6 +177,7 @@ private:
|
|||
std::unique_ptr<ImageComponent> mBackgroundImage;
|
||||
std::string mBackgroundImagePath;
|
||||
float mBackgroundRelativeScale;
|
||||
float mBackgroundCornerRadius;
|
||||
unsigned int mBackgroundColor;
|
||||
unsigned int mBackgroundColorEnd;
|
||||
bool mBackgroundColorGradientHorizontal;
|
||||
|
@ -185,11 +186,13 @@ private:
|
|||
std::string mSelectorImagePath;
|
||||
float mSelectorRelativeScale;
|
||||
SelectorLayer mSelectorLayer;
|
||||
float mSelectorCornerRadius;
|
||||
unsigned int mSelectorColor;
|
||||
unsigned int mSelectorColorEnd;
|
||||
bool mSelectorColorGradientHorizontal;
|
||||
bool mHasSelectorColor;
|
||||
float mTextRelativeScale;
|
||||
float mTextBackgroundCornerRadius;
|
||||
unsigned int mTextColor;
|
||||
unsigned int mTextBackgroundColor;
|
||||
unsigned int mTextSelectedColor;
|
||||
|
@ -254,17 +257,20 @@ GridComponent<T>::GridComponent()
|
|||
, mImageBrightness {0.0f}
|
||||
, mImageSaturation {1.0f}
|
||||
, mBackgroundRelativeScale {1.0f}
|
||||
, mBackgroundCornerRadius {0.0f}
|
||||
, mBackgroundColor {0xFFFFFFFF}
|
||||
, mBackgroundColorEnd {0xFFFFFFFF}
|
||||
, mBackgroundColorGradientHorizontal {true}
|
||||
, mHasBackgroundColor {false}
|
||||
, mSelectorRelativeScale {1.0f}
|
||||
, mSelectorLayer {SelectorLayer::TOP}
|
||||
, mSelectorCornerRadius {0.0f}
|
||||
, mSelectorColor {0xFFFFFFFF}
|
||||
, mSelectorColorEnd {0xFFFFFFFF}
|
||||
, mSelectorColorGradientHorizontal {true}
|
||||
, mHasSelectorColor {false}
|
||||
, mTextRelativeScale {1.0f}
|
||||
, mTextBackgroundCornerRadius {0.0f}
|
||||
, mTextColor {0x000000FF}
|
||||
, mTextBackgroundColor {0xFFFFFF00}
|
||||
, mTextSelectedColor {0x000000FF}
|
||||
|
@ -385,6 +391,7 @@ void GridComponent<T>::addEntry(Entry& entry, const std::shared_ptr<ThemeData>&
|
|||
0x00000000, mLineSpacing, 1.0f, mTextHorizontalScrolling, mTextHorizontalScrollSpeed,
|
||||
mTextHorizontalScrollDelay, mTextHorizontalScrollGap);
|
||||
text->setOrigin(0.5f, 0.5f);
|
||||
text->setBackgroundCornerRadius(mTextBackgroundCornerRadius);
|
||||
text->setColor(mTextColor);
|
||||
text->setBackgroundColor(mTextBackgroundColor);
|
||||
text->setRenderBackground(true);
|
||||
|
@ -773,9 +780,13 @@ template <typename T> void GridComponent<T>::render(const glm::mat4& parentTrans
|
|||
// If a selector color is set but no selector image, then render a rectangle.
|
||||
const float sizeX {mItemSize.x * scale * mSelectorRelativeScale};
|
||||
const float sizeY {mItemSize.y * scale * mSelectorRelativeScale};
|
||||
mRenderer->setMatrix(trans);
|
||||
mRenderer->drawRect(position.x, position.y, sizeX, sizeY, mSelectorColor,
|
||||
mSelectorColorEnd, mSelectorColorGradientHorizontal, opacity);
|
||||
const glm::mat4 drawTrans {
|
||||
glm::translate(trans, glm::round(glm::vec3 {position.x, position.y, 0.0f}))};
|
||||
mRenderer->setMatrix(drawTrans);
|
||||
mRenderer->drawRect(0.0f, 0.0f, sizeX, sizeY, mSelectorColor, mSelectorColorEnd,
|
||||
mSelectorColorGradientHorizontal, opacity, 1.0f,
|
||||
Renderer::BlendFactor::SRC_ALPHA,
|
||||
Renderer::BlendFactor::ONE_MINUS_SRC_ALPHA, mSelectorCornerRadius);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -885,9 +896,13 @@ template <typename T> void GridComponent<T>::render(const glm::mat4& parentTrans
|
|||
// If a background color is set but no background image, then render a rectangle.
|
||||
const float sizeX {mItemSize.x * scale * mBackgroundRelativeScale};
|
||||
const float sizeY {mItemSize.y * scale * mBackgroundRelativeScale};
|
||||
mRenderer->setMatrix(trans);
|
||||
mRenderer->drawRect(backgroundPos.x, backgroundPos.y, sizeX, sizeY, mBackgroundColor,
|
||||
mBackgroundColorEnd, mBackgroundColorGradientHorizontal, opacity);
|
||||
const glm::mat4 drawTrans {glm::translate(
|
||||
trans, glm::round(glm::vec3 {backgroundPos.x, backgroundPos.y, 0.0f}))};
|
||||
mRenderer->setMatrix(drawTrans);
|
||||
mRenderer->drawRect(
|
||||
0.0f, 0.0f, sizeX, sizeY, mBackgroundColor, mBackgroundColorEnd,
|
||||
mBackgroundColorGradientHorizontal, opacity, 1.0f, Renderer::BlendFactor::SRC_ALPHA,
|
||||
Renderer::BlendFactor::ONE_MINUS_SRC_ALPHA, mBackgroundCornerRadius);
|
||||
}
|
||||
|
||||
if (cursorEntry && mSelectorLayer == SelectorLayer::MIDDLE)
|
||||
|
@ -1160,10 +1175,11 @@ void GridComponent<T>::applyTheme(const std::shared_ptr<ThemeData>& theme,
|
|||
}
|
||||
}
|
||||
float backgroundCornerRadius {0.0f};
|
||||
if (elem->has("backgroundCornerRadius"))
|
||||
if (elem->has("backgroundCornerRadius")) {
|
||||
backgroundCornerRadius =
|
||||
glm::clamp(elem->get<float>("backgroundCornerRadius"), 0.0f, 0.5f) *
|
||||
(mItemScale >= 1.0f ? mItemScale : 1.0f) * mRenderer->getScreenWidth();
|
||||
}
|
||||
mBackgroundImage->setCornerRadius(backgroundCornerRadius);
|
||||
mBackgroundImage->setImage(elem->get<std::string>("backgroundImage"));
|
||||
mBackgroundImagePath = path;
|
||||
|
@ -1174,6 +1190,11 @@ void GridComponent<T>::applyTheme(const std::shared_ptr<ThemeData>& theme,
|
|||
<< element.substr(5) << "\", image does not exist: \"" << path << "\"";
|
||||
}
|
||||
}
|
||||
else if (elem->has("backgroundCornerRadius")) {
|
||||
mBackgroundCornerRadius =
|
||||
glm::clamp(elem->get<float>("backgroundCornerRadius"), 0.0f, 0.5f) *
|
||||
(mItemScale >= 1.0f ? mItemScale : 1.0f) * mRenderer->getScreenWidth();
|
||||
}
|
||||
|
||||
if (elem->has("selectorImage")) {
|
||||
const std::string& path {elem->get<std::string>("selectorImage")};
|
||||
|
@ -1192,10 +1213,11 @@ void GridComponent<T>::applyTheme(const std::shared_ptr<ThemeData>& theme,
|
|||
}
|
||||
}
|
||||
float selectorCornerRadius {0.0f};
|
||||
if (elem->has("selectorCornerRadius"))
|
||||
if (elem->has("selectorCornerRadius")) {
|
||||
selectorCornerRadius =
|
||||
glm::clamp(elem->get<float>("selectorCornerRadius"), 0.0f, 0.5f) *
|
||||
(mItemScale >= 1.0f ? mItemScale : 1.0f) * mRenderer->getScreenWidth();
|
||||
}
|
||||
mSelectorImage->setCornerRadius(selectorCornerRadius);
|
||||
mSelectorImage->setImage(elem->get<std::string>("selectorImage"));
|
||||
mSelectorImagePath = path;
|
||||
|
@ -1206,6 +1228,11 @@ void GridComponent<T>::applyTheme(const std::shared_ptr<ThemeData>& theme,
|
|||
<< element.substr(5) << "\", image does not exist: \"" << path << "\"";
|
||||
}
|
||||
}
|
||||
else if (elem->has("selectorCornerRadius")) {
|
||||
mSelectorCornerRadius = glm::clamp(elem->get<float>("selectorCornerRadius"), 0.0f, 0.5f) *
|
||||
(mItemScale >= 1.0f ? mItemScale : 1.0f) *
|
||||
mRenderer->getScreenWidth();
|
||||
}
|
||||
|
||||
if (elem->has("selectorLayer")) {
|
||||
const std::string& selectorLayer {elem->get<std::string>("selectorLayer")};
|
||||
|
@ -1365,6 +1392,12 @@ void GridComponent<T>::applyTheme(const std::shared_ptr<ThemeData>& theme,
|
|||
if (elem->has("textRelativeScale"))
|
||||
mTextRelativeScale = glm::clamp(elem->get<float>("textRelativeScale"), 0.2f, 1.0f);
|
||||
|
||||
if (elem->has("textBackgroundCornerRadius")) {
|
||||
mTextBackgroundCornerRadius =
|
||||
glm::clamp(elem->get<float>("textBackgroundCornerRadius"), 0.0f, 0.5f) *
|
||||
(mItemScale >= 1.0f ? mItemScale : 1.0f) * mRenderer->getScreenWidth();
|
||||
}
|
||||
|
||||
if (elem->has("textColor"))
|
||||
mTextColor = elem->get<unsigned int>("textColor");
|
||||
if (elem->has("textBackgroundColor"))
|
||||
|
|
|
@ -15,6 +15,10 @@
|
|||
#include "renderers/ShaderOpenGL.h"
|
||||
#include "resources/ResourceManager.h"
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
#include "utils/PlatformUtilAndroid.h"
|
||||
#endif
|
||||
|
||||
#if defined(_WIN64)
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
@ -101,12 +105,26 @@ bool Renderer::createWindow()
|
|||
displayMode.h = displayBounds.h;
|
||||
#endif
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
const std::pair<int, int> windowSize {Utils::Platform::Android::getWindowSize()};
|
||||
|
||||
if (windowSize.first != 0 && windowSize.second != 0) {
|
||||
sScreenWidth = windowSize.first;
|
||||
sScreenHeight = windowSize.second;
|
||||
}
|
||||
else {
|
||||
sScreenWidth = displayMode.w;
|
||||
sScreenHeight = displayMode.h;
|
||||
}
|
||||
#else
|
||||
sScreenWidth = Settings::getInstance()->getInt("ScreenWidth") ?
|
||||
Settings::getInstance()->getInt("ScreenWidth") :
|
||||
displayMode.w;
|
||||
sScreenHeight = Settings::getInstance()->getInt("ScreenHeight") ?
|
||||
Settings::getInstance()->getInt("ScreenHeight") :
|
||||
displayMode.h;
|
||||
#endif
|
||||
|
||||
mScreenOffsetX = glm::clamp((Settings::getInstance()->getInt("ScreenOffsetX") ?
|
||||
Settings::getInstance()->getInt("ScreenOffsetX") :
|
||||
0),
|
||||
|
@ -228,6 +246,8 @@ bool Renderer::createWindow()
|
|||
return false;
|
||||
}
|
||||
|
||||
mDisplayIndex = displayIndex;
|
||||
|
||||
#if defined(__APPLE__)
|
||||
// The code below is required as the high DPI scaling on macOS is very bizarre and is
|
||||
// measured in "points" rather than pixels (even though the naming convention sure looks
|
||||
|
|
|
@ -183,6 +183,7 @@ public:
|
|||
const glm::mat4& getProjectionMatrix() { return mProjectionMatrix; }
|
||||
const glm::mat4& getProjectionMatrixNormal() { return mProjectionMatrixNormal; }
|
||||
SDL_Window* getSDLWindow() { return mSDLWindow; }
|
||||
const int getDisplayIndex() { return mDisplayIndex; }
|
||||
const int getScreenRotation() { return mScreenRotation; }
|
||||
static const bool getIsVerticalOrientation() { return sIsVerticalOrientation; }
|
||||
static const float getScreenWidth() { return static_cast<float>(sScreenWidth); }
|
||||
|
@ -249,6 +250,7 @@ private:
|
|||
|
||||
static inline int sScreenWidth {0};
|
||||
static inline int sScreenHeight {0};
|
||||
int mDisplayIndex {0};
|
||||
int mScreenRotation {0};
|
||||
bool mInitialCursorState {true};
|
||||
static inline bool sIsVerticalOrientation {false};
|
||||
|
|
|
@ -500,8 +500,8 @@ void RendererOpenGL::drawTriangleStrips(const Vertex* vertices,
|
|||
const BlendFactor srcBlendFactor,
|
||||
const BlendFactor dstBlendFactor)
|
||||
{
|
||||
const float width {vertices[3].position[0]};
|
||||
const float height {vertices[3].position[1]};
|
||||
const float width {vertices[3].position[0] - vertices[1].position[0]};
|
||||
const float height {vertices[3].position[1] - vertices[2].position[1]};
|
||||
|
||||
GL_CHECK_ERROR(
|
||||
glBlendFunc(convertBlendFactor(srcBlendFactor), convertBlendFactor(dstBlendFactor)));
|
||||
|
|
|
@ -118,6 +118,16 @@ std::shared_ptr<Font> Font::get(float size, const std::string& path)
|
|||
return font;
|
||||
}
|
||||
|
||||
void Font::updateFontSizes()
|
||||
{
|
||||
getMiniFont(true);
|
||||
getSmallFont(true);
|
||||
getMediumFont(true);
|
||||
getMediumFixedFont(true);
|
||||
getLargeFont(true);
|
||||
getLargeFixedFont(true);
|
||||
}
|
||||
|
||||
glm::vec2 Font::sizeText(std::string text, float lineSpacing)
|
||||
{
|
||||
if (text == "")
|
||||
|
@ -332,8 +342,22 @@ TextCache* Font::buildTextCache(const std::string& text,
|
|||
Glyph* glyph {nullptr};
|
||||
|
||||
// Invalid character.
|
||||
if (!segment.doShape && character == 0)
|
||||
if (!segment.doShape && character == 0) {
|
||||
if (needGlyphsPos) {
|
||||
// TODO: This is a temporary workaround for a problem that only seems to be
|
||||
// present on Android, and that is that non-character input from a physical
|
||||
// keyboard generates SDL_TEXTINPUT events even though it shouldn't. This
|
||||
// workaround is not a proper fix, it's only there to prevent ES-DE from
|
||||
// crashing if such input is received when editing text. The issue has been
|
||||
// reported to the SDL developers as it needs to be addressed there.
|
||||
if (glyphPositions.size() > 0)
|
||||
glyphPositions.emplace_back(glyphPositions.back().x,
|
||||
glyphPositions.back().y);
|
||||
else
|
||||
glyphPositions.emplace_back(0.0f, 0.0f);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!segment.doShape && character == '\n') {
|
||||
x = 0.0f;
|
||||
|
|
|
@ -37,46 +37,65 @@ class Font : public IReloadable
|
|||
public:
|
||||
virtual ~Font();
|
||||
static std::shared_ptr<Font> get(float size, const std::string& path = getDefaultPath());
|
||||
static float getMiniFont()
|
||||
static float getMiniFont(bool forceUpdate = false)
|
||||
{
|
||||
static float sMiniFont {0.030f *
|
||||
std::min(Renderer::getScreenHeight(), Renderer::getScreenWidth())};
|
||||
if (forceUpdate)
|
||||
sMiniFont = 0.030f * std::min(Renderer::getScreenHeight(), Renderer::getScreenWidth());
|
||||
return sMiniFont;
|
||||
}
|
||||
static float getSmallFont()
|
||||
static float getSmallFont(bool forceUpdate = false)
|
||||
{
|
||||
static float sSmallFont {0.035f *
|
||||
std::min(Renderer::getScreenHeight(), Renderer::getScreenWidth())};
|
||||
if (forceUpdate)
|
||||
sSmallFont = 0.035f * std::min(Renderer::getScreenHeight(), Renderer::getScreenWidth());
|
||||
return sSmallFont;
|
||||
}
|
||||
static float getMediumFont()
|
||||
static float getMediumFont(bool forceUpdate = false)
|
||||
{
|
||||
static float sMediumFont {
|
||||
(Renderer::getIsVerticalOrientation() ? 0.040f : 0.045f) *
|
||||
std::min(Renderer::getScreenHeight(), Renderer::getScreenWidth())};
|
||||
if (forceUpdate)
|
||||
sMediumFont = (Renderer::getIsVerticalOrientation() ? 0.040f : 0.045f) *
|
||||
std::min(Renderer::getScreenHeight(), Renderer::getScreenWidth());
|
||||
return sMediumFont;
|
||||
}
|
||||
static float getMediumFixedFont()
|
||||
static float getMediumFixedFont(bool forceUpdate = false)
|
||||
{
|
||||
// Fixed size regardless of screen orientation.
|
||||
static float sMediumFixedFont {
|
||||
0.045f * std::min(Renderer::getScreenHeight(), Renderer::getScreenWidth())};
|
||||
if (forceUpdate)
|
||||
sMediumFixedFont =
|
||||
0.045f * std::min(Renderer::getScreenHeight(), Renderer::getScreenWidth());
|
||||
return sMediumFixedFont;
|
||||
}
|
||||
static float getLargeFont()
|
||||
static float getLargeFont(bool forceUpdate = false)
|
||||
{
|
||||
static float sLargeFont {(Renderer::getIsVerticalOrientation() ? 0.080f : 0.085f) *
|
||||
std::min(Renderer::getScreenHeight(), Renderer::getScreenWidth())};
|
||||
if (forceUpdate)
|
||||
sLargeFont = (Renderer::getIsVerticalOrientation() ? 0.080f : 0.085f) *
|
||||
std::min(Renderer::getScreenHeight(), Renderer::getScreenWidth());
|
||||
return sLargeFont;
|
||||
}
|
||||
static float getLargeFixedFont()
|
||||
static float getLargeFixedFont(bool forceUpdate = false)
|
||||
{
|
||||
// Fixed size regardless of screen orientation.
|
||||
static float sLargeFixedFont {
|
||||
0.085f * std::min(Renderer::getScreenHeight(), Renderer::getScreenWidth())};
|
||||
if (forceUpdate)
|
||||
sLargeFixedFont =
|
||||
0.085f * std::min(Renderer::getScreenHeight(), Renderer::getScreenWidth());
|
||||
return sLargeFixedFont;
|
||||
}
|
||||
|
||||
// Needed for when the application window has been resized.
|
||||
static void updateFontSizes();
|
||||
|
||||
// Returns the size of shaped text without applying any wrapping or abbreviations.
|
||||
glm::vec2 sizeText(std::string text, float lineSpacing = 1.5f);
|
||||
|
||||
|
|
|
@ -67,6 +67,7 @@ namespace Utils
|
|||
if (!isDirectory(genericPath))
|
||||
return contentList;
|
||||
|
||||
try {
|
||||
if (recursive) {
|
||||
#if defined(_WIN64)
|
||||
for (auto& entry : std::filesystem::recursive_directory_iterator(
|
||||
|
@ -91,6 +92,18 @@ namespace Utils
|
|||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (...) {
|
||||
#if defined(_WIN64)
|
||||
LOG(LogError) << "FileSystemUtil::getDirContent(): Couldn't read directory " << "\""
|
||||
<< Utils::String::replace(path, "/", "\\")
|
||||
<< "\", permission problems?";
|
||||
#else
|
||||
LOG(LogError) << "FileSystemUtil::getDirContent(): Couldn't read directory " << "\""
|
||||
<< path << "\", permission problems?";
|
||||
#endif
|
||||
return contentList;
|
||||
}
|
||||
|
||||
contentList.sort();
|
||||
return contentList;
|
||||
|
|
|
@ -31,10 +31,12 @@ namespace Utils
|
|||
// When adding a new locale, then make sure to also update ThemeData::sSupportedLanguages.
|
||||
const std::vector<std::pair<std::string, std::string>> sSupportedLocales {{{"en"}, {"US"}},
|
||||
{{"en"}, {"GB"}},
|
||||
{{"ca"}, {"ES"}},
|
||||
{{"de"}, {"DE"}},
|
||||
{{"es"}, {"ES"}},
|
||||
{{"fr"}, {"FR"}},
|
||||
{{"it"}, {"IT"}},
|
||||
{{"nl"}, {"NL"}},
|
||||
{{"pl"}, {"PL"}},
|
||||
{{"pt"}, {"BR"}},
|
||||
{{"ro"}, {"RO"}},
|
||||
|
@ -47,6 +49,9 @@ namespace Utils
|
|||
|
||||
std::string sCurrentLocale {"en_US"};
|
||||
float sMenuTitleScaleFactor {1.0f};
|
||||
#if defined(_WIN64)
|
||||
unsigned long sLocaleID {0};
|
||||
#endif
|
||||
|
||||
const char* pgettextBuiltin(const char* msgctxt, const char* msgid)
|
||||
{
|
||||
|
@ -186,7 +191,9 @@ namespace Utils
|
|||
}
|
||||
|
||||
// Language-specific menu title scale factor.
|
||||
if (localePair.first == "de")
|
||||
if (localePair.first == "ca")
|
||||
sMenuTitleScaleFactor = 0.92f;
|
||||
else if (localePair.first == "de")
|
||||
sMenuTitleScaleFactor = 0.92f;
|
||||
else if (localePair.first == "es")
|
||||
sMenuTitleScaleFactor = 0.90f;
|
||||
|
@ -194,6 +201,8 @@ namespace Utils
|
|||
sMenuTitleScaleFactor = 0.90f;
|
||||
else if (localePair.first == "it")
|
||||
sMenuTitleScaleFactor = 0.94f;
|
||||
else if (localePair.first == "nl")
|
||||
sMenuTitleScaleFactor = 0.94f;
|
||||
else if (localePair.first == "pl")
|
||||
sMenuTitleScaleFactor = 0.94f;
|
||||
else if (localePair.first == "pt")
|
||||
|
@ -230,9 +239,9 @@ namespace Utils
|
|||
|
||||
#if defined(_WIN64)
|
||||
_configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
|
||||
const LCID localeID {LocaleNameToLCID(Utils::String::stringToWideString(locale).c_str(),
|
||||
LOCALE_ALLOW_NEUTRAL_NAMES)};
|
||||
SetThreadLocale(localeID);
|
||||
sLocaleID = LocaleNameToLCID(Utils::String::stringToWideString(locale).c_str(),
|
||||
LOCALE_ALLOW_NEUTRAL_NAMES);
|
||||
SetThreadLocale(sLocaleID);
|
||||
#else
|
||||
setenv("LANGUAGE", locale.c_str(), 1);
|
||||
setenv("LANG", locale.c_str(), 1);
|
||||
|
@ -250,6 +259,27 @@ namespace Utils
|
|||
sCurrentLocale = locale;
|
||||
}
|
||||
|
||||
#if defined(_WIN64)
|
||||
void setThreadLocale()
|
||||
{
|
||||
// This is essentially a workaround for what seems to be a bug in the libintl library
|
||||
// where _configthreadlocale(_DISABLE_PER_THREAD_LOCALE) does not have the expected
|
||||
// effect. If gettext() is called from a child thread and the string has not been
|
||||
// translated already from the main thread then it will not get translated to the
|
||||
// selected locale. If however the string is first translated on the main thread and
|
||||
// then translated again from the child thread it works correctly. However, if calling
|
||||
// SetThreadLocale() from the child thread before attempting any translations then
|
||||
// everything behaves as expected which feels like a cleaner workaround than having
|
||||
// to make every single translation from the main thread that we want to use in any
|
||||
// child threads.
|
||||
|
||||
if (sLocaleID == 0)
|
||||
return;
|
||||
|
||||
SetThreadLocale(sLocaleID);
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace Localization
|
||||
|
||||
} // namespace Utils
|
||||
|
|
|
@ -25,6 +25,9 @@ namespace Utils
|
|||
{
|
||||
extern const std::vector<std::pair<std::string, std::string>> sSupportedLocales;
|
||||
extern std::string sCurrentLocale;
|
||||
#if defined(_WIN64)
|
||||
extern unsigned long sLocaleID;
|
||||
#endif
|
||||
extern float sMenuTitleScaleFactor;
|
||||
|
||||
const char* pgettextBuiltin(const char* msgctxt, const char* msgid);
|
||||
|
@ -34,6 +37,9 @@ namespace Utils
|
|||
unsigned long int n);
|
||||
std::pair<std::string, std::string> getLocale();
|
||||
void setLocale();
|
||||
#if defined(_WIN64)
|
||||
void setThreadLocale();
|
||||
#endif
|
||||
|
||||
} // namespace Localization
|
||||
|
||||
|
|
2
external/rlottie/format
vendored
|
@ -1 +1 @@
|
|||
git diff -U0 --no-color HEAD^ | clang-format-diff -i -p1
|
||||
// git diff -U0 --no-color HEAD^ | clang-format-diff -i -p1
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
"version": "3.1.0",
|
||||
"release": "45",
|
||||
"date": "2024-09-13",
|
||||
"androidVersionName": "3.0.3-26",
|
||||
"androidVersionCode": "26",
|
||||
"androidDate": "2024-06-14",
|
||||
"androidVersionName": "3.1.0-32",
|
||||
"androidVersionCode": "32",
|
||||
"androidDate": "2024-09-13",
|
||||
"packages": [
|
||||
{
|
||||
"name": "WindowsPortable",
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
<string name="configurator_storage_text">ES-DE requires permission to manage your storage (to have access to all your files) so please enable this setting using the button below</string>
|
||||
<string name="configurator_storage_button">Open permission screen</string>
|
||||
<string name="configurator_storage_button_legacy">Grant permission</string>
|
||||
<string name="configurator_storage_button_already_granted">Already granted</string>
|
||||
<string name="configurator_permission_granted">Permission granted</string>
|
||||
<string name="configurator_permission_not_granted">Permission not granted, please try again</string>
|
||||
|
||||
|
|
2158
locale/es-de.pot
|
@ -1,9 +1,11 @@
|
|||
en_US
|
||||
en_GB
|
||||
ca_ES
|
||||
de_DE
|
||||
es_ES
|
||||
fr_FR
|
||||
it_IT
|
||||
nl_NL
|
||||
pl_PL
|
||||
pt_BR
|
||||
ro_RO
|
||||
|
|
2905
locale/po/ca_ES.po
Normal file
2520
locale/po/de_DE.po
2445
locale/po/en_GB.po
2441
locale/po/en_US.po
2534
locale/po/es_ES.po
2554
locale/po/fr_FR.po
2528
locale/po/it_IT.po
2510
locale/po/ja_JP.po
2431
locale/po/ko_KR.po
2913
locale/po/nl_NL.po
Normal file
2520
locale/po/pl_PL.po
2496
locale/po/pt_BR.po
2528
locale/po/ro_RO.po
2500
locale/po/ru_RU.po
2456
locale/po/sv_SE.po
2396
locale/po/zh_CN.po
|
@ -1,4 +1,4 @@
|
|||
<!-- Last updated with information from MAME driver file mame0269.xml -->
|
||||
<!-- Last updated with information from MAME driver file mame0271.xml -->
|
||||
<bios>3dobios</bios>
|
||||
<bios>airlbios</bios>
|
||||
<bios>aleck64</bios>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Last updated with information from MAME driver file mame0269.xml -->
|
||||
<!-- Last updated with information from MAME driver file mame0271.xml -->
|
||||
<device>22vp931</device>
|
||||
<device>3c505</device>
|
||||
<device>3xtwin</device>
|
||||
|
@ -309,6 +309,7 @@
|
|||
<device>bbc_weddb3</device>
|
||||
<device>betadisk</device>
|
||||
<device>bingoct</device>
|
||||
<device>bk_kmd</device>
|
||||
<device>bluechip</device>
|
||||
<device>bml3kanji</device>
|
||||
<device>bml3mp1802</device>
|
||||
|
@ -426,6 +427,7 @@
|
|||
<device>comx_pl80</device>
|
||||
<device>comx_prn</device>
|
||||
<device>comx_thm</device>
|
||||
<device>concept_kbd</device>
|
||||
<device>cp2024</device>
|
||||
<device>cp31</device>
|
||||
<device>cp400_fdc</device>
|
||||
|
@ -792,6 +794,7 @@
|
|||
<device>mvme181</device>
|
||||
<device>mvme187</device>
|
||||
<device>mvme327a</device>
|
||||
<device>mvme328</device>
|
||||
<device>mvme350</device>
|
||||
<device>mzr8105</device>
|
||||
<device>nabupc_keyboard</device>
|
||||
|
@ -804,6 +807,11 @@
|
|||
<device>namco58</device>
|
||||
<device>namco59</device>
|
||||
<device>namco62</device>
|
||||
<device>namco_amc</device>
|
||||
<device>namco_asca1</device>
|
||||
<device>namco_asca3a</device>
|
||||
<device>namco_asca3</device>
|
||||
<device>namco_asca5</device>
|
||||
<device>namcoc65</device>
|
||||
<device>namcoc67</device>
|
||||
<device>namcoc68</device>
|
||||
|
@ -812,6 +820,16 @@
|
|||
<device>namcoc74</device>
|
||||
<device>namcoc75</device>
|
||||
<device>namcoc76</device>
|
||||
<device>namco_csz1</device>
|
||||
<device>namco_cyberleada</device>
|
||||
<device>namco_cyberlead</device>
|
||||
<device>namco_cyberlead_led</device>
|
||||
<device>namco_emio102</device>
|
||||
<device>namco_fca10</device>
|
||||
<device>namco_fca11</device>
|
||||
<device>namco_fcb</device>
|
||||
<device>namco_tssio</device>
|
||||
<device>namco_xmiu1</device>
|
||||
<device>nanoreseau_mo</device>
|
||||
<device>nanoreseau_to</device>
|
||||
<device>nb_48gc</device>
|
||||
|
@ -836,6 +854,7 @@
|
|||
<device>nb_wspt</device>
|
||||
<device>ncr53c825_pci</device>
|
||||
<device>neogs</device>
|
||||
<device>neon250</device>
|
||||
<device>nes_rob</device>
|
||||
<device>newbrain_eim</device>
|
||||
<device>newbrain_fdc</device>
|
||||
|
@ -905,6 +924,7 @@
|
|||
<device>ps2_keybc</device>
|
||||
<device>psion_3fax</device>
|
||||
<device>psion_3link_ser</device>
|
||||
<device>psion_parallel</device>
|
||||
<device>psx_cd</device>
|
||||
<device>psxgboost</device>
|
||||
<device>pvga1a</device>
|
||||
|
@ -951,6 +971,7 @@
|
|||
<device>rivatnt2_m64</device>
|
||||
<device>rivatnt2_ultra</device>
|
||||
<device>rivatnt</device>
|
||||
<device>rm_mq2</device>
|
||||
<device>robotron_k7070</device>
|
||||
<device>robotron_k7071</device>
|
||||
<device>rolm_pdc</device>
|
||||
|
@ -1133,11 +1154,15 @@
|
|||
<device>ti99_whtscsi</device>
|
||||
<device>ti_hx5102</device>
|
||||
<device>tiki100_8088</device>
|
||||
<device>tim011_kbd</device>
|
||||
<device>tk02</device>
|
||||
<device>tms32030</device>
|
||||
<device>tms32031</device>
|
||||
<device>tms32032</device>
|
||||
<device>tms32033</device>
|
||||
<device>to8_kbd</device>
|
||||
<device>to9_kbd</device>
|
||||
<device>to9p_kbd</device>
|
||||
<device>tp881v</device>
|
||||
<device>trs80m2kb</device>
|
||||
<device>turbogx</device>
|
||||
|
@ -1150,6 +1175,7 @@
|
|||
<device>ultra12f</device>
|
||||
<device>ultra14f</device>
|
||||
<device>ultra24f</device>
|
||||
<device>umc6650</device>
|
||||
<device>uni800</device>
|
||||
<device>unidisk</device>
|
||||
<device>upd7220a</device>
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
##
|
||||
## Bundle of CA Root Certificates
|
||||
##
|
||||
## Certificate data from Mozilla as of: Tue Jul 2 03:12:04 2024 GMT
|
||||
## Certificate data from Mozilla as of: Tue Sep 24 03:12:04 2024 GMT
|
||||
##
|
||||
## Find updated versions here: https://curl.se/docs/caextract.html
|
||||
##
|
||||
## This is a bundle of X.509 certificates of public Certificate Authorities
|
||||
## (CA). These were automatically extracted from Mozilla's root certificates
|
||||
|
@ -14,7 +16,7 @@
|
|||
## Just configure this file as the SSLCACertificateFile.
|
||||
##
|
||||
## Conversion done with mk-ca-bundle.pl version 1.29.
|
||||
## SHA256: 456ff095dde6dd73354c5c28c73d9c06f53b61a803963414cb91a1d92945cdd3
|
||||
## SHA256: 36105b01631f9fc03b1eca779b44a30a1a5890b9bf8dc07ccb001a07301e01cf
|
||||
##
|
||||
|
||||
|
||||
|
@ -3566,3 +3568,99 @@ Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB
|
|||
cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ
|
||||
pYXFuXqUPoeovQA=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
TWCA CYBER Root CA
|
||||
==================
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG
|
||||
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
|
||||
IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG
|
||||
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
|
||||
IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s
|
||||
Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh
|
||||
V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT
|
||||
o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT
|
||||
Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK
|
||||
/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH
|
||||
IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM
|
||||
fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF
|
||||
2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR
|
||||
wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO
|
||||
BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83
|
||||
QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB
|
||||
AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN
|
||||
c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x
|
||||
X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR
|
||||
IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq
|
||||
/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R
|
||||
FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe
|
||||
Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv
|
||||
It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl
|
||||
IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
SecureSign Root CA12
|
||||
====================
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG
|
||||
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
|
||||
ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ
|
||||
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
|
||||
U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3
|
||||
emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc
|
||||
J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl
|
||||
fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF
|
||||
EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef
|
||||
NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
|
||||
AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC
|
||||
AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi
|
||||
LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce
|
||||
mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS
|
||||
vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga
|
||||
aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
SecureSign Root CA14
|
||||
====================
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG
|
||||
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
|
||||
ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ
|
||||
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
|
||||
U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh
|
||||
1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn
|
||||
bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb
|
||||
1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa
|
||||
/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE
|
||||
kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx
|
||||
jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz
|
||||
ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0
|
||||
dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY
|
||||
AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB
|
||||
o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq
|
||||
YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E
|
||||
rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA
|
||||
ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds
|
||||
Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG
|
||||
FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q
|
||||
nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/
|
||||
OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa
|
||||
OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO
|
||||
pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN
|
||||
eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
SecureSign Root CA15
|
||||
====================
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE
|
||||
BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1
|
||||
cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV
|
||||
BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj
|
||||
dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G
|
||||
dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB
|
||||
2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
|
||||
AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J
|
||||
fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ
|
||||
SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4=
|
||||
-----END CERTIFICATE-----
|
||||
|
|
|
@ -28,6 +28,12 @@
|
|||
<entry>com.explusalpha.C64Emu/com.imagine.BaseActivity</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="CEMU">
|
||||
<!-- Nintendo Wii U emulator Cemu -->
|
||||
<rule type="androidpackage">
|
||||
<entry>info.cemu.Cemu/info.cemu.Cemu.emulation.EmulationActivity</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="CITRA">
|
||||
<!-- Nintendo 3DS emulator Citra -->
|
||||
<rule type="androidpackage">
|
||||
|
@ -97,12 +103,6 @@
|
|||
<entry>com.github.eka2l1/.emu.EmulatorActivity</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="EKA2L1-GUI">
|
||||
<!-- Symbian and Nokia N-Gage emulator EKA2L1 -->
|
||||
<rule type="androidpackage">
|
||||
<entry>com.github.eka2l1/.MainActivity</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="EPSXE">
|
||||
<!-- Sony PlayStation 1 emulator ePSXe -->
|
||||
<rule type="androidpackage">
|
||||
|
@ -203,6 +203,12 @@
|
|||
<entry>com.seleuco.mame4d2024/com.seleuco.mame4droid.MAME4droid</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="MANDARINE">
|
||||
<!-- Nintendo 3DS emulator Mandarine -->
|
||||
<rule type="androidpackage">
|
||||
<entry>io.github.mandarine3ds.mandarine/.activities.EmulationActivity</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="MASTERGEAR">
|
||||
<!-- Sega Game Gear, Master System and SG-1000 emulator MasterGear -->
|
||||
<rule type="androidpackage">
|
||||
|
|
|
@ -146,7 +146,7 @@
|
|||
<command label="FB Alpha 2012">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbalpha2012_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="Geolith">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=geolith_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="Flycast">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=flycast_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
|
||||
<platform>arcade</platform>
|
||||
<theme>arcade</theme>
|
||||
</system>
|
||||
|
@ -287,7 +287,7 @@
|
|||
<path>%ROMPATH%/atomiswave</path>
|
||||
<extension>.bin .BIN .dat .DAT .elf .ELF .lst .LST .7z .7Z .zip .ZIP</extension>
|
||||
<command label="Flycast">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=flycast_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
|
||||
<platform>arcade</platform>
|
||||
<theme>atomiswave</theme>
|
||||
</system>
|
||||
|
@ -382,7 +382,7 @@
|
|||
<command label="MAME - Current">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=mamearcade_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="MAME4droid 2024 (Standalone)">%EMULATOR_MAME4DROID-2024% %ACTION%=android.intent.action.VIEW %EXTRA_cli_params%="-rompath '%GAMEDIRRAW%;%ROMPATHRAW%/consolearcade'" %DATA%=%ROMPROVIDER%</command>
|
||||
<command label="Flycast">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=flycast_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
|
||||
<command label="Play! (Standalone)">%EMULATOR_PLAY!% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
|
||||
<command>PLACEHOLDER %ROM%</command>
|
||||
<platform>arcade</platform>
|
||||
|
@ -529,7 +529,7 @@
|
|||
<path>%ROMPATH%/dreamcast</path>
|
||||
<extension>.cdi .CDI .chd .CHD .cue .CUE .dat .DAT .elf .ELF .gdi .GDI .iso .ISO .lst .LST .m3u .M3U .7z .7Z .zip .ZIP</extension>
|
||||
<command label="Flycast">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=flycast_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
|
||||
<command label="Redream (Standalone)">%EMULATOR_REDREAM% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
|
||||
<platform>dreamcast</platform>
|
||||
<theme>dreamcast</theme>
|
||||
|
@ -916,7 +916,7 @@
|
|||
<command label="FB Alpha 2012">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=fbalpha2012_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="Geolith">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=geolith_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="Flycast">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=flycast_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
|
||||
<platform>arcade</platform>
|
||||
<theme>mame</theme>
|
||||
</system>
|
||||
|
@ -1113,6 +1113,7 @@
|
|||
<command label="Citra (Standalone)">%EMULATOR_CITRA% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %DATA%=%ROMSAF%</command>
|
||||
<command label="Citra Canary (Standalone)">%EMULATOR_CITRA-CANARY% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %DATA%=%ROMSAF%</command>
|
||||
<command label="Citra MMJ (Standalone)">%EMULATOR_CITRA-MMJ% %EXTRA_GamePath%=%ROM%</command>
|
||||
<command label="Mandarine (Standalone)">%EMULATOR_MANDARINE% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %DATA%=%ROMSAF%</command>
|
||||
<command label="Lime3DS (Standalone)">%EMULATOR_LIME3DS% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %DATA%=%ROMSAF%</command>
|
||||
<command label="Panda3DS (Standalone)">%EMULATOR_PANDA3DS% %DATA%=%ROMPROVIDER%</command>
|
||||
<platform>n3ds</platform>
|
||||
|
@ -1148,7 +1149,7 @@
|
|||
<path>%ROMPATH%/naomi</path>
|
||||
<extension>.bin .BIN .dat .DAT .elf .ELF .lst .LST .7z .7Z .zip .ZIP</extension>
|
||||
<command label="Flycast">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=flycast_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
|
||||
<platform>arcade</platform>
|
||||
<theme>naomi</theme>
|
||||
</system>
|
||||
|
@ -1158,7 +1159,7 @@
|
|||
<path>%ROMPATH%/naomi2</path>
|
||||
<extension>.bin .BIN .dat .DAT .elf .ELF .lst .LST .7z .7Z .zip .ZIP</extension>
|
||||
<command label="Flycast">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=flycast_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
|
||||
<platform>arcade</platform>
|
||||
<theme>naomi2</theme>
|
||||
</system>
|
||||
|
@ -1168,7 +1169,7 @@
|
|||
<path>%ROMPATH%/naomigd</path>
|
||||
<extension>.bin .BIN .dat .DAT .elf .ELF .lst .LST .7z .7Z .zip .ZIP</extension>
|
||||
<command label="Flycast">%EMULATOR_RETROARCH% %EXTRA_CONFIGFILE%=/storage/emulated/0/Android/data/%ANDROIDPACKAGE%/files/retroarch.cfg %EXTRA_LIBRETRO%=flycast_libretro_android.so %EXTRA_ROM%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROM%</command>
|
||||
<command label="Flycast (Standalone)">%EMULATOR_FLYCAST% %ACTION%=android.intent.action.VIEW %DATA%=%ROMSAF%</command>
|
||||
<platform>arcade</platform>
|
||||
<theme>naomigd</theme>
|
||||
</system>
|
||||
|
@ -1242,8 +1243,8 @@
|
|||
<name>ngage</name>
|
||||
<fullname>Nokia N-Gage</fullname>
|
||||
<path>%ROMPATH%/ngage</path>
|
||||
<extension>.ngage .zip .ZIP</extension>
|
||||
<command label="EKA2L1 (Standalone)">%EMULATOR_EKA2L1-GUI% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP%</command>
|
||||
<extension>.json .JSON</extension>
|
||||
<command label="EKA2L1 (Standalone)">%EMULATOR_EKA2L1% %ACTIVITY_CLEAR_TASK% %ACTIVITY_CLEAR_TOP% %ACTION%=android.intent.action.VIEW %DATA%=%ROMPROVIDER%</command>
|
||||
<platform>ngage</platform>
|
||||
<theme>ngage</theme>
|
||||
</system>
|
||||
|
@ -1969,8 +1970,8 @@
|
|||
<name>wiiu</name>
|
||||
<fullname>Nintendo Wii U</fullname>
|
||||
<path>%ROMPATH%/wiiu</path>
|
||||
<extension>.7z .7Z .zip .ZIP</extension>
|
||||
<command>PLACEHOLDER %ROM%</command>
|
||||
<extension>.elf .ELF .rpx .RPX .tmd .TMD .wua .WUA .wud .WUD .wuhb .WUHB .wux .WUX</extension>
|
||||
<command label="Cemu (Standalone)">%EMULATOR_CEMU% %DATA%=%ROMSAF%</command>
|
||||
<platform>wiiu</platform>
|
||||
<theme>wiiu</theme>
|
||||
</system>
|
||||
|
|
|
@ -563,6 +563,18 @@
|
|||
<entry>~/.local/share/flatpak/exports/bin/org.mamedev.MAME</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="MANDARINE">
|
||||
<!-- Nintendo 3DS emulator Mandarine -->
|
||||
<rule type="systempath">
|
||||
<entry>mandarine-qt</entry>
|
||||
</rule>
|
||||
<rule type="staticpath">
|
||||
<entry>~/Applications/mandarine-qt.AppImage</entry>
|
||||
<entry>~/.local/share/applications/mandarine-qt.AppImage</entry>
|
||||
<entry>~/.local/bin/mandarine-qt.AppImage</entry>
|
||||
<entry>~/bin/mandarine-qt.AppImage</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="MEDNAFEN">
|
||||
<!-- Multi-system emulator Mednafen -->
|
||||
<rule type="systempath">
|
||||
|
@ -581,6 +593,10 @@
|
|||
<entry>net.kuribo64.melonDS</entry>
|
||||
</rule>
|
||||
<rule type="staticpath">
|
||||
<entry>~/Applications/melonDS*.AppImage</entry>
|
||||
<entry>~/.local/share/applications/melonDS*.AppImage</entry>
|
||||
<entry>~/.local/bin/melonDS*.AppImage</entry>
|
||||
<entry>~/bin/melonDS*.AppImage</entry>
|
||||
<entry>/var/lib/flatpak/exports/bin/net.kuribo64.melonDS</entry>
|
||||
<entry>~/.local/share/flatpak/exports/bin/net.kuribo64.melonDS</entry>
|
||||
</rule>
|
||||
|
|
|
@ -1248,8 +1248,8 @@
|
|||
<extension>.3ds .3DS .3dsx .3DSX .app .APP .axf .AXF .cci .CCI .cxi .CXI .elf .ELF .7z .7Z .zip .ZIP</extension>
|
||||
<command label="Citra">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/citra_libretro.so %ROM%</command>
|
||||
<command label="Citra 2018">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/citra2018_libretro.so %ROM%</command>
|
||||
<command label="Citra (via Ponzu)">%EMULATOR_CITRA% %ROM%</command>
|
||||
<!--<command label="Lime3DS (Standalone)">%EMULATOR_LIME3DS% %ROM%</command>-->
|
||||
<command label="Citra (Standalone) (via Ponzu)">%EMULATOR_CITRA% %ROM%</command>
|
||||
<!--<command label="Mandarine (Standalone)">%EMULATOR_MANDARINE% %ROM%</command>-->
|
||||
<!--<command label="Panda3DS (Standalone)">%EMULATOR_PANDA3DS% %ROM%</command>-->
|
||||
<platform>n3ds</platform>
|
||||
<theme>n3ds</theme>
|
||||
|
@ -1320,6 +1320,7 @@
|
|||
<extension>.app .APP .bin .BIN .nds .NDS .7z .7Z .zip .ZIP</extension>
|
||||
<command label="DeSmuME">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/desmume_libretro.so %ROM%</command>
|
||||
<command label="DeSmuME 2015">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/desmume2015_libretro.so %ROM%</command>
|
||||
<command label="melonDS DS">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/melondsds_libretro.so %ROM%</command>
|
||||
<command label="melonDS">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/melonds_libretro.so %ROM%</command>
|
||||
<command label="melonDS (Standalone)">%EMULATOR_MELONDS% %ROM%</command>
|
||||
<!-- <command label="DeSmuME (Standalone)">%EMULATOR_DESMUME% %ROM%</command> -->
|
||||
|
|
|
@ -181,6 +181,12 @@
|
|||
<entry>/usr/local/bin/mame</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="MANDARINE">
|
||||
<!-- Nintendo 3DS emulator Mandarine -->
|
||||
<rule type="staticpath">
|
||||
<entry>/Applications/mandarine-qt.app/Contents/MacOS/mandarine-qt</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="MEDNAFEN">
|
||||
<!-- Multi-system emulator Mednafen -->
|
||||
<rule type="staticpath">
|
||||
|
|
|
@ -1170,6 +1170,7 @@
|
|||
<path>%ROMPATH%/n3ds</path>
|
||||
<extension>.3ds .3DS .3dsx .3DSX .app .APP .axf .AXF .cci .CCI .cxi .CXI .elf .ELF .7z .7Z .zip .ZIP</extension>
|
||||
<command label="Citra (Standalone)">%EMULATOR_CITRA% %ROM%</command>
|
||||
<command label="Mandarine (Standalone)">%EMULATOR_MANDARINE% %ROM%</command>
|
||||
<command label="Lime3DS (Standalone)">%EMULATOR_LIME3DS% %ROM%</command>
|
||||
<command label="Panda3DS (Standalone)">%EMULATOR_PANDA3DS% %ROM%</command>
|
||||
<platform>n3ds</platform>
|
||||
|
@ -1241,7 +1242,7 @@
|
|||
<command label="DeSmuME 2015">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/desmume2015_libretro.dylib %ROM%</command>
|
||||
<command label="melonDS DS">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/melondsds_libretro.dylib %ROM%</command>
|
||||
<command label="melonDS">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/melonds_libretro.dylib %ROM%</command>
|
||||
<command label="melonDS (Standalone)">%EMULATOR_MELONDS% %ROM%</command>
|
||||
<command label="melonDS (Standalone)">%EMULATOR_MELONDS% -f %ROM%</command>
|
||||
<command label="SkyEmu (Standalone)">%EMULATOR_SKYEMU% %ROM%</command>
|
||||
<platform>nds</platform>
|
||||
<theme>nds</theme>
|
||||
|
|
|
@ -283,6 +283,12 @@
|
|||
<entry>mame</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="MANDARINE">
|
||||
<!-- Nintendo 3DS emulator Mandarine -->
|
||||
<rule type="systempath">
|
||||
<entry>mandarine-qt</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="MEDNAFEN">
|
||||
<!-- Multi-system emulator Mednafen -->
|
||||
<rule type="systempath">
|
||||
|
|
|
@ -1206,6 +1206,7 @@
|
|||
<command label="Citra">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/citra_libretro.so %ROM%</command>
|
||||
<command label="Citra 2018">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/citra2018_libretro.so %ROM%</command>
|
||||
<command label="Citra (Standalone)">%EMULATOR_CITRA% %ROM%</command>
|
||||
<command label="Mandarine (Standalone)">%EMULATOR_MANDARINE% %ROM%</command>
|
||||
<command label="Lime3DS (Standalone)">%EMULATOR_LIME3DS% %ROM%</command>
|
||||
<command label="Panda3DS (Standalone)">%EMULATOR_PANDA3DS% %ROM%</command>
|
||||
<platform>n3ds</platform>
|
||||
|
@ -1277,7 +1278,7 @@
|
|||
<extension>.app .APP .bin .BIN .nds .NDS .7z .7Z .zip .ZIP</extension>
|
||||
<command label="melonDS DS">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/melondsds_libretro.so %ROM%</command>
|
||||
<command label="melonDS">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/melonds_libretro.so %ROM%</command>
|
||||
<command label="melonDS (Standalone)">%EMULATOR_MELONDS% %ROM%</command>
|
||||
<command label="melonDS (Standalone)">%EMULATOR_MELONDS% -f %ROM%</command>
|
||||
<command label="DeSmuME">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/desmume_libretro.so %ROM%</command>
|
||||
<command label="DeSmuME 2015">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%/desmume2015_libretro.so %ROM%</command>
|
||||
<command label="DeSmuME (Standalone)">%EMULATOR_DESMUME% %ROM%</command>
|
||||
|
|
|
@ -135,6 +135,16 @@
|
|||
<entry>%ESPATH%\..\Emulators\BasiliskII\BasiliskII.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="BEEBEM">
|
||||
<!-- Acorn Computers BBC Micro emulator BeebEm -->
|
||||
<rule type="systempath">
|
||||
<entry>BeebEm.exe</entry>
|
||||
</rule>
|
||||
<rule type="staticpath">
|
||||
<entry>%ESPATH%\Emulators\BeebEm\BeebEm.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\BeebEm\BeebEm.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="BIGPEMU">
|
||||
<!-- Atari Jaguar emulator BigPEmu -->
|
||||
<rule type="systempath">
|
||||
|
@ -268,14 +278,17 @@
|
|||
<emulator name="DUCKSTATION">
|
||||
<!-- Sony PlayStation 1 emulator DuckStation -->
|
||||
<rule type="systempath">
|
||||
<entry>duckstation-nogui-x64-ReleaseLTCG.exe</entry>
|
||||
<entry>duckstation-qt-x64-ReleaseLTCG.exe</entry>
|
||||
<entry>duckstation-qt-x64-ReleaseLTCG-SSE2.exe</entry>
|
||||
<entry>duckstation-nogui-x64-ReleaseLTCG.exe</entry>
|
||||
</rule>
|
||||
<rule type="staticpath">
|
||||
<entry>%ESPATH%\Emulators\duckstation\duckstation-nogui-x64-ReleaseLTCG.exe</entry>
|
||||
<entry>%ESPATH%\Emulators\duckstation\duckstation-qt-x64-ReleaseLTCG.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\duckstation\duckstation-nogui-x64-ReleaseLTCG.exe</entry>
|
||||
<entry>%ESPATH%\Emulators\duckstation\duckstation-qt-x64-ReleaseLTCG-SSE2.exe</entry>
|
||||
<entry>%ESPATH%\Emulators\duckstation\duckstation-nogui-x64-ReleaseLTCG.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\duckstation\duckstation-qt-x64-ReleaseLTCG.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\duckstation\duckstation-qt-x64-ReleaseLTCG-SSE2.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\duckstation\duckstation-nogui-x64-ReleaseLTCG.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="EASYRPG">
|
||||
|
@ -478,6 +491,16 @@
|
|||
<entry>%ESPATH%\..\Emulators\mame\mame.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="MANDARINE">
|
||||
<!-- Nintendo 3DS emulator Mandarine -->
|
||||
<rule type="systempath">
|
||||
<entry>mandarine-qt.exe</entry>
|
||||
</rule>
|
||||
<rule type="staticpath">
|
||||
<entry>%ESPATH%\Emulators\mandarine\mandarine-qt.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\mandarine\mandarine-qt.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="MEDNAFEN">
|
||||
<!-- Multi-system emulator Mednafen -->
|
||||
<rule type="systempath">
|
||||
|
@ -1038,6 +1061,16 @@
|
|||
<entry>%ESPATH%\..\Emulators\xroar\xroar.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="YABASANSHIRO-2">
|
||||
<!-- Sega Saturn emulator Yaba Sanshiro 2 -->
|
||||
<rule type="systempath">
|
||||
<entry>yabasanshiro.exe</entry>
|
||||
</rule>
|
||||
<rule type="staticpath">
|
||||
<entry>%ESPATH%\Emulators\yabasanshiro\yabasanshiro.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\yabasanshiro\yabasanshiro.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="ZESARUX">
|
||||
<!-- Sinclair ZX Spectrum emulator ZEsarUX -->
|
||||
<rule type="systempath">
|
||||
|
|
|
@ -86,6 +86,13 @@
|
|||
<entry>%ESPATH%\..\Emulators\BasiliskII\BasiliskII.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="BEEBEM">
|
||||
<!-- Acorn Computers BBC Micro emulator BeebEm -->
|
||||
<rule type="staticpath">
|
||||
<entry>%ESPATH%\Emulators\BeebEm\BeebEm.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\BeebEm\BeebEm.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="BIGPEMU">
|
||||
<!-- Atari Jaguar emulator BigPEmu -->
|
||||
<rule type="staticpath">
|
||||
|
@ -175,10 +182,12 @@
|
|||
<emulator name="DUCKSTATION">
|
||||
<!-- Sony PlayStation 1 emulator DuckStation -->
|
||||
<rule type="staticpath">
|
||||
<entry>%ESPATH%\Emulators\duckstation\duckstation-nogui-x64-ReleaseLTCG.exe</entry>
|
||||
<entry>%ESPATH%\Emulators\duckstation\duckstation-qt-x64-ReleaseLTCG.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\duckstation\duckstation-nogui-x64-ReleaseLTCG.exe</entry>
|
||||
<entry>%ESPATH%\Emulators\duckstation\duckstation-qt-x64-ReleaseLTCG-SSE2.exe</entry>
|
||||
<entry>%ESPATH%\Emulators\duckstation\duckstation-nogui-x64-ReleaseLTCG.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\duckstation\duckstation-qt-x64-ReleaseLTCG.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\duckstation\duckstation-qt-x64-ReleaseLTCG-SSE2.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\duckstation\duckstation-nogui-x64-ReleaseLTCG.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="EASYRPG">
|
||||
|
@ -320,6 +329,13 @@
|
|||
<entry>%ESPATH%\..\Emulators\mame\mame.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="MANDARINE">
|
||||
<!-- Nintendo 3DS emulator Mandarine -->
|
||||
<rule type="staticpath">
|
||||
<entry>%ESPATH%\Emulators\mandarine\mandarine-qt.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\mandarine\mandarine-qt.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="MEDNAFEN">
|
||||
<!-- Multi-system emulator Mednafen -->
|
||||
<rule type="staticpath">
|
||||
|
@ -697,6 +713,13 @@
|
|||
<entry>%ESPATH%\..\Emulators\xroar\xroar.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="YABASANSHIRO-2">
|
||||
<!-- Sega Saturn emulator Yaba Sanshiro 2 -->
|
||||
<rule type="staticpath">
|
||||
<entry>%ESPATH%\Emulators\yabasanshiro\yabasanshiro.exe</entry>
|
||||
<entry>%ESPATH%\..\Emulators\yabasanshiro\yabasanshiro.exe</entry>
|
||||
</rule>
|
||||
</emulator>
|
||||
<emulator name="ZESARUX">
|
||||
<!-- Sinclair ZX Spectrum emulator ZEsarUX -->
|
||||
<rule type="staticpath">
|
||||
|
|
|
@ -326,6 +326,7 @@
|
|||
<path>%ROMPATH%\bbcmicro</path>
|
||||
<extension>.dsd .DSD .img .IMG .ssd .SSD .7z .7Z .zip .ZIP</extension>
|
||||
<command label="MAME (Standalone)">%HIDEWINDOW% %STARTDIR%=%EMUDIR% %EMULATOR_MAME% -rompath %GAMEDIR%\;%ROMPATH%\bbcmicro bbcb -autoboot_delay "2" -autoboot_command "*cat\n\n*exec !boot\n" -analogue acornjoy -flop1 %ROM%</command>
|
||||
<command label="BeebEm (Standalone)">%EMULATOR_BEEBEM% %INJECT%=%BASENAME%.commands -FullScreen %ROM%</command>
|
||||
<platform>bbcmicro</platform>
|
||||
<theme>bbcmicro</theme>
|
||||
</system>
|
||||
|
@ -1230,6 +1231,7 @@
|
|||
<command label="Citra">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\citra_libretro.dll %ROM%</command>
|
||||
<command label="Citra 2018">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\citra2018_libretro.dll %ROM%</command>
|
||||
<command label="Citra (Standalone)">%EMULATOR_CITRA% %ROM%</command>
|
||||
<command label="Mandarine (Standalone)">%EMULATOR_MANDARINE% %ROM%</command>
|
||||
<command label="Lime3DS (Standalone)">%EMULATOR_LIME3DS% %ROM%</command>
|
||||
<command label="Panda3DS (Standalone)">%EMULATOR_PANDA3DS% %ROM%</command>
|
||||
<platform>n3ds</platform>
|
||||
|
@ -1304,7 +1306,7 @@
|
|||
<extension>.app .APP .bin .BIN .nds .NDS .7z .7Z .zip .ZIP</extension>
|
||||
<command label="melonDS DS">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\melondsds_libretro.dll %ROM%</command>
|
||||
<command label="melonDS">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\melonds_libretro.dll %ROM%</command>
|
||||
<command label="melonDS (Standalone)">%EMULATOR_MELONDS% %ROM%</command>
|
||||
<command label="melonDS (Standalone)">%EMULATOR_MELONDS% -f %ROM%</command>
|
||||
<command label="DeSmuME">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\desmume_libretro.dll %ROM%</command>
|
||||
<command label="DeSmuME 2015">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\desmume2015_libretro.dll %ROM%</command>
|
||||
<command label="SkyEmu (Standalone)">%EMULATOR_SKYEMU% %ROM%</command>
|
||||
|
@ -1688,6 +1690,7 @@
|
|||
<command label="Beetle Saturn">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\mednafen_saturn_libretro.dll %ROM%</command>
|
||||
<command label="Kronos">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\kronos_libretro.dll %ROM%</command>
|
||||
<command label="YabaSanshiro">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\yabasanshiro_libretro.dll %ROM%</command>
|
||||
<command label="Yaba Sanshiro 2 (Standalone)">%EMULATOR_YABASANSHIRO-2% -a -i %ROM%</command>
|
||||
<command label="Yabause">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\yabause_libretro.dll %ROM%</command>
|
||||
<command label="Mednafen (Standalone)">%EMULATOR_MEDNAFEN% -force_module ss %ROM%</command>
|
||||
<command label="SSF (Standalone)">%EMULATOR_SSF% %ROM%</command>
|
||||
|
@ -1702,6 +1705,7 @@
|
|||
<command label="Beetle Saturn">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\mednafen_saturn_libretro.dll %ROM%</command>
|
||||
<command label="Kronos">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\kronos_libretro.dll %ROM%</command>
|
||||
<command label="YabaSanshiro">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\yabasanshiro_libretro.dll %ROM%</command>
|
||||
<command label="Yaba Sanshiro 2 (Standalone)">%EMULATOR_YABASANSHIRO-2% -a -i %ROM%</command>
|
||||
<command label="Yabause">%EMULATOR_RETROARCH% -L %CORE_RETROARCH%\yabause_libretro.dll %ROM%</command>
|
||||
<command label="Mednafen (Standalone)">%EMULATOR_MEDNAFEN% -force_module ss %ROM%</command>
|
||||
<command label="SSF (Standalone)">%EMULATOR_SSF% %ROM%</command>
|
||||
|
|
|
@ -31,19 +31,23 @@ The following options are included:
|
|||
- 4:3
|
||||
- 21:9
|
||||
|
||||
12 languages:
|
||||
16 languages:
|
||||
|
||||
- English (United States)
|
||||
- English (United Kingdom)
|
||||
- Català
|
||||
- Deutsch
|
||||
- Español (España)
|
||||
- Français
|
||||
- Italiano
|
||||
- Nederlands
|
||||
- Polski
|
||||
- Português (Brasil)
|
||||
- Română
|
||||
- Русский
|
||||
- Svenska
|
||||
- 日本語
|
||||
- 한국어
|
||||
- 简体中文
|
||||
|
||||
3 transitions:
|
||||
|
|
|
@ -7,15 +7,19 @@
|
|||
|
||||
<language>en_US</language>
|
||||
<language>en_GB</language>
|
||||
<language>ca_ES</language>
|
||||
<language>de_DE</language>
|
||||
<language>es_ES</language>
|
||||
<language>fr_FR</language>
|
||||
<language>it_IT</language>
|
||||
<language>nl_NL</language>
|
||||
<language>pl_PL</language>
|
||||
<language>pt_BR</language>
|
||||
<language>ro_RO</language>
|
||||
<language>ru_RU</language>
|
||||
<language>sv_SE</language>
|
||||
<language>ja_JP</language>
|
||||
<language>ko_KR</language>
|
||||
<language>zh_CN</language>
|
||||
|
||||
<aspectRatio>16:9</aspectRatio>
|
||||
|
@ -29,30 +33,38 @@
|
|||
<colorScheme name="dark">
|
||||
<label language="en_US">Dark</label>
|
||||
<label language="en_GB">Dark</label>
|
||||
<label language="ca_ES">Fosc</label>
|
||||
<label language="de_DE">Dunkel</label>
|
||||
<label language="es_ES">Oscuro</label>
|
||||
<label language="fr_FR">Foncé</label>
|
||||
<label language="it_IT">Scuro</label>
|
||||
<label language="nl_NL">Donker</label>
|
||||
<label language="pl_PL">Ciemna</label>
|
||||
<label language="pt_BR">Escuro</label>
|
||||
<label language="ro_RO">Întunecată</label>
|
||||
<label language="ru_RU">Тёмная</label>
|
||||
<label language="sv_SE">Mörkt</label>
|
||||
<label language="ja_JP">ダーク</label>
|
||||
<label language="ko_KR">다크</label>
|
||||
<label language="zh_CN">暗黑</label>
|
||||
</colorScheme>
|
||||
|
||||
<colorScheme name="light">
|
||||
<label language="en_US">Light</label>
|
||||
<label language="en_GB">Light</label>
|
||||
<label language="ca_ES">Clar</label>
|
||||
<label language="de_DE">Hell</label>
|
||||
<label language="es_ES">Claro</label>
|
||||
<label language="fr_FR">Clair</label>
|
||||
<label language="it_IT">Chiaro</label>
|
||||
<label language="nl_NL">Licht</label>
|
||||
<label language="pl_PL">Jasna</label>
|
||||
<label language="pt_BR">Claro</label>
|
||||
<label language="ru_RU">Светлая</label>
|
||||
<label language="ro_RO">Luminoasă</label>
|
||||
<label language="sv_SE">Ljust</label>
|
||||
<label language="ja_JP">ライト</label>
|
||||
<label language="ko_KR">라이트</label>
|
||||
<label language="zh_CN">明亮</label>
|
||||
</colorScheme>
|
||||
|
||||
|
@ -71,15 +83,19 @@
|
|||
<variant name="textlistWithVideos">
|
||||
<label language="en_US">Textlist</label>
|
||||
<label language="en_GB">Textlist</label>
|
||||
<label language="ca_ES">Llistat</label>
|
||||
<label language="de_DE">Liste</label>
|
||||
<label language="es_ES">Lista</label>
|
||||
<label language="fr_FR">Liste</label>
|
||||
<label language="it_IT">Lista testi</label>
|
||||
<label language="nl_NL">Tekstlijst</label>
|
||||
<label language="pl_PL">Lista tekstowa</label>
|
||||
<label language="pt_BR">Lista de texto</label>
|
||||
<label language="ro_RO">Listă text</label>
|
||||
<label language="ru_RU">Текст</label>
|
||||
<label language="sv_SE">Textlista</label>
|
||||
<label language="ja_JP">テキストリスト</label>
|
||||
<label language="ko_KR">텍스트리스트</label>
|
||||
<label language="zh_CN">文字列表</label>
|
||||
<selectable>true</selectable>
|
||||
</variant>
|
||||
|
@ -87,15 +103,19 @@
|
|||
<variant name="textlistWithoutVideos">
|
||||
<label language="en_US">Textlist without videos</label>
|
||||
<label language="en_GB">Textlist without videos</label>
|
||||
<label language="ca_ES">Llistat sense vídeos</label>
|
||||
<label language="de_DE">Liste ohne videos</label>
|
||||
<label language="es_ES">Lista sin videos</label>
|
||||
<label language="fr_FR">Liste sans vidéos</label>
|
||||
<label language="it_IT">Lista testi, no video</label>
|
||||
<label language="nl_NL">Tekstlijst zonder video's</label>
|
||||
<label language="pl_PL">Lista tekstowa bez wideo</label>
|
||||
<label language="pt_BR">Lista de texto sem vídeos</label>
|
||||
<label language="ro_RO">Listă text fără videouri</label>
|
||||
<label language="ru_RU">Текст без видео</label>
|
||||
<label language="sv_SE">Textlista utan video</label>
|
||||
<label language="ja_JP">ビデオが含まないテキストリスト</label>
|
||||
<label language="ko_KR">텍스트리스트 비디오 없음</label>
|
||||
<label language="zh_CN">不带视频的文字列表</label>
|
||||
<selectable>true</selectable>
|
||||
</variant>
|
||||
|
@ -103,15 +123,19 @@
|
|||
<variant name="simpleTextlistWithVideos">
|
||||
<label language="en_US">Simple textlist</label>
|
||||
<label language="en_GB">Simple textlist</label>
|
||||
<label language="ca_ES">Llistat simple</label>
|
||||
<label language="de_DE">Einfache liste</label>
|
||||
<label language="es_ES">Lista simple</label>
|
||||
<label language="fr_FR">Simple liste</label>
|
||||
<label language="it_IT">Lista testi semplice</label>
|
||||
<label language="nl_NL">Simpele tekstlijst</label>
|
||||
<label language="pl_PL">Prosta lista tekstowa</label>
|
||||
<label language="pt_BR">Lista de texto simples</label>
|
||||
<label language="ro_RO">Listă text simplă</label>
|
||||
<label language="ru_RU">Простой текст</label>
|
||||
<label language="sv_SE">Enkel textlista</label>
|
||||
<label language="ja_JP">簡易なテキストリスト</label>
|
||||
<label language="ko_KR">심플 텍스트리스트</label>
|
||||
<label language="zh_CN">简易文字列表</label>
|
||||
<selectable>true</selectable>
|
||||
</variant>
|
||||
|
@ -119,15 +143,19 @@
|
|||
<variant name="simpleTextlistWithoutVideos">
|
||||
<label language="en_US">Simple textlist without videos</label>
|
||||
<label language="en_GB">Simple textlist without videos</label>
|
||||
<label language="ca_ES">Llistat simple sense vídeos</label>
|
||||
<label language="de_DE">Einfache liste ohne videos</label>
|
||||
<label language="es_ES">Lista simple sin videos</label>
|
||||
<label language="fr_FR">Simple liste sans vidéos</label>
|
||||
<label language="it_IT">Lista testi semplice, no video</label>
|
||||
<label language="nl_NL">Simpele tekstlijst zonder video's</label>
|
||||
<label language="pl_PL">Prosta lista tekstowa bez wideo</label>
|
||||
<label language="pt_BR">Lista de texto simples sem vídeos</label>
|
||||
<label language="ro_RO">Listă text simplă fără videouri</label>
|
||||
<label language="ru_RU">Простой текст без видео</label>
|
||||
<label language="sv_SE">Enkel textlista utan video</label>
|
||||
<label language="ja_JP">ビデオが含まない簡単なテキストリスト</label>
|
||||
<label language="ko_KR">심플 텍스트리스트 비디오 없음</label>
|
||||
<label language="zh_CN">不带视频的简易文字列表</label>
|
||||
<selectable>true</selectable>
|
||||
</variant>
|
||||
|
@ -135,15 +163,19 @@
|
|||
<variant name="carousel">
|
||||
<label language="en_US">Carousel</label>
|
||||
<label language="en_GB">Carousel</label>
|
||||
<label language="ca_ES">Carrusel</label>
|
||||
<label language="de_DE">Karussell</label>
|
||||
<label language="es_ES">Carrusel</label>
|
||||
<label language="fr_FR">Carrousel</label>
|
||||
<label language="it_IT">Carosello</label>
|
||||
<label language="nl_NL">Carousel</label>
|
||||
<label language="pl_PL">Karuzela</label>
|
||||
<label language="pt_BR">Carrossel</label>
|
||||
<label language="ro_RO">Carusel</label>
|
||||
<label language="ru_RU">Карусель</label>
|
||||
<label language="sv_SE">Karusell</label>
|
||||
<label language="ja_JP">カルーセル</label>
|
||||
<label language="ko_KR">캐러셀</label>
|
||||
<label language="zh_CN">轮播</label>
|
||||
<selectable>true</selectable>
|
||||
</variant>
|
||||
|
@ -151,15 +183,19 @@
|
|||
<variant name="simpleCarousel">
|
||||
<label language="en_US">Simple carousel</label>
|
||||
<label language="en_GB">Simple carousel</label>
|
||||
<label language="ca_ES">Carrusel simple</label>
|
||||
<label language="de_DE">Einfaches karussell</label>
|
||||
<label language="es_ES">Carrusel simple</label>
|
||||
<label language="fr_FR">Simple Carrousel</label>
|
||||
<label language="fr_FR">Simple carrousel</label>
|
||||
<label language="it_IT">Carosello semplice</label>
|
||||
<label language="nl_NL">Simpel carousel</label>
|
||||
<label language="pl_PL">Prosta karuzela</label>
|
||||
<label language="pt_BR">Carrossel simples</label>
|
||||
<label language="ro_RO">instant și glisează</label>
|
||||
<label language="ru_RU">Простая карусель</label>
|
||||
<label language="sv_SE">Enkel karusell</label>
|
||||
<label language="ja_JP">簡単なカルーセル</label>
|
||||
<label language="ko_KR">심플 캐러셀</label>
|
||||
<label language="zh_CN">简易轮播</label>
|
||||
<selectable>true</selectable>
|
||||
</variant>
|
||||
|
@ -167,15 +203,19 @@
|
|||
<transitions name="instantAndSlide">
|
||||
<label language="en_US">Instant and slide</label>
|
||||
<label language="en_GB">Instant and slide</label>
|
||||
<label language="ca_ES">Instantani i lliscar</label>
|
||||
<label language="de_DE">Sofort und gleiten</label>
|
||||
<label language="es_ES">Instantanea y deslizante</label>
|
||||
<label language="fr_FR">Instantané et glissement</label>
|
||||
<label language="it_IT">Istantanea e scorri</label>
|
||||
<label language="nl_NL">Direct en glijd</label>
|
||||
<label language="pl_PL">Momentalne przesunięcie</label>
|
||||
<label language="pt_BR">Instantâneo e deslizar</label>
|
||||
<label language="ro_RO">Instant și glisează</label>
|
||||
<label language="ru_RU">Мгновенное скольжение</label>
|
||||
<label language="sv_SE">Direkt och glidande</label>
|
||||
<label language="ja_JP">インスタントとスライド</label>
|
||||
<label language="ko_KR">즉시 그리고 슬라이드</label>
|
||||
<label language="zh_CN">即时与滑动</label>
|
||||
<selectable>true</selectable>
|
||||
<systemToSystem>instant</systemToSystem>
|
||||
|
@ -189,15 +229,19 @@
|
|||
<transitions name="instant">
|
||||
<label language="en_US">Instant</label>
|
||||
<label language="en_GB">Instant</label>
|
||||
<label language="ca_ES">Instantani</label>
|
||||
<label language="de_DE">Sofort</label>
|
||||
<label language="es_ES">Instantanea</label>
|
||||
<label language="fr_FR">Instantané</label>
|
||||
<label language="it_IT">Istantanea</label>
|
||||
<label language="nl_NL">Direct</label>
|
||||
<label language="pl_PL">Natychmiastowe</label>
|
||||
<label language="pt_BR">Instantâneo</label>
|
||||
<label language="ro_RO">Instant</label>
|
||||
<label language="ru_RU">Мгновенно</label>
|
||||
<label language="sv_SE">Direkt</label>
|
||||
<label language="ja_JP">インスタント</label>
|
||||
<label language="ko_KR">즉시</label>
|
||||
<label language="zh_CN">即时</label>
|
||||
<selectable>true</selectable>
|
||||
<systemToSystem>instant</systemToSystem>
|
||||
|
@ -211,15 +255,19 @@
|
|||
<transitions name="fade">
|
||||
<label language="en_US">Fade</label>
|
||||
<label language="en_GB">Fade</label>
|
||||
<label language="ca_ES">Desaparèixer</label>
|
||||
<label language="de_DE">Überblendung</label>
|
||||
<label language="es_ES">Fundido</label>
|
||||
<label language="fr_FR">Fondu</label>
|
||||
<label language="it_IT">Dissolvi</label>
|
||||
<label language="nl_NL">Fade</label>
|
||||
<label language="pl_PL">Zanikanie</label>
|
||||
<label language="pt_BR">Esmaecer</label>
|
||||
<label language="ro_RO">Estompează</label>
|
||||
<label language="ru_RU">Затухание</label>
|
||||
<label language="sv_SE">Uttoning</label>
|
||||
<label language="ja_JP">フェイド</label>
|
||||
<label language="ko_KR">페이드</label>
|
||||
<label language="zh_CN">淡出</label>
|
||||
<selectable>true</selectable>
|
||||
<systemToSystem>instant</systemToSystem>
|
||||
|
|
|
@ -11,6 +11,32 @@
|
|||
<langCustomCollections>Custom Collections</langCustomCollections>
|
||||
<langYourCollections>Your Collections</langYourCollections>
|
||||
</variables>
|
||||
<language name="ca_ES">
|
||||
<variables>
|
||||
<langLabelRating>Valoració</langLabelRating>
|
||||
<langLabelReleasedate>Llançaamemt</langLabelReleasedate>
|
||||
<langLabelPlayers>Jugadors</langLabelPlayers>
|
||||
<langLabelGenre>Gènere</langLabelGenre>
|
||||
<langLabelDeveloper>Desenvolupador</langLabelDeveloper>
|
||||
<langLabelPublisher>Editor</langLabelPublisher>
|
||||
<langLabelLastPlayed>Última Partida</langLabelLastPlayed>
|
||||
<langCustomCollections>Col·leccions</langCustomCollections>
|
||||
<langYourCollections>Les teves Col·leccions</langYourCollections>
|
||||
</variables>
|
||||
</language>
|
||||
<language name="de_DE">
|
||||
<variables>
|
||||
<langLabelRating>Bewertung</langLabelRating>
|
||||
<langLabelReleasedate>Veröffentlicht</langLabelReleasedate>
|
||||
<langLabelPlayers>Spieler</langLabelPlayers>
|
||||
<langLabelGenre>Genre</langLabelGenre>
|
||||
<langLabelDeveloper>Entwickler</langLabelDeveloper>
|
||||
<langLabelPublisher>Herausgeber</langLabelPublisher>
|
||||
<langLabelLastPlayed>Zuletzt Gespielt</langLabelLastPlayed>
|
||||
<langCustomCollections>Benutzerdefinierte Sammlungen</langCustomCollections>
|
||||
<langYourCollections>Deine Sammlungen</langYourCollections>
|
||||
</variables>
|
||||
</language>
|
||||
<language name="es_ES">
|
||||
<variables>
|
||||
<langLabelRating>Valoracion</langLabelRating>
|
||||
|
@ -50,6 +76,20 @@
|
|||
<langYourCollections>Le tue Collezioni</langYourCollections>
|
||||
</variables>
|
||||
</language>
|
||||
<language name="nl_NL">
|
||||
<variables>
|
||||
<langLabelRating>Waardering</langLabelRating>
|
||||
<langLabelReleasedate>Datum van Uitgave</langLabelReleasedate>
|
||||
<langLabelPlayers>Spelers</langLabelPlayers>
|
||||
<langLabelGenre>Genre</langLabelGenre>
|
||||
<langLabelDeveloper>Ontwikkelaar</langLabelDeveloper>
|
||||
<langLabelPublisher>Uitgever</langLabelPublisher>
|
||||
<langLabelPublisher>Uitgever</langLabelPublisher>
|
||||
<langLabelLastPlayed>Laatst Gespeeld</langLabelLastPlayed>
|
||||
<langCustomCollections>Custom Collecties</langCustomCollections>
|
||||
<langYourCollections>Jouw Collecties</langYourCollections>
|
||||
</variables>
|
||||
</language>
|
||||
<language name="pl_PL">
|
||||
<variables>
|
||||
<langLabelRating>Ocena</langLabelRating>
|
||||
|
@ -128,6 +168,19 @@
|
|||
<langYourCollections>あなたのコレクション</langYourCollections>
|
||||
</variables>
|
||||
</language>
|
||||
<language name="ko_KR">
|
||||
<variables>
|
||||
<langLabelRating>평점</langLabelRating>
|
||||
<langLabelReleasedate>발매일</langLabelReleasedate>
|
||||
<langLabelPlayers>플레이어</langLabelPlayers>
|
||||
<langLabelGenre>장르</langLabelGenre>
|
||||
<langLabelDeveloper>개발사</langLabelDeveloper>
|
||||
<langLabelPublisher>배급사</langLabelPublisher>
|
||||
<langLabelLastPlayed>최근 실행</langLabelLastPlayed>
|
||||
<langCustomCollections>커스텀 컬렉션</langCustomCollections>
|
||||
<langYourCollections>너의 컬렉션</langYourCollections>
|
||||
</variables>
|
||||
</language>
|
||||
<language name="zh_CN">
|
||||
<variables>
|
||||
<langLabelRating>评分</langLabelRating>
|
||||
|
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 24 KiB |
|
@ -26,19 +26,23 @@ The following options are included:
|
|||
- 4:3
|
||||
- 21:9
|
||||
|
||||
12 languages:
|
||||
16 languages:
|
||||
|
||||
- English (United States)
|
||||
- English (United Kingdom)
|
||||
- Català
|
||||
- Deutsch
|
||||
- Español (España)
|
||||
- Français
|
||||
- Italiano
|
||||
- Nederlands
|
||||
- Polski
|
||||
- Português (Brasil)
|
||||
- Română
|
||||
- Русский
|
||||
- Svenska
|
||||
- 日本語
|
||||
- 한국어
|
||||
- 简体中文
|
||||
|
||||
3 transitions:
|
||||
|
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 358 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 180 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 440 KiB |
Before Width: | Height: | Size: 464 KiB After Width: | Height: | Size: 386 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 282 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 330 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 144 KiB |