Compare commits

..

591 commits

Author SHA1 Message Date
XargonWan c562a217fc Merge branch 'master' of https://gitlab.com/es-de/emulationstation-de into retrodeck-main
Some checks are pending
Build ES-DE / Building_RetroDECK-ES-DE (push) Waiting to run
2024-11-29 10:30:31 +09:00
Leon Styhre 91a9a9cf3b Documentation update 2024-11-26 23:46:01 +01:00
Leon Styhre bd3a43573c (Linux) Added support for the AppImage release of melonDS 2024-11-26 22:05:40 +01:00
Leon Styhre 5220c36a7c Added the -f flag for fullscreen mode for melonDS standalone on Linux, macOS and Windows 2024-11-26 21:47:58 +01:00
Leon Styhre 37180e2e37 (Windows) Added BeebEm standalone as an alternative emulator for the bbcmicro system 2024-11-26 21:24:57 +01:00
Leon Styhre 6f59a815ad (Android) Removed the EKA2L1-GUI find rules entry 2024-11-26 19:55:53 +01:00
Leon Styhre 74c75341b0 (Android) Added support for launching individual games directly with EKA2L1 for the ngage system 2024-11-26 19:53:46 +01:00
Leon Styhre b579f50936 Updated the zh_CN translations 2024-11-26 19:51:58 +01:00
Leon Styhre 807eb20094 Updated the ja_JP translations 2024-11-26 19:51:13 +01:00
Leon Styhre 8ca828d356 Updated the ro_RO translations 2024-11-25 23:01:53 +01:00
Leon Styhre d16ae0a175 Documentation update 2024-11-25 21:07:30 +01:00
Leon Styhre 98e0cf6ea8 Updated the pl_PL translations 2024-11-25 19:49:39 +01:00
Leon Styhre 1b8f51ac23 Updated the pt_BR translations 2024-11-25 19:45:35 +01:00
Leon Styhre a54c2891f6 Updated the ko_KR translations 2024-11-25 19:42:01 +01:00
Leon Styhre 4497d86852 Workaround in rlottie for a potential Clang 16 compiler bug 2024-11-25 19:36:23 +01:00
Leon Styhre 97c3c5c5cf Updated the fr_FR translations 2024-11-24 18:23:12 +01:00
Leon Styhre dab35970ab Documentation update 2024-11-24 17:50:02 +01:00
Leon Styhre 9a9a371c5d Added two new translation messages to all .po files 2024-11-24 17:49:41 +01:00
Leon Styhre f0ea55b9f2 (Android) Directories for corrupt themes are now automatically removed when the theme downloader is started 2024-11-24 17:32:22 +01:00
Leon Styhre 6c6dc82ef6 Added support to the theme downloader for detecting and handling theme repository URL changes 2024-11-24 17:15:06 +01:00
Leon Styhre fbbfec6274 Documentation update 2024-11-24 14:52:30 +01:00
Leon Styhre 487a842f36 Added a 'textBackgroundCornerRadius' property to the grid element
Also made the 'backgroundCornerRadius' and 'selectorCornerRadius' properties apply to colored rectangles
2024-11-24 14:42:55 +01:00
Leon Styhre 8c9d9d51fc Added a 'textBackgroundCornerRadius' property to the carousel element 2024-11-24 14:38:54 +01:00
Leon Styhre 3baf505351 Fixed an incorrect width and height calculation in the renderer 2024-11-24 13:47:24 +01:00
Leon Styhre 26b7945171 Fixed an issue where the grid component selector position was not always calculated correctly 2024-11-24 13:41:58 +01:00
Leon Styhre 0c5e296103 Documentation update 2024-11-23 00:03:13 +01:00
Leon Styhre 8326c0bbee (Windows) Added Yaba Sanshiro 2 standalone as an alternative emulator for the saturn and saturnjp systems 2024-11-22 23:21:58 +01:00
Leon Styhre a924b84dca (Windows) Added a find rule for the SSE2 build of DuckStation 2024-11-21 22:28:55 +01:00
Leon Styhre c013f7ba7d Documentation update 2024-11-21 21:51:44 +01:00
Leon Styhre f09f4838f1 (Windows) Fixed an issue where the video and slideshow screensavers didn't work if a custom game media directory had been configured 2024-11-21 20:59:50 +01:00
Leon Styhre b26da9d80d (Android) Added experimental support for running in multi-window mode 2024-11-18 22:57:39 +01:00
Leon Styhre 697c3fb74f Updated the pl_PL translations 2024-11-14 22:01:48 +01:00
Leon Styhre 2d34ab6fb4 Documentation update 2024-11-13 23:46:03 +01:00
Leon Styhre 8428a2c0a3 (Android) Added one translation string to android_strings.xml 2024-11-13 22:00:14 +01:00
Leon Styhre c9522b029b Updated the it_IT translations 2024-11-13 21:56:13 +01:00
Leon Styhre 27a8bd867c Added two new translation messages to all .po files 2024-11-13 19:09:33 +01:00
Leon Styhre 572cd9b8b0 (Android) Changed the default audio driver from AAudio to OpenSL ES
Also added an audio driver menu option to the Sound settings menu
2024-11-13 18:17:27 +01:00
Leon Styhre 9aab182c5c Changed the message sorting for all .po files 2024-11-13 18:06:45 +01:00
Leon Styhre d8e52a616c Updated update_translation_strings.sh to sort the input source files so the .po files get consistently sorted as well 2024-11-13 18:03:25 +01:00
Leon Styhre fbf40c177b Documentation update 2024-11-12 20:06:31 +01:00
Leon Styhre 049ec88a4a Updated the MAME index files to include ROMs up to MAME version 0.271 2024-11-12 20:00:39 +01:00
Leon Styhre ae5002c59f Bundled the September 2024 release of the Mozilla TLS/SSL certificates 2024-11-12 19:58:55 +01:00
Leon Styhre 03c821a6e5 Updated SDL to 2.30.9 2024-11-12 19:58:01 +01:00
Leon Styhre 4c5cabc5fc (Windows) Fixed an issue where translations didn't work correctly for some text 2024-11-12 19:56:16 +01:00
Leon Styhre 1a4648622a Fixed an issue where pasting text into a text edit field would make the cursor jump to an incorrect position 2024-11-12 19:52:47 +01:00
Leon Styhre bdd93d86ea Documentation update 2024-11-11 23:22:13 +01:00
Leon Styhre 59dd4c58d5 Added Mandarine standalone as an alternative emulator for the n3ds system 2024-11-11 23:16:06 +01:00
Leon Styhre d380db8a1f Fixed an issue where placing a directory with no access permissions inside a system folder crashed the application on startup 2024-11-11 22:02:47 +01:00
Leon Styhre ce580a269f Documentation update 2024-11-08 22:22:55 +01:00
Leon Styhre 89ce634bcb (Windows) Updated OpenSSL to 3.4.0 2024-10-30 20:20:57 +01:00
Leon Styhre 3c06f06ee8 Documentation update 2024-10-30 20:18:58 +01:00
Leon Styhre c95dd349bb Documentation update 2024-10-27 23:06:51 +01:00
Leon Styhre 0cd15194b4 (Android) Added a temporary workaround to avoid crashes on non-character keyboard input when editing text 2024-10-27 22:46:05 +01:00
Leon Styhre 4af72384db (modern-es-de) Fixed an issue where the carousel icon for tanodragon was incorrectly showing the dragon32 system 2024-10-26 12:27:20 +02:00
Leon Styhre 91edbddc66 (linear-es-de) Fixed an issue where the carousel icon for tanodragon was incorrectly showing the dragon32 system 2024-10-26 12:26:39 +02:00
Leon Styhre f20f9158b7 Documentation update 2024-10-26 11:35:03 +02:00
Leon Styhre 12d2541f2d Documentation update 2024-10-26 11:21:53 +02:00
Leon Styhre c53e25fdb2 Updated the ko_KR translations 2024-10-19 13:49:57 +02:00
Leon Styhre bd6a6ca919 Documentation update 2024-10-19 13:48:04 +02:00
Leon Styhre a7d87580b6 (slate-es-de) Added translations for nl_NL 2024-10-14 21:26:56 +02:00
Leon Styhre f5f6a18e50 (modern-es-de) Added translations for nl_NL 2024-10-14 21:25:12 +02:00
Leon Styhre 27d0887f1a (linear-es-de) Added translations for nl_NL 2024-10-14 21:23:04 +02:00
Leon Styhre 4ce33fa646 Updated latest_release.json for the Android 3.1.0-32 release 2024-10-11 18:41:09 +02:00
Leon Styhre 3c8fa752b2 Documentation update 2024-10-07 22:23:16 +02:00
Leon Styhre 8f835ff5b3 (Android) Changed Flycast standalone to use %ROMSAF% instead of %ROM% as the latter caused game launching to fail on some devices 2024-10-07 21:37:15 +02:00
Leon Styhre fb773da199 Fixed an issue where invalid popup notifications were sometimes shown after a download error message had been displayed in the theme downloader 2024-10-07 21:23:39 +02:00
Leon Styhre 77d27db8cb Documentation update 2024-10-06 22:39:21 +02:00
Leon Styhre 9bc20fb18a Some code format changes made by clang-format 18 2024-10-06 22:36:22 +02:00
Leon Styhre 3dcc7be790 The Git index stat cache is now refreshed for all themes when starting the theme downloader 2024-10-06 22:20:21 +02:00
Leon Styhre 56996c0a26 (Haiku) Minor change to the HaikuDepot recipe 2024-10-05 17:32:34 +02:00
Leon Styhre ed7e9558cb (Haiku) Minor change to the HaikuDepot recipe 2024-10-04 23:06:53 +02:00
Leon Styhre 7bcd8290b9 (Haiku) Minor change to the HaikuDepot recipe 2024-10-04 17:30:31 +02:00
Leon Styhre e9d128a6ec (Haiku) Minor change to the HaikuDepot recipe 2024-10-03 22:58:28 +02:00
Leon Styhre eae5dfc310 Documentation update 2024-10-01 21:58:40 +02:00
Leon Styhre ac963843f6 (Linux) Removed support for the unofficial AppImage release of Ryujinx 2024-10-01 21:57:52 +02:00
Leon Styhre d54dcaef39 Documentation update 2024-10-01 20:31:21 +02:00
Leon Styhre 3310dff8e3 (Linux) Added support for the unofficial AppImage release of Ryujinx 2024-10-01 20:30:34 +02:00
Leon Styhre 5beb8e5a34 Documentation update 2024-09-30 21:37:37 +02:00
Leon Styhre d14cfd4e7e (modern-es-de) Replaced some legacy carousel icons 2024-09-30 20:49:33 +02:00
Leon Styhre 45fc13a43e Fixed an issue where pressing the 'Clear' button in the text editor and then entering some value in the input field crashed the application 2024-09-29 20:53:40 +02:00
Leon Styhre ed1d15dbac Documentation update 2024-09-28 13:32:48 +02:00
Leon Styhre f3d3f5363d (Haiku) Minor recipe update for HaikuDepot 2024-09-28 13:27:27 +02:00
Leon Styhre d523910aa7 Updated the ca_ES translations 2024-09-28 13:20:14 +02:00
Leon Styhre f400ba78d7 (slate-es-de) Added translations for ca_ES 2024-09-28 13:16:29 +02:00
Leon Styhre 0d761db5e6 (modern-es-de) Added translations for ca_ES 2024-09-28 13:05:45 +02:00
Leon Styhre fdd0232cbb (linear-es-de) Minor adjustments to the ca_ES translations 2024-09-28 13:03:38 +02:00
Leon Styhre f1caaf9ff1 (linear-es-de) Added translations for ca_ES 2024-09-28 12:55:08 +02:00
Leon Styhre 9d4da523b5 (Haiku) Some minor updates for HaikuDepot 2024-09-28 12:15:55 +02:00
Leon Styhre cc1c034525 Documentation update 2024-09-28 00:14:41 +02:00
Leon Styhre e14452c48a Updated the ca_ES translations 2024-09-27 23:55:53 +02:00
Leon Styhre 0fa691d9fa Updated the fr_FR translations 2024-09-25 21:42:39 +02:00
Leon Styhre 7a350ae93c Updated the ca_ES translations 2024-09-25 21:12:39 +02:00
Leon Styhre 7f9860e0b3 Updated the fr_FR translations 2024-09-23 18:48:24 +02:00
Leon Styhre 54dee3ac57 Made two text label fields wider in the scraper credentials menu 2024-09-23 18:47:41 +02:00
Leon Styhre bc13c93c53 Updated the nl_NL translations 2024-09-22 21:40:12 +02:00
Leon Styhre ce0d51663c Documenation update 2024-09-22 16:39:44 +02:00
Leon Styhre 2a0d7867f4 Updated the nl_NL translations 2024-09-22 16:29:40 +02:00
Leon Styhre ca132c0ce7 Documentation update 2024-09-22 16:13:02 +02:00
Leon Styhre 80e7b442d3 (Android) Added support for the Nintendo Wii U (wiiu) game system 2024-09-22 16:06:16 +02:00
Leon Styhre 98d36d56cc Added support for the nl_NL locale 2024-09-22 15:11:40 +02:00
Leon Styhre 86fad10a6c (slate-es-de) Added translations for ko_KR 2024-09-22 14:47:22 +02:00
Leon Styhre d48c5616fa (modern-es-de) Added translations for ko_KR 2024-09-22 14:46:30 +02:00
Leon Styhre 4b2d3b283c (linear-es-de) Added translations for ko_KR 2024-09-22 14:45:05 +02:00
Leon Styhre 6f62ea96c8 Added missing country info for the es_ES.po file 2024-09-20 14:22:28 +02:00
Leon Styhre 3ba46470da Added support for the ca_ES locale 2024-09-20 14:11:54 +02:00
Leon Styhre fe5a4ca86f (slate-es-de) Added translations for de_DE 2024-09-20 11:28:46 +02:00
Leon Styhre 6fb90e593f (modern-es-de) Added translations for de_DE 2024-09-20 11:23:27 +02:00
Leon Styhre 91caa23aec (linear-es-de) Added a language entry to the README.md file 2024-09-20 11:22:20 +02:00
Leon Styhre 9566ecb490 (linear-es-de) Added translations for de_DE 2024-09-20 11:14:38 +02:00
Leon Styhre a463b6fa2d Fixed a regression where filesystem case-sensitivity was not considered when looking for media files for the screensaver 2024-09-20 10:58:26 +02:00
Leon Styhre 31c8e76e47 Documentation update 2024-09-18 20:34:32 +02:00
Leon Styhre 7502649fc0 Change to avoid a potential issue for an if statement 2024-09-18 17:29:54 +02:00
Leon Styhre a2063f4b5a Fixed a crash on shutdown when the 'no ROMs' dialog was shown 2024-09-18 17:23:57 +02:00
Leon Styhre c33ee569f4 (Android) Fixed an issue where switching from ES-DE to another app and back again while the 'no ROMs' dialog was shown crashed the application 2024-09-18 17:15:55 +02:00
Leon Styhre c2ae6468fe Updated the de_DE translations 2024-09-16 22:57:26 +02:00
Leon Styhre 6614b8a1c7 Documentation update 2024-09-16 22:55:06 +02:00
Leon Styhre f485f83d0d Updated the fr_FR translations 2024-09-16 22:53:34 +02:00
Leon Styhre 6a521ffb68 Added support for the de_DE locale 2024-09-16 22:36:02 +02:00
Leon Styhre 4fa953dc0d Documentation update 2024-09-16 20:27:39 +02:00
Leon Styhre fb9aeddfab Fixed an issue where attempting to view media for a game that had no downloaded media paused the playback of all static theme videos 2024-09-16 20:17:30 +02:00
Leon Styhre 8d23e474d9 Changed the ja_JP position in the languages file 2024-09-15 22:00:53 +02:00
Leon Styhre 738d2a39c3 Changed the position of the ko_KR language 2024-09-15 21:53:43 +02:00
Leon Styhre 670acfca07 Documentation update 2024-09-15 21:39:12 +02:00
Leon Styhre 947f252cb2 Fixed an issue where newly entered ScreenScraper username and password values were positioned incorrectly vertically in the account settings menu 2024-09-15 21:12:21 +02:00
Leon Styhre 52966534d4 Added support for the ko_KR locale 2024-09-15 20:52:23 +02:00
Leon Styhre c4ef9e2e7f Added the Nanum Square Neo Korean font 2024-09-15 20:48:57 +02:00
Leon Styhre 4b24cb0d4e Changed a rounding in ScrollableContainer to slightly decrease the risk of glyphs getting cut off at the bottom of the container 2024-09-15 11:39:04 +02:00
Leon Styhre 5300e54295 Video player resources are now completely freed up after finishing view transitions 2024-09-15 11:34:28 +02:00
Leon Styhre d1f9dc7e23 Bumped the version to 3.1.1-alpha 2024-09-15 11:26:14 +02:00
Leon Styhre bc0b8a4ad3 (Haiku) Updated the srcGitRev value in the HaikuPorts recipe 2024-09-14 14:54:09 +02:00
Leon Styhre 8b459af323 Documentation update 2024-09-13 22:31:00 +02:00
Leon Styhre e357c14c37 Fixed a typo in the changelog 2024-09-13 20:26:35 +02:00
Leon Styhre 0d07da2a88 Updated latest_release.json for the 3.1.0 release 2024-09-13 20:01:52 +02:00
Leon Styhre 842c9966eb Documentation update for the 3.1.0 release 2024-09-13 18:19:36 +02:00
Leon Styhre a7c1d463ca Documentation update 2024-09-09 19:02:50 +02:00
Leon Styhre 2d09905584 Updated the Winlator emulator names 2024-09-09 18:56:34 +02:00
Leon Styhre a2061e4711 (linear-es-de) Added some missing sv_SE translations 2024-09-09 18:08:01 +02:00
Leon Styhre f07e612f47 (linear-es-de) Added some missing metadata files 2024-09-09 17:40:55 +02:00
Leon Styhre 1747ca0393 (modern-es-de) Eliminated an annoying debug message 2024-09-09 17:40:05 +02:00
Leon Styhre ccf5e3de36 Bumped the version to 3.1.0 2024-09-09 17:07:39 +02:00
Leon Styhre 0e692be641 (Android) Added support for the PC Arcade Systems (pcarcade) and Taito Type X (type-x) game systems 2024-09-09 17:04:09 +02:00
Leon Styhre fd65e3d559 Documentation update 2024-09-07 15:07:37 +02:00
Leon Styhre efa71da31a (Android) Added Winlator PRoot Cmod standalone as an alternative emulator for the windows system 2024-09-07 15:04:32 +02:00
Leon Styhre 1acab82dc9 (Android) Added support for the Microsoft Windows (windows) game system using the Winlator emulator 2024-09-07 14:47:00 +02:00
Leon Styhre 5a04e95a6a Added izapple2 standalone as an alternative emulator for the apple2 system on Linux and Windows 2024-09-07 13:36:07 +02:00
Leon Styhre 7ae17e8f17 Documentation update 2024-09-07 12:51:26 +02:00
Leon Styhre fb0ab44469 Added jgenesis as an alternative emulator for the famicom, gamegear, gb, gbc, genesis, mastersystem, megacd, megacdjp, megadrive, megadrivejp, nes, segacd, sfc, snes and snesna systems on Linux and Windows 2024-09-07 12:32:52 +02:00
Leon Styhre 66c939b00c (Windows) Added 'Shortcut' as an alternative emulator for the switch system
Also added the .lnk file extension
2024-09-07 11:28:31 +02:00
Leon Styhre 548aef50ee Added some missing find rules for Lime3DS 2024-09-07 11:03:47 +02:00
Leon Styhre f48e68c5e9 Added support for the new Lime3DS binary names on Linux, macOS and Windows 2024-09-07 10:58:08 +02:00
Leon Styhre e69210204f Updated the fr_FR translations 2024-09-06 22:14:20 +02:00
Leon Styhre 511bb52f83 Updated SDL to 2.30.7 on Android, Windows, macOS and the Linux AppImage builds 2024-09-06 12:52:57 +02:00
Leon Styhre ad30e5c4e6 (slate-es-de) Added translations for pl_PL 2024-09-06 12:22:36 +02:00
Leon Styhre 7958af9d7f (modern-es-de) Added translations for pl_PL 2024-09-06 12:21:44 +02:00
Leon Styhre d16b6aad72 Documentation update 2024-09-05 17:25:56 +02:00
Leon Styhre a653294eb7 Removed support for the ar_EG, de_DE, el_GR and nl_NL locales and moved their .po files to an archive directory 2024-09-05 17:18:20 +02:00
Leon Styhre 7927dbb8c5 Added the Stella 2023 RetroArch core as an alternative emulator for the atari2600 system 2024-09-05 17:14:22 +02:00
Leon Styhre d579c0a01e Added the VirtualXT RetroArch core as an alternative emulator for the dos and pc systems 2024-09-05 17:11:43 +02:00
Leon Styhre 79e87d7855 (linear-es-de) Added translations for pl_PL 2024-09-05 17:08:01 +02:00
Leon Styhre 67b955e460 Updated the MAME index files to include ROMs up to MAME version 0.269 2024-09-05 17:06:42 +02:00
Leon Styhre 6a5dc5fdb2 Bundled the July 2024 release of the Mozilla TLS/SSL certificates 2024-09-05 17:05:30 +02:00
Leon Styhre 142b1c5d40 Updated the pl_PL translations 2024-09-05 17:04:26 +02:00
Leon Styhre 9ebf166d58 Updated the de_DE translations 2024-09-05 17:03:30 +02:00
Leon Styhre 02e766a193 (linear-es-de) Added sv_SE translations for all system hardware types 2024-09-04 22:31:44 +02:00
Leon Styhre e33b2123e5 (linear-es-de) Updated the system metadata 2024-09-04 21:08:17 +02:00
Leon Styhre 17c59f8730 pdated the el_GR translations 2024-09-04 20:57:51 +02:00
Leon Styhre a99e01edfa Documentation update 2024-09-04 18:28:49 +02:00
Leon Styhre 0aab42cf8e (modern-es-de) Added some capitalized default metadata values 2024-09-04 18:27:38 +02:00
Leon Styhre 904a8f5c5d Fixed an issue where the text element defaultValue property no longer worked correctly 2024-09-04 18:25:54 +02:00
Leon Styhre 9d64a2feab Updated all locales with new theme engine translations 2024-09-04 17:48:32 +02:00
Leon Styhre cd89aa749c (slate-es-de) Added translations for ja_JP and zh_CN 2024-09-04 17:35:22 +02:00
Leon Styhre 599865a6de (modern-es-de) Added translations for ja_JP and zh_CN 2024-09-04 17:34:19 +02:00
Leon Styhre a05903dd52 (linear-es-de) Added translations for ja_JP and zh_CN 2024-09-04 17:33:34 +02:00
Leon Styhre e34fbb9115 Added theme engine translations for 'never' and 'unknown' date values 2024-09-04 17:28:53 +02:00
Leon Styhre 56c8c11783 Added theme engine translations for 'unknown' metadata values for developer, publisher, genre and players 2024-09-04 17:27:34 +02:00
Leon Styhre c80ba5be86 Fixed a line breaking issue 2024-09-04 17:19:36 +02:00
Leon Styhre 281b967e8f Removed an unnecessary element resize in ScrollableContainer 2024-09-04 17:16:28 +02:00
Leon Styhre f3af0e246c Added a menu title font size adjustment for the ru_RU translations 2024-09-03 23:05:13 +02:00
Leon Styhre 15f6d8730a (slate-es-de) Added translations for ru_RU 2024-09-03 20:22:31 +02:00
Leon Styhre 640d1cd3ee (modern-es-de) Added translations for ru_RU 2024-09-03 20:17:30 +02:00
Leon Styhre c8feeaf479 (linear-es-de) Added translations for ru_RU 2024-09-03 20:11:26 +02:00
Leon Styhre be1017dbc3 Updated the ru_RU translations 2024-09-03 19:58:06 +02:00
Leon Styhre e9f4b4b261 (Windows) Reduced the ICU library size via a data filter file 2024-09-03 19:09:06 +02:00
Leon Styhre 1b70d815dd (macOS) Reduced the ICU library size via a data filter file 2024-09-03 19:03:31 +02:00
Leon Styhre 7bcbc16bf2 Added an ICU filter configuration file 2024-09-03 19:00:04 +02:00
Leon Styhre 2428735b66 Updated SDL to 2.30.6 on Android, Windows, macOS and the Linux AppImage builds 2024-09-02 20:08:49 +02:00
Leon Styhre 3928b616c6 (Haiku) Updated the srcGitRev value in the HaikuPorts recipe 2024-09-02 19:02:24 +02:00
Leon Styhre a79e757f86 Documentation update 2024-09-02 18:57:48 +02:00
Leon Styhre 580f075d85 (Haiku) Added support for the c64, plus4 and vic20 systems 2024-09-02 18:49:15 +02:00
Leon Styhre 45ca74a1f6 (slate-es-de) Added translations for pt_BR 2024-09-02 18:46:32 +02:00
Leon Styhre a03cf10400 (modern-es-de) Added translations for pt_BR 2024-09-02 18:40:26 +02:00
Leon Styhre 737d75f0fc (linear-es-de) Added translations for pt_BR 2024-09-02 18:34:03 +02:00
Leon Styhre c10c3c6a0b (slate-es-de) Added translations for es_ES, fr_FR and it_IT 2024-09-02 18:24:49 +02:00
Leon Styhre 039bb6e35a (modern-es-de) Added translations for es_ES and it_IT 2024-09-02 18:23:43 +02:00
Leon Styhre babbfaccc9 (modern-es-de) Decreased the helpsystem entry spacing 2024-09-02 18:16:12 +02:00
Leon Styhre 5d340f7bbf (linear-es-de) Added translations for it_IT 2024-09-02 18:14:39 +02:00
Leon Styhre 1123fb3524 Updated the pt_BR translations 2024-09-02 18:11:51 +02:00
Leon Styhre 0512c2632d Updated the it_IT translations 2024-09-02 18:10:31 +02:00
Leon Styhre 38faa8a661 (slate-es-de) Added translations for ro_RO 2024-09-01 21:36:06 +02:00
Leon Styhre 05f7608de9 (modern-es-de) Added translations for ro_RO 2024-09-01 21:29:59 +02:00
Leon Styhre 52a7854d37 (linear-es-de) Some minor translation changes 2024-09-01 21:21:19 +02:00
Leon Styhre 61935e54d8 (modern-es-de) Updated the fr_FR translations 2024-09-01 21:20:05 +02:00
Leon Styhre 84d5750215 (linear-es-de) Updated the es_ES translations 2024-09-01 20:14:23 +02:00
Leon Styhre ea06223b42 (slate-es-de) Added translations for en_US, en_GB and sv_SE 2024-09-01 20:09:24 +02:00
Leon Styhre c2a61f7a08 (linear-es-de) Added translations for ro_RO 2024-09-01 19:44:46 +02:00
Leon Styhre b721055bcb (linear-es-de) Added translations for es_ES 2024-09-01 19:30:31 +02:00
Leon Styhre ebbfaf25ab Updated the ro_RO translations 2024-09-01 19:23:08 +02:00
Leon Styhre 42fdd6500b Updated the es_ES translations 2024-09-01 19:09:36 +02:00
Leon Styhre 4032f4440f (modern-es-de) Added translations for en_US, en_GB, fr_FR and sv_SE 2024-09-01 19:01:11 +02:00
Leon Styhre d12c0483de Updated the zh_CN translations 2024-09-01 18:36:45 +02:00
Leon Styhre a2c9c7d884 Updated the ja_JP translations 2024-09-01 18:31:13 +02:00
Leon Styhre 6a19cdc40b (linear-es-de) Added translations for fr_FR 2024-09-01 18:23:01 +02:00
Leon Styhre 298fd0f7d6 Updated the fr_FR translations 2024-09-01 17:30:01 +02:00
Leon Styhre 266a3e4651 Documentation update 2024-09-01 14:26:32 +02:00
Leon Styhre 8874690ef6 (linear-es-de) Added translations for en_US, en_GB and sv_SE 2024-09-01 14:14:03 +02:00
Leon Styhre 98bf9251d5 Updated all locale (.po) files with the theme engine localization additions 2024-09-01 13:44:09 +02:00
Leon Styhre e08f270aa2 Added translation support for the metadata property for the text element 2024-09-01 12:49:13 +02:00
Leon Styhre 9a18a5c816 Added translations for the name and fullname systemdata properties for the text element 2024-09-01 12:27:23 +02:00
Leon Styhre 6672aee6c5 Fixed an incorrect code comment in CollectionSystemsManager 2024-09-01 12:24:33 +02:00
Leon Styhre d4e53a53f0 Added translations for the automatic collection names (short name versions) when used as theme system variables 2024-09-01 12:23:41 +02:00
Leon Styhre 4d245c955f Added support for including theme files from within the colorScheme and fontSize tag pairs 2024-09-01 11:42:38 +02:00
Leon Styhre 63e9586d88 Fixed an issue where text elements defined as gamecount using the systemdata property could not scroll horizontally 2024-09-01 11:30:16 +02:00
Leon Styhre 57a821e717 Fixed a regression where horizontal text containers would sometimes not work correctly 2024-09-01 10:56:31 +02:00
Leon Styhre 18eade57ad Added localization support to the label entries in capabilities.xml 2024-08-31 20:54:29 +02:00
Leon Styhre 2446e9d91c Added theme contextual hinting to the custom collection summary text in CollectionSystemsManager
Also added translation support for a string that was previously missed
2024-08-31 13:33:54 +02:00
Leon Styhre f845b5f031 Added localization support for the theme game counter 2024-08-31 13:17:11 +02:00
Leon Styhre ff091a9d83 Added translations for the automatic collection names when used as theme system variables 2024-08-31 13:04:17 +02:00
Leon Styhre 965ece8a85 Added localization support to DateTimeComponent 2024-08-31 12:54:38 +02:00
Leon Styhre d4a0f32dd0 Added support for using language variables in the theme configuration 2024-08-31 12:52:20 +02:00
Leon Styhre 8997cf2209 Updated the it_IT translations 2024-08-31 11:27:07 +02:00
Leon Styhre b9b870942e (modern-es-de) Fixed an issue where the system logo for saturnjp was incorrectly showing the western variant 2024-08-29 23:36:44 +02:00
Leon Styhre c9a2fd8396 (linear-es-de) Fixed an issue where the system logo for saturnjp was incorrectly showing the western variant 2024-08-29 23:35:37 +02:00
Leon Styhre 366477fa72 Changed a theme loading debug message 2024-08-29 19:20:06 +02:00
Leon Styhre eecd84ac09 Added basic configuration support and menu entries for theme localization 2024-08-29 19:09:33 +02:00
Leon Styhre 3f4ed60649 (Haiku) Updated the srcGitRev value in the HaikuPorts recipe 2024-08-28 18:31:20 +02:00
Leon Styhre ec4a1cb3de Documentation update 2024-08-28 18:27:58 +02:00
Leon Styhre 1c11625c4f (Haiku) Added configuration for a number of game systems 2024-08-28 18:26:21 +02:00
Leon Styhre 19b4fc960f Documentation update 2024-08-27 23:03:36 +02:00
Leon Styhre 620861ebd1 (Haiku) Added configuration for a number of game systems 2024-08-27 23:01:58 +02:00
Leon Styhre 8791c66b13 (Haiku) Updated the srcGitRev value in the HaikuPorts recipe 2024-08-27 20:35:22 +02:00
Leon Styhre ac3fe9de51 Documentation update 2024-08-27 20:32:29 +02:00
Leon Styhre 7e0f10ec94 (Haiku) Added configuration for a number of game systems 2024-08-27 20:31:43 +02:00
Leon Styhre 058ab4f9f3 (Haiku) Updated the srcGitRev value in the HaikuPorts recipe 2024-08-27 18:48:04 +02:00
Leon Styhre 860e9919ab Documentation update 2024-08-27 18:41:28 +02:00
Leon Styhre 0b25ad5cfa Updated the it_IT translations 2024-08-27 18:40:28 +02:00
Leon Styhre cb42ef652a (Haiku) Added configuration for a number of game systems 2024-08-27 18:38:22 +02:00
Leon Styhre 9351718f23 Documentation update 2024-08-26 22:39:50 +02:00
Leon Styhre fc68595a47 (Haiku) Fixed an URI issue in the HaikuPorts recipe 2024-08-26 22:11:18 +02:00
Leon Styhre d52d692804 (Haiku) Added a HaikuPorts recipe 2024-08-26 21:42:49 +02:00
Leon Styhre 32f206f36f (Haiku) Added support for some game systems 2024-08-26 21:35:07 +02:00
Leon Styhre 74dfa5239f Added a menu title font size adjustment for the de_DE translations 2024-08-26 17:17:55 +02:00
Leon Styhre db6c9801dc (Haiku) Added a resource file 2024-08-24 17:06:34 +02:00
Leon Styhre 193af56e40 Fixed an issue where returning from a game would sometimes make the helpsystem use the dimmed theme properties 2024-08-24 13:54:31 +02:00
Leon Styhre f9401529d1 Some minor code modernization in MameNames 2024-08-24 12:50:26 +02:00
Leon Styhre 068b7c6bfd Updated the pl_PL translations 2024-08-24 12:09:33 +02:00
Leon Styhre d15dd28e26 Added a code comment clarification in FileSystemUtil 2024-08-24 12:07:30 +02:00
Leon Styhre 76e29d534d Removed support for the ca_AD locale 2024-08-24 12:06:34 +02:00
Leon Styhre f7cc0f6ace Added an extra check in OptionListComponent to avoid potential crashes 2024-08-24 12:03:56 +02:00
Leon Styhre ae779a42e6 Fixed an issue where scraping using TheGamesDB would crash the application 2024-08-24 11:58:03 +02:00
Leon Styhre b71b0d1abf Updated the zh_CN translations 2024-08-24 11:51:07 +02:00
Leon Styhre 2bba50c25c Updated the ja_JP translations 2024-08-24 11:49:12 +02:00
Leon Styhre 8c59b072b1 Added a menu title font size adjustment for the it_IT translations 2024-08-24 11:45:34 +02:00
Leon Styhre 3d5890cb91 Updated the it_IT translations 2024-08-24 11:42:32 +02:00
Leon Styhre a6a74fcc44 Updated the es_ES translations 2024-08-24 11:38:29 +02:00
Leon Styhre f528775cf3 Updated the fr_FR translations 2024-08-24 11:35:53 +02:00
Leon Styhre ea023b8e34 (Haiku) Made sure es-pdf-convert is found under all circumstances 2024-08-23 17:05:48 +02:00
Leon Styhre 20293e1c03 (Haiku) Added support for the correct system resource directories 2024-08-23 16:42:26 +02:00
Leon Styhre f7496141f4 (Haiku) Changed to correct installation directories 2024-08-23 16:29:00 +02:00
Leon Styhre 03ce48da81 (Haiku) Added correct installation directories to the CMake configuration 2024-08-23 16:06:01 +02:00
Leon Styhre 2079b4c964 Documentation update 2024-08-22 22:43:17 +02:00
Leon Styhre c0d9fa12f1 Updated the el_GR.po, es_ES.po, fr_FR.po, it_IT.po, ja_JP.po, ru_RU.po and zh_CN.po locale files 2024-08-22 22:31:57 +02:00
Leon Styhre 51cb73b987 (Haiku) Added support for the PDF viewer 2024-08-22 17:32:22 +02:00
Leon Styhre 7992dbcf01 (Android) Changed ePSXe to use %ROM% instead of %ROMSAF% 2024-08-22 17:31:00 +02:00
Leon Styhre b9f8d4cfdd Added a check for whether a text element has a width defined when the container property is set 2024-08-22 17:29:39 +02:00
Leon Styhre ce3d50d2b3 Fixed a potential issue where globally disabling text shaping could cause space detection to fail 2024-08-22 00:19:10 +02:00
Leon Styhre b0a7e76974 Fixed an issue where text shaping could be permanently disabled after editing text 2024-08-22 00:10:13 +02:00
Leon Styhre 256ed24621 Documentation update 2024-08-21 21:22:49 +02:00
Leon Styhre fc40308cd7 (Android) Added a new default find rule entry for Flycast as its application ID has been changed 2024-08-21 21:14:32 +02:00
Leon Styhre 03c6fb3297 Added support for the de_DE locale 2024-08-21 21:03:38 +02:00
Leon Styhre a5a4937011 Documentation update 2024-08-20 23:25:33 +02:00
Leon Styhre 5a2e6ec537 (Android) Fonts and locales are now copied earlier than the other assets as HarfBuzz and libintl need them earlier in the startup process 2024-08-20 23:09:11 +02:00
Leon Styhre c630ad091c Documentation update 2024-08-20 18:20:20 +02:00
Leon Styhre 03149d0b33 Added support for the ca_AD locale 2024-08-20 17:53:39 +02:00
Leon Styhre 7e9590d7c3 Fixed an issue where theme names in the theme downloader could get abbreviated 2024-08-20 17:49:53 +02:00
Leon Styhre 8689b3aecf Fixed some Clang compiler warnings 2024-08-20 17:27:36 +02:00
Leon Styhre 3a5c4a7605 (Windows) Fixed some MSVC compiler warnings 2024-08-20 17:17:33 +02:00
Leon Styhre 3f2f8f9b57 Fixed a special line wrapping scenario where a trailing space should be removed 2024-08-20 17:16:19 +02:00
Leon Styhre 3552c6e228 Added layout and line wrapping support for shaped text and for mixing of LTR and RTL scripts 2024-08-20 00:13:44 +02:00
Leon Styhre bd6956d52f (FreeBSD) Added fallback method to locate binary 2024-08-19 17:22:30 +02:00
Leon Styhre 338843ce46 (FreeBSD) Added support for rebooting and powering off from inside ES-DE 2024-08-19 17:20:31 +02:00
Leon Styhre 3f5e277cd6 (FreeBSD) Added the man page to the CPack configuration 2024-08-19 17:18:21 +02:00
Leon Styhre 330f36ee14 (FreeBSD) Added support for building with DEINIT_ON_LAUNCH 2024-08-19 17:17:20 +02:00
Leon Styhre 2a9ab5ea88 DateTimeEditComponent no longer renders the debug overlay unless there is a string to display 2024-08-16 21:26:21 +02:00
Leon Styhre 302f6e0fc5 Added an assertion to GuiComponent::setSize() to check for negative mSize values 2024-08-13 21:42:50 +02:00
Leon Styhre eccc5095fb Fixed an issue where ComponentList could generate elements with negative widths 2024-08-13 21:41:17 +02:00
Leon Styhre 3f8abb0807 Removed direct use of Font::wrapText() from TextComponent 2024-08-12 22:03:17 +02:00
Leon Styhre 1d3b2f8066 Removed direct use of Font::wrapText() from OptionListComponent, TextEditComponent and TextListComponent 2024-08-12 20:51:52 +02:00
Leon Styhre 0723ae8364 (Haiku) Added find rule configuration for RetroArch
Also added a single core for testing purposes
2024-08-11 22:04:52 +02:00
Leon Styhre 9be6cdc42b Documentation update 2024-08-11 21:58:21 +02:00
Leon Styhre 17f55fd8cf (Haiku) Updated CMake configuration to make ES-DE build on Haiku Nightly (but no longer on R1/beta4) 2024-08-11 21:56:02 +02:00
Leon Styhre a841d4175a Changed a compiler silencing option to only apply to Clang 2024-08-11 19:26:14 +02:00
Leon Styhre 3d0701f288 Changed Font::buildTextCache() and Font::renderTextCache() to protected functions 2024-08-11 19:20:03 +02:00
Leon Styhre aba1163c44 Changed TextEditComponent to use TextComponent instead of using Font facilities directly 2024-08-11 19:01:47 +02:00
Leon Styhre 75fdd94d45 Minor code cleanup 2024-08-11 18:27:37 +02:00
Leon Styhre b0616fcbb1 Changed DateTimeEditComponent to use TextComponent instead of using Font facilities directly 2024-08-11 18:22:45 +02:00
Leon Styhre b697dc2a52 Reverted ButtonComponent and SliderComponent to render the debug overlays themselves 2024-08-11 18:14:39 +02:00
Leon Styhre 8ee7b6f118 Changed SliderComponent to use TextComponent instead of using Font facilities directly 2024-08-11 15:03:04 +02:00
Leon Styhre 5b7becf446 Changed ButtonComponent to use TextComponent instead of using Font facilities directly 2024-08-11 14:00:40 +02:00
Leon Styhre ccf680b433 Changed Window to use TextComponent instead of using Font facilities directly 2024-08-11 13:28:26 +02:00
Leon Styhre 8ff6f50635 Changed ScreenSaver to use TextComponent instead of using Font facilities directly 2024-08-11 12:32:04 +02:00
Leon Styhre 5776d37d54 Updated the pl_PL translations 2024-08-11 10:31:06 +02:00
Leon Styhre 3defff515d Documentation update 2024-08-10 16:36:23 +02:00
Leon Styhre 7353f04e66 (Haiku) Added support for the ScummVM Game Engine (scummvm) game system 2024-08-10 16:17:13 +02:00
Leon Styhre 3adee7c863 (Haiku) Added support for the Sony PlayStation Portable (psp) game system 2024-08-10 15:14:27 +02:00
Leon Styhre a9956e2f07 (Haiku) Added a ScreenScraper platform identifier 2024-08-10 15:13:05 +02:00
Leon Styhre c15eff8994 Added experimental support for building on Haiku 2024-08-10 14:28:24 +02:00
Leon Styhre 0347a276ea Silenced some Clang compiler warnings 2024-08-09 22:54:57 +02:00
Leon Styhre 2d84fa78db Documentation update 2024-08-09 22:14:00 +02:00
Leon Styhre 544abf1e81 Changed a code comment that referred to BSD Unix 2024-08-09 21:09:00 +02:00
Leon Styhre 9c07456d21 Removed support for NetBSD and OpenBSD 2024-08-09 21:05:12 +02:00
Leon Styhre 7791859d14 Added a menu title font size adjustment for the pl_PL translations 2024-08-09 19:51:35 +02:00
Leon Styhre f6b3f11714 Updated the pl_PL translations 2024-08-09 18:11:35 +02:00
Leon Styhre 92c3696843 Documentation update 2024-08-09 17:54:23 +02:00
Leon Styhre c63184f010 Replaced all built-in Unicode case conversion logic and lookup tables with facilities from the ICU library 2024-08-09 17:48:46 +02:00
Leon Styhre de317b4c91 (Windows) Fixed an MSVC compiler warning 2024-08-09 17:25:13 +02:00
Leon Styhre 22478ed145 (Windows) Added the ICU library as a dependency 2024-08-09 17:24:08 +02:00
Leon Styhre 2bbcdd375c (macOS) Added the ICU library as a dependency 2024-08-08 21:53:13 +02:00
Leon Styhre 6ad96ba252 (Android) Added the ICU library as a dependency 2024-08-08 20:28:29 +02:00
Leon Styhre 3afe2bacc3 Added the ICU library as a dependency 2024-08-08 20:26:10 +02:00
Leon Styhre ee61283e2b Removed a lot of unnecessary text processing 2024-08-06 20:31:26 +02:00
Leon Styhre b2e796c664 Documentation update 2024-08-05 22:49:46 +02:00
Leon Styhre 2c95d5a7d6 Fixed a source file header typo 2024-08-05 22:47:13 +02:00
Leon Styhre a7d673f541 Some font-related code and comments cleanup 2024-08-04 13:43:44 +02:00
Leon Styhre 03f6567dd5 Added support for the ar_EG locale 2024-08-04 13:02:00 +02:00
Leon Styhre 16697c0503 Added sharing of glyph atlas entries between shaped glyph entries that need the same texture 2024-08-04 12:46:57 +02:00
Leon Styhre 91d3f3a43a Fixed a regression where text shaping stopped working 2024-08-04 12:16:13 +02:00
Leon Styhre b288bd172c Removed a temporary member variable in Font and replaced it with proper argument passing 2024-08-04 11:52:25 +02:00
Leon Styhre 14c4e00bf2 Changed Font::shapeText() to pass the segments vector by reference 2024-08-04 11:31:03 +02:00
Leon Styhre 5d653a9e93 Reverted a change in TextComponent as it caused unforeseen issues 2024-08-03 21:20:28 +02:00
Leon Styhre 2e01613e41 Removed the offensive wrapText hacks and added some optimizations
Also changed the three dots to an actual ellipsis Unicode character when abbreviating text
2024-08-03 20:50:59 +02:00
Leon Styhre c873441851 Made accurate text layout work correctly using HarfBuzz 2024-08-03 19:04:45 +02:00
Leon Styhre 7a8bd97226 Added a precaution to prevent crashes in case of broken fonts being used 2024-08-03 14:54:49 +02:00
Leon Styhre 75b93794b0 Fixed another failure mode for the wrapText shaped text hack 2024-08-03 14:22:36 +02:00
Leon Styhre 4931ea9749 Changed to having HarfBuzz set the horizontal glyph advance 2024-08-03 14:09:51 +02:00
Leon Styhre b4b498ba29 Reverted some font changes that were not needed after all 2024-08-03 13:54:55 +02:00
Leon Styhre 908788da25 Fixed an issue where text was not correctly centered after line breaks 2024-08-03 00:18:41 +02:00
Leon Styhre c87d2e7584 RTL text segments are now flagged as such 2024-08-02 23:36:06 +02:00
Leon Styhre 09d16e9c16 Text shaping segments are no longer created by space characters 2024-08-02 23:34:44 +02:00
Leon Styhre b3ac8b6320 Changed the text shaping function to return the segment vector 2024-08-02 23:31:47 +02:00
Leon Styhre 9e7b02291b Added a hack to make shaped text wrap somehow correctly 2024-08-02 15:58:26 +02:00
Leon Styhre 45091547b7 Changed two font calculation functions to use shaped text
Also consolidated the HarfBuzz segment creation and shaping into a single function
2024-08-02 12:43:26 +02:00
Leon Styhre b1adbc0f2a Added support for the pl_PL locale 2024-08-01 21:36:45 +02:00
Leon Styhre 81bc30cc26 Fixed a text shaping issue when there was a font change for the last character of a string 2024-08-01 14:36:29 +02:00
Leon Styhre 84e850a507 Moved the text shaping to a separate function 2024-08-01 14:34:34 +02:00
Leon Styhre 412e74738a Moved the HarfBuzz segment building to a separate function
Also implemented segment caching and fixed an issue where missing glyphs were not handled correctly
2024-08-01 12:20:39 +02:00
Leon Styhre 82f6686cbf Changed the font VRAM usage calculation to actually only include texture data 2024-08-01 10:58:15 +02:00
Leon Styhre 7a3a8f8042 Added the nl_NL locale to locale/languages 2024-07-31 21:45:42 +02:00
Leon Styhre dff85c46a6 (Android) Added initial text shaping support 2024-07-31 21:38:46 +02:00
Leon Styhre f6c4acf2d7 Disabled building of HarfBuzz-subset on Windows and macOS 2024-07-31 20:54:27 +02:00
Leon Styhre 6185eeb0cc (macOS) Added initial text shaping support 2024-07-31 19:31:40 +02:00
Leon Styhre c1218d5033 (Windows) Added initial text shaping support 2024-07-31 19:15:59 +02:00
Leon Styhre 73b7f34f50 Fixed some font issues 2024-07-31 18:46:32 +02:00
Leon Styhre 539cdd8146 Added initial text shaping support 2024-07-31 18:44:26 +02:00
Leon Styhre 71ccaf193e Added the HarfBuzz library as a dependency 2024-07-31 18:26:32 +02:00
Leon Styhre f9d5b2b12e Added support for the nl_NL locale 2024-07-30 18:18:04 +02:00
Leon Styhre d52e175896 Updated the pt_BR translations 2024-07-29 23:44:13 +02:00
Leon Styhre 4c1b5fde3c Reorganized some per-language menu title font size entries 2024-07-29 11:25:38 +02:00
Leon Styhre 84ddb1c136 Updated the ro_RO translations 2024-07-29 11:05:32 +02:00
Leon Styhre 24418417eb Updated the ro_RO translations 2024-07-29 10:52:46 +02:00
Leon Styhre 456f9be771 Documentation update 2024-07-28 16:23:12 +02:00
Leon Styhre 192035e16a Clarified the custom event script sorting in a code comment 2024-07-28 16:21:44 +02:00
Leon Styhre 7e4a88a144 Changed one translation 2024-07-28 14:24:32 +02:00
Leon Styhre 440f45fff8 Updated the en_US, en_GB and sv_SE translations 2024-07-28 14:05:33 +02:00
Leon Styhre be0971cd3a Added a 'Dark with red' menu color scheme to improve perceived contrast on low-contrast displays 2024-07-28 14:02:37 +02:00
Leon Styhre c6a1924682 Updated the fr_FR translations 2024-07-28 11:01:44 +02:00
Leon Styhre 9caf43a095 Updated the ru_RU translations 2024-07-27 10:30:39 +02:00
Leon Styhre 5c846257b0 Updated the es_ES translations 2024-07-26 23:18:10 +02:00
Leon Styhre 4dba11dc50 Added a message to the Android translations 2024-07-26 23:12:28 +02:00
Leon Styhre cd04c97fc3 Documentation update 2024-07-26 22:31:34 +02:00
Leon Styhre 9703531273 Added a code comment regarding Unicode case mapping entries for the Latin Extended-B Unicode block 2024-07-26 21:16:27 +02:00
Leon Styhre 3b5d5a7da4 Added a StringUtil function to return the string length in Unicode characters 2024-07-26 21:09:51 +02:00
Leon Styhre 428bbc1416 Updated the ja_JP translations 2024-07-26 21:06:37 +02:00
Leon Styhre 9eac172000 Fixed an issue where the theme downloader percentage indicators did not render when using the ja_JP locale 2024-07-26 20:55:18 +02:00
Leon Styhre fcbcae1e77 Updated the ja_JP translations 2024-07-26 20:02:48 +02:00
Leon Styhre 73067f76a3 Updated the ro_RO translations 2024-07-26 18:01:51 +02:00
Leon Styhre 2ebb41a316 Updated the fr_FR translations 2024-07-26 16:49:19 +02:00
Leon Styhre 3ba6ebb37f Updated the es_ES translations 2024-07-26 11:53:34 +02:00
Leon Styhre b93e24295e Updated the fr_FR translations 2024-07-26 11:43:03 +02:00
Leon Styhre 1f847fff8a Updated the sv_SE translations 2024-07-25 21:08:01 +02:00
Leon Styhre a8ccd77aa7 Updated the ja_JP translations 2024-07-25 20:36:00 +02:00
Leon Styhre f792e9665c Documentation update 2024-07-25 16:03:33 +02:00
Leon Styhre 7bdd015f03 Updated the pt_BR translations 2024-07-25 16:00:23 +02:00
Leon Styhre 0d41632352 Added a menu title font size adjustment for the Japanese translations 2024-07-25 13:13:00 +02:00
Leon Styhre f48689a427 Updated the en_GB, ro_RO, sv_SE and zh_CN translations 2024-07-25 12:30:48 +02:00
Leon Styhre 4d4c493116 Updated the en_US translations 2024-07-25 12:26:04 +02:00
Leon Styhre 71e1bab958 Updated the pt_BR translations 2024-07-24 21:29:22 +02:00
Leon Styhre b1a1f2dbd8 Updated the ro_RO translations 2024-07-24 21:26:37 +02:00
Leon Styhre a6e3f638bf Updated the pt_BR translations 2024-07-24 19:19:57 +02:00
Leon Styhre 9300f00b94 Added case conversion support for the Latin Extended-B Unicode block 2024-07-24 19:02:30 +02:00
Leon Styhre d5b075b4d8 Added a missing translation 2024-07-24 17:18:09 +02:00
Leon Styhre 5b35a6ac91 Updated the es_ES, fr_FR, it_IT, ja_JP, ro_RO and ru_RU translations 2024-07-24 11:59:09 +02:00
Leon Styhre 0cf89ea875 Changed some per-language menu title font sizes 2024-07-24 11:57:24 +02:00
Leon Styhre ab2d5d998e Updated the el_GR translations 2024-07-24 11:55:46 +02:00
Leon Styhre dd436bbda8 Updated the pt_BR translations 2024-07-24 11:54:47 +02:00
Leon Styhre fa763336e0 Updated the zh_CN translations 2024-07-24 11:54:08 +02:00
Leon Styhre 5ac4c390d5 Updated the sv_SE translations 2024-07-24 11:53:14 +02:00
Leon Styhre e83f738073 Updated the en_GB translations 2024-07-24 11:51:18 +02:00
Leon Styhre 26d229e159 Updated the en_US translations 2024-07-24 11:50:31 +02:00
Leon Styhre 076709b239 Moved the Ubuntu Condensed font higher in the loading order 2024-07-24 11:47:12 +02:00
Leon Styhre d55ddf61c5 Added plural forms to two translation strings 2024-07-24 11:38:10 +02:00
Leon Styhre c9bc2b7695 Updated the pt_BR translations 2024-07-24 11:12:49 +02:00
Leon Styhre f4bc3a1cf4 Documentation update 2024-07-23 19:52:23 +02:00
Leon Styhre 7d8b89ee00 Updated the el_GR, es_ES, fr_FR, it_IT, ja_JP, pt_BR, ro_RO and ru_RU translations 2024-07-23 19:51:18 +02:00
Leon Styhre 7db5895c86 Updated the zh_CN translations 2024-07-23 19:32:45 +02:00
Leon Styhre d0bb8968b0 Updated the sv_SE translations 2024-07-23 19:31:43 +02:00
Leon Styhre f08528711b Updated the en_GB translations 2024-07-23 19:30:22 +02:00
Leon Styhre 20cb280b97 Updated the en_US translations 2024-07-23 19:29:36 +02:00
Leon Styhre ea2f29a5c9 Changed some translation hinting to use context information instead 2024-07-23 19:28:08 +02:00
Leon Styhre f4d1534bab Added gettext context support 2024-07-23 18:17:44 +02:00
Leon Styhre 2d991a52b9 Updated the en_GB translations 2024-07-23 11:42:58 +02:00
Leon Styhre f84caff123 Made some size adjustments to GuiThemeDownloader 2024-07-23 11:31:16 +02:00
Leon Styhre 733c46eff2 Updated the zh_CN translations 2024-07-23 10:37:41 +02:00
Leon Styhre a1e31331b5 Added support for the ro_RO locale 2024-07-23 10:34:12 +02:00
Leon Styhre 39e0a1773b Added support for the ru_RU locale 2024-07-22 16:12:04 +02:00
Leon Styhre b8bae01c38 Documentation update 2024-07-22 11:30:28 +02:00
Leon Styhre b076933623 Updated the sv_SE translations 2024-07-22 11:26:53 +02:00
Leon Styhre d86923fb98 Added menu title per-language font sizing to the entire application 2024-07-22 11:25:25 +02:00
Leon Styhre 298b371715 Added support for the es_ES locale 2024-07-21 11:50:06 +02:00
Leon Styhre 1f605347c3 Added support for the el_GR locale 2024-07-21 11:37:53 +02:00
Leon Styhre afea0eace9 Added support for the fr_FR locale 2024-07-21 11:13:49 +02:00
Leon Styhre 0582856b84 Fixed an issue where formatting translation strings could lead to crashes on some platforms 2024-07-20 22:17:44 +02:00
Leon Styhre 5fefb5960b Documentation update 2024-07-20 19:48:13 +02:00
Leon Styhre 2dc805bcbd (Linux) Added workaround for a library or OS bug that prevented some locales from working correctly 2024-07-20 16:50:44 +02:00
Leon Styhre 75bff1f0df (Windows) Added a missing DLL file 2024-07-20 15:58:39 +02:00
Leon Styhre bb22747a1b Documentation update 2024-07-20 13:44:45 +02:00
Leon Styhre f1ee285b3e Added support for the pt_BR locale 2024-07-20 13:42:51 +02:00
Leon Styhre 335b3dd4ff Added support for the ja_JP locale 2024-07-20 13:35:37 +02:00
Leon Styhre 01406c27c3 Added support for the it_IT locale 2024-07-20 13:31:21 +02:00
Leon Styhre 0b5b0e0572 Added support for the en_GB locale 2024-07-20 13:24:37 +02:00
Leon Styhre 7ef8f6cc28 Fixed some translation issues 2024-07-20 13:15:56 +02:00
Leon Styhre ff3e1c3a72 Updated the zh_CN translations 2024-07-20 11:51:55 +02:00
Leon Styhre 2cf591f99d Documentation update 2024-07-19 13:44:58 +02:00
Leon Styhre d3e2e5085b Documentation update 2024-07-19 13:06:21 +02:00
Leon Styhre 324d83ffd9 Updated the zh_CN translations 2024-07-19 10:58:58 +02:00
Leon Styhre 873a8e5d96 Updated the zh_CN translations 2024-07-19 10:57:31 +02:00
Leon Styhre 8d5dcb494a Updated the PO message catalog files with some changed translation strings 2024-07-19 10:40:58 +02:00
Leon Styhre 611b8bfdd7 Updated some localization strings 2024-07-19 10:40:04 +02:00
Leon Styhre 38d232769c Documentation update 2024-07-18 15:46:22 +02:00
Leon Styhre 48585d5ca5 Updated the zh_CN translations 2024-07-18 15:45:24 +02:00
Leon Styhre fedc264087 Added some sv_SE translations 2024-07-18 15:18:39 +02:00
Leon Styhre 27c01e3b1e Added some en_US translations 2024-07-18 15:09:41 +02:00
Leon Styhre 72ee58e748 Added localization support to parts of the application 2024-07-18 15:07:41 +02:00
Leon Styhre 9207004bd2 Added some sv_SE translations 2024-07-17 19:53:03 +02:00
Leon Styhre ddbbf06fe7 Added some en_US translations 2024-07-17 19:52:29 +02:00
Leon Styhre 47a8363f32 Added localization support to parts of the application 2024-07-17 19:51:18 +02:00
Leon Styhre 13fadd1658 Removed some obsolete code from DateTimeEditComponent 2024-07-17 16:49:51 +02:00
Leon Styhre ad2dd1832f Added some sv_SE translations 2024-07-17 14:18:17 +02:00
Leon Styhre 3d687357bc Added some en_US translations 2024-07-17 14:16:19 +02:00
Leon Styhre 35f51e6904 Added localization support to parts of the application 2024-07-17 14:14:59 +02:00
Leon Styhre 085b3da8e0 Fixed some potential crashes when encountering scraper errors 2024-07-17 12:57:05 +02:00
Leon Styhre 8ca231ceb4 (macOS) Removed an obsolete license file 2024-07-17 11:36:17 +02:00
Leon Styhre 2bbb2ba0cc Added the Android translatable strings file to the locale directory 2024-07-16 21:54:23 +02:00
Leon Styhre 5bea1dfb8b Reverted the change where StringUtil::toCapitalized() would capitalize characters follow apostrophes 2024-07-16 21:27:29 +02:00
Leon Styhre b067481f3f tringUtil::toCapitalized() will now capitalize characters following apostrophes and quotation marks 2024-07-16 21:25:08 +02:00
Leon Styhre 7ea52c13a5 StringUtil::toCapitalized() will now capitalize characters following the ( and [ characters 2024-07-16 21:19:49 +02:00
Leon Styhre cac5ec0402 Fixed an issue where the StringUtil::toCapitalized() function didn't correctly capitalize multi-byte Unicode characters
Also modernized some code
2024-07-16 21:13:50 +02:00
Leon Styhre be3aea7845 (Linux) Added a systempath find rule for the ryujinx binary name for the Ryujinx emulator 2024-07-16 19:30:24 +02:00
Leon Styhre f7be57336b (Windows) Fixed some MSVC compiler warnings 2024-07-16 16:58:55 +02:00
Leon Styhre 8a56304eba Added some sv_SE translations 2024-07-16 16:51:58 +02:00
Leon Styhre fa355cdb8f Added some en_US translations 2024-07-16 16:51:37 +02:00
Leon Styhre 062288ad07 Added localization support to parts of the application 2024-07-16 16:50:46 +02:00
Leon Styhre c8259aa792 Added some sv_SE translations 2024-07-16 13:58:17 +02:00
Leon Styhre bcf902b46d Added some en_US translations 2024-07-16 13:57:39 +02:00
Leon Styhre 14b65cb2e4 Added localization support to parts of the application 2024-07-16 13:56:35 +02:00
Leon Styhre 5e3d07bb56 Fixed an issue where some localization changes led to crashes 2024-07-16 12:15:29 +02:00
Leon Styhre 5e1d7c6a87 Added some sv_SE translations 2024-07-16 12:06:25 +02:00
Leon Styhre cd863de77b Added some en_US translations 2024-07-16 12:05:27 +02:00
Leon Styhre b13c3ee582 Added localization support to parts of the application 2024-07-16 12:04:50 +02:00
Leon Styhre 42f7e46d08 Added localization plural rules support 2024-07-16 10:15:42 +02:00
Leon Styhre a1cb6ce4c4 Added some sv_SE translations 2024-07-15 18:40:09 +02:00
Leon Styhre e47225d436 Added some en_US translations 2024-07-15 18:39:17 +02:00
Leon Styhre d0605ea650 Added localization support to parts of the application 2024-07-15 18:38:23 +02:00
Leon Styhre 4ffc5d6bf9 Added a very simplified implementation of std::format 2024-07-15 17:39:03 +02:00
Leon Styhre 9a78863f03 Added some sv_SE translations 2024-07-14 23:48:02 +02:00
Leon Styhre 4ae460b41a Added some en_US translations 2024-07-14 23:47:37 +02:00
Leon Styhre f9886b904f Added localization support to parts of the application 2024-07-14 23:46:33 +02:00
Leon Styhre c8bbebffac Documentation update 2024-07-14 18:05:16 +02:00
Leon Styhre 554593e542 Added some sv_SE translations 2024-07-14 18:04:21 +02:00
Leon Styhre e8a7ba6ad4 Added some en_US translations 2024-07-14 18:03:33 +02:00
Leon Styhre c2beb86bcc Added localization support to parts of the application 2024-07-14 18:01:54 +02:00
Leon Styhre 84f296badd Added some sv_SE translations 2024-07-14 16:50:06 +02:00
Leon Styhre b5b36e09b3 Added some en_US translations 2024-07-14 16:49:43 +02:00
Leon Styhre 557748970a Added localization support to parts of the application 2024-07-14 16:48:31 +02:00
Leon Styhre d2d4b6d45c (Android) Added JL-Mod standalone as an alternative emulator for the j2me system 2024-07-14 16:40:53 +02:00
Leon Styhre db072d7318 Added some sv_SE translations 2024-07-14 14:00:53 +02:00
Leon Styhre e7170c45e4 Added some en_US translations 2024-07-14 14:00:05 +02:00
Leon Styhre 6766fd2ca1 Added localization support to parts of the application 2024-07-14 13:58:57 +02:00
Leon Styhre d1427a1ea3 Added some sv_SE translations 2024-07-14 12:37:09 +02:00
Leon Styhre abfa5ba0e8 Added some en_US translations 2024-07-14 12:36:49 +02:00
Leon Styhre ac7f912654 Added localization support to parts of the application 2024-07-14 12:35:40 +02:00
Leon Styhre f5dbaa3224 (Android) Added J2ME Loader standalone as the default emulator for the j2me system 2024-07-14 11:06:24 +02:00
Leon Styhre a1617c51f1 Fixed a build error when using the OpenGL ES renderer 2024-07-14 10:39:27 +02:00
Leon Styhre 6d7135fc08 Added some sv_SE translations 2024-07-13 22:16:15 +02:00
Leon Styhre 7ac69f9371 Added some en_US translations 2024-07-13 22:15:37 +02:00
Leon Styhre f088658004 Added localization support to parts of the application 2024-07-13 22:14:37 +02:00
Leon Styhre 7f4f06eedc Removed the code location info from all PO message catalog files 2024-07-13 19:26:41 +02:00
Leon Styhre badbc2fb3a Added some sv_SE translations 2024-07-13 19:19:12 +02:00
Leon Styhre 74e9c62534 Added some en_US translations 2024-07-13 19:17:49 +02:00
Leon Styhre be95b494dc Added localization support to parts of the application 2024-07-13 19:14:34 +02:00
Leon Styhre f6db47510d Added some en_US translations 2024-07-13 12:33:52 +02:00
Leon Styhre 4c3a95d537 Added some sv_SE translations 2024-07-13 12:32:54 +02:00
Leon Styhre e0c57b068d Added localization support to parts of the application 2024-07-13 12:32:16 +02:00
Leon Styhre 9e8143820e Added explicit linking of the libintl library on Unix systems where the gettext functions are not part of the C standard library 2024-07-13 11:24:53 +02:00
Leon Styhre 3c3143bad7 Added some sv_SE translations 2024-07-12 23:03:28 +02:00
Leon Styhre a6ef256a49 Added localization support to parts of the application 2024-07-12 23:02:36 +02:00
Leon Styhre b18423d25a Documentation update 2024-07-12 21:26:01 +02:00
Leon Styhre 59507ecc0c Renamed the zh_rCN locale to zh_CN 2024-07-12 21:25:43 +02:00
Leon Styhre bb9b09ef89 Fixed some log messages when using a noload.txt file for a subdirectory 2024-07-10 23:56:36 +02:00
Leon Styhre 196e0d1031 Added support for skipping the scanning of game system subdirectories 2024-07-10 22:42:25 +02:00
Leon Styhre a5b1b17c2c Changed the application name in all header files 2024-07-10 18:04:40 +02:00
Leon Styhre 602b37febe Documentation update 2024-07-10 17:54:55 +02:00
Leon Styhre 8c0bfa2e3b Fixed small issue for the sv_SE translations 2024-07-10 17:53:47 +02:00
Leon Styhre 6d9a95a667 Added initial zh_rCN localization support 2024-07-10 17:52:44 +02:00
Leon Styhre c56b8d9230 Added the Ardens RetroArch core as an alternative emulator for the arduboy system
Also added the .arduboy file extension
2024-07-10 17:47:52 +02:00
Leon Styhre 18f5f3e164 (Android) Added support for using the %BASENAME% variable with the %EXTRA% and %EXTRAARRAY% variables 2024-07-10 17:44:41 +02:00
Leon Styhre 95433503e5 Updated SDL to 2.30.5 on Android, Windows, macOS and the Linux AppImage builds 2024-07-09 22:40:36 +02:00
Leon Styhre ab39b3759e Dramatically improved start times for the video and slideshow screensavers on devices with poor disk I/O performance 2024-07-09 21:42:24 +02:00
Leon Styhre a5c07b5b38 Documentation update 2024-07-08 17:54:19 +02:00
Leon Styhre 43060f9b41 Added an error popup if incorrect credentials are used when scraping using ScreenScraper 2024-07-08 17:53:15 +02:00
Leon Styhre 7b4cfefbc4 Fixed a typo where the 32:9 aspect ratio was referred to as 32:0 2024-07-06 13:07:25 +02:00
Leon Styhre 706727ff96 Added two flags to the msgfmt command when compiling message catalog files using update_translation_strings.sh 2024-07-04 21:57:35 +02:00
Leon Styhre 009b5b8d33 (Android) Localization files are now always setup on startup 2024-07-04 21:49:46 +02:00
Leon Styhre 311ad93337 (Android) Localization message catalog files are no longer compiled via the CMake configuration 2024-07-04 20:30:47 +02:00
Leon Styhre 36215d9d67 Updated the sv_SE localizations 2024-07-04 19:38:12 +02:00
Leon Styhre a252ec0e4e Added initial en_US localization support 2024-07-04 19:36:13 +02:00
Leon Styhre 80bf0c320a Some localization changes in GuiMenu 2024-07-04 19:34:04 +02:00
Leon Styhre 1df2641e0c Changed to scaling the menu title per language instead of the overall menu 2024-07-04 19:33:07 +02:00
Leon Styhre 6b541ad501 Added localization support to parts of the application 2024-07-04 18:53:13 +02:00
Leon Styhre 1700bb195c Removed some forced uppercase conversions 2024-07-04 18:47:26 +02:00
Leon Styhre 661bb5d539 Added support for per-language menu scaling 2024-07-04 18:38:49 +02:00
Leon Styhre dfc217d006 Added localization support for en_US to be able to handle special cases 2024-07-04 18:36:37 +02:00
Leon Styhre 12e1a683e5 Small cosmetic change to a ScreenScraper debug message 2024-07-03 21:02:30 +02:00
Leon Styhre 0094a32d8e Documentation update 2024-07-02 23:58:32 +02:00
Leon Styhre eeccee307d Added a menu option for selecting the application language 2024-07-02 23:57:44 +02:00
Leon Styhre e3148e6cda (Windows) Added an extra precaution in case of an invalid locale entry 2024-07-02 22:09:51 +02:00
Leon Styhre 2d3a559cee Added support for falling back to the closest matching locale if there is not an exact match 2024-07-02 22:05:40 +02:00
Leon Styhre 74691c8951 Added a license file for libintl (gettext) 2024-07-02 20:46:15 +02:00
Leon Styhre 91333b5273 Changed some copyright messages 2024-07-02 18:08:15 +02:00
Leon Styhre 63729cce19 (Android) Added localization support 2024-07-02 18:04:42 +02:00
Leon Styhre 302305b3ee Changed to using SDL_GetPreferredLocales() also on Linux
Also set the LANGUAGE environment variable on Linux
2024-06-30 23:22:48 +02:00
Leon Styhre 552f540a49 (macOS) Added language auto-detection 2024-06-30 23:10:04 +02:00
Leon Styhre 51c9507b87 (Windows) Added localization support 2024-06-30 22:27:22 +02:00
Leon Styhre 272e5834e0 (Windows) Added partial localization support 2024-06-30 19:47:43 +02:00
Leon Styhre c70684e654 (macOS) Added libiconv as a dependency library 2024-06-30 17:33:54 +02:00
Leon Styhre 6256f44455 (macOS) Added localization support 2024-06-30 15:44:09 +02:00
Leon Styhre c576968e65 Added tools script for updating the translation strings and for compiling the message catalog files 2024-06-30 13:46:14 +02:00
Leon Styhre fec433d4b2 Added CMake configuration for compiling localization message catalog files
Also added initial message catalog files
2024-06-30 13:44:48 +02:00
Leon Styhre ec8a49623a Added initial localization support 2024-06-29 21:24:28 +02:00
Leon Styhre b7b873e553 Documentation update 2024-06-29 10:26:02 +02:00
Leon Styhre 82bd856366 (Windows) Fixed an issue where video textures were sometimes not aligned correctly 2024-06-28 22:44:21 +02:00
Leon Styhre 38a99abf79 (Windows) Video textures were sometimes not aligned correctly horizontally 2024-06-28 22:17:19 +02:00
Leon Styhre 56c7d4cf95 Documentation update 2024-06-28 18:43:29 +02:00
Leon Styhre 5cd635b138 Documentation update 2024-06-26 20:16:45 +02:00
Leon Styhre 10e398b23a Documentation update 2024-06-26 17:09:11 +02:00
Leon Styhre 4ce33e6961 (Android) Added support for launching individual games directly with EKA2L1 for the symbian system 2024-06-26 17:04:53 +02:00
Leon Styhre 39e11b270f Documentation update 2024-06-23 23:16:05 +02:00
Leon Styhre c74e30d593 (Android) Small cosmetic change in es_find_rules.xml 2024-06-23 23:15:19 +02:00
Leon Styhre eb75f79b70 Game files with only an extension and no filename will now get skipped on application startup 2024-06-23 21:41:53 +02:00
Leon Styhre cfa53c5097 Fixed a GCC compiler warning 2024-06-23 21:39:02 +02:00
Leon Styhre 4ddf13a833 Added the -D_GLIBCXX_ASSERTIONS and -D_FORTIFY_SOURCE=3 options when building using AddressSanitizer or UndefinedBehaviorSanitizer 2024-06-23 21:30:59 +02:00
Leon Styhre 2aa52d69e5 Documentation update 2024-06-23 15:08:35 +02:00
Leon Styhre 0c3d1bf880 (macOS) Fixed a license file formatting issue 2024-06-23 14:54:59 +02:00
Leon Styhre 33ab4b4088 Copyright update 2024-06-23 14:35:00 +02:00
Leon Styhre 5feef892c0 Changed CPACK_DEBIAN_PACKAGE_MAINTAINER 2024-06-23 14:29:51 +02:00
Leon Styhre 6ec18005d6 Changed CPACK_PACKAGE_VENDOR 2024-06-23 14:03:13 +02:00
Leon Styhre 1befae20e9 Documentation update 2024-06-20 12:30:01 +02:00
Leon Styhre b8e3656547 Added NooDS standalone as an alternative emulator for the gba and nds systems on Android, Linux and Windows 2024-06-20 12:17:25 +02:00
Leon Styhre aa3eaf69aa (Android) Changed the find rule for Ruffle to make game launching work again after a code change in the emulator 2024-06-20 11:41:23 +02:00
Leon Styhre 28380963a0 Updated latest_release.json for the Android 3.0.3-26 release 2024-06-20 09:18:44 +02:00
Leon Styhre cd7b393375 (Linux) Added a systempath find rule for the ppsspp binary name for the PPSSPP emulator 2024-06-17 20:16:47 +02:00
Leon Styhre ecf3ea2984 Documentation update 2024-06-17 17:26:41 +02:00
Leon Styhre 64ecbb5dde Added MAME standalone as the default emulator for the dragon32 and tanodragon systems on Linux, macOS and Windows
Also added the .7z and .zip file extensions
2024-06-17 17:22:12 +02:00
Leon Styhre 82b21ec1eb (Android) Added support for the Dragon Data Dragon 32 (dragon32) and Tano Dragon (tanodragon) game systems 2024-06-17 17:21:08 +02:00
Leon Styhre 592f132dcd Text within parantheses is no longer stripped out from the game name popup when adding or removing games from custom collections 2024-06-17 17:05:27 +02:00
Leon Styhre ebd1662ad5 Documentation update 2024-06-16 22:40:17 +02:00
Leon Styhre 990e26369d Added 'backgroundMargins' and 'backgroundCornerRadius' properties to the datetime element 2024-06-16 22:39:41 +02:00
Leon Styhre 1898a161b4 (Android) Changed a RetroArch find rules comment 2024-06-16 22:15:23 +02:00
Leon Styhre 14064ac603 (Android) Added the version code to the GuiMenu version string also for prereleases 2024-06-16 22:05:54 +02:00
Leon Styhre 8b5a447da6 Bumped the version to 3.1.0-alpha 2024-06-16 21:47:12 +02:00
Leon Styhre 8d4322ca8f Documentation update 2024-06-16 14:44:28 +02:00
Leon Styhre 81e6b81a04 Documentation update 2024-06-16 10:53:55 +02:00
122 changed files with 26763 additions and 18744 deletions

View file

@ -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 | |

View file

@ -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 | |

View file

@ -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

View file

@ -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)** \

View file

@ -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?

View file

@ -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.

View file

@ -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.

View file

@ -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.

View file

@ -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**

View file

@ -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

View file

@ -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>

View file

@ -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 |

View 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).

