No description
Find a file
JosJuice 3f4b57635e
android: Use case insensitivity in DocumentsTree (#7115)
* android: Unify DocumentNode's `key` and `name`

They're effectively the same data, just obtained in different ways.

* android: Remove getFilenameWithExtensions method

After the previous commit, there's only one remaining use of
getFilenameWithExtensions. Let's get rid of that one in favor of
DocumentFile.getName so we no longer need to do manual URI parsing.

* android: Use case insensitivity in DocumentsTree

External storage on Android is case insensitive. This is still the case
when accessing it through SAF. (Of course, SAF makes no guarantees about
whether the storage location picked by the user is backed by external
storage or whether it's case insensitive, but I'm just going to ignore
that for now because I am *so tired of SAF*)

Because the underlying file system is case insensitive, Citra's caching
layer that had to be implemented because SAF's performance is atrocious
also needs to be case insensitive. Otherwise, we get a problem in the
following scenario:

1. Citra wants to check if a particular folder exists in sdmc, and if
   not, create it.
2. The folder does exist, but it has a different capitalization than
   Citra expects, due to a mismatch between Citra's code and (typically)
   files dumped from a real 3DS using ThreeSD.
3. Citra tries to open the folder, but DocumentsTree fails to find it,
   because the case doesn't match.
4. Citra then tries to create the folder, but creating the folder fails,
   because the underlying filesystem considers the folder to exist.
5. The game fails to start.

(Sorry, did I say creating the folder fails? Actually, a new folder does
get created, with " (1)" appended to the end of the name. SAF makes no
guarantees whatsoever about what happens in this situation – it's all
determined by the storage provider!)

This commit makes the caching layer case insensitive so that the
described scenario will work better.
2023-11-07 11:46:25 -08:00
.ci build: Remove need for system Python to download Qt on macOS. (#7125) 2023-11-06 12:26:50 -08:00
.github qt: Update to 6.6.0 (#7099) 2023-11-01 17:58:02 -07:00
CMakeModules build: Remove need for system Python to download Qt on macOS. (#7125) 2023-11-06 12:26:50 -08:00
dist qt: Update to 6.6.0 (#7099) 2023-11-01 17:58:02 -07:00
externals video_core: Implement an arm64 shader-jit backend (#7002) 2023-11-05 21:40:31 +01:00
hooks hook: remove clang-format check 2017-02-17 13:52:23 +02:00
src android: Use case insensitivity in DocumentsTree (#7115) 2023-11-07 11:46:25 -08:00
.gitattributes Meta: Add gitattributes file 2018-09-22 14:59:15 -06:00
.gitignore Add Kdevelop files to .gitignore (#6951) 2023-09-07 11:52:40 -07:00
.gitmodules video_core: Implement an arm64 shader-jit backend (#7002) 2023-11-05 21:40:31 +01:00
CMakeLists.txt audio_core: Replace AAC decoders with single FAAD2-based decoder. (#7098) 2023-11-04 14:56:13 -07:00
CONTRIBUTING.md CONTRIBUTING.md: migrate to the wiki 2018-11-08 00:15:55 -05:00
Doxyfile Remove every trailing whitespace from the project (but externals). 2015-05-29 21:59:29 +01:00
keys.tar.enc Flatpak support (#4383) 2018-11-07 21:33:36 -05:00
license.txt Replace non-commercial icons with free icons from icons8 (#5093) 2020-03-26 13:40:03 -05:00
README.md github: Improve Readme and add better issue templates (#6276) 2023-02-13 14:51:09 +01:00


Citra
Citra

Citra is the world's most popular, open-source, Nintendo 3DS emulator.
It is written in C++ with portability in mind and builds are actively maintained for Windows, Linux, Android and macOS.

GitHub Actions Build Status Discord

Compatibility | Releases | Development | Building | Support | License

Compatibility

The emulator is capable of running most commercial games at full speed, provided you meet the necessary hardware requirements.

For a full list of games Citra supports, please visit our Compatibility page

Check out our website for the latest news on exciting features, progress reports, and more! Please read the FAQ before getting started with the project.

Need help? Check out our asking for help guide.

Releases

Citra has two main release channels: Nightly and Canary.

The Nightly build is based on the master branch, and contains already reviewed and tested features.

The Canary build is based on the master branch, but with additional features still under review. PRs tagged canary-merge are merged only into the Canary builds.

Both builds can be installed with the installer provided on the website, but those looking for specific versions or standalone releases can find them in the release tabs of the Nightly and Canary repositories.

Android builds can be downloaded from the Google Play Store.

A Flatpak for Citra is available on Flathub. Details on the build process can be found in our Flathub repository.

Development

Most of the development happens on GitHub. It's also where our central repository is hosted. For development discussion, please join us on our Discord server or at #citra-dev on libera.

If you want to contribute please take a look at the Contributor's Guide and Developer Information. You can also contact any of the developers on Discord in order to know about the current state of the emulator.

If you want to contribute to the user interface translation, please check out the Citra project on transifex. We centralize the translation work there, and periodically upstream translations.

Building

Support

If you enjoy the project and want to support us financially, check out our Patreon!

We also happily accept donated games and hardware. Please see our donations page for more information on how you can contribute to Citra. Any donations received will go towards things like:

  • 3DS consoles for developers to explore the hardware
  • 3DS games for testing
  • Any equipment required for homebrew
  • Infrastructure setup

We also more than gladly accept used 3DS consoles! If you would like to give yours away, don't hesitate to join our Discord server and talk to bunnei.

License

Citra is licensed under the GPLv2 (or any later version). Refer to the LICENSE.txt file.