View file

@ -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

View 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"
};

View file

@ -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

View file

@ -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();

View file

@ -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.

View file

@ -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?";

View file

@ -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
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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__)
mVersion.setText(applicationName + " " + Utils::String::toUpper(PROGRAM_VERSION_STRING) + "-" +
std::to_string(ANDROID_VERSION_CODE) + " (Built " + __DATE__ + ")");
#else
mVersion.setText(applicationName + " " + Utils::String::toUpper(PROGRAM_VERSION_STRING) +
" (Built " + __DATE__ + ")");
#endif
#else
#if defined(__ANDROID__)
mVersion.setText(applicationName + " " + Utils::String::toUpper(PROGRAM_VERSION_STRING) + "-" +
std::to_string(ANDROID_VERSION_CODE));
#else
mVersion.setText(applicationName + " " + Utils::String::toUpper(PROGRAM_VERSION_STRING));
#endif
#endif
#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
mVersion.setText(applicationName + " " + Utils::String::toUpper(PROGRAM_VERSION_STRING) +
" (Built " + __DATE__ + ")");
#endif
#else
#if defined(__ANDROID__)
mVersion.setText(applicationName + " " + Utils::String::toUpper(PROGRAM_VERSION_STRING) + "-" +
std::to_string(ANDROID_VERSION_CODE));
#else
mVersion.setText(applicationName + " " + Utils::String::toUpper(PROGRAM_VERSION_STRING));
#endif
#endif
#if defined(RETRODECK)
// Only execute this block if RETRODECK is defined

View file

@ -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";

View file

@ -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);

View file

@ -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),
mMenuColorTitle, ALIGN_LEFT);
mCenterGrid->setEntry(mLocalChanges, glm::ivec2 {3, 2}, false, true, glm::ivec2 {2, 1});
mInfoField = std::make_shared<TextComponent>("", Font::get(fontSizeSmall, FONT_PATH_BOLD),
mMenuColorTitle, ALIGN_LEFT);
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"};

View file

@ -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;

View file

@ -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);

View file

@ -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?";

View file

@ -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);
}

View file

@ -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,21 +184,18 @@ 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)
Utils::String::replace(Utils::FileSystem::getAppDataDirectory(), "/", "\\") +
"\nTO THE FOLLOWING:\n" +
Utils::String::replace(
Utils::FileSystem::getParent(Utils::FileSystem::getAppDataDirectory()), "/", "\\") +
"\\ES-DE"
};
Utils::String::replace(Utils::FileSystem::getAppDataDirectory(), "/", "\\") +
"\nTO THE FOLLOWING:\n" +
Utils::String::replace(
Utils::FileSystem::getParent(Utils::FileSystem::getAppDataDirectory()), "/", "\\") +
"\\ES-DE"};
#else
Utils::FileSystem::getAppDataDirectory() + "\nTO THE FOLLOWING:\n" +
Utils::FileSystem::getParent(Utils::FileSystem::getAppDataDirectory()) + "/ES-DE"
};
Utils::FileSystem::getAppDataDirectory() + "\nTO THE FOLLOWING:\n" +
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);

View file

@ -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

View file

@ -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();

View file

@ -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};

View file

@ -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},

View file

@ -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

View file

@ -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);

View file

@ -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()

View file

@ -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"))

View file

@ -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"))

View file

@ -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

View file

@ -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};

View file

@ -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)));

View file

@ -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;

View file

@ -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);

View file

@ -67,29 +67,42 @@ namespace Utils
if (!isDirectory(genericPath))
return contentList;
if (recursive) {
try {
if (recursive) {
#if defined(_WIN64)
for (auto& entry : std::filesystem::recursive_directory_iterator(
Utils::String::stringToWideString(genericPath))) {
contentList.emplace_back(
Utils::String::wideStringToString(entry.path().generic_wstring()));
for (auto& entry : std::filesystem::recursive_directory_iterator(
Utils::String::stringToWideString(genericPath))) {
contentList.emplace_back(
Utils::String::wideStringToString(entry.path().generic_wstring()));
#else
for (auto& entry : std::filesystem::recursive_directory_iterator(genericPath)) {
contentList.emplace_back(entry.path().generic_string());
for (auto& entry : std::filesystem::recursive_directory_iterator(genericPath)) {
contentList.emplace_back(entry.path().generic_string());
#endif
}
}
else {
#if defined(_WIN64)
for (auto& entry : std::filesystem::directory_iterator(
Utils::String::stringToWideString(genericPath))) {
contentList.emplace_back(
Utils::String::wideStringToString(entry.path().generic_wstring()));
#else
for (auto& entry : std::filesystem::directory_iterator(genericPath)) {
contentList.emplace_back(entry.path().generic_string());
#endif
}
}
}
else {
catch (...) {
#if defined(_WIN64)
for (auto& entry : std::filesystem::directory_iterator(
Utils::String::stringToWideString(genericPath))) {
contentList.emplace_back(
Utils::String::wideStringToString(entry.path().generic_wstring()));
LOG(LogError) << "FileSystemUtil::getDirContent(): Couldn't read directory " << "\""
<< Utils::String::replace(path, "/", "\\")
<< "\", permission problems?";
#else
for (auto& entry : std::filesystem::directory_iterator(genericPath)) {
contentList.emplace_back(entry.path().generic_string());
LOG(LogError) << "FileSystemUtil::getDirContent(): Couldn't read directory " << "\""
<< path << "\", permission problems?";
#endif
}
return contentList;
}
contentList.sort();

View file

@ -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

View file

@ -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

View file

@ -1 +1 @@
git diff -U0 --no-color HEAD^ | clang-format-diff -i -p1
// git diff -U0 --no-color HEAD^ | clang-format-diff -i -p1

View file

@ -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",

View file

@ -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>

File diff suppressed because it is too large Load diff

View file

@ -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

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

2913
locale/po/nl_NL.po Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -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>

View file

@ -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>

File diff suppressed because it is too large Load diff

View file

@ -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-----

View file

@ -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">

View file

@ -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>

View file

@ -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>

View file

@ -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> -->

View file

@ -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">

View file

@ -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>

View file

@ -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">

View file

@ -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>

View file

@ -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">

View file

@ -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">

View file

@ -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>

View file

@ -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:

View file

@ -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>

View file

@ -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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View file

@ -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:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 440 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 464 KiB

After

Width:  |  Height:  |  Size: 386 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 330 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Some files were not shown because too many files have changed in this diff Show more