diff --git a/.ci/license-header.sh b/.ci/license-header.sh index 70a842e01d..6b19f91185 100755 --- a/.ci/license-header.sh +++ b/.ci/license-header.sh @@ -115,7 +115,7 @@ for file in $FILES; do *.cmake|*.sh|*CMakeLists.txt) begin="#" ;; - *.kt*|*.cpp|*.h) + *.kt*|*.cpp|*.h|*.qml) begin="//" ;; *) @@ -193,7 +193,7 @@ if [ "$UPDATE" = "true" ]; then begin="#" shell=true ;; - *.kt*|*.cpp|*.h) + *) begin="//" shell="false" ;; diff --git a/CMakeLists.txt b/CMakeLists.txt index 4490df21cb..4ab08739f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -196,7 +196,7 @@ option(YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${BUNDLED_SIRIT_DEFAULT}) # FreeBSD 15+ has libusb, versions below should disable it cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "WIN32 OR PLATFORM_LINUX OR PLATFORM_FREEBSD OR APPLE" OFF) -cmake_dependent_option(ENABLE_OPENGL "Enable OpenGL" ON "NOT WIN32 OR NOT ARCHITECTURE_arm64" OFF) +cmake_dependent_option(ENABLE_OPENGL "Enable OpenGL" ON "NOT (WIN32 AND ARCHITECTURE_arm64) AND NOT APPLE" OFF) mark_as_advanced(FORCE ENABLE_OPENGL) option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON) diff --git a/CMakeModules/GenerateSCMRev.cmake b/CMakeModules/GenerateSCMRev.cmake index 5b0adad8dd..adc9902fcf 100644 --- a/CMakeModules/GenerateSCMRev.cmake +++ b/CMakeModules/GenerateSCMRev.cmake @@ -38,13 +38,13 @@ set(GIT_DESC ${BUILD_VERSION}) # Auto-updater metadata! Must somewhat mirror GitHub API endpoint if (NIGHTLY_BUILD) set(BUILD_AUTO_UPDATE_WEBSITE "https://github.com") - set(BUILD_AUTO_UPDATE_API "api.github.com") + set(BUILD_AUTO_UPDATE_API "https://api.github.com") set(BUILD_AUTO_UPDATE_API_PATH "/repos/") set(BUILD_AUTO_UPDATE_REPO "Eden-CI/Nightly") set(REPO_NAME "Eden Nightly") else() set(BUILD_AUTO_UPDATE_WEBSITE "https://git.eden-emu.dev") - set(BUILD_AUTO_UPDATE_API "git.eden-emu.dev") + set(BUILD_AUTO_UPDATE_API "https://git.eden-emu.dev") set(BUILD_AUTO_UPDATE_API_PATH "/api/v1/repos/") set(BUILD_AUTO_UPDATE_REPO "eden-emu/eden") set(REPO_NAME "Eden") diff --git a/docs/Options.md b/docs/Options.md index 55aead805f..3eb6effe92 100644 --- a/docs/Options.md +++ b/docs/Options.md @@ -70,8 +70,8 @@ These options control executables and build flavors. The following options are desktop only. -- `ENABLE_LIBUSB` (ON) Enable the use of the libusb input frontend (HIGHLY RECOMMENDED) -- `ENABLE_OPENGL` (ON) Enable the OpenGL graphics frontend +- `ENABLE_LIBUSB` (ON) Enable the use of the libusb input backend (HIGHLY RECOMMENDED) +- `ENABLE_OPENGL` (ON) Enable the OpenGL graphics backend - Unavailable on Windows/ARM64 - You probably shouldn't turn this off. diff --git a/docs/user/AlterDateTime.md b/docs/user/AlterDateTime.md index 43bd3ed7b1..aeffa1a548 100644 --- a/docs/user/AlterDateTime.md +++ b/docs/user/AlterDateTime.md @@ -1,6 +1,6 @@ # Setting a Custom Date/Time in Eden -Use this guide whenever you want to modify the Date or Time that Eden reports to games. This can be useful for modifying RNG elements, skipping wait times in games, etc. +Use this guide whenever you want to modify the Date or Time that Eden reports to games. This can be useful for modifying RNG elements, skipping wait times in games, etc. **Click [Here](https://evilperson1337.notion.site/Setting-a-Custom-Date-Time-in-Eden-2b357c2edaf680acb8d4e63ccc126564) for a version of this guide with images & visual elements.** @@ -16,5 +16,5 @@ Use this guide whenever you want to modify the Date or Time that Eden reports to 1. Navigate to *Emulation → Configure*. 2. Click on the **System** item on the left-hand side navigation, then check the *Custom RTC Date* box. -3. The Date/Time option now becomes editable. Set it to the value you want and hit **OK**. -4. GREAT SCOTT! We have time traveled! You can of course go forward or backward in time (as long as it is not before the year 1970) and your game should update accordingly (e.g. certain *Super Mario Odyssey* moons that take time for flowers to grow will now be fully grown.). \ No newline at end of file +3. The Date/Time option now becomes editable. Set it to the value you want and hit **OK**. +4. GREAT SCOTT! We have time traveled! You can of course go forward or backward in time (as long as it is not before the year 1970) and your game should update accordingly (e.g. certain *Super Mario Odyssey* moons that take time for flowers to grow will now be fully grown.). \ No newline at end of file diff --git a/docs/user/Basics.md b/docs/user/Basics.md index 5101f4d9c3..794a0935d5 100644 --- a/docs/user/Basics.md +++ b/docs/user/Basics.md @@ -16,6 +16,15 @@ The CPU must support FMA for an optimal gameplay experience. The GPU needs to su If your GPU doesn't support or is just behind by a minor version, see Mesa environment variables below (*nix only). +## Releases and versions + +- Stable releases/Versioned releases: Has a version number and it's the versions we expect 3rd party repositories to host (package managers and such), these are, well, stable, have low amount of regressions (wrt. to master and nightlies) and generally focus on "keeping things without regressions", recommended for the average user. + - RC releases: Release candidate, generally "less stable but still stable" versions. + - Full release: "The stablest possible you could get". +- Nightly: Builds done around 2PM UTC (if there are any changes), generally stable, but not recommended for the average user. These contain daily updates and may contain critical fixes for some games. +- Master: Unstable builds, can lead from a game working exceptionally fine to absolute crashing in some systems because someone forgot to check if NixOS or Solaris worked. These contain straight from the oven fixes, please don't use them unless you plan to contribute something! They're very experimental! Still 95% of the time it will work just fine. +- PR builds: Highly experimental builds, testers may grab from these. The average user should treat them the same as master builds, except sometimes they straight up don't build/work. + ## User configuration ### Configuration directories diff --git a/docs/user/CommandLine.md b/docs/user/CommandLine.md index 4b3a5bdf58..cd98d88b19 100644 --- a/docs/user/CommandLine.md +++ b/docs/user/CommandLine.md @@ -7,6 +7,7 @@ There are two main applications, an SDL2 based app (`eden-cli`) and a Qt based a - `-g `: Alternate way to specify what to load, overrides. However let it be noted that arguments that use `-` will be treated as options/ignored, if your game, for some reason, starts with `-`, in order to safely handle it you may need to specify it as an argument. - `-f`: Use fullscreen. - `-u `: Select the index of the user to load as. +- `-input-profile `: Specifies input profile name to use (for player #0 only). - `-qlaunch`: Launch QLaunch. - `-setup`: Launch setup applet. @@ -20,3 +21,4 @@ There are two main applications, an SDL2 based app (`eden-cli`) and a Qt based a - `--program/-p`: Specify the program arguments to pass (optional). - `--user/-u`: Specify the user index. - `--version/-v`: Display version and quit. +- `--input-profile/-i`: Specifies input profile name to use (for player #0 only). diff --git a/docs/user/ControllerProfiles.md b/docs/user/ControllerProfiles.md deleted file mode 100644 index 3b4898f447..0000000000 --- a/docs/user/ControllerProfiles.md +++ /dev/null @@ -1,49 +0,0 @@ -# Configuring Controller Profiles - -Use this guide for when you want to configure specific controller settings to be reused. - -**Click [Here](https://evilperson1337.notion.site/Configuring-Controller-Profiles-2be57c2edaf680eabc3ac8c333ec75c4) for a version of this guide with images & visual elements.** - ---- - -### Pre-Requisites - -- Eden Set Up and Configured - ---- - -### Steps -1. Launch Eden and wait for it to load. -2. Navigate to *Emulation > Configure…* -3. Select **Controls** from the left-hand menu and configure your controller for the way you want it to be in game. -4. Select **New** and enter a name for the profile in the box that appears. Press **OK** to save the profile settings. -5. Select **OK** to close the settings menu. - -## Setting Controller Profiles By Game - -Use this guide when you want to set up specific controller profiles for specific games. This can be useful for certain games like *Captain Toad Treasure Tracker* where a blue dot appears in the middle of the screen when you have docked mode enabled, but not handheld mode. - -**Click [Here](https://evilperson1337.notion.site/Setting-Controller-Profiles-By-Game-2b057c2edaf681658a57f0c199cb6083) for a version of this guide with images & visual elements.** - ---- - -### Pre-Requisites - -- Eden Emulator set up and fully configured -- Controller Profile Created - - See [*Configuring Controller Profiles*](./ControllerProfiles.md) for instructions on how to do this if needed. - ---- - -### Steps - -1. *Right-Click* the game you want to apply the profile to in the main window and select **Properties.** -2. Navigate to the **Input Profiles** tab in the window that appears. Drop down on *Player 1 profile* (or whatever player profile you want to apply it to) and select the profile you want. - - -1. Click **OK** to apply the profile mapping. -2. Launch the game and confirm that the profile is applied, regardless of what the global configuration is. diff --git a/docs/user/Controllers.md b/docs/user/Controllers.md new file mode 100644 index 0000000000..6aac9056ff --- /dev/null +++ b/docs/user/Controllers.md @@ -0,0 +1,65 @@ +# User Handbook - Controllers + +Most of the controls should work out of the box. If not, please use a joystick calibrator to ensure it's not an issue with your own controller, for example: + +- https://github.com/dkosmari/calibrate-joystick + +## Using external controllers on the Steamdeck + +In desktop mode ignore your pro controller/xbox contoller external controller and use **Steam Virtual Gamepad 0 as Player 1**. If you have multiple external controllers set **Player 2 to Steam Virtual Gamepad 1**. Steam app must not be closed on desktop mode. + +Here's the annoying part of it. When waking up the steam deck from sleep try not to touch any button on the Steamdeck and turn on your external controller. Then open the Eden.AppImage. If you're lucky you can get your external controller to be position 0 and also Steam Virtual Gamepad 0 in desktop mode. If not that is ok too unless you need to configure player 1 to have gyro. You might need to repeat this to get your external controller as Steam Virtual Gamepad 0 so you can config Player 1 having gyro. You might be able to config player 1 to have gyro with the Steamdeck itself. Or you can also config player 1, 2, 3, etc, to have gyro somehow. Make sure they are all using Virtual Gamepads though. + +Turn off controller then go to gaming mode. Try not to touch any buttons on the physical Steamdeck. When in gaming mode turn on the external controller. If lucky it will be assigned as Steam Virtual Gamepad 0. If not just use steam Gamemode feature to rearrange controller positions order. + +Basically the Steamdeck or the external controller is fighting for position 0 and it depends on what is touched first after waking from sleep. + +## Configuring Controller Profiles + +Use this guide for when you want to configure specific controller settings to be reused. + +**Click [Here](https://evilperson1337.notion.site/Configuring-Controller-Profiles-2be57c2edaf680eabc3ac8c333ec75c4) for a version of this guide with images & visual elements.** + +--- + +#### Pre-Requisites + +- Eden Set Up and Configured + +--- + +#### Steps +1. Launch Eden and wait for it to load. +2. Navigate to *Emulation > Configure…* +3. Select **Controls** from the left-hand menu and configure your controller for the way you want it to be in game. +4. Select **New** and enter a name for the profile in the box that appears. Press **OK** to save the profile settings. +5. Select **OK** to close the settings menu. + +### Setting Controller Profiles By Game + +Use this guide when you want to set up specific controller profiles for specific games. This can be useful for certain games like *Captain Toad Treasure Tracker* where a blue dot appears in the middle of the screen when you have docked mode enabled, but not handheld mode. + +**Click [Here](https://evilperson1337.notion.site/Setting-Controller-Profiles-By-Game-2b057c2edaf681658a57f0c199cb6083) for a version of this guide with images & visual elements.** + +--- + +#### Pre-Requisites + +- Eden Emulator set up and fully configured +- Controller Profile Created + - See [*Configuring Controller Profiles*](./ControllerProfiles.md) for instructions on how to do this if needed. + +--- + +#### Steps + +1. *Right-Click* the game you want to apply the profile to in the main window and select **Properties.** +2. Navigate to the **Input Profiles** tab in the window that appears. Drop down on *Player 1 profile* (or whatever player profile you want to apply it to) and select the profile you want. + + +1. Click **OK** to apply the profile mapping. +2. Launch the game and confirm that the profile is applied, regardless of what the global configuration is. diff --git a/docs/user/README.md b/docs/user/README.md index 9804f4d62f..c1c4cd200a 100644 --- a/docs/user/README.md +++ b/docs/user/README.md @@ -11,10 +11,12 @@ A copy of this handbook is [available online](https://git.eden-emu.dev/eden-emu/ - **[The Basics](Basics.md)** - **[Quickstart](./QuickStart.md)** - **[Settings](./Settings.md)** -- **[Installing Mods](./Mods.md)** -- **[Run On macOS](./RunOnMacOS.md)** +- **[Controllers](./Controllers.md)** + - **[Controller profiles](./Controllers.md#configuring-controller-profiles)** - **[Audio](Audio.md)** - **[Graphics](Graphics.md)** +- **[Installing Mods](./Mods.md)** +- **[Run On macOS](./RunOnMacOS.md)** - **[Data, Savefiles and Storage](Storage.md)** - **[Orphaned Profiles](Orphaned.md)** - **[Troubleshooting](./Troubleshoot.md)** @@ -23,7 +25,6 @@ A copy of this handbook is [available online](https://git.eden-emu.dev/eden-emu/ - **[Importing Saves](./ImportingSaves.md)** - **[Installing Atmosphere Mods](./InstallingAtmosphereMods.md)** - **[Installing Updates & DLCs](./InstallingUpdatesDLC.md)** -- **[Controller Profiles](./ControllerProfiles.md)** - **[Alter Date & Time](./AlterDateTime.md)** ## 3rd-party Integration @@ -35,6 +36,7 @@ A copy of this handbook is [available online](https://git.eden-emu.dev/eden-emu/ - **[Obtainium](./ThirdParty.md#configuring-obtainium)** - **[ES-DE](./ThirdParty.md#configuring-es-de)** - **[Mirrors](./ThirdParty.md#mirrors)** + - **[GameMode](./ThirdParty.md#configuring-gamemode)** ## Advanced diff --git a/docs/user/RunOnMacOS.md b/docs/user/RunOnMacOS.md index e01bf0253d..2729e13ced 100644 --- a/docs/user/RunOnMacOS.md +++ b/docs/user/RunOnMacOS.md @@ -1,4 +1,12 @@ -# Allowing Eden to Run on MacOS +# User Handbook - Run on macOS + +Current macOS support is still experimental and very reliant on MoltenVK developments, plans have shifted to properly provide support for KosmicKrisp and similar new GPU endeavours, but macOS users still are bound to MoltenVK itself. + +Users of macOS may wish to use [Asahi Linux](https://wiki.gentoo.org/wiki/Project:Asahi/Guide) for the rising KosmicKrisp support. + +As of writing, neither macOS nor Asahi has support for NCE; additionally Asahi has extraneous paging bugs with fastmem. + +## Allowing Eden to Run on MacOS Use this guide when you need to allow Eden to run on a Mac system, but are being blocked by Apple Security policy. @@ -6,19 +14,19 @@ Use this guide when you need to allow Eden to run on a Mac system, but are being --- -### Pre-Requisites +#### Pre-Requisites - Permissions to modify settings in MacOS --- -## Why am I Seeing This? +### Why am I Seeing This? Recent versions of MacOS (Catalina & newer) introduced the **Gatekeeper** security functionality, requiring software to be signed by Apple or a trusted (aka - paying) developer. If the signature isn’t on the list of trusted ones, it will stop the program from executing and display the message above. --- -## Steps +### Steps 1. Open the *System Settings* panel. 2. Navigate to *Privacy & Security*. diff --git a/docs/user/Settings.md b/docs/user/Settings.md index 35fcd0c9ef..9153a27e4d 100644 --- a/docs/user/Settings.md +++ b/docs/user/Settings.md @@ -50,5 +50,4 @@ See also [an extended breakdown of some options](./Graphics.md). ## Controls -Most of the controls should work out of the box. If not, please use a joystick calibrator to ensure it's not an issue with your own controller, for example: -- https://github.com/dkosmari/calibrate-joystick +See [controllers](./Controllers.md). diff --git a/docs/user/Testing.md b/docs/user/Testing.md index 6c3b7d3e15..eb3beeb37c 100644 --- a/docs/user/Testing.md +++ b/docs/user/Testing.md @@ -1,39 +1,99 @@ -# User Handbook - Testing - -While this is mainly aimed for testers - normal users can benefit from these guidelines to make their life easier when trying to outline and/or report an issue. - -## Getting logs - -In order to get more information, you can find logs in the following location: - - -## How to Test a PR Against the Based Master When Issues Arise +# Testing When you're testing a pull request (PR) and encounter unexpected behavior, it's important to determine whether the issue was introduced by the PR or if it already exists in the base code. To do this, compare the behavior against the based master branch. Even before an issue occurs, it is best practice to keep the same settings and delete the shader cache. Using an already made shader cache can make the PR look like it is having a regression in some rare cases. -### What to Do When Something Seems Off +Try not to test PRs which are for documentation or extremely trivial changes (like a PR that changes the app icon), unless you really want to; generally avoid any PRs marked `[docs]`. + +If a PR specifies it is for a given platform (i.e `linux`) then just test on Linux. If it says `NCE` then test on Android and Linux ARM64 (Raspberry Pi and such). macOS fixes may also affect Asahi, test that if you can too. + +You may also build artifacts yourself, be aware that the resulting builds are NOT the same as those from CI, because of package versioning and build environment differences. One famous example is FFmpeg randomly breaking on many Arch distros due to packaging differences. + +## Quickstart + +Think of the source code as a "tree", with the "trunk" of that tree being our `master` branch, any other branches are PRs or separate development branches, only our stable releases pull from `master` - all other branches are considered unstable and aren't recommended to pull from unless you're testing multiple branches at once. + +Here's some terminology you may want to familiarize yourself with: + +- PR: Pull request, a change in the codebase; from which the author of said change (the programmer) requests a pull of that branch into master (make it so the new code makes it into a release basically). +- Bisect: Bilinear method of searching regressions, some regressions may be sporadic and can't be bisected, but the overwhelming majority are. +- WIP: Work-in-progress. +- Regression: A new bug/glitch caused by new code, i.e "Zelda broke in android after commit xyz". +- Master: The "root" branch, this is where all merged code goes to, traditionally called `main`, `trunk` or just `master`, it contains all the code that eventually make it to stable releases. +- `HEAD`: Latest commit in a given branch, `HEAD` of `master` is the latest commit on branch `master`. +- `origin`: The default "remote", basically the URL from where git is located at, for most of the time that location is https://git.eden-emu.dev/eden-emu/eden. + +## Testing checklist + +For regressions/bugs from PRs or commits: + +- [ ] Occurs in master? + - If it occurs on master: + - [ ] Occurs on previous stable release? (before this particular PR). + - If it occurs on previous stable release: + - [ ] Occurs on previous-previous stable release? + - And so on and so forth... some bugs come from way before Eden was even conceived. + - Otherwise, try bisecting between the previous stable release AND the latest `HEAD` of master + - [ ] Occurs in given commit? +- [ ] Occurs in PR? + - If it occurs on PR: + - [ ] Bisected PR? (if it has commits) + - [ ] Found bisected commit? + +If an issue sporadically appears, try to do multiple runs, try if possible, to count the number of times it has failed and the number of times it has "worked just fine"; say it worked 3 times but failed 1. then there is a 1/4th chance every run that the issue is replicated - so every bisect step would require 4 runs to ensure there is atleast a chance of triggering the bug. + +## What to do when something seems off + If you notice something odd during testing: + - Reproduce the issue using the based master branch. - Observe whether the same behavior occurs. -### Two Possible Outcomes +From there onwards there can be two possible outcomes: + - If the issue exists in the based master: This means the problem was already present before the PR. The PR most likely did not introduce the regression. - If the issue does not exist in the based master: This suggests the PR most likely introduced the regression and needs further investigation. -### Report your findings +## Reporting Your Findings + When you report your results: + - Clearly state whether the behavior was observed in the based master. -- Indicate whether the result is good (expected behavior) or bad (unexpected or broken behavior). Without mentioning if your post/report/log is good or bad it may confuse the Developer of the PR. -- Example: -``` -1. "Tested on based master — issue not present. Bad result for PR, likely regression introduced." -2. "Tested on based master — issue already present. Good result for PR, not a regression." -``` +- Indicate whether the result is good (expected behavior) or bad (unexpected or broken behavior). Without mentioning if your post/report/log is good or bad it may confuse the developer of the PR. + +For example: + +1. "Bad result for PR: Tested on based master - issue not present. Likely regression introduced." +2. "Good result for PR: Tested on based master - issue already present. Not a regression." + +This approach helps maintain clarity and accountability in the testing process and ensures regressions are caught and addressed efficiently. + +If the behavior seems normal for a certain game/feature then it may not be always required to check against the based master. This approach helps maintain clarity and accountability in the testing process and ensures regressions are caught and addressed efficiently. If the behavior seems normal for a certain game/feature then it may not be always required to check against the based master. If a master build for the PR' based master does not exist. It will be helpful to just test past and future builds nearby. That would help with gathering more information about the problem. -**Always include [debugging info](../Debug.md) as needed**. \ No newline at end of file +**Always include [debugging info](../Debug.md) as needed**. + +## Bisecting + +One happy reminder, when testing, *know how to bisect!* + +Say you're trying to find an issue between 1st of Jan and 8th of Jan, you can search by dividing "in half" the time between each commit: +- Check for 4th of Jan +- If 4th of Jan is "working" then the issue must be in the future +- So then check 6th of Jan +- If 6th of Jan isn't working then the issue must be in the past +- So then check 5th of Jan +- If 5th of Jan worked, then the issue starts at 6th of Jan + +The faulty commit then, is 6th of Jan. This is called bisection https://git-scm.com/docs/git-bisect + +## Notes + +- PR's marked with **WIP** do NOT need to be tested unless explicitly asked (check the git in case) +- Sometimes license checks may fail, hover over the build icon to see if builds did succeed, as the CI will push builds even if license checks fail. +- All open PRs can be viewed [here](https://git.eden-emu.dev/eden-emu/eden/pulls/). +- If site is down use one of the [mirrors](./user/ThirdParty.md#mirrors). diff --git a/docs/user/ThirdParty.md b/docs/user/ThirdParty.md index 083542cd3e..5bd72ebe72 100644 --- a/docs/user/ThirdParty.md +++ b/docs/user/ThirdParty.md @@ -4,7 +4,6 @@ The Eden emulator by itself lacks some functionality - or otherwise requires ext While most of the links mentioned in this guide are relatively "safe"; we urge users to use their due diligence and appropriatedly verify the integrity of all files downloaded and ensure they're not compromised. -- [Nightly Eden builds](https://github.com/pflyly/eden-nightly) - [NixOS Eden Flake](https://github.com/Grantimatter/eden-flake) - [ES-DE Frontend Support](https://github.com/GlazedBelmont/es-de-android-custom-systems) @@ -66,3 +65,9 @@ Note: Even though the site isn't Codeberg, it uses the same Forgejo/Gitea backen ```xml %EMULATOR_EDEN% %ACTION%=android.nfc.action.TECH_DISCOVERED %DATA%=%ROMPROVIDER% ``` + +## Configuring GameMode + +There is a checkbox to enable gamemode automatically. The `libgamemode.so` library must be findable on the standard `LD_LIBRARY_PATH` otherwise it will not properly be enabled. If for whatever reason it doesn't work, see [Arch wiki: GameMode](https://wiki.archlinux.org/title/GameMode) for more info. + +You may launch the emulator directly via the wrapper `gamemode `, and things should work out of the box. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index dfb311b327..a9fa5314b7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -242,7 +242,6 @@ if (YUZU_CMD) endif() if (ENABLE_QT) - add_definitions(-DYUZU_QT_WIDGETS) add_subdirectory(qt_common) add_subdirectory(yuzu) endif() diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index c642dbdcda..b899ca07fa 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -73,6 +73,11 @@ SPDX-License-Identifier: GPL-3.0-or-later android:theme="@style/Theme.Yuzu.Main" android:label="@string/preferences_settings"/> + + ) : title = YuzuApplication.appContext.getString(applet.titleId), path = appletPath ) - val action = HomeNavigationDirections.actionGlobalEmulationActivity(appletGame) - binding.root.findNavController().navigate(action) + binding.root.findNavController().navigate( + R.id.action_global_emulationActivity, + bundleOf( + "game" to appletGame, + "custom" to false + ) + ) } } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/GpuUnswizzleSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/GpuUnswizzleSetting.kt index 5d6535e81e..a9a40f6903 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/GpuUnswizzleSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/GpuUnswizzleSetting.kt @@ -27,6 +27,20 @@ class GpuUnswizzleSetting( override val isSaveable = true override val isRuntimeModifiable = true override val isSwitchable = true + override val pairedSettingKey: String = "" + override var global: Boolean + get() { + return BooleanSetting.GPU_UNSWIZZLE_ENABLED.global && + IntSetting.GPU_UNSWIZZLE_TEXTURE_SIZE.global && + IntSetting.GPU_UNSWIZZLE_STREAM_SIZE.global && + IntSetting.GPU_UNSWIZZLE_CHUNK_SIZE.global + } + set(value) { + BooleanSetting.GPU_UNSWIZZLE_ENABLED.global = value + IntSetting.GPU_UNSWIZZLE_TEXTURE_SIZE.global = value + IntSetting.GPU_UNSWIZZLE_STREAM_SIZE.global = value + IntSetting.GPU_UNSWIZZLE_CHUNK_SIZE.global = value + } override fun getValueAsString(needsGlobal: Boolean): String = "combined" override fun reset() { BooleanSetting.GPU_UNSWIZZLE_ENABLED.reset() @@ -72,4 +86,4 @@ class GpuUnswizzleSetting( IntSetting.GPU_UNSWIZZLE_CHUNK_SIZE.setInt(value) fun reset() = setting.reset() -} \ No newline at end of file +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index a8bd44983b..a20858f0a9 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -989,6 +989,7 @@ abstract class SettingsItem( override val isRuntimeModifiable: Boolean = false override val defaultValue: Boolean = true override val isSwitchable: Boolean = true + override val pairedSettingKey: String = "" override var global: Boolean get() { return BooleanSetting.FASTMEM.global && diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt index 11be703536..d33bbc3d7d 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsActivity.kt @@ -111,18 +111,10 @@ class SettingsActivity : AppCompatActivity() { if (navHostFragment.childFragmentManager.backStackEntryCount > 0) { navHostFragment.navController.popBackStack() } else { - finishWithFragmentLikeAnimation() + finish() } } - private fun finishWithFragmentLikeAnimation() { - finish() - overridePendingTransition( - androidx.navigation.ui.R.anim.nav_default_pop_enter_anim, - androidx.navigation.ui.R.anim.nav_default_pop_exit_anim - ) - } - override fun onStart() { super.onStart() if (!DirectoryInitialization.areDirectoriesReady) { @@ -178,7 +170,7 @@ class SettingsActivity : AppCompatActivity() { getString(R.string.settings_reset), Toast.LENGTH_LONG ).show() - finishWithFragmentLikeAnimation() + finish() } private fun setInsets() { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSubscreenActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSubscreenActivity.kt new file mode 100644 index 0000000000..11ecd355fb --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsSubscreenActivity.kt @@ -0,0 +1,152 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.ui + +import android.content.Context +import android.os.Bundle +import android.view.View +import android.view.ViewGroup.MarginLayoutParams +import androidx.activity.OnBackPressedCallback +import androidx.appcompat.app.AppCompatActivity +import androidx.core.os.bundleOf +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.navArgs +import com.google.android.material.color.MaterialColors +import org.yuzu.yuzu_emu.R +import org.yuzu.yuzu_emu.YuzuApplication +import org.yuzu.yuzu_emu.databinding.ActivitySettingsBinding +import org.yuzu.yuzu_emu.utils.DirectoryInitialization +import org.yuzu.yuzu_emu.utils.InsetsHelper +import org.yuzu.yuzu_emu.utils.ThemeHelper + +enum class SettingsSubscreen { + PROFILE_MANAGER, + DRIVER_MANAGER, + DRIVER_FETCHER, + FREEDRENO_SETTINGS, + APPLET_LAUNCHER, + INSTALLABLE, + GAME_FOLDERS, + ABOUT, + LICENSES, + GAME_INFO, + ADDONS, +} + +class SettingsSubscreenActivity : AppCompatActivity() { + private lateinit var binding: ActivitySettingsBinding + + private val args by navArgs() + + override fun attachBaseContext(base: Context) { + super.attachBaseContext(YuzuApplication.applyLanguage(base)) + } + + override fun onCreate(savedInstanceState: Bundle?) { + ThemeHelper.setTheme(this) + + super.onCreate(savedInstanceState) + + binding = ActivitySettingsBinding.inflate(layoutInflater) + setContentView(binding.root) + + val navHostFragment = + supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment + if (savedInstanceState == null) { + val navController = navHostFragment.navController + val navGraph = navController.navInflater.inflate( + R.navigation.settings_subscreen_navigation + ) + navGraph.setStartDestination(resolveStartDestination()) + navController.setGraph(navGraph, createStartDestinationArgs()) + } + + WindowCompat.setDecorFitsSystemWindows(window, false) + + if (InsetsHelper.getSystemGestureType(applicationContext) != + InsetsHelper.GESTURE_NAVIGATION + ) { + binding.navigationBarShade.setBackgroundColor( + ThemeHelper.getColorWithOpacity( + MaterialColors.getColor( + binding.navigationBarShade, + com.google.android.material.R.attr.colorSurface + ), + ThemeHelper.SYSTEM_BAR_ALPHA + ) + ) + } + + onBackPressedDispatcher.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() = navigateBack() + } + ) + + setInsets() + } + + override fun onStart() { + super.onStart() + if (!DirectoryInitialization.areDirectoriesReady) { + DirectoryInitialization.start() + } + } + + fun navigateBack() { + val navHostFragment = + supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment + if (!navHostFragment.navController.popBackStack()) { + finish() + } + } + + private fun resolveStartDestination(): Int = + when (args.destination) { + SettingsSubscreen.PROFILE_MANAGER -> R.id.profileManagerFragment + SettingsSubscreen.DRIVER_MANAGER -> R.id.driverManagerFragment + SettingsSubscreen.DRIVER_FETCHER -> R.id.driverFetcherFragment + SettingsSubscreen.FREEDRENO_SETTINGS -> R.id.freedrenoSettingsFragment + SettingsSubscreen.APPLET_LAUNCHER -> R.id.appletLauncherFragment + SettingsSubscreen.INSTALLABLE -> R.id.installableFragment + SettingsSubscreen.GAME_FOLDERS -> R.id.gameFoldersFragment + SettingsSubscreen.ABOUT -> R.id.aboutFragment + SettingsSubscreen.LICENSES -> R.id.licensesFragment + SettingsSubscreen.GAME_INFO -> R.id.gameInfoFragment + SettingsSubscreen.ADDONS -> R.id.addonsFragment + } + + private fun createStartDestinationArgs(): Bundle = + when (args.destination) { + SettingsSubscreen.DRIVER_MANAGER, + SettingsSubscreen.FREEDRENO_SETTINGS -> bundleOf("game" to args.game) + + SettingsSubscreen.GAME_INFO, + SettingsSubscreen.ADDONS -> bundleOf( + "game" to requireNotNull(args.game) { + "Game is required for ${args.destination}" + } + ) + + else -> Bundle() + } + + private fun setInsets() { + ViewCompat.setOnApplyWindowInsetsListener( + binding.navigationBarShade + ) { _: View, windowInsets: WindowInsetsCompat -> + val barInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + + val mlpNavShade = binding.navigationBarShade.layoutParams as MarginLayoutParams + mlpNavShade.height = barInsets.bottom + binding.navigationBarShade.layoutParams = mlpNavShade + + windowInsets + } + } +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt index 7fec413b66..aa2b3c7df2 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AboutFragment.kt @@ -21,9 +21,10 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.findNavController import com.google.android.material.transition.MaterialSharedAxis -import org.yuzu.yuzu_emu.BuildConfig +import org.yuzu.yuzu_emu.HomeNavigationDirections import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.databinding.FragmentAboutBinding +import org.yuzu.yuzu_emu.features.settings.ui.SettingsSubscreen import org.yuzu.yuzu_emu.model.HomeViewModel import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins import org.yuzu.yuzu_emu.NativeLibrary @@ -54,7 +55,7 @@ class AboutFragment : Fragment() { super.onViewCreated(view, savedInstanceState) homeViewModel.setStatusBarShadeVisibility(visible = false) binding.toolbarAbout.setNavigationOnClickListener { - binding.root.findNavController().popBackStack() + requireActivity().onBackPressedDispatcher.onBackPressed() } binding.imageLogo.setOnLongClickListener { @@ -72,8 +73,11 @@ class AboutFragment : Fragment() { ) } binding.buttonLicenses.setOnClickListener { - exitTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) - binding.root.findNavController().navigate(R.id.action_aboutFragment_to_licensesFragment) + val action = HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.LICENSES, + null + ) + binding.root.findNavController().navigate(action) } val buildName = getString(R.string.app_name_suffixed) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt index 96b7a8cce2..b20d75ef0a 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AddonsFragment.kt @@ -15,7 +15,6 @@ import androidx.core.view.updatePadding import androidx.documentfile.provider.DocumentFile import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.navigation.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.transition.MaterialSharedAxis @@ -61,7 +60,7 @@ class AddonsFragment : Fragment() { homeViewModel.setStatusBarShadeVisibility(false) binding.toolbarAddons.setNavigationOnClickListener { - binding.root.findNavController().popBackStack() + requireActivity().onBackPressedDispatcher.onBackPressed() } binding.toolbarAddons.title = getString(R.string.addons_game, args.game.title) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AppletLauncherFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AppletLauncherFragment.kt index 3ab171a8d4..49237cb756 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AppletLauncherFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/AppletLauncherFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.fragments @@ -12,7 +12,6 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.navigation.findNavController import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis import org.yuzu.yuzu_emu.R @@ -50,7 +49,7 @@ class AppletLauncherFragment : Fragment() { homeViewModel.setStatusBarShadeVisibility(visible = false) binding.toolbarApplets.setNavigationOnClickListener { - binding.root.findNavController().popBackStack() + requireActivity().onBackPressedDispatcher.onBackPressed() } val applets = listOf( diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ContentTypeSelectionDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ContentTypeSelectionDialogFragment.kt index c1d8b9ea5f..880c2ff3bf 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ContentTypeSelectionDialogFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ContentTypeSelectionDialogFragment.kt @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,15 +8,18 @@ package org.yuzu.yuzu_emu.fragments import android.app.Dialog import android.content.DialogInterface +import android.net.Uri import android.os.Bundle +import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import androidx.preference.PreferenceManager import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.yuzu.yuzu_emu.NativeLibrary import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.YuzuApplication import org.yuzu.yuzu_emu.model.AddonViewModel -import org.yuzu.yuzu_emu.ui.main.MainActivity +import org.yuzu.yuzu_emu.utils.InstallableActions class ContentTypeSelectionDialogFragment : DialogFragment() { private val addonViewModel: AddonViewModel by activityViewModels() @@ -23,6 +29,52 @@ class ContentTypeSelectionDialogFragment : DialogFragment() { private var selectedItem = 0 + private val installGameUpdateLauncher = + registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { documents -> + if (documents.isEmpty()) { + return@registerForActivityResult + } + + val game = addonViewModel.game + if (game == null) { + installContent(documents) + return@registerForActivityResult + } + + ProgressDialogFragment.newInstance( + requireActivity(), + R.string.verifying_content, + false + ) { _, _ -> + var updatesMatchProgram = true + for (document in documents) { + val valid = NativeLibrary.doesUpdateMatchProgram( + game.programId, + document.toString() + ) + if (!valid) { + updatesMatchProgram = false + break + } + } + + requireActivity().runOnUiThread { + if (updatesMatchProgram) { + installContent(documents) + } else { + MessageDialogFragment.newInstance( + requireActivity(), + titleId = R.string.content_install_notice, + descriptionId = R.string.content_install_notice_description, + positiveAction = { installContent(documents) }, + negativeAction = {} + ).show(parentFragmentManager, MessageDialogFragment.TAG) + } + } + return@newInstance Any() + }.show(parentFragmentManager, ProgressDialogFragment.TAG) + } + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val launchOptions = arrayOf(getString(R.string.updates_and_dlc), getString(R.string.mods_and_cheats)) @@ -31,12 +83,11 @@ class ContentTypeSelectionDialogFragment : DialogFragment() { selectedItem = savedInstanceState.getInt(SELECTED_ITEM) } - val mainActivity = requireActivity() as MainActivity return MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.select_content_type) .setPositiveButton(android.R.string.ok) { _: DialogInterface, _: Int -> when (selectedItem) { - 0 -> mainActivity.installGameUpdate.launch(arrayOf("*/*")) + 0 -> installGameUpdateLauncher.launch(arrayOf("*/*")) else -> { if (!preferences.getBoolean(MOD_NOTICE_SEEN, false)) { preferences.edit().putBoolean(MOD_NOTICE_SEEN, true).apply() @@ -47,7 +98,7 @@ class ContentTypeSelectionDialogFragment : DialogFragment() { } } } - .setSingleChoiceItems(launchOptions, 0) { _: DialogInterface, i: Int -> + .setSingleChoiceItems(launchOptions, selectedItem) { _: DialogInterface, i: Int -> selectedItem = i } .setNegativeButton(android.R.string.cancel, null) @@ -65,4 +116,13 @@ class ContentTypeSelectionDialogFragment : DialogFragment() { private const val SELECTED_ITEM = "SelectedItem" private const val MOD_NOTICE_SEEN = "ModNoticeSeen" } + + private fun installContent(documents: List) { + InstallableActions.installContent( + activity = requireActivity(), + fragmentManager = parentFragmentManager, + addonViewModel = addonViewModel, + documents = documents + ) + } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverFetcherFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverFetcherFragment.kt index e2b652dc60..eacc64a63e 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverFetcherFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverFetcherFragment.kt @@ -13,7 +13,6 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible import androidx.core.view.updatePadding import androidx.fragment.app.activityViewModels -import androidx.navigation.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper @@ -142,7 +141,7 @@ class DriverFetcherFragment : Fragment() { super.onViewCreated(view, savedInstanceState) homeViewModel.setStatusBarShadeVisibility(visible = false) binding.toolbarDrivers.setNavigationOnClickListener { - binding.root.findNavController().popBackStack() + requireActivity().onBackPressedDispatcher.onBackPressed() } binding.listDrivers.layoutManager = LinearLayoutManager(context) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt index 23334f05eb..89a6362dc6 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.fragments @@ -19,6 +19,7 @@ import androidx.navigation.fragment.navArgs import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis +import org.yuzu.yuzu_emu.HomeNavigationDirections import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -27,6 +28,7 @@ import org.yuzu.yuzu_emu.adapters.DriverAdapter import org.yuzu.yuzu_emu.databinding.FragmentDriverManagerBinding import org.yuzu.yuzu_emu.features.settings.model.Settings import org.yuzu.yuzu_emu.features.settings.model.StringSetting +import org.yuzu.yuzu_emu.features.settings.ui.SettingsSubscreen import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver import org.yuzu.yuzu_emu.model.DriverViewModel import org.yuzu.yuzu_emu.model.HomeViewModel @@ -105,7 +107,7 @@ class DriverManagerFragment : Fragment() { } binding.toolbarDrivers.setNavigationOnClickListener { - binding.root.findNavController().popBackStack() + requireActivity().onBackPressedDispatcher.onBackPressed() } binding.buttonInstall.setOnClickListener { @@ -113,9 +115,11 @@ class DriverManagerFragment : Fragment() { } binding.buttonFetch.setOnClickListener { - binding.root.findNavController().navigate( - R.id.action_driverManagerFragment_to_driverFetcherFragment + val action = HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.DRIVER_FETCHER, + null ) + binding.root.findNavController().navigate(action) } binding.listDrivers.apply { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt index 9c43d2c6e1..6e05df799b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameFoldersFragment.kt @@ -4,20 +4,21 @@ package org.yuzu.yuzu_emu.fragments import android.content.Intent +import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.navigation.findNavController import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.transition.MaterialSharedAxis -import kotlinx.coroutines.launch import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.adapters.FolderAdapter import org.yuzu.yuzu_emu.databinding.FragmentFoldersBinding @@ -25,7 +26,6 @@ import org.yuzu.yuzu_emu.model.DirectoryType import org.yuzu.yuzu_emu.model.GameDir import org.yuzu.yuzu_emu.model.GamesViewModel import org.yuzu.yuzu_emu.model.HomeViewModel -import org.yuzu.yuzu_emu.ui.main.MainActivity import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins import org.yuzu.yuzu_emu.utils.collect @@ -36,6 +36,20 @@ class GameFoldersFragment : Fragment() { private val homeViewModel: HomeViewModel by activityViewModels() private val gamesViewModel: GamesViewModel by activityViewModels() + private val getGamesDirectory = + registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { result -> + if (result != null) { + processGamesDir(result) + } + } + + private val getExternalContentDirectory = + registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { result -> + if (result != null) { + processExternalContentDir(result) + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) @@ -59,7 +73,7 @@ class GameFoldersFragment : Fragment() { homeViewModel.setStatusBarShadeVisibility(visible = false) binding.toolbarFolders.setNavigationOnClickListener { - binding.root.findNavController().popBackStack() + requireActivity().onBackPressedDispatcher.onBackPressed() } binding.listFolders.apply { @@ -74,7 +88,6 @@ class GameFoldersFragment : Fragment() { (binding.listFolders.adapter as FolderAdapter).submitList(it) } - val mainActivity = requireActivity() as MainActivity binding.buttonAdd.setOnClickListener { // Show a model to choose between Game and External Content val options = arrayOf( @@ -87,10 +100,10 @@ class GameFoldersFragment : Fragment() { .setItems(options) { _, which -> when (which) { 0 -> { // Game Folder - mainActivity.getGamesDirectory.launch(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).data) + getGamesDirectory.launch(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).data) } 1 -> { // External Content Folder - mainActivity.getExternalContentDirectory.launch(null) + getExternalContentDirectory.launch(null) } } } @@ -105,6 +118,50 @@ class GameFoldersFragment : Fragment() { gamesViewModel.onCloseGameFoldersFragment() } + private fun processGamesDir(result: Uri) { + requireContext().contentResolver.takePersistableUriPermission( + result, + Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + + val uriString = result.toString() + val folder = gamesViewModel.folders.value.firstOrNull { it.uriString == uriString } + if (folder != null) { + Toast.makeText( + requireContext().applicationContext, + R.string.folder_already_added, + Toast.LENGTH_SHORT + ).show() + return + } + + AddGameFolderDialogFragment.newInstance(uriString, calledFromGameFragment = false) + .show(parentFragmentManager, AddGameFolderDialogFragment.TAG) + } + + private fun processExternalContentDir(result: Uri) { + requireContext().contentResolver.takePersistableUriPermission( + result, + Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + + val uriString = result.toString() + val folder = gamesViewModel.folders.value.firstOrNull { + it.uriString == uriString && it.type == DirectoryType.EXTERNAL_CONTENT + } + if (folder != null) { + Toast.makeText( + requireContext().applicationContext, + R.string.folder_already_added, + Toast.LENGTH_SHORT + ).show() + return + } + + val externalContentDir = GameDir(uriString, deepScan = false, DirectoryType.EXTERNAL_CONTENT) + gamesViewModel.addFolder(externalContentDir, savedFromGameFragment = false) + } + private fun setInsets() = ViewCompat.setOnApplyWindowInsetsListener( binding.root diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt index 7863e40ff5..5d6238e5a1 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GameInfoFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.fragments @@ -18,7 +18,6 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.navigation.findNavController import androidx.navigation.fragment.navArgs import com.google.android.material.transition.MaterialSharedAxis import org.yuzu.yuzu_emu.NativeLibrary @@ -64,7 +63,7 @@ class GameInfoFragment : Fragment() { binding.apply { toolbarInfo.title = args.game.title toolbarInfo.setNavigationOnClickListener { - view.findNavController().popBackStack() + requireActivity().onBackPressedDispatcher.onBackPressed() } val pathString = Uri.parse(args.game.path).path ?: "" diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt index 9e55297846..46b75197d5 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt @@ -35,6 +35,7 @@ import org.yuzu.yuzu_emu.adapters.GamePropertiesAdapter import org.yuzu.yuzu_emu.databinding.FragmentGamePropertiesBinding import org.yuzu.yuzu_emu.features.DocumentProvider import org.yuzu.yuzu_emu.features.settings.model.Settings +import org.yuzu.yuzu_emu.features.settings.ui.SettingsSubscreen import org.yuzu.yuzu_emu.model.DriverViewModel import org.yuzu.yuzu_emu.model.GameProperty import org.yuzu.yuzu_emu.model.GamesViewModel @@ -250,8 +251,10 @@ class GamePropertiesFragment : Fragment() { R.string.info_description, R.drawable.ic_info_outline, action = { - val action = GamePropertiesFragmentDirections - .actionPerGamePropertiesFragmentToGameInfoFragment(args.game) + val action = HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.GAME_INFO, + args.game + ) binding.root.findNavController().navigate(action) } ) @@ -317,8 +320,11 @@ class GamePropertiesFragment : Fragment() { R.string.add_ons_description, R.drawable.ic_edit, action = { - val action = GamePropertiesFragmentDirections - .actionPerGamePropertiesFragmentToAddonsFragment(args.game) + val action = + HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.ADDONS, + args.game + ) binding.root.findNavController().navigate(action) } ) @@ -333,8 +339,11 @@ class GamePropertiesFragment : Fragment() { R.drawable.ic_build, detailsFlow = driverViewModel.selectedDriverTitle, action = { - val action = GamePropertiesFragmentDirections - .actionPerGamePropertiesFragmentToDriverManagerFragment(args.game) + val action = + HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.DRIVER_MANAGER, + args.game + ) binding.root.findNavController().navigate(action) } ) @@ -347,8 +356,11 @@ class GamePropertiesFragment : Fragment() { R.string.freedreno_per_game_description, R.drawable.ic_graphics, action = { - val action = GamePropertiesFragmentDirections - .actionPerGamePropertiesFragmentToFreedrenoSettingsFragment(args.game) + val action = + HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.FREEDRENO_SETTINGS, + args.game + ) binding.root.findNavController().navigate(action) } ) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt index 6f4bf858ea..37eda22c69 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt @@ -36,6 +36,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentHomeSettingsBinding import org.yuzu.yuzu_emu.features.DocumentProvider import org.yuzu.yuzu_emu.features.fetcher.SpacingItemDecoration import org.yuzu.yuzu_emu.features.settings.model.Settings +import org.yuzu.yuzu_emu.features.settings.ui.SettingsSubscreen import org.yuzu.yuzu_emu.model.DriverViewModel import org.yuzu.yuzu_emu.model.HomeSetting import org.yuzu.yuzu_emu.model.HomeViewModel @@ -126,8 +127,11 @@ class HomeSettingsFragment : Fragment() { R.string.profile_manager_description, R.drawable.ic_account_circle, { - binding.root.findNavController() - .navigate(R.id.action_homeSettingsFragment_to_profileManagerFragment) + val action = HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.PROFILE_MANAGER, + null + ) + binding.root.findNavController().navigate(action) } ) ) @@ -137,8 +141,10 @@ class HomeSettingsFragment : Fragment() { R.string.install_gpu_driver_description, R.drawable.ic_build, { - val action = HomeSettingsFragmentDirections - .actionHomeSettingsFragmentToDriverManagerFragment(null) + val action = HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.DRIVER_MANAGER, + null + ) binding.root.findNavController().navigate(action) }, { true }, @@ -154,7 +160,12 @@ class HomeSettingsFragment : Fragment() { R.string.gpu_driver_settings, R.drawable.ic_graphics, { - binding.root.findNavController().navigate(R.id.freedrenoSettingsFragment) + val action = + HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.FREEDRENO_SETTINGS, + null + ) + binding.root.findNavController().navigate(action) } ) ) @@ -175,8 +186,11 @@ class HomeSettingsFragment : Fragment() { R.string.applets_description, R.drawable.ic_applet, { - binding.root.findNavController() - .navigate(R.id.action_homeSettingsFragment_to_appletLauncherFragment) + val action = HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.APPLET_LAUNCHER, + null + ) + binding.root.findNavController().navigate(action) }, { NativeLibrary.isFirmwareAvailable() }, R.string.applets_error_firmware, @@ -189,8 +203,11 @@ class HomeSettingsFragment : Fragment() { R.string.manage_yuzu_data_description, R.drawable.ic_install, { - binding.root.findNavController() - .navigate(R.id.action_homeSettingsFragment_to_installableFragment) + val action = HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.INSTALLABLE, + null + ) + binding.root.findNavController().navigate(action) } ) ) @@ -200,8 +217,11 @@ class HomeSettingsFragment : Fragment() { R.string.select_games_folder_description, R.drawable.ic_add, { - binding.root.findNavController() - .navigate(R.id.action_homeSettingsFragment_to_gameFoldersFragment) + val action = HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.GAME_FOLDERS, + null + ) + binding.root.findNavController().navigate(action) } ) ) @@ -284,9 +304,11 @@ class HomeSettingsFragment : Fragment() { R.string.about_description, R.drawable.ic_info_outline, { - exitTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) - parentFragmentManager.primaryNavigationFragment?.findNavController() - ?.navigate(R.id.action_homeSettingsFragment_to_aboutFragment) + val action = HomeNavigationDirections.actionGlobalSettingsSubscreenActivity( + SettingsSubscreen.ABOUT, + null + ) + binding.root.findNavController().navigate(action) } ) ) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt index 1b94d5f1a6..10862c37b4 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/InstallableFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.fragments @@ -14,23 +14,23 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.navigation.findNavController import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.yuzu.yuzu_emu.NativeLibrary import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.YuzuApplication import org.yuzu.yuzu_emu.adapters.InstallableAdapter import org.yuzu.yuzu_emu.databinding.FragmentInstallablesBinding +import org.yuzu.yuzu_emu.model.AddonViewModel +import org.yuzu.yuzu_emu.model.DriverViewModel +import org.yuzu.yuzu_emu.model.GamesViewModel import org.yuzu.yuzu_emu.model.HomeViewModel import org.yuzu.yuzu_emu.model.Installable import org.yuzu.yuzu_emu.model.TaskState -import org.yuzu.yuzu_emu.ui.main.MainActivity -import org.yuzu.yuzu_emu.utils.DirectoryInitialization import org.yuzu.yuzu_emu.utils.FileUtil +import org.yuzu.yuzu_emu.utils.InstallableActions import org.yuzu.yuzu_emu.utils.NativeConfig import org.yuzu.yuzu_emu.utils.ViewUtils.updateMargins import org.yuzu.yuzu_emu.utils.collect @@ -45,6 +45,9 @@ class InstallableFragment : Fragment() { private val binding get() = _binding!! private val homeViewModel: HomeViewModel by activityViewModels() + private val gamesViewModel: GamesViewModel by activityViewModels() + private val addonViewModel: AddonViewModel by activityViewModels() + private val driverViewModel: DriverViewModel by activityViewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -65,12 +68,10 @@ class InstallableFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val mainActivity = requireActivity() as MainActivity - homeViewModel.setStatusBarShadeVisibility(visible = false) binding.toolbarInstallables.setNavigationOnClickListener { - binding.root.findNavController().popBackStack() + requireActivity().onBackPressedDispatcher.onBackPressed() } homeViewModel.openImportSaves.collect(viewLifecycleOwner) { @@ -84,8 +85,8 @@ class InstallableFragment : Fragment() { Installable( R.string.user_data, R.string.user_data_description, - install = { mainActivity.importUserData.launch(arrayOf("application/zip")) }, - export = { mainActivity.exportUserData.launch("export.zip") } + install = { importUserDataLauncher.launch(arrayOf("application/zip")) }, + export = { exportUserDataLauncher.launch("export.zip") } ), Installable( R.string.manage_save_data, @@ -127,27 +128,33 @@ class InstallableFragment : Fragment() { Installable( R.string.install_game_content, R.string.install_game_content_description, - install = { mainActivity.installGameUpdate.launch(arrayOf("*/*")) } + install = { installGameUpdateLauncher.launch(arrayOf("*/*")) } ), Installable( R.string.install_firmware, R.string.install_firmware_description, - install = { mainActivity.getFirmware.launch(arrayOf("application/zip")) } + install = { getFirmwareLauncher.launch(arrayOf("application/zip")) } ), Installable( R.string.uninstall_firmware, R.string.uninstall_firmware_description, - install = { mainActivity.uninstallFirmware() } + install = { + InstallableActions.uninstallFirmware( + activity = requireActivity(), + fragmentManager = parentFragmentManager, + homeViewModel = homeViewModel + ) + } ), Installable( R.string.install_prod_keys, R.string.install_prod_keys_description, - install = { mainActivity.getProdKey.launch(arrayOf("*/*")) } + install = { getProdKeyLauncher.launch(arrayOf("*/*")) } ), Installable( R.string.install_amiibo_keys, R.string.install_amiibo_keys_description, - install = { mainActivity.getAmiiboKey.launch(arrayOf("*/*")) } + install = { getAmiiboKeyLauncher.launch(arrayOf("*/*")) } ) ) @@ -180,6 +187,132 @@ class InstallableFragment : Fragment() { windowInsets } + private val getProdKeyLauncher = + registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> + if (result != null) { + InstallableActions.processKey( + activity = requireActivity(), + fragmentManager = parentFragmentManager, + gamesViewModel = gamesViewModel, + result = result, + extension = "keys" + ) + } + } + + private val getAmiiboKeyLauncher = + registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> + if (result != null) { + InstallableActions.processKey( + activity = requireActivity(), + fragmentManager = parentFragmentManager, + gamesViewModel = gamesViewModel, + result = result, + extension = "bin" + ) + } + } + + private val getFirmwareLauncher = + registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> + if (result != null) { + InstallableActions.processFirmware( + activity = requireActivity(), + fragmentManager = parentFragmentManager, + homeViewModel = homeViewModel, + result = result + ) + } + } + + private val installGameUpdateLauncher = + registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { documents -> + if (documents.isEmpty()) { + return@registerForActivityResult + } + + if (addonViewModel.game == null) { + InstallableActions.installContent( + activity = requireActivity(), + fragmentManager = parentFragmentManager, + addonViewModel = addonViewModel, + documents = documents + ) + return@registerForActivityResult + } + + ProgressDialogFragment.newInstance( + requireActivity(), + R.string.verifying_content, + false + ) { _, _ -> + var updatesMatchProgram = true + for (document in documents) { + val valid = NativeLibrary.doesUpdateMatchProgram( + addonViewModel.game!!.programId, + document.toString() + ) + if (!valid) { + updatesMatchProgram = false + break + } + } + + if (updatesMatchProgram) { + requireActivity().runOnUiThread { + InstallableActions.installContent( + activity = requireActivity(), + fragmentManager = parentFragmentManager, + addonViewModel = addonViewModel, + documents = documents + ) + } + } else { + requireActivity().runOnUiThread { + MessageDialogFragment.newInstance( + requireActivity(), + titleId = R.string.content_install_notice, + descriptionId = R.string.content_install_notice_description, + positiveAction = { + InstallableActions.installContent( + activity = requireActivity(), + fragmentManager = parentFragmentManager, + addonViewModel = addonViewModel, + documents = documents + ) + }, + negativeAction = {} + ).show(parentFragmentManager, MessageDialogFragment.TAG) + } + } + return@newInstance Any() + }.show(parentFragmentManager, ProgressDialogFragment.TAG) + } + + private val importUserDataLauncher = + registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> + if (result != null) { + InstallableActions.importUserData( + activity = requireActivity(), + fragmentManager = parentFragmentManager, + gamesViewModel = gamesViewModel, + driverViewModel = driverViewModel, + result = result + ) + } + } + + private val exportUserDataLauncher = + registerForActivityResult(ActivityResultContracts.CreateDocument("application/zip")) { result -> + if (result != null) { + InstallableActions.exportUserData( + activity = requireActivity(), + fragmentManager = parentFragmentManager, + result = result + ) + } + } + private val importSaves = registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> if (result == null) { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt index aa18aa2482..32b72fe38f 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.yuzu.yuzu_emu.fragments @@ -13,7 +13,6 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.navigation.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.transition.MaterialSharedAxis import org.yuzu.yuzu_emu.R @@ -48,7 +47,7 @@ class LicensesFragment : Fragment() { homeViewModel.setStatusBarShadeVisibility(visible = false) binding.toolbarLicenses.setNavigationOnClickListener { - binding.root.findNavController().popBackStack() + requireActivity().onBackPressedDispatcher.onBackPressed() } val licenses = listOf( diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProfileManagerFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProfileManagerFragment.kt index 6ee34105e7..2786906f6b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProfileManagerFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/ProfileManagerFragment.kt @@ -51,7 +51,7 @@ class ProfileManagerFragment : Fragment() { homeViewModel.setStatusBarShadeVisibility(visible = false) binding.toolbarProfiles.setNavigationOnClickListener { - findNavController().popBackStack() + requireActivity().onBackPressedDispatcher.onBackPressed() } setupRecyclerView() diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt index 74a171cf1f..f0806df786 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/ui/main/MainActivity.kt @@ -26,7 +26,6 @@ import androidx.preference.PreferenceManager import com.google.android.material.color.MaterialColors import com.google.android.material.dialog.MaterialAlertDialogBuilder import java.io.File -import java.io.FilenameFilter import org.yuzu.yuzu_emu.NativeLibrary import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.databinding.ActivityMainBinding @@ -39,16 +38,10 @@ import org.yuzu.yuzu_emu.model.AddonViewModel import org.yuzu.yuzu_emu.model.DriverViewModel import org.yuzu.yuzu_emu.model.GamesViewModel import org.yuzu.yuzu_emu.model.HomeViewModel -import org.yuzu.yuzu_emu.model.InstallResult import android.os.Build -import org.yuzu.yuzu_emu.model.TaskState import org.yuzu.yuzu_emu.model.TaskViewModel import org.yuzu.yuzu_emu.utils.* import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible -import java.io.BufferedInputStream -import java.io.BufferedOutputStream -import java.util.zip.ZipEntry -import java.util.zip.ZipInputStream import androidx.core.content.edit import org.yuzu.yuzu_emu.activities.EmulationActivity import kotlin.text.compareTo @@ -453,35 +446,13 @@ class MainActivity : AppCompatActivity(), ThemeProvider { } fun processKey(result: Uri, extension: String = "keys") { - contentResolver.takePersistableUriPermission( - result, - Intent.FLAG_GRANT_READ_URI_PERMISSION + InstallableActions.processKey( + activity = this, + fragmentManager = supportFragmentManager, + gamesViewModel = gamesViewModel, + result = result, + extension = extension ) - - val resultCode: Int = NativeLibrary.installKeys(result.toString(), extension) - - if (resultCode == 0) { - // TODO(crueter): It may be worth it to switch some of these Toasts to snackbars, - // since most of it is foreground-only anyways. - Toast.makeText( - applicationContext, - R.string.keys_install_success, - Toast.LENGTH_SHORT - ).show() - - gamesViewModel.reloadGames(true) - - return - } - - val resultString: String = - resources.getStringArray(R.array.installKeysResults)[resultCode] - - MessageDialogFragment.newInstance( - titleId = R.string.keys_failed, - descriptionString = resultString, - helpLinkId = R.string.keys_missing_help - ).show(supportFragmentManager, MessageDialogFragment.TAG) } val getFirmware = registerForActivityResult(ActivityResultContracts.OpenDocument()) { result -> @@ -491,75 +462,21 @@ class MainActivity : AppCompatActivity(), ThemeProvider { } fun processFirmware(result: Uri, onComplete: (() -> Unit)? = null) { - val filterNCA = FilenameFilter { _, dirName -> dirName.endsWith(".nca") } - - val firmwarePath = - File(NativeConfig.getNandDir() + "/system/Contents/registered/") - val cacheFirmwareDir = File("${cacheDir.path}/registered/") - - ProgressDialogFragment.newInstance( - this, - R.string.firmware_installing - ) { progressCallback, _ -> - var messageToShow: Any - try { - FileUtil.unzipToInternalStorage( - result.toString(), - cacheFirmwareDir, - progressCallback - ) - val unfilteredNumOfFiles = cacheFirmwareDir.list()?.size ?: -1 - val filteredNumOfFiles = cacheFirmwareDir.list(filterNCA)?.size ?: -2 - messageToShow = if (unfilteredNumOfFiles != filteredNumOfFiles) { - MessageDialogFragment.newInstance( - this, - titleId = R.string.firmware_installed_failure, - descriptionId = R.string.firmware_installed_failure_description - ) - } else { - firmwarePath.deleteRecursively() - cacheFirmwareDir.copyRecursively(firmwarePath, true) - NativeLibrary.initializeSystem(true) - homeViewModel.setCheckKeys(true) - getString(R.string.save_file_imported_success) - } - } catch (e: Exception) { - Log.error("[MainActivity] Firmware install failed - ${e.message}") - messageToShow = getString(R.string.fatal_error) - } finally { - cacheFirmwareDir.deleteRecursively() - } - messageToShow - }.apply { - onDialogComplete = onComplete - }.show(supportFragmentManager, ProgressDialogFragment.TAG) + InstallableActions.processFirmware( + activity = this, + fragmentManager = supportFragmentManager, + homeViewModel = homeViewModel, + result = result, + onComplete = onComplete + ) } fun uninstallFirmware() { - val firmwarePath = - File(NativeConfig.getNandDir() + "/system/Contents/registered/") - ProgressDialogFragment.newInstance( - this, - R.string.firmware_uninstalling - ) { progressCallback, _ -> - var messageToShow: Any - try { - // Ensure the firmware directory exists before attempting to delete - if (firmwarePath.exists()) { - firmwarePath.deleteRecursively() - // Optionally reinitialize the system or perform other necessary steps - NativeLibrary.initializeSystem(true) - homeViewModel.setCheckKeys(true) - messageToShow = getString(R.string.firmware_uninstalled_success) - } else { - messageToShow = getString(R.string.firmware_uninstalled_failure) - } - } catch (e: Exception) { - Log.error("[MainActivity] Firmware uninstall failed - ${e.message}") - messageToShow = getString(R.string.fatal_error) - } - messageToShow - }.show(supportFragmentManager, ProgressDialogFragment.TAG) + InstallableActions.uninstallFirmware( + activity = this, + fragmentManager = supportFragmentManager, + homeViewModel = homeViewModel + ) } val installGameUpdate = registerForActivityResult( @@ -606,101 +523,12 @@ class MainActivity : AppCompatActivity(), ThemeProvider { } private fun installContent(documents: List) { - ProgressDialogFragment.newInstance( - this@MainActivity, - R.string.installing_game_content - ) { progressCallback, messageCallback -> - var installSuccess = 0 - var installOverwrite = 0 - var errorBaseGame = 0 - var error = 0 - documents.forEach { - messageCallback.invoke(FileUtil.getFilename(it)) - when ( - InstallResult.from( - NativeLibrary.installFileToNand( - it.toString(), - progressCallback - ) - ) - ) { - InstallResult.Success -> { - installSuccess += 1 - } - - InstallResult.Overwrite -> { - installOverwrite += 1 - } - - InstallResult.BaseInstallAttempted -> { - errorBaseGame += 1 - } - - InstallResult.Failure -> { - error += 1 - } - } - } - - addonViewModel.refreshAddons(force = true) - - val separator = System.lineSeparator() ?: "\n" - val installResult = StringBuilder() - if (installSuccess > 0) { - installResult.append( - getString( - R.string.install_game_content_success_install, - installSuccess - ) - ) - installResult.append(separator) - } - if (installOverwrite > 0) { - installResult.append( - getString( - R.string.install_game_content_success_overwrite, - installOverwrite - ) - ) - installResult.append(separator) - } - val errorTotal: Int = errorBaseGame + error - if (errorTotal > 0) { - installResult.append(separator) - installResult.append( - getString( - R.string.install_game_content_failed_count, - errorTotal - ) - ) - installResult.append(separator) - if (errorBaseGame > 0) { - installResult.append(separator) - installResult.append( - getString(R.string.install_game_content_failure_base) - ) - installResult.append(separator) - } - if (error > 0) { - installResult.append( - getString(R.string.install_game_content_failure_description) - ) - installResult.append(separator) - } - return@newInstance MessageDialogFragment.newInstance( - this, - titleId = R.string.install_game_content_failure, - descriptionString = installResult.toString().trim(), - helpLinkId = R.string.install_game_content_help_link - ) - } else { - return@newInstance MessageDialogFragment.newInstance( - this, - titleId = R.string.install_game_content_success, - descriptionString = installResult.toString().trim() - ) - } - }.show(supportFragmentManager, ProgressDialogFragment.TAG) + InstallableActions.installContent( + activity = this, + fragmentManager = supportFragmentManager, + addonViewModel = addonViewModel, + documents = documents + ) } val exportUserData = registerForActivityResult( @@ -709,25 +537,11 @@ class MainActivity : AppCompatActivity(), ThemeProvider { if (result == null) { return@registerForActivityResult } - - ProgressDialogFragment.newInstance( - this, - R.string.exporting_user_data, - true - ) { progressCallback, _ -> - val zipResult = FileUtil.zipFromInternalStorage( - File(DirectoryInitialization.userDirectory!!), - DirectoryInitialization.userDirectory!!, - BufferedOutputStream(contentResolver.openOutputStream(result)), - progressCallback, - compression = false - ) - return@newInstance when (zipResult) { - TaskState.Completed -> getString(R.string.user_data_export_success) - TaskState.Failed -> R.string.export_failed - TaskState.Cancelled -> R.string.user_data_export_cancelled - } - }.show(supportFragmentManager, ProgressDialogFragment.TAG) + InstallableActions.exportUserData( + activity = this, + fragmentManager = supportFragmentManager, + result = result + ) } val importUserData = @@ -735,58 +549,12 @@ class MainActivity : AppCompatActivity(), ThemeProvider { if (result == null) { return@registerForActivityResult } - - ProgressDialogFragment.newInstance( - this, - R.string.importing_user_data - ) { progressCallback, _ -> - val checkStream = - ZipInputStream(BufferedInputStream(contentResolver.openInputStream(result))) - var isYuzuBackup = false - checkStream.use { stream -> - var ze: ZipEntry? = null - while (stream.nextEntry?.also { ze = it } != null) { - val itemName = ze!!.name.trim() - if (itemName == "/config/config.ini" || itemName == "config/config.ini") { - isYuzuBackup = true - return@use - } - } - } - if (!isYuzuBackup) { - return@newInstance MessageDialogFragment.newInstance( - this, - titleId = R.string.invalid_yuzu_backup, - descriptionId = R.string.user_data_import_failed_description - ) - } - - // Clear existing user data - NativeConfig.unloadGlobalConfig() - File(DirectoryInitialization.userDirectory!!).deleteRecursively() - - // Copy archive to internal storage - try { - FileUtil.unzipToInternalStorage( - result.toString(), - File(DirectoryInitialization.userDirectory!!), - progressCallback - ) - } catch (e: Exception) { - return@newInstance MessageDialogFragment.newInstance( - this, - titleId = R.string.import_failed, - descriptionId = R.string.user_data_import_failed_description - ) - } - - // Reinitialize relevant data - NativeLibrary.initializeSystem(true) - NativeConfig.initializeGlobalConfig() - gamesViewModel.reloadGames(false) - driverViewModel.reloadDriverData() - - return@newInstance getString(R.string.user_data_import_success) - }.show(supportFragmentManager, ProgressDialogFragment.TAG) + InstallableActions.importUserData( + activity = this, + fragmentManager = supportFragmentManager, + gamesViewModel = gamesViewModel, + driverViewModel = driverViewModel, + result = result + ) } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InstallableActions.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InstallableActions.kt new file mode 100644 index 0000000000..d385e2a095 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InstallableActions.kt @@ -0,0 +1,327 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.utils + +import android.content.Intent +import android.net.Uri +import android.widget.Toast +import androidx.fragment.app.FragmentActivity +import androidx.fragment.app.FragmentManager +import org.yuzu.yuzu_emu.NativeLibrary +import org.yuzu.yuzu_emu.R +import org.yuzu.yuzu_emu.fragments.MessageDialogFragment +import org.yuzu.yuzu_emu.fragments.ProgressDialogFragment +import org.yuzu.yuzu_emu.model.AddonViewModel +import org.yuzu.yuzu_emu.model.DriverViewModel +import org.yuzu.yuzu_emu.model.GamesViewModel +import org.yuzu.yuzu_emu.model.HomeViewModel +import org.yuzu.yuzu_emu.model.InstallResult +import org.yuzu.yuzu_emu.model.TaskState +import java.io.BufferedInputStream +import java.io.BufferedOutputStream +import java.io.File +import java.io.FilenameFilter +import java.util.zip.ZipEntry +import java.util.zip.ZipInputStream + +object InstallableActions { + fun processKey( + activity: FragmentActivity, + fragmentManager: FragmentManager, + gamesViewModel: GamesViewModel, + result: Uri, + extension: String = "keys" + ) { + activity.contentResolver.takePersistableUriPermission( + result, + Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + + val resultCode = NativeLibrary.installKeys(result.toString(), extension) + if (resultCode == 0) { + Toast.makeText( + activity.applicationContext, + R.string.keys_install_success, + Toast.LENGTH_SHORT + ).show() + gamesViewModel.reloadGames(true) + return + } + + val resultString = activity.resources.getStringArray(R.array.installKeysResults)[resultCode] + MessageDialogFragment.newInstance( + titleId = R.string.keys_failed, + descriptionString = resultString, + helpLinkId = R.string.keys_missing_help + ).show(fragmentManager, MessageDialogFragment.TAG) + } + + fun processFirmware( + activity: FragmentActivity, + fragmentManager: FragmentManager, + homeViewModel: HomeViewModel, + result: Uri, + onComplete: (() -> Unit)? = null + ) { + val filterNCA = FilenameFilter { _, dirName -> dirName.endsWith(".nca") } + val firmwarePath = File(NativeConfig.getNandDir() + "/system/Contents/registered/") + val cacheFirmwareDir = File("${activity.cacheDir.path}/registered/") + + ProgressDialogFragment.newInstance( + activity, + R.string.firmware_installing + ) { progressCallback, _ -> + var messageToShow: Any + try { + FileUtil.unzipToInternalStorage( + result.toString(), + cacheFirmwareDir, + progressCallback + ) + val unfilteredNumOfFiles = cacheFirmwareDir.list()?.size ?: -1 + val filteredNumOfFiles = cacheFirmwareDir.list(filterNCA)?.size ?: -2 + messageToShow = if (unfilteredNumOfFiles != filteredNumOfFiles) { + MessageDialogFragment.newInstance( + activity, + titleId = R.string.firmware_installed_failure, + descriptionId = R.string.firmware_installed_failure_description + ) + } else { + firmwarePath.deleteRecursively() + cacheFirmwareDir.copyRecursively(firmwarePath, overwrite = true) + NativeLibrary.initializeSystem(true) + homeViewModel.setCheckKeys(true) + activity.getString(R.string.save_file_imported_success) + } + } catch (_: Exception) { + messageToShow = activity.getString(R.string.fatal_error) + } finally { + cacheFirmwareDir.deleteRecursively() + } + messageToShow + }.apply { + onDialogComplete = onComplete + }.show(fragmentManager, ProgressDialogFragment.TAG) + } + + fun uninstallFirmware( + activity: FragmentActivity, + fragmentManager: FragmentManager, + homeViewModel: HomeViewModel + ) { + val firmwarePath = File(NativeConfig.getNandDir() + "/system/Contents/registered/") + ProgressDialogFragment.newInstance( + activity, + R.string.firmware_uninstalling + ) { _, _ -> + val messageToShow: Any = try { + if (firmwarePath.exists()) { + firmwarePath.deleteRecursively() + NativeLibrary.initializeSystem(true) + homeViewModel.setCheckKeys(true) + activity.getString(R.string.firmware_uninstalled_success) + } else { + activity.getString(R.string.firmware_uninstalled_failure) + } + } catch (_: Exception) { + activity.getString(R.string.fatal_error) + } + messageToShow + }.show(fragmentManager, ProgressDialogFragment.TAG) + } + + fun installContent( + activity: FragmentActivity, + fragmentManager: FragmentManager, + addonViewModel: AddonViewModel, + documents: List + ) { + ProgressDialogFragment.newInstance( + activity, + R.string.installing_game_content + ) { progressCallback, messageCallback -> + var installSuccess = 0 + var installOverwrite = 0 + var errorBaseGame = 0 + var error = 0 + documents.forEach { + messageCallback.invoke(FileUtil.getFilename(it)) + when ( + InstallResult.from( + NativeLibrary.installFileToNand( + it.toString(), + progressCallback + ) + ) + ) { + InstallResult.Success -> installSuccess += 1 + InstallResult.Overwrite -> installOverwrite += 1 + InstallResult.BaseInstallAttempted -> errorBaseGame += 1 + InstallResult.Failure -> error += 1 + } + } + + addonViewModel.refreshAddons(force = true) + + val separator = System.lineSeparator() ?: "\n" + val installResult = StringBuilder() + if (installSuccess > 0) { + installResult.append( + activity.getString( + R.string.install_game_content_success_install, + installSuccess + ) + ) + installResult.append(separator) + } + if (installOverwrite > 0) { + installResult.append( + activity.getString( + R.string.install_game_content_success_overwrite, + installOverwrite + ) + ) + installResult.append(separator) + } + val errorTotal = errorBaseGame + error + if (errorTotal > 0) { + installResult.append(separator) + installResult.append( + activity.getString( + R.string.install_game_content_failed_count, + errorTotal + ) + ) + installResult.append(separator) + if (errorBaseGame > 0) { + installResult.append(separator) + installResult.append(activity.getString(R.string.install_game_content_failure_base)) + installResult.append(separator) + } + if (error > 0) { + installResult.append( + activity.getString(R.string.install_game_content_failure_description) + ) + installResult.append(separator) + } + return@newInstance MessageDialogFragment.newInstance( + activity, + titleId = R.string.install_game_content_failure, + descriptionString = installResult.toString().trim(), + helpLinkId = R.string.install_game_content_help_link + ) + } else { + return@newInstance MessageDialogFragment.newInstance( + activity, + titleId = R.string.install_game_content_success, + descriptionString = installResult.toString().trim() + ) + } + }.show(fragmentManager, ProgressDialogFragment.TAG) + } + + fun exportUserData( + activity: FragmentActivity, + fragmentManager: FragmentManager, + result: Uri + ) { + val userDirectory = DirectoryInitialization.userDirectory + if (userDirectory == null) { + Toast.makeText( + activity.applicationContext, + R.string.fatal_error, + Toast.LENGTH_SHORT + ).show() + return + } + + ProgressDialogFragment.newInstance( + activity, + R.string.exporting_user_data, + true + ) { progressCallback, _ -> + val zipResult = FileUtil.zipFromInternalStorage( + File(userDirectory), + userDirectory, + BufferedOutputStream(activity.contentResolver.openOutputStream(result)), + progressCallback, + compression = false + ) + return@newInstance when (zipResult) { + TaskState.Completed -> activity.getString(R.string.user_data_export_success) + TaskState.Failed -> R.string.export_failed + TaskState.Cancelled -> R.string.user_data_export_cancelled + } + }.show(fragmentManager, ProgressDialogFragment.TAG) + } + + fun importUserData( + activity: FragmentActivity, + fragmentManager: FragmentManager, + gamesViewModel: GamesViewModel, + driverViewModel: DriverViewModel, + result: Uri + ) { + val userDirectory = DirectoryInitialization.userDirectory + if (userDirectory == null) { + Toast.makeText( + activity.applicationContext, + R.string.fatal_error, + Toast.LENGTH_SHORT + ).show() + return + } + + ProgressDialogFragment.newInstance( + activity, + R.string.importing_user_data + ) { progressCallback, _ -> + val checkStream = ZipInputStream( + BufferedInputStream(activity.contentResolver.openInputStream(result)) + ) + var isYuzuBackup = false + checkStream.use { stream -> + var ze: ZipEntry? = null + while (stream.nextEntry?.also { ze = it } != null) { + val itemName = ze!!.name.trim() + if (itemName == "/config/config.ini" || itemName == "config/config.ini") { + isYuzuBackup = true + return@use + } + } + } + if (!isYuzuBackup) { + return@newInstance MessageDialogFragment.newInstance( + activity, + titleId = R.string.invalid_yuzu_backup, + descriptionId = R.string.user_data_import_failed_description + ) + } + + NativeConfig.unloadGlobalConfig() + File(userDirectory).deleteRecursively() + + try { + FileUtil.unzipToInternalStorage( + result.toString(), + File(userDirectory), + progressCallback + ) + } catch (_: Exception) { + return@newInstance MessageDialogFragment.newInstance( + activity, + titleId = R.string.import_failed, + descriptionId = R.string.user_data_import_failed_description + ) + } + + NativeLibrary.initializeSystem(true) + NativeConfig.initializeGlobalConfig() + gamesViewModel.reloadGames(false) + driverViewModel.reloadDriverData() + + return@newInstance activity.getString(R.string.user_data_import_success) + }.show(fragmentManager, ProgressDialogFragment.TAG) + } +} diff --git a/src/android/app/src/main/jni/android_config.cpp b/src/android/app/src/main/jni/android_config.cpp index 0c5696ef3f..f697084348 100644 --- a/src/android/app/src/main/jni/android_config.cpp +++ b/src/android/app/src/main/jni/android_config.cpp @@ -2,7 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include -#include +#include #include #include #include "android_config.h" diff --git a/src/android/app/src/main/jni/emu_window/emu_window.cpp b/src/android/app/src/main/jni/emu_window/emu_window.cpp index 4e90cad570..4e6fd560f4 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.cpp +++ b/src/android/app/src/main/jni/emu_window/emu_window.cpp @@ -7,7 +7,7 @@ #include #include "common/android/id_cache.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "input_common/drivers/android.h" #include "input_common/drivers/touch_screen.h" #include "input_common/drivers/virtual_amiibo.h" diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 2108e05911..210689ce55 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -42,8 +42,7 @@ #include "common/detached_tasks.h" #include "common/dynamic_library.h" #include "common/fs/path_util.h" -#include "common/logging/backend.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scm_rev.h" #include "common/scope_exit.h" #include "common/settings.h" diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp index 4536175e9d..647fdbb997 100644 --- a/src/android/app/src/main/jni/native_config.cpp +++ b/src/android/app/src/main/jni/native_config.cpp @@ -10,7 +10,7 @@ #include "common/android/android_common.h" #include "common/android/id_cache.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "frontend_common/config.h" #include "frontend_common/settings_generator.h" diff --git a/src/android/app/src/main/jni/native_freedreno.cpp b/src/android/app/src/main/jni/native_freedreno.cpp index 15c798e5ef..e0f57a8595 100644 --- a/src/android/app/src/main/jni/native_freedreno.cpp +++ b/src/android/app/src/main/jni/native_freedreno.cpp @@ -23,7 +23,7 @@ #include #include "common/android/android_common.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "native.h" namespace { diff --git a/src/android/app/src/main/jni/native_log.cpp b/src/android/app/src/main/jni/native_log.cpp index 95dd1f0573..c6b6fe95b7 100644 --- a/src/android/app/src/main/jni/native_log.cpp +++ b/src/android/app/src/main/jni/native_log.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include -#include +#include #include extern "C" { diff --git a/src/android/app/src/main/res/layout-w600dp/fragment_about.xml b/src/android/app/src/main/res/layout-w600dp/fragment_about.xml index ae2b3e3637..cc8d26dd58 100644 --- a/src/android/app/src/main/res/layout-w600dp/fragment_about.xml +++ b/src/android/app/src/main/res/layout-w600dp/fragment_about.xml @@ -10,12 +10,11 @@ + android:touchscreenBlocksFocus="false"> + android:paddingBottom="24dp" + android:paddingStart="24dp" + android:paddingTop="0dp" + android:paddingEnd="24dp"> - + android:gravity="center_horizontal" + android:orientation="vertical"> + + + + + + + + - - - - - - - - - - diff --git a/src/android/app/src/main/res/layout/fragment_about.xml b/src/android/app/src/main/res/layout/fragment_about.xml index da823bcc25..b1b896f169 100644 --- a/src/android/app/src/main/res/layout/fragment_about.xml +++ b/src/android/app/src/main/res/layout/fragment_about.xml @@ -10,12 +10,11 @@ + android:touchscreenBlocksFocus="false"> - - - - + + + + + android:text="@string/app_name" + android:textAlignment="center" /> - + - - - - + @@ -220,7 +206,9 @@ app:icon="@drawable/ic_discord" app:iconSize="24dp" app:iconGravity="textStart" - app:iconPadding="0dp" /> + app:iconPadding="0dp" + app:strokeColor="?attr/colorOutline" + app:strokeWidth="1dp" /> + app:iconPadding="0dp" + app:strokeColor="?attr/colorOutline" + app:strokeWidth="1dp" /> + app:iconPadding="0dp" + app:strokeColor="?attr/colorOutline" + app:strokeWidth="1dp" /> + app:iconPadding="0dp" + app:strokeColor="?attr/colorOutline" + app:strokeWidth="1dp" /> + app:iconPadding="0dp" + app:strokeColor="?attr/colorOutline" + app:strokeWidth="1dp" /> diff --git a/src/android/app/src/main/res/navigation/emulation_navigation.xml b/src/android/app/src/main/res/navigation/emulation_navigation.xml index 5e6a49501d..2adc60a47c 100644 --- a/src/android/app/src/main/res/navigation/emulation_navigation.xml +++ b/src/android/app/src/main/res/navigation/emulation_navigation.xml @@ -40,10 +40,6 @@ + app:destination="@id/settingsActivity" /> diff --git a/src/android/app/src/main/res/navigation/home_navigation.xml b/src/android/app/src/main/res/navigation/home_navigation.xml index 7d04a19f36..dd567abc1a 100644 --- a/src/android/app/src/main/res/navigation/home_navigation.xml +++ b/src/android/app/src/main/res/navigation/home_navigation.xml @@ -20,26 +20,7 @@ - - - - - - - + android:label="HomeSettingsFragment" /> - - + android:label="AboutFragment" /> + app:destination="@id/settingsActivity" /> + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 7d094effcb..83c04ad40e 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -400,7 +400,7 @@ Copied to clipboard An open-source Switch emulator Contributors - Contributors who made Eden for Android possible + People who made Eden for Android possible https://git.eden-emu.dev/eden-emu/eden/activity/contributors Projects that make Eden for Android possible Build diff --git a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp index 238a9c863a..45a69eca03 100644 --- a/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp +++ b/src/audio_core/adsp/apps/audio_renderer/audio_renderer.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -11,7 +11,7 @@ #include "audio_core/audio_core.h" #include "audio_core/common/common.h" #include "audio_core/sink/sink.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/thread.h" #include "core/core.h" #include "core/core_timing.h" diff --git a/src/audio_core/adsp/apps/opus/opus_decoder.cpp b/src/audio_core/adsp/apps/opus/opus_decoder.cpp index ff4ea8ba2d..8a009c04c7 100644 --- a/src/audio_core/adsp/apps/opus/opus_decoder.cpp +++ b/src/audio_core/adsp/apps/opus/opus_decoder.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -12,7 +12,7 @@ #include "audio_core/adsp/apps/opus/shared_memory.h" #include "audio_core/audio_core.h" #include "audio_core/common/common.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/thread.h" #include "core/core.h" #include "core/core_timing.h" diff --git a/src/audio_core/in/audio_in_system.cpp b/src/audio_core/in/audio_in_system.cpp index 44fd5ce7b6..ec1f565736 100644 --- a/src/audio_core/in/audio_in_system.cpp +++ b/src/audio_core/in/audio_in_system.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -9,7 +9,7 @@ #include "audio_core/audio_event.h" #include "audio_core/audio_manager.h" #include "audio_core/in/audio_in_system.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/core_timing.h" #include "core/hle/kernel/k_event.h" diff --git a/src/audio_core/out/audio_out_system.cpp b/src/audio_core/out/audio_out_system.cpp index d65f445b6a..dcb0d0694e 100644 --- a/src/audio_core/out/audio_out_system.cpp +++ b/src/audio_core/out/audio_out_system.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -9,7 +9,7 @@ #include "audio_core/audio_event.h" #include "audio_core/audio_manager.h" #include "audio_core/out/audio_out_system.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/core_timing.h" #include "core/hle/kernel/k_event.h" diff --git a/src/audio_core/renderer/command/data_source/decode.cpp b/src/audio_core/renderer/command/data_source/decode.cpp index 5a97aadad4..a11d73cac6 100644 --- a/src/audio_core/renderer/command/data_source/decode.cpp +++ b/src/audio_core/renderer/command/data_source/decode.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -10,7 +10,7 @@ #include "audio_core/renderer/command/data_source/decode.h" #include "audio_core/renderer/command/resample/resample.h" #include "common/fixed_point.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scratch_buffer.h" #include "core/guest_memory.h" #include "core/memory.h" diff --git a/src/audio_core/renderer/command/mix/mix_ramp.cpp b/src/audio_core/renderer/command/mix/mix_ramp.cpp index 2f6500da5f..51c75b1b93 100644 --- a/src/audio_core/renderer/command/mix/mix_ramp.cpp +++ b/src/audio_core/renderer/command/mix/mix_ramp.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "audio_core/adsp/apps/audio_renderer/command_list_processor.h" #include "audio_core/renderer/command/mix/mix_ramp.h" #include "common/fixed_point.h" -#include "common/logging/log.h" +#include "common/logging.h" namespace AudioCore::Renderer { diff --git a/src/audio_core/renderer/command/mix/volume.cpp b/src/audio_core/renderer/command/mix/volume.cpp index 92baf6cc33..1e3f28c409 100644 --- a/src/audio_core/renderer/command/mix/volume.cpp +++ b/src/audio_core/renderer/command/mix/volume.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "audio_core/adsp/apps/audio_renderer/command_list_processor.h" #include "audio_core/renderer/command/mix/volume.h" #include "common/fixed_point.h" -#include "common/logging/log.h" +#include "common/logging.h" namespace AudioCore::Renderer { /** diff --git a/src/audio_core/renderer/nodes/node_states.cpp b/src/audio_core/renderer/nodes/node_states.cpp index 028a58041a..c39cf32393 100644 --- a/src/audio_core/renderer/nodes/node_states.cpp +++ b/src/audio_core/renderer/nodes/node_states.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "audio_core/renderer/nodes/node_states.h" -#include "common/logging/log.h" +#include "common/logging.h" namespace AudioCore::Renderer { diff --git a/src/audio_core/sink/cubeb_sink.cpp b/src/audio_core/sink/cubeb_sink.cpp index a3a7a89ba4..ca42810345 100644 --- a/src/audio_core/sink/cubeb_sink.cpp +++ b/src/audio_core/sink/cubeb_sink.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -10,7 +10,7 @@ #include "audio_core/common/common.h" #include "audio_core/sink/cubeb_sink.h" #include "audio_core/sink/sink_stream.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "core/core.h" diff --git a/src/audio_core/sink/oboe_sink.cpp b/src/audio_core/sink/oboe_sink.cpp index 466a9cc8e0..d1ead7d880 100644 --- a/src/audio_core/sink/oboe_sink.cpp +++ b/src/audio_core/sink/oboe_sink.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ #include "audio_core/common/common.h" #include "audio_core/sink/oboe_sink.h" #include "audio_core/sink/sink_stream.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "core/core.h" diff --git a/src/audio_core/sink/sdl2_sink.cpp b/src/audio_core/sink/sdl2_sink.cpp index 25ed58620e..b016bf2222 100644 --- a/src/audio_core/sink/sdl2_sink.cpp +++ b/src/audio_core/sink/sdl2_sink.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -12,7 +12,7 @@ #include "audio_core/common/common.h" #include "audio_core/sink/sdl2_sink.h" #include "audio_core/sink/sink_stream.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "core/core.h" diff --git a/src/audio_core/sink/sink_details.cpp b/src/audio_core/sink/sink_details.cpp index 70bf75018b..4420560d22 100644 --- a/src/audio_core/sink/sink_details.cpp +++ b/src/audio_core/sink/sink_details.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -20,7 +20,7 @@ #include "audio_core/sink/sdl2_sink.h" #endif #include "audio_core/sink/null_sink.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings_enums.h" namespace AudioCore::Sink { diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 7d299b708e..fc3d9b59d8 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -75,16 +75,8 @@ add_library( input.h intrusive_red_black_tree.h literals.h - logging/backend.cpp - logging/backend.h - logging/filter.cpp - logging/filter.h - logging/formatter.h - logging/log.h - logging/log_entry.h - logging/text_formatter.cpp - logging/text_formatter.h - logging/types.h + logging.cpp + logging.h lz4_compression.cpp lz4_compression.h make_unique_for_overwrite.h diff --git a/src/common/android/applets/software_keyboard.cpp b/src/common/android/applets/software_keyboard.cpp index 477e62b169..db76db91a6 100644 --- a/src/common/android/applets/software_keyboard.cpp +++ b/src/common/android/applets/software_keyboard.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ #include "common/android/android_common.h" #include "common/android/applets/software_keyboard.h" #include "common/android/id_cache.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/string_util.h" #include "core/core.h" diff --git a/src/common/android/applets/web_browser.cpp b/src/common/android/applets/web_browser.cpp index cf844ff5fc..29f1cfc4f9 100644 --- a/src/common/android/applets/web_browser.cpp +++ b/src/common/android/applets/web_browser.cpp @@ -1,10 +1,10 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include "common/android/android_common.h" #include "common/android/id_cache.h" #include "common/android/applets/web_browser.h" -#include "common/logging/log.h" +#include "common/logging.h" static jclass s_native_library_class = nullptr; static jmethodID s_open_external_url = nullptr; diff --git a/src/common/assert.cpp b/src/common/assert.cpp index e6be671865..b0ddc89037 100644 --- a/src/common/assert.cpp +++ b/src/common/assert.cpp @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" #include "common/common_funcs.h" -#include "common/logging/backend.h" +#include "common/logging.h" #include "common/settings.h" #ifdef _MSC_VER diff --git a/src/common/assert.h b/src/common/assert.h index 67310f8e06..298af3071a 100644 --- a/src/common/assert.h +++ b/src/common/assert.h @@ -7,7 +7,7 @@ #pragma once -#include "common/logging/log.h" +#include "common/logging.h" // Sometimes we want to try to continue even after hitting an assert. // However touching this file yields a global recompilation as this header is included almost diff --git a/src/common/fs/file.cpp b/src/common/fs/file.cpp index 8a3135e0ed..854090e7b2 100644 --- a/src/common/fs/file.cpp +++ b/src/common/fs/file.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -12,7 +12,7 @@ #ifdef ANDROID #include "common/fs/fs_android.h" #endif -#include "common/logging/log.h" +#include "common/logging.h" #ifdef _WIN32 #include diff --git a/src/common/fs/fs.cpp b/src/common/fs/fs.cpp index 174aed49b8..3858b0f0c3 100644 --- a/src/common/fs/fs.cpp +++ b/src/common/fs/fs.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include "common/fs/fs_android.h" #endif #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" namespace Common::FS { diff --git a/src/common/fs/path_util.cpp b/src/common/fs/path_util.cpp index 3f928ac327..714e393293 100644 --- a/src/common/fs/path_util.cpp +++ b/src/common/fs/path_util.cpp @@ -16,7 +16,7 @@ #endif #include "common/fs/fs_paths.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #ifdef _WIN32 #include // Used in GetExeDirectory() diff --git a/src/common/heap_tracker.cpp b/src/common/heap_tracker.cpp index a99d386d8a..b72abb16d8 100644 --- a/src/common/heap_tracker.cpp +++ b/src/common/heap_tracker.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -6,7 +6,7 @@ #include #include "common/heap_tracker.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/assert.h" namespace Common { diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index a75152eec0..d4b1709377 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -54,7 +54,7 @@ #include "common/assert.h" #include "common/free_region_manager.h" #include "common/host_memory.h" -#include "common/logging/log.h" +#include "common/logging.h" #if defined(__ANDROID__) && __ANDROID_API__ < 30 #include diff --git a/src/common/input.h b/src/common/input.h index b076fd7e6b..bd9b2d1656 100644 --- a/src/common/input.h +++ b/src/common/input.h @@ -12,7 +12,7 @@ #include #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/param_package.h" #include "common/uuid.h" diff --git a/src/common/log_classes.inc b/src/common/log_classes.inc new file mode 100644 index 0000000000..ba2234f041 --- /dev/null +++ b/src/common/log_classes.inc @@ -0,0 +1,104 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +/// Macro listing all log classes. Code should define CLS and SUB as desired before invoking this. + +CLS(Log) +CLS(Common) +SUB(Common, Filesystem) +SUB(Common, Memory) +CLS(Core) +SUB(Core, ARM) +SUB(Core, Timing) +CLS(Config) +CLS(Debug) +SUB(Debug, Emulated) +SUB(Debug, GPU) +SUB(Debug, Breakpoint) +SUB(Debug, GDBStub) +CLS(Kernel) +SUB(Kernel, SVC) +CLS(Service) +SUB(Service, ACC) +SUB(Service, Audio) +SUB(Service, AM) +SUB(Service, AOC) +SUB(Service, APM) +SUB(Service, ARP) +SUB(Service, BCAT) +SUB(Service, BPC) +SUB(Service, BGTC) +SUB(Service, BTDRV) +SUB(Service, BTM) +SUB(Service, Capture) +SUB(Service, ERPT) +SUB(Service, ETicket) +SUB(Service, EUPLD) +SUB(Service, Fatal) +SUB(Service, FGM) +SUB(Service, Friend) +SUB(Service, FS) +SUB(Service, GRC) +SUB(Service, HID) +SUB(Service, IRS) +SUB(Service, JIT) +SUB(Service, LBL) +SUB(Service, LDN) +SUB(Service, LDR) +SUB(Service, LM) +SUB(Service, Migration) +SUB(Service, Mii) +SUB(Service, MM) +SUB(Service, MNPP) +SUB(Service, NCM) +SUB(Service, NFC) +SUB(Service, NFP) +SUB(Service, NGC) +SUB(Service, NIFM) +SUB(Service, NIM) +SUB(Service, NOTIF) +SUB(Service, NPNS) +SUB(Service, NS) +SUB(Service, NVDRV) +SUB(Service, Nvnflinger) +SUB(Service, OLSC) +SUB(Service, PCIE) +SUB(Service, PCTL) +SUB(Service, PCV) +SUB(Service, PM) +SUB(Service, PREPO) +SUB(Service, PSC) +SUB(Service, PTM) +SUB(Service, SET) +SUB(Service, SM) +SUB(Service, SPL) +SUB(Service, SSL) +SUB(Service, TCAP) +SUB(Service, Time) +SUB(Service, USB) +SUB(Service, VI) +SUB(Service, WLAN) +CLS(HW) +SUB(HW, Memory) +SUB(HW, LCD) +SUB(HW, GPU) +SUB(HW, AES) +CLS(IPC) +CLS(Frontend) +CLS(Render) +SUB(Render, Software) +SUB(Render, OpenGL) +SUB(Render, Vulkan) +CLS(Shader) +SUB(Shader, SPIRV) +SUB(Shader, GLASM) +SUB(Shader, GLSL) +CLS(Audio) +SUB(Audio, DSP) +SUB(Audio, Sink) +CLS(Input) +CLS(Network) +CLS(Loader) +CLS(CheatEngine) +CLS(Crypto) +CLS(WebService) diff --git a/src/common/logging.cpp b/src/common/logging.cpp new file mode 100644 index 0000000000..0b82d3e727 --- /dev/null +++ b/src/common/logging.cpp @@ -0,0 +1,463 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: 2014 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include + +#if defined(__ANDROID__) +#include +#endif +#ifdef _WIN32 +#include // For OutputDebugStringW +#else +#include +#include +#endif + +#include +#include + +#include "common/fs/file.h" +#include "common/fs/fs.h" +#include "common/fs/fs_paths.h" +#include "common/fs/path_util.h" +#include "common/literals.h" +#include "common/polyfill_thread.h" +#include "common/thread.h" + +#include "common/logging.h" +#include "common/settings.h" +#include "common/string_util.h" +#include "common/bounded_threadsafe_queue.h" + +namespace Common::Log { + +namespace { + +/// @brief Returns the name of the passed log class as a C-string. Subclasses are separated by periods +/// instead of underscores as in the enumeration. +/// @note GetClassName is a macro defined by Windows.h, grrr... +const char* GetLogClassName(Class log_class) { + switch (log_class) { +#define CLS(x) case Class::x: return #x; +#define SUB(x, y) case Class::x##_##y: return #x "." #y; +#include "common/log_classes.inc" +#undef CLS +#undef SUB + default: return "?"; + } +} + +/// @brief Returns the name of the passed log level as a C-string. +const char* GetLevelName(Level log_level) { + switch (log_level) { +#define LVL(x) case Level::x: return #x; + LVL(Trace) + LVL(Debug) + LVL(Info) + LVL(Warning) + LVL(Error) + LVL(Critical) +#undef LVL + default: return "?"; + } +} + +} + +// Some IDEs prefer : instead, so let's just do that :) +std::string FormatLogMessage(const Entry& entry) noexcept { + if (!entry.filename) return ""; + auto const time_seconds = uint32_t(entry.timestamp.count() / 1000000); + auto const time_fractional = uint32_t(entry.timestamp.count() % 1000000); + auto const class_name = GetLogClassName(entry.log_class); + auto const level_name = GetLevelName(entry.log_level); + return fmt::format("[{:4d}.{:06d}] {} <{}> {}:{}:{}: {}", time_seconds, time_fractional, class_name, level_name, entry.filename, entry.line_num, entry.function, entry.message); +} + +namespace { +template +Level GetLevelByName(const It begin, const It end) { + for (u32 i = 0; i < u32(Level::Count); ++i) { + const char* level_name = GetLevelName(Level(i)); + if (Common::ComparePartialString(begin, end, level_name)) + return Level(i); + } + return Level::Count; +} + +template +Class GetClassByName(const It begin, const It end) { + for (u32 i = 0; i < u32(Class::Count); ++i) { + const char* level_name = GetLogClassName(Class(i)); + if (Common::ComparePartialString(begin, end, level_name)) + return Class(i); + } + return Class::Count; +} + +template +bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { + auto level_separator = std::find(begin, end, ':'); + if (level_separator == end) { + LOG_ERROR(Log, "Invalid log filter. Must specify a log level after `:`: {}", std::string(begin, end)); + return false; + } + const Level level = GetLevelByName(level_separator + 1, end); + if (level == Level::Count) { + LOG_ERROR(Log, "Unknown log level in filter: {}", std::string(begin, end)); + return false; + } + if (Common::ComparePartialString(begin, level_separator, "*")) { + instance.class_levels.fill(level); + return true; + } + const Class log_class = GetClassByName(begin, level_separator); + if (log_class == Class::Count) { + LOG_ERROR(Log, "Unknown log class in filter: {}", std::string(begin, end)); + return false; + } + instance.SetClassLevel(log_class, level); + return true; +} +} // Anonymous namespace + +void Filter::ParseFilterString(std::string_view filter_view) { + auto clause_begin = filter_view.cbegin(); + while (clause_begin != filter_view.cend()) { + auto clause_end = std::find(clause_begin, filter_view.cend(), ' '); + // If clause isn't empty + if (clause_end != clause_begin) { + ParseFilterRule(*this, clause_begin, clause_end); + } + if (clause_end != filter_view.cend()) { + // Skip over the whitespace + ++clause_end; + } + clause_begin = clause_end; + } +} + +namespace { + +/// @brief Trims up to and including the last of ../, ..\, src/, src\ in a string +/// do not be fooled this isn't generating new strings on .rodata :) +constexpr const char* TrimSourcePath(std::string_view source) noexcept { + const auto rfind = [source](const std::string_view match) { + return source.rfind(match) == source.npos ? 0 : (source.rfind(match) + match.size()); + }; + auto idx = (std::max)({rfind("src/"), rfind("src\\"), rfind("../"), rfind("..\\")}); + return source.data() + idx; +} + +/// @brief Interface for logging backends. +struct Backend { + virtual ~Backend() noexcept = default; + virtual void Write(const Entry& entry) noexcept = 0; + virtual void Flush() noexcept = 0; +}; + +/// @brief Formatting specifier (to use with printf) of the equivalent fmt::format() expression +#define CCB_PRINTF_FMT "[%4d.%06d] %s <%s> %s:%u:%s: %s" + +/// @brief Instead of using fmt::format() just use the system's formatting capabilities directly +struct DirectFormatArgs { + const char *class_name; + const char *level_name; + uint32_t time_seconds; + uint32_t time_fractional; +}; +[[nodiscard]] inline DirectFormatArgs GetDirectFormatArgs(Entry const& entry) noexcept { + return { + .class_name = GetLogClassName(entry.log_class), + .level_name = GetLevelName(entry.log_level), + .time_seconds = uint32_t(entry.timestamp.count() / 1000000), + .time_fractional = uint32_t(entry.timestamp.count() % 1000000), + }; +} + +/// @brief Backend that writes to stdout and with color +struct ColorConsoleBackend final : public Backend { +#ifdef _WIN32 + explicit ColorConsoleBackend() noexcept { + console_handle = GetStdHandle(STD_ERROR_HANDLE); + GetConsoleScreenBufferInfo(console_handle, &original_info); + } + ~ColorConsoleBackend() noexcept override { + SetConsoleTextAttribute(console_handle, original_info.wAttributes); + } + void Write(const Entry& entry) noexcept override { + if (enabled && console_handle != INVALID_HANDLE_VALUE) { + WORD color = WORD([&entry]() { + switch (entry.log_level) { + case Level::Debug: return FOREGROUND_GREEN | FOREGROUND_BLUE; // Cyan + case Level::Info: return FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; // Bright gray + case Level::Warning: return FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY; + case Level::Error: return FOREGROUND_RED | FOREGROUND_INTENSITY; + case Level::Critical: return FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY; + default: break; + } + return FOREGROUND_INTENSITY; // Grey + }()); + SetConsoleTextAttribute(console_handle, color); + auto const df = GetDirectFormatArgs(entry); + std::fprintf(stdout, CCB_PRINTF_FMT "\n", df.time_seconds, df.time_fractional, df.class_name, df.level_name, entry.filename, entry.line_num, entry.function, entry.message.c_str()); + } + } + void Flush() noexcept override {} + CONSOLE_SCREEN_BUFFER_INFO original_info = {}; + HANDLE console_handle = INVALID_HANDLE_VALUE; + std::atomic_bool enabled = false; +#else // ^^^ Windows vvv POSIX + explicit ColorConsoleBackend() noexcept {} + ~ColorConsoleBackend() noexcept override {} + void Write(const Entry& entry) noexcept override { + if (enabled) { +#define ESC "\x1b" + auto const color_str = [&entry]() -> const char* { + switch (entry.log_level) { +#define CCB_MAKE_COLOR_FMT(X) ESC X CCB_PRINTF_FMT ESC "[0m\n" + case Level::Debug: return CCB_MAKE_COLOR_FMT("[0;36m"); // Cyan + case Level::Info: return CCB_MAKE_COLOR_FMT("[0;37m"); // Bright gray + case Level::Warning: return CCB_MAKE_COLOR_FMT("[1;33m"); // Bright yellow + case Level::Error: return CCB_MAKE_COLOR_FMT("[1;31m"); // Bright red + case Level::Critical: return CCB_MAKE_COLOR_FMT("[1;35m"); // Bright magenta + default: return CCB_MAKE_COLOR_FMT("[1;30m"); // Grey +#undef CCB_MAKE_COLOR_FMT + } + }(); + auto const df = GetDirectFormatArgs(entry); + std::fprintf(stdout, color_str, df.time_seconds, df.time_fractional, df.class_name, df.level_name, entry.filename, entry.line_num, entry.function, entry.message.c_str()); +#undef ESC + } + } + void Flush() noexcept override {} + std::atomic_bool enabled = false; +#endif +}; + +#ifndef __OPENORBIS__ +/// @brief Backend that writes to a file passed into the constructor +struct FileBackend final : public Backend { + explicit FileBackend(const std::filesystem::path& filename) noexcept { + auto old_filename = filename; + old_filename += ".old.txt"; + // Existence checks are done within the functions themselves. + // We don't particularly care if these succeed or not. + void(FS::RemoveFile(old_filename)); + void(FS::RenameFile(filename, old_filename)); + file.emplace(filename, FS::FileAccessMode::Write, FS::FileType::TextFile); + } + ~FileBackend() noexcept override = default; + + void Write(const Entry& entry) noexcept override { + if (!enabled) + return; + + auto message = FormatLogMessage(entry).append(1, '\n'); +#ifndef __ANDROID__ + if (Settings::values.censor_username.GetValue()) { + // This must be a static otherwise it would get checked on EVERY + // instance of logging an entry... + static std::string username = []() -> std::string { + // in order of precedence + // LOGNAME usually works on UNIX, USERNAME on Windows + // Some UNIX systems suck and don't use LOGNAME so we also + // need USER :( + for (auto const var : { "LOGNAME", "USERNAME", "USER", }) + if (auto const s = ::getenv(var); s != nullptr) + return std::string{s}; + return std::string{}; + }(); + if (!username.empty()) + boost::replace_all(message, username, "user"); + } +#endif + bytes_written += file->WriteString(message); + + // Option to log each line rather than 4k buffers + if (Settings::values.log_flush_line.GetValue()) + file->Flush(); + + using namespace Common::Literals; + // Prevent logs from exceeding a set maximum size in the event that log entries are spammed. + const auto write_limit = Settings::values.extended_logging.GetValue() ? 1_GiB : 100_MiB; + const bool write_limit_exceeded = bytes_written > write_limit; + if (entry.log_level >= Level::Error || write_limit_exceeded) { + // Stop writing after the write limit is exceeded. + // Don't close the file so we can print a stacktrace if necessary + if (write_limit_exceeded) + enabled = false; + file->Flush(); + } + } + + void Flush() noexcept override { + file->Flush(); + } +private: + std::optional file; + std::size_t bytes_written = 0; + bool enabled = true; +}; +#endif + +#ifdef _WIN32 +/// @brief Backend that writes to Visual Studio's output window +struct DebuggerBackend final : public Backend { + explicit DebuggerBackend() noexcept = default; + ~DebuggerBackend() noexcept override = default; + void Write(const Entry& entry) noexcept override { + ::OutputDebugStringW(UTF8ToUTF16W(FormatLogMessage(entry).append(1, '\n')).c_str()); + } + void Flush() noexcept override {} +}; +#endif +#ifdef ANDROID +/// @brief Backend that writes to the Android logcat +struct LogcatBackend : public Backend { + explicit LogcatBackend() noexcept = default; + ~LogcatBackend() noexcept override = default; + void Write(const Entry& entry) noexcept override { + android_LogPriority android_log_priority = [&]() { + switch (entry.log_level) { + case Level::Debug: return ANDROID_LOG_DEBUG; + case Level::Info: return ANDROID_LOG_INFO; + case Level::Warning: return ANDROID_LOG_WARN; + case Level::Error: return ANDROID_LOG_ERROR; + case Level::Critical: return ANDROID_LOG_FATAL; + case Level::Count: + case Level::Trace: return ANDROID_LOG_VERBOSE; + } + }(); + auto const df = GetDirectFormatArgs(entry); + __android_log_print(android_log_priority, "YuzuNative", CCB_PRINTF_FMT, df.time_seconds, df.time_fractional, df.class_name, df.level_name, entry.filename, entry.line_num, entry.function, entry.message.c_str()); + } + void Flush() noexcept override {} +}; +#endif + +/// @brief Static state as a singleton. +struct Impl { + // Well, I mean it's the default constructor! + explicit Impl() noexcept : filter(Level::Trace) {} + + void StartBackendThread() noexcept { + backend_thread = std::jthread([this](std::stop_token stop_token) { + Common::SetCurrentThreadName("Logger"); + Entry entry; + const auto write_logs = [this, &entry]() { + ForEachBackend([&entry](Backend& backend) { + backend.Write(entry); + }); + }; + do { + message_queue.PopWait(entry, stop_token); + write_logs(); + } while (!stop_token.stop_requested()); + // Drain the logging queue. Only writes out up to MAX_LOGS_TO_WRITE to prevent a + // case where a system is repeatedly spamming logs even on close. + int max_logs_to_write = filter.IsDebug() ? INT_MAX : 100; + while (max_logs_to_write-- && message_queue.TryPop(entry)) + write_logs(); + }); + } + + void StopBackendThread() noexcept { + backend_thread.request_stop(); + if (backend_thread.joinable()) + backend_thread.join(); + ForEachBackend([](Backend& backend) { backend.Flush(); }); + } + + void ForEachBackend(auto lambda) noexcept { + lambda(static_cast(color_console_backend)); +#ifndef __OPENORBIS__ + if (file_backend) + lambda(static_cast(*file_backend)); +#endif +#ifdef _WIN32 + lambda(static_cast(debugger_backend)); +#endif +#ifdef ANDROID + lambda(static_cast(lc_backend)); +#endif + } + + Filter filter; + ColorConsoleBackend color_console_backend{}; +#ifndef __OPENORBIS__ + std::optional file_backend; +#endif +#ifdef _WIN32 + DebuggerBackend debugger_backend{}; +#endif +#ifdef ANDROID + LogcatBackend lc_backend{}; +#endif + MPSCQueue message_queue{}; + std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()}; + std::jthread backend_thread; +}; +} // namespace + +// Constructor shall NOT depend upon Settings() or whatever +// it's ran at global static ctor() time... so BE CAREFUL MFER! +static std::optional logging_instance{}; + +void Initialize() { + if (logging_instance) { + LOG_WARNING(Log, "Reinitializing logging backend"); + } else { + logging_instance.emplace(); + logging_instance->filter.ParseFilterString(Settings::values.log_filter.GetValue()); +#ifndef __OPENORBIS__ + using namespace Common::FS; + const auto& log_dir = GetEdenPath(EdenPath::LogDir); + void(CreateDir(log_dir)); + logging_instance->file_backend.emplace(log_dir / LOG_FILE); +#endif + } +} + +void Start() { + if (logging_instance) + logging_instance->StartBackendThread(); +} + +void Stop() { + if (logging_instance) + logging_instance->StopBackendThread(); +} + +void SetGlobalFilter(const Filter& filter) { + if (logging_instance) + logging_instance->filter = filter; +} + +void SetColorConsoleBackendEnabled(bool enabled) { + if (logging_instance) + logging_instance->color_console_backend.enabled = enabled; +} + +void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename, unsigned int line_num, const char* function, fmt::string_view format, const fmt::format_args& args) { + if (logging_instance && logging_instance->filter.CheckMessage(log_class, log_level)) { + logging_instance->message_queue.EmplaceWait(Entry{ + .message = fmt::vformat(format, args), + .timestamp = std::chrono::duration_cast(std::chrono::steady_clock::now() - logging_instance->time_origin), + .log_class = log_class, + .log_level = log_level, + .filename = TrimSourcePath(filename), + .function = function, + .line_num = line_num, + }); + } +} +} // namespace Common::Log diff --git a/src/common/logging.h b/src/common/logging.h new file mode 100644 index 0000000000..eabc683f63 --- /dev/null +++ b/src/common/logging.h @@ -0,0 +1,164 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: 2014 Citra Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include +#include +#include "common/swap.h" + +// adapted from https://github.com/fmtlib/fmt/issues/2704 +// a generic formatter for enum classes +#if FMT_VERSION >= 80100 +template +struct fmt::formatter, char>> + : formatter> { + template + auto format(const T& value, FormatContext& ctx) const -> decltype(ctx.out()) { + return fmt::formatter>::format( + static_cast>(value), ctx); + } +}; +#endif + +template +struct fmt::formatter> { + constexpr auto parse(format_parse_context& ctx) { + return ctx.begin(); + } + template + auto format(const SwapStructT& reg, FormatContext& ctx) const { + return fmt::format_to(ctx.out(), "{}", T(reg)); + } +}; + +#ifdef _DEBUG +#define LOG_TRACE(log_class, ...) \ + Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Trace, \ + __FILE__, __LINE__, __func__, __VA_ARGS__) +#else +#define LOG_TRACE(log_class, fmt, ...) (void(0)) +#endif + +#define LOG_DEBUG(log_class, ...) \ + ::Common::Log::FmtLogMessage(::Common::Log::Class::log_class, ::Common::Log::Level::Debug, \ + __FILE__, __LINE__, __func__, __VA_ARGS__) +#define LOG_INFO(log_class, ...) \ + ::Common::Log::FmtLogMessage(::Common::Log::Class::log_class, ::Common::Log::Level::Info, \ + __FILE__, __LINE__, __func__, __VA_ARGS__) +#define LOG_WARNING(log_class, ...) \ + ::Common::Log::FmtLogMessage(::Common::Log::Class::log_class, ::Common::Log::Level::Warning, \ + __FILE__, __LINE__, __func__, __VA_ARGS__) +#define LOG_ERROR(log_class, ...) \ + ::Common::Log::FmtLogMessage(::Common::Log::Class::log_class, ::Common::Log::Level::Error, \ + __FILE__, __LINE__, __func__, __VA_ARGS__) +#define LOG_CRITICAL(log_class, ...) \ + ::Common::Log::FmtLogMessage(::Common::Log::Class::log_class, ::Common::Log::Level::Critical, \ + __FILE__, __LINE__, __func__, __VA_ARGS__) + +namespace Common::Log { + +/// Specifies the severity or level of detail of the log message. +enum class Level : u8 { + Trace, ///< Extremely detailed and repetitive debugging information that is likely to pollute logs. + Debug, ///< Less detailed debugging information. + Info, ///< Status information from important points during execution. + Warning, ///< Minor or potential problems found during execution of a task. + Error, ///< Major problems found during execution of a task that prevent it from being completed. + Critical, ///< Major problems during execution that threaten the stability of the entire application. + Count ///< Total number of logging levels +}; + +/// Specifies the sub-system that generated the log message. +enum class Class : u8 { +#define SUB(A, B) A##_##B, +#define CLS(A) A, +#include "log_classes.inc" +#undef SUB +#undef CLS + Count, +}; + +/// Logs a message to the global logger, using fmt +void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename, unsigned int line_num, const char* function, fmt::string_view format, const fmt::format_args& args); + +template +void FmtLogMessage(Class log_class, Level log_level, const char* filename, unsigned int line_num, const char* function, fmt::format_string format, const Args&... args) { + FmtLogMessageImpl(log_class, log_level, filename, line_num, function, format, fmt::make_format_args(args...)); +} + +/// Implements a log message filter which allows different log classes to have different minimum +/// severity levels. The filter can be changed at runtime and can be parsed from a string to allow +/// editing via the interface or loading from a configuration file. +struct Filter { + /// Initializes the filter with all classes having `default_level` as the minimum level. + explicit Filter(Level level = Level::Info) { + class_levels.fill(level); + } + /// Sets the minimum level of `log_class` (and not of its subclasses) to `level`. + void SetClassLevel(Class log_class, Level level) { + class_levels[std::size_t(log_class)] = level; + } + /// Parses a filter string and applies it to this filter. + /// A filter string consists of a space-separated list of filter rules, each of the format + /// `:`. `` is a log class name, with subclasses separated using periods. + /// `*` is allowed as a class name and will reset all filters to the specified level. `` + /// a severity level name which will be set as the minimum logging level of the matched classes. + /// Rules are applied left to right, with each rule overriding previous ones in the sequence. + /// A few examples of filter rules: + /// - `*:Info` -- Resets the level of all classes to Info. + /// - `Service:Info` -- Sets the level of Service to Info. + /// - `Service.FS:Trace` -- Sets the level of the Service.FS class to Trace. + void ParseFilterString(std::string_view filter_view); + /// Matches class/level combination against the filter, returning true if it passed. + [[nodiscard]] bool CheckMessage(Class log_class, Level level) const { + return u8(level) >= u8(class_levels[std::size_t(log_class)]); + } + /// Returns true if any logging classes are set to debug + [[nodiscard]] bool IsDebug() const { + return std::any_of(class_levels.begin(), class_levels.end(), [](const Level& l) { + return u8(l) <= u8(Level::Debug); + }); + } + std::array class_levels; +}; + +/// Initializes the logging system. This should be the first thing called in main. +void Initialize(); + +void Start(); + +/// Explicitly stops the logger thread and flushes the buffers +void Stop(); + +/// The global filter will prevent any messages from even being processed if they are filtered. +void SetGlobalFilter(const Filter& filter); +void SetColorConsoleBackendEnabled(bool enabled); + +/// @brief A log entry. Log entries are store in a structured format to permit more varied output +/// formatting on different frontends, as well as facilitating filtering and aggregation. +struct Entry { + std::string message; + std::chrono::microseconds timestamp; + Class log_class{}; + Level log_level{}; + const char* filename = nullptr; + const char* function = nullptr; + unsigned int line_num = 0; +}; + +/// Formats a log entry into the provided text buffer. +std::string FormatLogMessage(const Entry& entry) noexcept; + +/// Prints the same message as `PrintMessage`, but colored according to the severity level. +void PrintColoredMessage(const Entry& entry) noexcept; + +/// Formats and prints a log entry to the android logcat. +void PrintMessageToLogcat(const Entry& entry) noexcept; + +} // namespace Common::Log diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp deleted file mode 100644 index 788cf77ca2..0000000000 --- a/src/common/logging/backend.cpp +++ /dev/null @@ -1,369 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: 2014 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include -#include -#include -#include -#include - -#include -#include - -#ifdef _WIN32 -#include // For OutputDebugStringW -#endif - -#include "common/fs/file.h" -#include "common/fs/fs.h" -#include "common/fs/fs_paths.h" -#include "common/fs/path_util.h" -#include "common/literals.h" -#include "common/polyfill_thread.h" -#include "common/thread.h" - -#include "common/logging/backend.h" -#include "common/logging/log.h" -#include "common/logging/log_entry.h" -#include "common/logging/text_formatter.h" -#include "common/settings.h" -#ifdef _WIN32 -#include "common/string_util.h" -#endif -#include "common/bounded_threadsafe_queue.h" - -namespace Common::Log { - -namespace { - -/// @brief Trims up to and including the last of ../, ..\, src/, src\ in a string -/// do not be fooled this isn't generating new strings on .rodata :) -constexpr const char* TrimSourcePath(std::string_view source) noexcept { - const auto rfind = [source](const std::string_view match) { - return source.rfind(match) == source.npos ? 0 : (source.rfind(match) + match.size()); - }; - auto idx = (std::max)({rfind("src/"), rfind("src\\"), rfind("../"), rfind("..\\")}); - return source.data() + idx; -} - -/// @brief Interface for logging backends. -struct Backend { - virtual ~Backend() noexcept = default; - virtual void Write(const Entry& entry) noexcept = 0; - virtual void EnableForStacktrace() noexcept= 0; - virtual void Flush() noexcept = 0; -}; - -/// @brief Backend that writes to stderr and with color -struct ColorConsoleBackend final : public Backend { - explicit ColorConsoleBackend() noexcept = default; - ~ColorConsoleBackend() noexcept override = default; - - void Write(const Entry& entry) noexcept override { - if (enabled.load(std::memory_order_relaxed)) - PrintColoredMessage(entry); - } - - void Flush() noexcept override { - // stderr shouldn't be buffered - } - - void EnableForStacktrace() noexcept override { - enabled = true; - } - - void SetEnabled(bool enabled_) noexcept { - enabled = enabled_; - } - -private: - std::atomic_bool enabled{false}; -}; - -#ifndef __OPENORBIS__ -/// @brief Backend that writes to a file passed into the constructor -struct FileBackend final : public Backend { - explicit FileBackend(const std::filesystem::path& filename) noexcept { - auto old_filename = filename; - old_filename += ".old.txt"; - - // Existence checks are done within the functions themselves. - // We don't particularly care if these succeed or not. - void(FS::RemoveFile(old_filename)); - void(FS::RenameFile(filename, old_filename)); - - file = std::make_unique(filename, FS::FileAccessMode::Write, FS::FileType::TextFile); - } - - ~FileBackend() noexcept override = default; - - void Write(const Entry& entry) noexcept override { - if (!enabled) - return; - - auto message = FormatLogMessage(entry).append(1, '\n'); -#ifndef __ANDROID__ - if (Settings::values.censor_username.GetValue()) { - // This must be a static otherwise it would get checked on EVERY - // instance of logging an entry... - static std::string username = []() -> std::string { - // in order of precedence - // LOGNAME usually works on UNIX, USERNAME on Windows - // Some UNIX systems suck and don't use LOGNAME so we also - // need USER :( - for (auto const var : { - "LOGNAME", - "USERNAME", - "USER", - }) { - if (auto const s = getenv(var); s != nullptr) - return std::string{s}; - } - - return std::string{}; - }(); - if (!username.empty()) - boost::replace_all(message, username, "user"); - } -#endif - bytes_written += file->WriteString(message); - - // Option to log each line rather than 4k buffers - if (Settings::values.log_flush_line.GetValue()) - file->Flush(); - - using namespace Common::Literals; - // Prevent logs from exceeding a set maximum size in the event that log entries are spammed. - const auto write_limit = Settings::values.extended_logging.GetValue() ? 1_GiB : 100_MiB; - const bool write_limit_exceeded = bytes_written > write_limit; - if (entry.log_level >= Level::Error || write_limit_exceeded) { - // Stop writing after the write limit is exceeded. - // Don't close the file so we can print a stacktrace if necessary - if (write_limit_exceeded) - enabled = false; - file->Flush(); - } - } - - void Flush() noexcept override { - file->Flush(); - } - - void EnableForStacktrace() noexcept override { - enabled = true; - bytes_written = 0; - } - -private: - std::unique_ptr file; - std::size_t bytes_written = 0; - bool enabled = true; -}; -#endif - -#ifdef _WIN32 -/// @brief Backend that writes to Visual Studio's output window -struct DebuggerBackend final : public Backend { - explicit DebuggerBackend() noexcept = default; - ~DebuggerBackend() noexcept override = default; - void Write(const Entry& entry) noexcept override { - ::OutputDebugStringW(UTF8ToUTF16W(FormatLogMessage(entry).append(1, '\n')).c_str()); - } - void Flush() noexcept override {} - void EnableForStacktrace() noexcept override {} -}; -#endif -#ifdef ANDROID -/// @brief Backend that writes to the Android logcat -struct LogcatBackend : public Backend { - explicit LogcatBackend() noexcept = default; - ~LogcatBackend() noexcept override = default; - void Write(const Entry& entry) noexcept override { - PrintMessageToLogcat(entry); - } - void Flush() noexcept override {} - void EnableForStacktrace() noexcept override {} -}; -#endif - -bool initialization_in_progress_suppress_logging = true; - -/// @brief Static state as a singleton. -class Impl { -public: - static Impl& Instance() noexcept { - if (!instance) - std::abort(); - return *instance; - } - - static void Initialize() noexcept { - if (instance) { - LOG_WARNING(Log, "Reinitializing logging backend"); - return; - } - using namespace Common::FS; - const auto& log_dir = GetEdenPath(EdenPath::LogDir); - void(CreateDir(log_dir)); - Filter filter; - filter.ParseFilterString(Settings::values.log_filter.GetValue()); - instance = std::unique_ptr(new Impl(log_dir / LOG_FILE, filter), Deleter); - initialization_in_progress_suppress_logging = false; - } - - static void Start() noexcept { - instance->StartBackendThread(); - } - - static void Stop() noexcept { - instance->StopBackendThread(); - } - - Impl(const Impl&) noexcept = delete; - Impl& operator=(const Impl&) noexcept = delete; - - Impl(Impl&&) noexcept = delete; - Impl& operator=(Impl&&) noexcept = delete; - - void SetGlobalFilter(const Filter& f) noexcept { - filter = f; - } - - void SetColorConsoleBackendEnabled(bool enabled) noexcept { - color_console_backend.SetEnabled(enabled); - } - - bool CanPushEntry(Class log_class, Level log_level) const noexcept { - return filter.CheckMessage(log_class, log_level); - } - - void PushEntry(Class log_class, Level log_level, const char* filename, unsigned int line_num, const char* function, std::string&& message) noexcept { - message_queue.EmplaceWait(CreateEntry(log_class, log_level, TrimSourcePath(filename), line_num, function, std::move(message))); - } - -private: - Impl(const std::filesystem::path& file_backend_filename, const Filter& filter_) noexcept : - filter{filter_} -#ifndef __OPENORBIS__ - , file_backend{file_backend_filename} -#endif - {} - - ~Impl() noexcept = default; - - void StartBackendThread() noexcept { - backend_thread = std::jthread([this](std::stop_token stop_token) { - Common::SetCurrentThreadName("Logger"); - Entry entry; - const auto write_logs = [this, &entry]() { - ForEachBackend([&entry](Backend& backend) { - backend.Write(entry); - }); - }; - do { - message_queue.PopWait(entry, stop_token); - write_logs(); - } while (!stop_token.stop_requested()); - // Drain the logging queue. Only writes out up to MAX_LOGS_TO_WRITE to prevent a - // case where a system is repeatedly spamming logs even on close. - int max_logs_to_write = filter.IsDebug() ? INT_MAX : 100; - while (max_logs_to_write-- && message_queue.TryPop(entry)) - write_logs(); - }); - } - - void StopBackendThread() noexcept { - backend_thread.request_stop(); - if (backend_thread.joinable()) - backend_thread.join(); - ForEachBackend([](Backend& backend) { backend.Flush(); }); - } - - Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr, const char* function, std::string&& message) const noexcept { - using std::chrono::duration_cast; - using std::chrono::microseconds; - using std::chrono::steady_clock; - return { - .timestamp = duration_cast(steady_clock::now() - time_origin), - .log_class = log_class, - .log_level = log_level, - .filename = filename, - .line_num = line_nr, - .function = function, - .message = std::move(message), - }; - } - - void ForEachBackend(auto lambda) noexcept { - lambda(static_cast(color_console_backend)); -#ifndef __OPENORBIS__ - lambda(static_cast(file_backend)); -#endif -#ifdef _WIN32 - lambda(static_cast(debugger_backend)); -#endif -#ifdef ANDROID - lambda(static_cast(lc_backend)); -#endif - } - - static void Deleter(Impl* ptr) noexcept { - delete ptr; - } - - static inline std::unique_ptr instance{nullptr, Deleter}; - - Filter filter; - ColorConsoleBackend color_console_backend{}; -#ifndef __OPENORBIS__ - FileBackend file_backend; -#endif -#ifdef _WIN32 - DebuggerBackend debugger_backend{}; -#endif -#ifdef ANDROID - LogcatBackend lc_backend{}; -#endif - - MPSCQueue message_queue{}; - std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()}; - std::jthread backend_thread; -}; -} // namespace - -void Initialize() { - Impl::Initialize(); -} - -void Start() { - Impl::Start(); -} - -void Stop() { - Impl::Stop(); -} - -void DisableLoggingInTests() { - initialization_in_progress_suppress_logging = true; -} - -void SetGlobalFilter(const Filter& filter) { - Impl::Instance().SetGlobalFilter(filter); -} - -void SetColorConsoleBackendEnabled(bool enabled) { - Impl::Instance().SetColorConsoleBackendEnabled(enabled); -} - -void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename, unsigned int line_num, const char* function, fmt::string_view format, const fmt::format_args& args) { - if (!initialization_in_progress_suppress_logging) { - auto& instance = Impl::Instance(); - if (instance.CanPushEntry(log_class, log_level)) - instance.PushEntry(log_class, log_level, filename, line_num, function, fmt::vformat(format, args)); - } -} -} // namespace Common::Log diff --git a/src/common/logging/backend.h b/src/common/logging/backend.h deleted file mode 100644 index 2a9926e9e9..0000000000 --- a/src/common/logging/backend.h +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "common/logging/filter.h" - -namespace Common::Log { - -class Filter; - -/// Initializes the logging system. This should be the first thing called in main. -void Initialize(); - -void Start(); - -/// Explicitly stops the logger thread and flushes the buffers -void Stop(); - -void DisableLoggingInTests(); - -/** - * The global filter will prevent any messages from even being processed if they are filtered. - */ -void SetGlobalFilter(const Filter& filter); - -void SetColorConsoleBackendEnabled(bool enabled); -} // namespace Common::Log diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp deleted file mode 100644 index 813e812780..0000000000 --- a/src/common/logging/filter.cpp +++ /dev/null @@ -1,242 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: 2014 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include "common/logging/filter.h" -#include "common/string_util.h" - -namespace Common::Log { -namespace { -template -Level GetLevelByName(const It begin, const It end) { - for (u32 i = 0; i < u32(Level::Count); ++i) { - const char* level_name = GetLevelName(Level(i)); - if (Common::ComparePartialString(begin, end, level_name)) - return Level(i); - } - return Level::Count; -} - -template -Class GetClassByName(const It begin, const It end) { - for (u32 i = 0; i < u32(Class::Count); ++i) { - const char* level_name = GetLogClassName(Class(i)); - if (Common::ComparePartialString(begin, end, level_name)) - return Class(i); - } - return Class::Count; -} - -template -bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) { - auto level_separator = std::find(begin, end, ':'); - if (level_separator == end) { - LOG_ERROR(Log, "Invalid log filter. Must specify a log level after `:`: {}", - std::string(begin, end)); - return false; - } - - const Level level = GetLevelByName(level_separator + 1, end); - if (level == Level::Count) { - LOG_ERROR(Log, "Unknown log level in filter: {}", std::string(begin, end)); - return false; - } - - if (Common::ComparePartialString(begin, level_separator, "*")) { - instance.ResetAll(level); - return true; - } - - const Class log_class = GetClassByName(begin, level_separator); - if (log_class == Class::Count) { - LOG_ERROR(Log, "Unknown log class in filter: {}", std::string(begin, end)); - return false; - } - - instance.SetClassLevel(log_class, level); - return true; -} -} // Anonymous namespace - -/// Macro listing all log classes. Code should define CLS and SUB as desired before invoking this. -#define ALL_LOG_CLASSES() \ - CLS(Log) \ - CLS(Common) \ - SUB(Common, Filesystem) \ - SUB(Common, Memory) \ - CLS(Core) \ - SUB(Core, ARM) \ - SUB(Core, Timing) \ - CLS(Config) \ - CLS(Debug) \ - SUB(Debug, Emulated) \ - SUB(Debug, GPU) \ - SUB(Debug, Breakpoint) \ - SUB(Debug, GDBStub) \ - CLS(Kernel) \ - SUB(Kernel, SVC) \ - CLS(Service) \ - SUB(Service, ACC) \ - SUB(Service, Audio) \ - SUB(Service, AM) \ - SUB(Service, AOC) \ - SUB(Service, APM) \ - SUB(Service, ARP) \ - SUB(Service, BCAT) \ - SUB(Service, BPC) \ - SUB(Service, BGTC) \ - SUB(Service, BTDRV) \ - SUB(Service, BTM) \ - SUB(Service, Capture) \ - SUB(Service, ERPT) \ - SUB(Service, ETicket) \ - SUB(Service, EUPLD) \ - SUB(Service, Fatal) \ - SUB(Service, FGM) \ - SUB(Service, Friend) \ - SUB(Service, FS) \ - SUB(Service, GRC) \ - SUB(Service, HID) \ - SUB(Service, IRS) \ - SUB(Service, JIT) \ - SUB(Service, LBL) \ - SUB(Service, LDN) \ - SUB(Service, LDR) \ - SUB(Service, LM) \ - SUB(Service, Migration) \ - SUB(Service, Mii) \ - SUB(Service, MM) \ - SUB(Service, MNPP) \ - SUB(Service, NCM) \ - SUB(Service, NFC) \ - SUB(Service, NFP) \ - SUB(Service, NGC) \ - SUB(Service, NIFM) \ - SUB(Service, NIM) \ - SUB(Service, NOTIF) \ - SUB(Service, NPNS) \ - SUB(Service, NS) \ - SUB(Service, NVDRV) \ - SUB(Service, Nvnflinger) \ - SUB(Service, OLSC) \ - SUB(Service, PCIE) \ - SUB(Service, PCTL) \ - SUB(Service, PCV) \ - SUB(Service, PM) \ - SUB(Service, PREPO) \ - SUB(Service, PSC) \ - SUB(Service, PTM) \ - SUB(Service, SET) \ - SUB(Service, SM) \ - SUB(Service, SPL) \ - SUB(Service, SSL) \ - SUB(Service, TCAP) \ - SUB(Service, Time) \ - SUB(Service, USB) \ - SUB(Service, VI) \ - SUB(Service, WLAN) \ - CLS(HW) \ - SUB(HW, Memory) \ - SUB(HW, LCD) \ - SUB(HW, GPU) \ - SUB(HW, AES) \ - CLS(IPC) \ - CLS(Frontend) \ - CLS(Render) \ - SUB(Render, Software) \ - SUB(Render, OpenGL) \ - SUB(Render, Vulkan) \ - CLS(Shader) \ - SUB(Shader, SPIRV) \ - SUB(Shader, GLASM) \ - SUB(Shader, GLSL) \ - CLS(Audio) \ - SUB(Audio, DSP) \ - SUB(Audio, Sink) \ - CLS(Input) \ - CLS(Network) \ - CLS(Loader) \ - CLS(CheatEngine) \ - CLS(Crypto) \ - CLS(WebService) - -// GetClassName is a macro defined by Windows.h, grrr... -const char* GetLogClassName(Class log_class) { - switch (log_class) { -#define CLS(x) \ - case Class::x: \ - return #x; -#define SUB(x, y) \ - case Class::x##_##y: \ - return #x "." #y; - ALL_LOG_CLASSES() -#undef CLS -#undef SUB - case Class::Count: - break; - } - return "Invalid"; -} - -const char* GetLevelName(Level log_level) { -#define LVL(x) \ - case Level::x: \ - return #x - switch (log_level) { - LVL(Trace); - LVL(Debug); - LVL(Info); - LVL(Warning); - LVL(Error); - LVL(Critical); - case Level::Count: - break; - } -#undef LVL - return "Invalid"; -} - -Filter::Filter(Level default_level) { - ResetAll(default_level); -} - -void Filter::ResetAll(Level level) { - class_levels.fill(level); -} - -void Filter::SetClassLevel(Class log_class, Level level) { - class_levels[static_cast(log_class)] = level; -} - -void Filter::ParseFilterString(std::string_view filter_view) { - auto clause_begin = filter_view.cbegin(); - while (clause_begin != filter_view.cend()) { - auto clause_end = std::find(clause_begin, filter_view.cend(), ' '); - - // If clause isn't empty - if (clause_end != clause_begin) { - ParseFilterRule(*this, clause_begin, clause_end); - } - - if (clause_end != filter_view.cend()) { - // Skip over the whitespace - ++clause_end; - } - clause_begin = clause_end; - } -} - -bool Filter::CheckMessage(Class log_class, Level level) const { - return u8(level) >= u8(class_levels[std::size_t(log_class)]); -} - -bool Filter::IsDebug() const { - return std::any_of(class_levels.begin(), class_levels.end(), [](const Level& l) { - return u8(l) <= u8(Level::Debug); - }); -} - -} // namespace Common::Log diff --git a/src/common/logging/filter.h b/src/common/logging/filter.h deleted file mode 100644 index 54d172cc02..0000000000 --- a/src/common/logging/filter.h +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include -#include "common/logging/log.h" - -namespace Common::Log { - -/** - * Returns the name of the passed log class as a C-string. Subclasses are separated by periods - * instead of underscores as in the enumeration. - */ -const char* GetLogClassName(Class log_class); - -/** - * Returns the name of the passed log level as a C-string. - */ -const char* GetLevelName(Level log_level); - -/** - * Implements a log message filter which allows different log classes to have different minimum - * severity levels. The filter can be changed at runtime and can be parsed from a string to allow - * editing via the interface or loading from a configuration file. - */ -class Filter { -public: - /// Initializes the filter with all classes having `default_level` as the minimum level. - explicit Filter(Level default_level = Level::Info); - - /// Resets the filter so that all classes have `level` as the minimum displayed level. - void ResetAll(Level level); - /// Sets the minimum level of `log_class` (and not of its subclasses) to `level`. - void SetClassLevel(Class log_class, Level level); - - /** - * Parses a filter string and applies it to this filter. - * - * A filter string consists of a space-separated list of filter rules, each of the format - * `:`. `` is a log class name, with subclasses separated using periods. - * `*` is allowed as a class name and will reset all filters to the specified level. `` - * a severity level name which will be set as the minimum logging level of the matched classes. - * Rules are applied left to right, with each rule overriding previous ones in the sequence. - * - * A few examples of filter rules: - * - `*:Info` -- Resets the level of all classes to Info. - * - `Service:Info` -- Sets the level of Service to Info. - * - `Service.FS:Trace` -- Sets the level of the Service.FS class to Trace. - */ - void ParseFilterString(std::string_view filter_view); - - /// Matches class/level combination against the filter, returning true if it passed. - bool CheckMessage(Class log_class, Level level) const; - - /// Returns true if any logging classes are set to debug - bool IsDebug() const; - -private: - std::array(Class::Count)> class_levels; -}; -} // namespace Common::Log diff --git a/src/common/logging/formatter.h b/src/common/logging/formatter.h deleted file mode 100644 index 343174a0c7..0000000000 --- a/src/common/logging/formatter.h +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include "common/swap.h" - -// adapted from https://github.com/fmtlib/fmt/issues/2704 -// a generic formatter for enum classes -#if FMT_VERSION >= 80100 -template -struct fmt::formatter, char>> - : formatter> { - template - auto format(const T& value, FormatContext& ctx) const -> decltype(ctx.out()) { - return fmt::formatter>::format( - static_cast>(value), ctx); - } -}; -#endif - -template -struct fmt::formatter> { - constexpr auto parse(format_parse_context& ctx) { - return ctx.begin(); - } - template - auto format(const SwapStructT& reg, FormatContext& ctx) const { - return fmt::format_to(ctx.out(), "{}", T(reg)); - } -}; diff --git a/src/common/logging/log.h b/src/common/logging/log.h deleted file mode 100644 index 757cf464d5..0000000000 --- a/src/common/logging/log.h +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: 2014 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include - -#include - -#include "common/logging/formatter.h" -#include "common/logging/types.h" - -namespace Common::Log { - -/// Logs a message to the global logger, using fmt -void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename, - unsigned int line_num, const char* function, fmt::string_view format, - const fmt::format_args& args); - -template -void FmtLogMessage(Class log_class, Level log_level, const char* filename, unsigned int line_num, - const char* function, fmt::format_string format, const Args&... args) { - FmtLogMessageImpl(log_class, log_level, filename, line_num, function, format, - fmt::make_format_args(args...)); -} - -} // namespace Common::Log - -#ifdef _DEBUG -#define LOG_TRACE(log_class, ...) \ - Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Trace, \ - __FILE__, __LINE__, __func__, \ - __VA_ARGS__) -#else -#define LOG_TRACE(log_class, fmt, ...) (void(0)) -#endif - -#define LOG_DEBUG(log_class, ...) \ - ::Common::Log::FmtLogMessage(::Common::Log::Class::log_class, ::Common::Log::Level::Debug, \ - __FILE__, __LINE__, __func__, \ - __VA_ARGS__) -#define LOG_INFO(log_class, ...) \ - ::Common::Log::FmtLogMessage(::Common::Log::Class::log_class, ::Common::Log::Level::Info, \ - __FILE__, __LINE__, __func__, \ - __VA_ARGS__) -#define LOG_WARNING(log_class, ...) \ - ::Common::Log::FmtLogMessage(::Common::Log::Class::log_class, ::Common::Log::Level::Warning, \ - __FILE__, __LINE__, __func__, \ - __VA_ARGS__) -#define LOG_ERROR(log_class, ...) \ - ::Common::Log::FmtLogMessage(::Common::Log::Class::log_class, ::Common::Log::Level::Error, \ - __FILE__, __LINE__, __func__, \ - __VA_ARGS__) -#define LOG_CRITICAL(log_class, ...) \ - ::Common::Log::FmtLogMessage(::Common::Log::Class::log_class, ::Common::Log::Level::Critical, \ - __FILE__, __LINE__, __func__, \ - __VA_ARGS__) diff --git a/src/common/logging/log_entry.h b/src/common/logging/log_entry.h deleted file mode 100644 index 23f1aaf625..0000000000 --- a/src/common/logging/log_entry.h +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include - -#include "common/logging/types.h" - -namespace Common::Log { - -/// @brief A log entry. Log entries are store in a structured format to permit more varied output -/// formatting on different frontends, as well as facilitating filtering and aggregation. -struct Entry { - std::chrono::microseconds timestamp; - Class log_class{}; - Level log_level{}; - const char* filename = nullptr; - unsigned int line_num = 0; - const char* function = nullptr; - std::string message; -}; - -} // namespace Common::Log diff --git a/src/common/logging/text_formatter.cpp b/src/common/logging/text_formatter.cpp deleted file mode 100644 index dee1f770bc..0000000000 --- a/src/common/logging/text_formatter.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: 2014 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include -#include -#include -#include - -#ifdef _WIN32 -#include -#elif defined(__ANDROID__) -#include -#endif - -#include "common/assert.h" -#include "common/logging/filter.h" -#include "common/logging/log.h" -#include "common/logging/log_entry.h" -#include "common/logging/text_formatter.h" - -namespace Common::Log { - -// Some IDEs prefer : instead, so let's just do that :) -std::string FormatLogMessage(const Entry& entry) noexcept { - if (!entry.filename) return ""; - - auto const time_seconds = uint32_t(entry.timestamp.count() / 1000000); - auto const time_fractional = uint32_t(entry.timestamp.count() % 1000000); - auto const class_name = GetLogClassName(entry.log_class); - auto const level_name = GetLevelName(entry.log_level); - return fmt::format("[{:4d}.{:06d}] {} <{}> {}:{}:{}: {}", time_seconds, time_fractional, - class_name, level_name, entry.filename, entry.line_num, entry.function, - entry.message); -} - -/// @brief Formats and prints a log entry to stderr. -static void PrintMessage(const Entry& entry) noexcept { -#ifdef _WIN32 - auto const str = FormatLogMessage(entry).append(1, '\n'); - fwrite(str.c_str(), 1, str.size(), stderr); -#else -#define ESC "\x1b" - auto const color_str = [&entry]() -> const char* { - switch (entry.log_level) { - case Level::Debug: return ESC "[0;36m"; // Cyan - case Level::Info: return ESC "[0;37m"; // Bright gray - case Level::Warning: return ESC "[1;33m"; // Bright yellow - case Level::Error: return ESC "[1;31m"; // Bright red - case Level::Critical: return ESC "[1;35m"; // Bright magenta - default: return ESC "[1;30m"; // Grey - } - }(); - auto const time_seconds = uint32_t(entry.timestamp.count() / 1000000); - auto const time_fractional = uint32_t(entry.timestamp.count() % 1000000); - auto const class_name = GetLogClassName(entry.log_class); - auto const level_name = GetLevelName(entry.log_level); - fprintf(stderr, "%s[%4d.%06d] %s <%s> %s:%u:%s: %s" ESC "[0m\n", color_str, - time_seconds, time_fractional, class_name, level_name, entry.filename, - entry.line_num, entry.function, entry.message.c_str()); -#undef ESC -#endif -} - -void PrintColoredMessage(const Entry& entry) noexcept { -#ifdef _WIN32 - HANDLE console_handle = GetStdHandle(STD_ERROR_HANDLE); - if (console_handle == INVALID_HANDLE_VALUE) - return; - CONSOLE_SCREEN_BUFFER_INFO original_info = {}; - GetConsoleScreenBufferInfo(console_handle, &original_info); - WORD color = WORD([&entry]() { - switch (entry.log_level) { - case Level::Debug: return FOREGROUND_GREEN | FOREGROUND_BLUE; // Cyan - case Level::Info: return FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; // Bright gray - case Level::Warning: return FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY; - case Level::Error: return FOREGROUND_RED | FOREGROUND_INTENSITY; - case Level::Critical: return FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY; - default: break; - } - return FOREGROUND_INTENSITY; // Grey - }()); - SetConsoleTextAttribute(console_handle, color); -#endif - PrintMessage(entry); -#ifdef _WIN32 - SetConsoleTextAttribute(console_handle, original_info.wAttributes); -#endif -} - -void PrintMessageToLogcat(const Entry& entry) noexcept { -#ifdef ANDROID - android_LogPriority android_log_priority = [&]() { - switch (entry.log_level) { - case Level::Debug: return ANDROID_LOG_DEBUG; - case Level::Info: return ANDROID_LOG_INFO; - case Level::Warning: return ANDROID_LOG_WARN; - case Level::Error: return ANDROID_LOG_ERROR; - case Level::Critical: return ANDROID_LOG_FATAL; - case Level::Count: - case Level::Trace: return ANDROID_LOG_VERBOSE; - } - }(); - auto const str = FormatLogMessage(entry); - __android_log_print(android_log_priority, "YuzuNative", "%s", str.c_str()); -#endif -} -} // namespace Common::Log diff --git a/src/common/logging/text_formatter.h b/src/common/logging/text_formatter.h deleted file mode 100644 index 8ce11240f2..0000000000 --- a/src/common/logging/text_formatter.h +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: 2014 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include - -namespace Common::Log { - -struct Entry; - -/// Formats a log entry into the provided text buffer. -std::string FormatLogMessage(const Entry& entry) noexcept; -/// Prints the same message as `PrintMessage`, but colored according to the severity level. -void PrintColoredMessage(const Entry& entry) noexcept; -/// Formats and prints a log entry to the android logcat. -void PrintMessageToLogcat(const Entry& entry) noexcept; -} // namespace Common::Log diff --git a/src/common/logging/types.h b/src/common/logging/types.h deleted file mode 100644 index 08af50ee0c..0000000000 --- a/src/common/logging/types.h +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "common/common_types.h" - -namespace Common::Log { - -/// Specifies the severity or level of detail of the log message. -enum class Level : u8 { - Trace, ///< Extremely detailed and repetitive debugging information that is likely to - ///< pollute logs. - Debug, ///< Less detailed debugging information. - Info, ///< Status information from important points during execution. - Warning, ///< Minor or potential problems found during execution of a task. - Error, ///< Major problems found during execution of a task that prevent it from being - ///< completed. - Critical, ///< Major problems during execution that threaten the stability of the entire - ///< application. - - Count ///< Total number of logging levels -}; - -/** - * Specifies the sub-system that generated the log message. - * - * @note If you add a new entry here, also add a corresponding one to `ALL_LOG_CLASSES` in - * filter.cpp. - */ -enum class Class : u8 { - Log, ///< Messages about the log system itself - Common, ///< Library routines - Common_Filesystem, ///< Filesystem interface library - Common_Memory, ///< Memory mapping and management functions - Core, ///< LLE emulation core - Core_ARM, ///< ARM CPU core - Core_Timing, ///< CoreTiming functions - Config, ///< Emulator configuration (including commandline) - Debug, ///< Debugging tools - Debug_Emulated, ///< Debug messages from the emulated programs - Debug_GPU, ///< GPU debugging tools - Debug_Breakpoint, ///< Logging breakpoints and watchpoints - Debug_GDBStub, ///< GDB Stub - Kernel, ///< The HLE implementation of the CTR kernel - Kernel_SVC, ///< Kernel system calls - Service, ///< HLE implementation of system services. Each major service - ///< should have its own subclass. - Service_ACC, ///< The ACC (Accounts) service - Service_AM, ///< The AM (Applet manager) service - Service_AOC, ///< The AOC (AddOn Content) service - Service_APM, ///< The APM (Performance) service - Service_ARP, ///< The ARP service - Service_Audio, ///< The Audio (Audio control) service - Service_BCAT, ///< The BCAT service - Service_BGTC, ///< The BGTC (Background Task Controller) service - Service_BPC, ///< The BPC service - Service_BTDRV, ///< The Bluetooth driver service - Service_BTM, ///< The BTM service - Service_Capture, ///< The capture service - Service_ERPT, ///< The error reporting service - Service_ETicket, ///< The ETicket service - Service_EUPLD, ///< The error upload service - Service_Fatal, ///< The Fatal service - Service_FGM, ///< The FGM service - Service_Friend, ///< The friend service - Service_FS, ///< The FS (Filesystem) service - Service_GRC, ///< The game recording service - Service_HID, ///< The HID (Human interface device) service - Service_IRS, ///< The IRS service - Service_JIT, ///< The JIT service - Service_LBL, ///< The LBL (LCD backlight) service - Service_LDN, ///< The LDN (Local domain network) service - Service_LDR, ///< The loader service - Service_LM, ///< The LM (Logger) service - Service_Migration, ///< The migration service - Service_Mii, ///< The Mii service - Service_MM, ///< The MM (Multimedia) service - Service_MNPP, ///< The MNPP service - Service_NCM, ///< The NCM service - Service_NFC, ///< The NFC (Near-field communication) service - Service_NFP, ///< The NFP service - Service_NGC, ///< The NGC (No Good Content) service - Service_NIFM, ///< The NIFM (Network interface) service - Service_NIM, ///< The NIM service - Service_NOTIF, ///< The NOTIF (Notification) service - Service_NPNS, ///< The NPNS service - Service_NS, ///< The NS services - Service_NVDRV, ///< The NVDRV (Nvidia driver) service - Service_Nvnflinger, ///< The Nvnflinger service - Service_OLSC, ///< The OLSC service - Service_PCIE, ///< The PCIe service - Service_PCTL, ///< The PCTL (Parental control) service - Service_PCV, ///< The PCV service - Service_PM, ///< The PM service - Service_PREPO, ///< The PREPO (Play report) service - Service_PSC, ///< The PSC service - Service_PTM, ///< The PTM service - Service_SET, ///< The SET (Settings) service - Service_SM, ///< The SM (Service manager) service - Service_SPL, ///< The SPL service - Service_SSL, ///< The SSL service - Service_TCAP, ///< The TCAP service. - Service_Time, ///< The time service - Service_USB, ///< The USB (Universal Serial Bus) service - Service_VI, ///< The VI (Video interface) service - Service_WLAN, ///< The WLAN (Wireless local area network) service - HW, ///< Low-level hardware emulation - HW_Memory, ///< Memory-map and address translation - HW_LCD, ///< LCD register emulation - HW_GPU, ///< GPU control emulation - HW_AES, ///< AES engine emulation - IPC, ///< IPC interface - Frontend, ///< Emulator UI - Render, ///< Emulator video output and hardware acceleration - Render_Software, ///< Software renderer backend - Render_OpenGL, ///< OpenGL backend - Render_Vulkan, ///< Vulkan backend - Shader, ///< Shader recompiler - Shader_SPIRV, ///< Shader SPIR-V code generation - Shader_GLASM, ///< Shader GLASM code generation - Shader_GLSL, ///< Shader GLSL code generation - Audio, ///< Audio emulation - Audio_DSP, ///< The HLE implementation of the DSP - Audio_Sink, ///< Emulator audio output backend - Loader, ///< ROM loader - CheatEngine, ///< Memory manipulation and engine VM functions - Crypto, ///< Cryptographic engine/functions - Input, ///< Input emulation - Network, ///< Network emulation - WebService, ///< Interface to yuzu Web Services - Count ///< Total number of logging classes -}; - -} // namespace Common::Log diff --git a/src/common/param_package.cpp b/src/common/param_package.cpp index 629babb811..b2803a4fcf 100644 --- a/src/common/param_package.cpp +++ b/src/common/param_package.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/param_package.h" #include "common/string_util.h" diff --git a/src/common/settings.cpp b/src/common/settings.cpp index c952567e63..f549169cd2 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -23,10 +23,14 @@ #include "common/assert.h" #include "common/fs/fs_util.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/time_zone.h" +#if defined(__linux__ ) && defined(ARCHITECTURE_arm64) +#include +#endif + namespace Settings { // Clang 14 and earlier have errors when explicitly instantiating these classes @@ -178,7 +182,11 @@ bool IsFastmemEnabled() { return bool(values.cpuopt_fastmem); else if (values.cpu_accuracy.GetValue() == CpuAccuracy::Unsafe) return bool(values.cpuopt_unsafe_host_mmu); -#if !defined(__APPLE__) && !defined(__linux__) && !defined(__ANDROID__) && !defined(_WIN32) +#if defined(__linux__) && defined(ARCHITECTURE_arm64) + // Only 4kb systems support host MMU right now + // TODO: Support this + return getpagesize() == 4096; +#elif !defined(__APPLE__) && !defined(__ANDROID__) && !defined(_WIN32) && !defined(__linux__) return false; #else return true; diff --git a/src/common/thread.cpp b/src/common/thread.cpp index b0b63ae35c..f4bdb3f7c0 100644 --- a/src/common/thread.cpp +++ b/src/common/thread.cpp @@ -8,7 +8,7 @@ #include #include "common/error.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/assert.h" #include "common/thread.h" #ifdef __APPLE__ diff --git a/src/common/time_zone.cpp b/src/common/time_zone.cpp index f77df604f4..64f29251ca 100644 --- a/src/common/time_zone.cpp +++ b/src/common/time_zone.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,7 +13,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/time_zone.h" namespace Common::TimeZone { diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp index 780120a5b2..4cc42ccbd5 100644 --- a/src/common/x64/cpu_detect.cpp +++ b/src/common/x64/cpu_detect.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2013 Dolphin Emulator Project / 2015 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,7 +15,7 @@ #include #include "common/bit_util.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/x64/cpu_detect.h" #include "common/x64/rdtsc.h" diff --git a/src/core/arm/arm_interface.cpp b/src/core/arm/arm_interface.cpp index 4f6bfb2bd1..b7de9fc0f8 100644 --- a/src/core/arm/arm_interface.cpp +++ b/src/core/arm/arm_interface.cpp @@ -1,9 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/arm/arm_interface.h" #include "core/arm/debug.h" #include "core/core.h" diff --git a/src/core/arm/dynarmic/dynarmic_cp15.cpp b/src/core/arm/dynarmic/dynarmic_cp15.cpp index e3e2d8339d..7cb1d58398 100644 --- a/src/core/arm/dynarmic/dynarmic_cp15.cpp +++ b/src/core/arm/dynarmic/dynarmic_cp15.cpp @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/arm/dynarmic/arm_dynarmic_32.h" #include "core/arm/dynarmic/dynarmic_cp15.h" #include "core/core.h" diff --git a/src/core/arm/nce/interpreter_visitor.h b/src/core/arm/nce/interpreter_visitor.h index daae204310..131b69cd7d 100644 --- a/src/core/arm/nce/interpreter_visitor.h +++ b/src/core/arm/nce/interpreter_visitor.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -14,7 +14,7 @@ #include "core/hle/kernel/k_thread.h" #include "core/memory.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/arm/nce/visitor_base.h" namespace Core { diff --git a/src/core/arm/nce/patcher.h b/src/core/arm/nce/patcher.h index 499c98c901..980a0c81e0 100644 --- a/src/core/arm/nce/patcher.h +++ b/src/core/arm/nce/patcher.h @@ -9,7 +9,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/common_types.h" #include "common/settings.h" #include "core/hle/kernel/code_set.h" diff --git a/src/core/core.cpp b/src/core/core.cpp index 9db4589ceb..2c8cbe21bb 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -9,7 +9,7 @@ #include "game_settings.h" #include "audio_core/audio_core.h" #include "common/fs/fs.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/settings_enums.h" #include "common/string_util.h" diff --git a/src/core/crypto/aes_util.cpp b/src/core/crypto/aes_util.cpp index 55f436f532..34d66456ee 100644 --- a/src/core/crypto/aes_util.cpp +++ b/src/core/crypto/aes_util.cpp @@ -9,7 +9,7 @@ #include #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/crypto/aes_util.h" #include "core/crypto/key_manager.h" diff --git a/src/core/crypto/key_manager.cpp b/src/core/crypto/key_manager.cpp index fc0ee064cc..68692c178e 100644 --- a/src/core/crypto/key_manager.cpp +++ b/src/core/crypto/key_manager.cpp @@ -20,7 +20,7 @@ #include "common/fs/fs.h" #include "common/fs/path_util.h" #include "common/hex_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/string_util.h" #include "core/crypto/aes_util.h" diff --git a/src/core/debugger/debugger.cpp b/src/core/debugger/debugger.cpp index 1aada09e29..3f089b7f80 100644 --- a/src/core/debugger/debugger.cpp +++ b/src/core/debugger/debugger.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -19,7 +19,7 @@ #include #endif -#include "common/logging/log.h" +#include "common/logging.h" #include "common/polyfill_thread.h" #include "common/thread.h" #include "core/core.h" diff --git a/src/core/debugger/gdbstub.cpp b/src/core/debugger/gdbstub.cpp index a23ef2d65f..a5f49f6ff1 100644 --- a/src/core/debugger/gdbstub.cpp +++ b/src/core/debugger/gdbstub.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -14,7 +14,7 @@ #include #include "common/hex_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "common/settings.h" #include "common/string_util.h" diff --git a/src/core/file_sys/card_image.cpp b/src/core/file_sys/card_image.cpp index 0bcf40cf86..593c561689 100644 --- a/src/core/file_sys/card_image.cpp +++ b/src/core/file_sys/card_image.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/crypto/key_manager.h" #include "core/file_sys/card_image.h" #include "core/file_sys/content_archive.h" diff --git a/src/core/file_sys/content_archive.cpp b/src/core/file_sys/content_archive.cpp index 4e3313f83c..2b478d6b99 100644 --- a/src/core/file_sys/content_archive.cpp +++ b/src/core/file_sys/content_archive.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -9,7 +9,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include #include "core/crypto/aes_util.h" #include "core/crypto/ctr_encryption_layer.h" diff --git a/src/core/file_sys/ips_layer.cpp b/src/core/file_sys/ips_layer.cpp index 57a9ce37d5..1dddd27909 100644 --- a/src/core/file_sys/ips_layer.cpp +++ b/src/core/file_sys/ips_layer.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include @@ -9,7 +9,7 @@ #include #include "common/hex_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/swap.h" #include "core/file_sys/ips_layer.h" #include "core/file_sys/vfs/vfs_vector.h" diff --git a/src/core/file_sys/nca_metadata.cpp b/src/core/file_sys/nca_metadata.cpp index 324ecbc8c9..3937f39959 100644 --- a/src/core/file_sys/nca_metadata.cpp +++ b/src/core/file_sys/nca_metadata.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -6,7 +6,7 @@ #include #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/swap.h" #include "core/file_sys/nca_metadata.h" #include "core/file_sys/vfs/vfs.h" diff --git a/src/core/file_sys/partition_filesystem.cpp b/src/core/file_sys/partition_filesystem.cpp index 8ad2307cb5..5d88cd8d95 100644 --- a/src/core/file_sys/partition_filesystem.cpp +++ b/src/core/file_sys/partition_filesystem.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/file_sys/partition_filesystem.h" #include "core/file_sys/vfs/vfs_offset.h" #include "core/loader/loader.h" diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index 627646ee84..6af926eac0 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp @@ -10,7 +10,7 @@ #include #include "common/hex_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #ifndef _WIN32 #include "common/string_util.h" diff --git a/src/core/file_sys/program_metadata.cpp b/src/core/file_sys/program_metadata.cpp index f542a09d0e..4fc2e7ced3 100644 --- a/src/core/file_sys/program_metadata.cpp +++ b/src/core/file_sys/program_metadata.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -7,7 +7,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "core/file_sys/program_metadata.h" #include "core/file_sys/vfs/vfs.h" diff --git a/src/core/file_sys/registered_cache.cpp b/src/core/file_sys/registered_cache.cpp index 020d403c95..61671ea333 100644 --- a/src/core/file_sys/registered_cache.cpp +++ b/src/core/file_sys/registered_cache.cpp @@ -11,7 +11,7 @@ #include "common/assert.h" #include "common/fs/path_util.h" #include "common/hex_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/string_util.h" #include "core/crypto/key_manager.h" #include "core/file_sys/card_image.h" diff --git a/src/core/file_sys/romfs_factory.cpp b/src/core/file_sys/romfs_factory.cpp index 35e1499055..517872547c 100644 --- a/src/core/file_sys/romfs_factory.cpp +++ b/src/core/file_sys/romfs_factory.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include "common/assert.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/file_sys/common_funcs.h" #include "core/file_sys/content_archive.h" #include "core/file_sys/nca_metadata.h" diff --git a/src/core/file_sys/savedata_factory.cpp b/src/core/file_sys/savedata_factory.cpp index 114a18891f..0ba839ec14 100644 --- a/src/core/file_sys/savedata_factory.cpp +++ b/src/core/file_sys/savedata_factory.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -6,7 +6,7 @@ #include "common/assert.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/uuid.h" #include "core/core.h" #include "core/file_sys/savedata_factory.h" diff --git a/src/core/file_sys/submission_package.cpp b/src/core/file_sys/submission_package.cpp index 56286405e2..630bb0b079 100644 --- a/src/core/file_sys/submission_package.cpp +++ b/src/core/file_sys/submission_package.cpp @@ -10,7 +10,7 @@ #include #include "common/hex_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/crypto/key_manager.h" #include "core/file_sys/content_archive.h" #include "core/file_sys/nca_metadata.h" diff --git a/src/core/file_sys/system_archive/system_archive.cpp b/src/core/file_sys/system_archive/system_archive.cpp index b53eef877a..cb68d5b55e 100644 --- a/src/core/file_sys/system_archive/system_archive.cpp +++ b/src/core/file_sys/system_archive/system_archive.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/file_sys/romfs.h" #include "core/file_sys/system_archive/mii_model.h" #include "core/file_sys/system_archive/ng_word.h" diff --git a/src/core/file_sys/system_archive/system_version.cpp b/src/core/file_sys/system_archive/system_version.cpp index 5662004b7a..c4ed91ce01 100644 --- a/src/core/file_sys/system_archive/system_version.cpp +++ b/src/core/file_sys/system_archive/system_version.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/file_sys/system_archive/system_version.h" #include "core/file_sys/vfs/vfs_vector.h" #include "core/hle/api_version.h" diff --git a/src/core/file_sys/vfs/vfs_real.cpp b/src/core/file_sys/vfs/vfs_real.cpp index 2c3cb26907..1eafff6c06 100644 --- a/src/core/file_sys/vfs/vfs_real.cpp +++ b/src/core/file_sys/vfs/vfs_real.cpp @@ -12,7 +12,7 @@ #include "common/fs/file.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/file_sys/vfs/vfs.h" #include "core/file_sys/vfs/vfs_real.h" diff --git a/src/core/frontend/applets/cabinet.cpp b/src/core/frontend/applets/cabinet.cpp index c33ce248b5..95ebdc6c4a 100644 --- a/src/core/frontend/applets/cabinet.cpp +++ b/src/core/frontend/applets/cabinet.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/frontend/applets/cabinet.h" #include diff --git a/src/core/frontend/applets/controller.cpp b/src/core/frontend/applets/controller.cpp index e04d884bab..c4292c5a12 100644 --- a/src/core/frontend/applets/controller.cpp +++ b/src/core/frontend/applets/controller.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/settings_enums.h" #include "core/frontend/applets/controller.h" diff --git a/src/core/frontend/applets/error.cpp b/src/core/frontend/applets/error.cpp index 53d4be2e54..ff45a13510 100644 --- a/src/core/frontend/applets/error.cpp +++ b/src/core/frontend/applets/error.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/frontend/applets/error.h" namespace Core::Frontend { diff --git a/src/core/frontend/applets/general.cpp b/src/core/frontend/applets/general.cpp index 4c299ee9c7..f70e0f28a9 100644 --- a/src/core/frontend/applets/general.cpp +++ b/src/core/frontend/applets/general.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/frontend/applets/general.h" namespace Core::Frontend { diff --git a/src/core/frontend/applets/mii_edit.cpp b/src/core/frontend/applets/mii_edit.cpp index 2988c3e720..3b52cd1c24 100644 --- a/src/core/frontend/applets/mii_edit.cpp +++ b/src/core/frontend/applets/mii_edit.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/frontend/applets/mii_edit.h" namespace Core::Frontend { diff --git a/src/core/frontend/applets/net_connect.cpp b/src/core/frontend/applets/net_connect.cpp index eba4a5cb2f..71bde3b4f4 100644 --- a/src/core/frontend/applets/net_connect.cpp +++ b/src/core/frontend/applets/net_connect.cpp @@ -1,7 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/frontend/applets/net_connect.h" namespace Core::Frontend { diff --git a/src/core/frontend/applets/software_keyboard.cpp b/src/core/frontend/applets/software_keyboard.cpp index bd0ec64f47..ad30fa8958 100644 --- a/src/core/frontend/applets/software_keyboard.cpp +++ b/src/core/frontend/applets/software_keyboard.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/string_util.h" #include "core/frontend/applets/software_keyboard.h" diff --git a/src/core/frontend/applets/web_browser.cpp b/src/core/frontend/applets/web_browser.cpp index eca8d6d98d..361c2e397d 100644 --- a/src/core/frontend/applets/web_browser.cpp +++ b/src/core/frontend/applets/web_browser.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/frontend/applets/web_browser.h" namespace Core::Frontend { diff --git a/src/core/game_settings.cpp b/src/core/game_settings.cpp index da1530e026..745eae1908 100644 --- a/src/core/game_settings.cpp +++ b/src/core/game_settings.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include "core/game_settings.h" @@ -6,7 +6,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "video_core/renderer_base.h" diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp index 28d39320e4..4b76e18950 100644 --- a/src/core/hle/kernel/k_scheduler.cpp +++ b/src/core/hle/kernel/k_scheduler.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -9,7 +9,7 @@ #include "common/assert.h" #include "common/bit_util.h" #include "common/fiber.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/arm/arm_interface.h" #include "core/core.h" #include "core/core_timing.h" diff --git a/src/core/hle/kernel/k_server_session.cpp b/src/core/hle/kernel/k_server_session.cpp index 40c3323ef3..4c91235ac9 100644 --- a/src/core/hle/kernel/k_server_session.cpp +++ b/src/core/hle/kernel/k_server_session.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ #include "common/assert.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "common/scratch_buffer.h" #include "core/core.h" diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp index bfc8691e95..17bdb7b6fa 100644 --- a/src/core/hle/kernel/k_thread.cpp +++ b/src/core/hle/kernel/k_thread.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -18,7 +18,7 @@ #include "common/common_funcs.h" #include "common/common_types.h" #include "common/fiber.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core.h" #include "core/cpu_manager.h" diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 5c2b6a4a88..129bda194a 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -14,7 +14,7 @@ #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "common/thread.h" #include "common/thread_worker.h" diff --git a/src/core/hle/kernel/svc/svc_processor.cpp b/src/core/hle/kernel/svc/svc_processor.cpp index 7602ce6c03..71fe91ad90 100644 --- a/src/core/hle/kernel/svc/svc_processor.cpp +++ b/src/core/hle/kernel/svc/svc_processor.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/physical_core.h" #include "core/hle/kernel/svc.h" diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index b4d6e2ac30..d8767f9fed 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -10,7 +10,7 @@ #include "common/common_types.h" #include "common/fs/file.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include #include "common/stb.h" #include "common/string_util.h" diff --git a/src/core/hle/service/am/frontend/applet_cabinet.cpp b/src/core/hle/service/am/frontend/applet_cabinet.cpp index 71fa2a0c17..24c249fcce 100644 --- a/src/core/hle/service/am/frontend/applet_cabinet.cpp +++ b/src/core/hle/service/am/frontend/applet_cabinet.cpp @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/frontend/applets/cabinet.h" #include "core/hle/kernel/k_event.h" diff --git a/src/core/hle/service/am/frontend/applet_controller.cpp b/src/core/hle/service/am/frontend/applet_controller.cpp index cfa7cff707..2c4536e873 100644 --- a/src/core/hle/service/am/frontend/applet_controller.cpp +++ b/src/core/hle/service/am/frontend/applet_controller.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -8,7 +8,7 @@ #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/string_util.h" #include "core/core.h" #include "core/frontend/applets/controller.h" diff --git a/src/core/hle/service/am/frontend/applet_error.cpp b/src/core/hle/service/am/frontend/applet_error.cpp index 1c530aa324..1a0786ea5a 100644 --- a/src/core/hle/service/am/frontend/applet_error.cpp +++ b/src/core/hle/service/am/frontend/applet_error.cpp @@ -7,7 +7,7 @@ #include #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/string_util.h" #include "core/core.h" #include "core/frontend/applets/error.h" diff --git a/src/core/hle/service/am/frontend/applet_general.cpp b/src/core/hle/service/am/frontend/applet_general.cpp index d2cabb7b59..5345fdec33 100644 --- a/src/core/hle/service/am/frontend/applet_general.cpp +++ b/src/core/hle/service/am/frontend/applet_general.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" #include "common/hex_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/frontend/applets/general.h" #include "core/hle/result.h" diff --git a/src/core/hle/service/am/frontend/applet_mii_edit.cpp b/src/core/hle/service/am/frontend/applet_mii_edit.cpp index 0180ab761a..7826021018 100644 --- a/src/core/hle/service/am/frontend/applet_mii_edit.cpp +++ b/src/core/hle/service/am/frontend/applet_mii_edit.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/frontend/applets/mii_edit.h" #include "core/hle/service/am/am.h" diff --git a/src/core/hle/service/am/frontend/applet_net_connect.cpp b/src/core/hle/service/am/frontend/applet_net_connect.cpp index 91ba664b7a..c963021ce4 100644 --- a/src/core/hle/service/am/frontend/applet_net_connect.cpp +++ b/src/core/hle/service/am/frontend/applet_net_connect.cpp @@ -1,9 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include "common/assert.h" #include "common/hex_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/frontend/applets/net_connect.h" #include "core/hle/result.h" diff --git a/src/core/hle/service/am/frontend/applet_web_browser.cpp b/src/core/hle/service/am/frontend/applet_web_browser.cpp index 98e3b9c66d..92782c58e2 100644 --- a/src/core/hle/service/am/frontend/applet_web_browser.cpp +++ b/src/core/hle/service/am/frontend/applet_web_browser.cpp @@ -8,7 +8,7 @@ #include "common/fs/file.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/string_util.h" #include "core/core.h" diff --git a/src/core/hle/service/am/service/self_controller.cpp b/src/core/hle/service/am/service/self_controller.cpp index 1b58cbea27..89e393bb97 100644 --- a/src/core/hle/service/am/service/self_controller.cpp +++ b/src/core/hle/service/am/service/self_controller.cpp @@ -1,10 +1,10 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/result.h" #include "core/hle/service/am/am_results.h" #include "core/hle/service/am/frontend/applets.h" diff --git a/src/core/hle/service/aoc/addon_content_manager.cpp b/src/core/hle/service/aoc/addon_content_manager.cpp index d47f57d645..4d3e640bb3 100644 --- a/src/core/hle/service/aoc/addon_content_manager.cpp +++ b/src/core/hle/service/aoc/addon_content_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core.h" #include "core/file_sys/common_funcs.h" diff --git a/src/core/hle/service/apm/apm_controller.cpp b/src/core/hle/service/apm/apm_controller.cpp index 4f1aa5cc27..2149af2c3c 100644 --- a/src/core/hle/service/apm/apm_controller.cpp +++ b/src/core/hle/service/apm/apm_controller.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/settings_enums.h" #include "core/core_timing.h" diff --git a/src/core/hle/service/apm/apm_interface.cpp b/src/core/hle/service/apm/apm_interface.cpp index d29051ee77..90241a7093 100644 --- a/src/core/hle/service/apm/apm_interface.cpp +++ b/src/core/hle/service/apm/apm_interface.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/apm/apm.h" #include "core/hle/service/apm/apm_controller.h" #include "core/hle/service/apm/apm_interface.h" diff --git a/src/core/hle/service/bcat/backend/backend.cpp b/src/core/hle/service/bcat/backend/backend.cpp index 1993493a9e..491416254c 100644 --- a/src/core/hle/service/bcat/backend/backend.cpp +++ b/src/core/hle/service/bcat/backend/backend.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/hex_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_event.h" #include "core/hle/service/bcat/backend/backend.h" diff --git a/src/core/hle/service/bcat/news/builtin_news.cpp b/src/core/hle/service/bcat/news/builtin_news.cpp index 43b0445039..ed001b056b 100644 --- a/src/core/hle/service/bcat/news/builtin_news.cpp +++ b/src/core/hle/service/bcat/news/builtin_news.cpp @@ -7,7 +7,7 @@ #include "common/fs/file.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include #include diff --git a/src/core/hle/service/bcat/news/news_data_service.cpp b/src/core/hle/service/bcat/news/news_data_service.cpp index c5d4b58881..200d00e785 100644 --- a/src/core/hle/service/bcat/news/news_data_service.cpp +++ b/src/core/hle/service/bcat/news/news_data_service.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -9,7 +9,7 @@ #include "core/hle/service/bcat/news/news_storage.h" #include "core/hle/service/cmif_serialization.h" -#include "common/logging/log.h" +#include "common/logging.h" #include diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp index 83618a956b..256a722a84 100644 --- a/src/core/hle/service/btdrv/btdrv.cpp +++ b/src/core/hle/service/btdrv/btdrv.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_event.h" #include "core/hle/service/btdrv/btdrv.h" diff --git a/src/core/hle/service/btm/btm_system.cpp b/src/core/hle/service/btm/btm_system.cpp index 99718a7b01..1684b0193e 100644 --- a/src/core/hle/service/btm/btm_system.cpp +++ b/src/core/hle/service/btm/btm_system.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/btm/btm_system.h" #include "core/hle/service/btm/btm_system_core.h" #include "core/hle/service/cmif_serialization.h" diff --git a/src/core/hle/service/btm/btm_system_core.cpp b/src/core/hle/service/btm/btm_system_core.cpp index 4bc8a9e8ba..f1e623be16 100644 --- a/src/core/hle/service/btm/btm_system_core.cpp +++ b/src/core/hle/service/btm/btm_system_core.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/btm/btm_system_core.h" #include "core/hle/service/cmif_serialization.h" #include "core/hle/service/set/system_settings_server.h" diff --git a/src/core/hle/service/btm/btm_user.cpp b/src/core/hle/service/btm/btm_user.cpp index d2e228f8d1..c380c573fa 100644 --- a/src/core/hle/service/btm/btm_user.cpp +++ b/src/core/hle/service/btm/btm_user.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/btm/btm_user.h" #include "core/hle/service/btm/btm_user_core.h" #include "core/hle/service/cmif_serialization.h" diff --git a/src/core/hle/service/btm/btm_user_core.cpp b/src/core/hle/service/btm/btm_user_core.cpp index 6f9fa589b8..b120df14c0 100644 --- a/src/core/hle/service/btm/btm_user_core.cpp +++ b/src/core/hle/service/btm/btm_user_core.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_event.h" #include "core/hle/service/btm/btm_user_core.h" diff --git a/src/core/hle/service/caps/caps_a.cpp b/src/core/hle/service/caps/caps_a.cpp index 72d3977081..2b365f6cd7 100644 --- a/src/core/hle/service/caps/caps_a.cpp +++ b/src/core/hle/service/caps/caps_a.cpp @@ -1,10 +1,10 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/caps/caps_a.h" #include "core/hle/service/caps/caps_manager.h" #include "core/hle/service/caps/caps_result.h" diff --git a/src/core/hle/service/caps/caps_c.cpp b/src/core/hle/service/caps/caps_c.cpp index 6993c04c2c..6c9f8e964d 100644 --- a/src/core/hle/service/caps/caps_c.cpp +++ b/src/core/hle/service/caps/caps_c.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/caps/caps_c.h" #include "core/hle/service/caps/caps_manager.h" #include "core/hle/service/caps/caps_result.h" diff --git a/src/core/hle/service/caps/caps_manager.cpp b/src/core/hle/service/caps/caps_manager.cpp index 1825d345a6..af0b9b16ad 100644 --- a/src/core/hle/service/caps/caps_manager.cpp +++ b/src/core/hle/service/caps/caps_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -8,7 +8,7 @@ #include "common/fs/file.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/stb.h" #include "core/core.h" #include "core/hle/service/caps/caps_manager.h" diff --git a/src/core/hle/service/caps/caps_ss.cpp b/src/core/hle/service/caps/caps_ss.cpp index dfa7f1a840..0cd641f551 100644 --- a/src/core/hle/service/caps/caps_ss.cpp +++ b/src/core/hle/service/caps/caps_ss.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/caps/caps_manager.h" #include "core/hle/service/caps/caps_ss.h" #include "core/hle/service/cmif_serialization.h" diff --git a/src/core/hle/service/caps/caps_su.cpp b/src/core/hle/service/caps/caps_su.cpp index 528f364f5f..8622ab058f 100644 --- a/src/core/hle/service/caps/caps_su.cpp +++ b/src/core/hle/service/caps/caps_su.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/service/caps/caps_manager.h" #include "core/hle/service/caps/caps_su.h" diff --git a/src/core/hle/service/caps/caps_u.cpp b/src/core/hle/service/caps/caps_u.cpp index 40d4d05fe5..6472b2bac6 100644 --- a/src/core/hle/service/caps/caps_u.cpp +++ b/src/core/hle/service/caps/caps_u.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/caps/caps_manager.h" #include "core/hle/service/caps/caps_types.h" #include "core/hle/service/caps/caps_u.h" diff --git a/src/core/hle/service/erpt/erpt.cpp b/src/core/hle/service/erpt/erpt.cpp index 29db6594f4..014f1da62f 100644 --- a/src/core/hle/service/erpt/erpt.cpp +++ b/src/core/hle/service/erpt/erpt.cpp @@ -6,7 +6,7 @@ #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/cmif_serialization.h" #include "core/hle/service/erpt/erpt.h" #include "core/hle/service/server_manager.h" diff --git a/src/core/hle/service/fatal/fatal.cpp b/src/core/hle/service/fatal/fatal.cpp index 52199b0756..5b281a725a 100644 --- a/src/core/hle/service/fatal/fatal.cpp +++ b/src/core/hle/service/fatal/fatal.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -8,7 +8,7 @@ #include #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scm_rev.h" #include "common/swap.h" #include "core/core.h" diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index 2031052409..c192fea454 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -9,7 +9,7 @@ #include "common/assert.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core.h" #include "core/file_sys/bis_factory.h" diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp index 0503be378c..0ee68c0332 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp @@ -14,7 +14,7 @@ #include "common/assert.h" #include "common/common_types.h" #include "common/hex_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/string_util.h" #include "core/core.h" diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp index 563c796c15..b851de8496 100644 --- a/src/core/hle/service/friend/friend.cpp +++ b/src/core/hle/service/friend/friend.cpp @@ -5,7 +5,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/uuid.h" #include "core/core.h" #include "core/hle/kernel/k_event.h" diff --git a/src/core/hle/service/glue/arp.cpp b/src/core/hle/service/glue/arp.cpp index 1254b6d49c..a7f54e980c 100644 --- a/src/core/hle/service/glue/arp.cpp +++ b/src/core/hle/service/glue/arp.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_process.h" #include "core/hle/kernel/kernel.h" diff --git a/src/core/hle/service/glue/bgtc.cpp b/src/core/hle/service/glue/bgtc.cpp index ae22ac4f79..5e51f98319 100644 --- a/src/core/hle/service/glue/bgtc.cpp +++ b/src/core/hle/service/glue/bgtc.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/service/glue/bgtc.h" #include "core/hle/service/ipc_helpers.h" diff --git a/src/core/hle/service/glue/notif.cpp b/src/core/hle/service/glue/notif.cpp index 3daec85210..49811bff4f 100644 --- a/src/core/hle/service/glue/notif.cpp +++ b/src/core/hle/service/glue/notif.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -8,7 +8,7 @@ #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/cmif_serialization.h" #include "core/hle/service/glue/notif.h" #include "core/hle/service/ipc_helpers.h" diff --git a/src/core/hle/service/hid/active_vibration_device_list.cpp b/src/core/hle/service/hid/active_vibration_device_list.cpp index c440f8382c..e0d6d3f2d9 100644 --- a/src/core/hle/service/hid/active_vibration_device_list.cpp +++ b/src/core/hle/service/hid/active_vibration_device_list.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/cmif_serialization.h" #include "core/hle/service/hid/active_vibration_device_list.h" #include "hid_core/hid_result.h" diff --git a/src/core/hle/service/hid/applet_resource.cpp b/src/core/hle/service/hid/applet_resource.cpp index 4c5df44be5..04d4d1b654 100644 --- a/src/core/hle/service/hid/applet_resource.cpp +++ b/src/core/hle/service/hid/applet_resource.cpp @@ -1,10 +1,10 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/kernel/k_shared_memory.h" #include "core/hle/service/cmif_serialization.h" #include "core/hle/service/hid/applet_resource.h" diff --git a/src/core/hle/service/hid/hid_server.cpp b/src/core/hle/service/hid/hid_server.cpp index b0c253cd00..f29cf4e3d7 100644 --- a/src/core/hle/service/hid/hid_server.cpp +++ b/src/core/hle/service/hid/hid_server.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -7,7 +7,7 @@ #include #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/hle/kernel/k_shared_memory.h" #include "core/hle/kernel/k_transfer_memory.h" diff --git a/src/core/hle/service/hid/hidbus.cpp b/src/core/hle/service/hid/hidbus.cpp index 4fb002bc41..ebc66932ab 100644 --- a/src/core/hle/service/hid/hidbus.cpp +++ b/src/core/hle/service/hid/hidbus.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core.h" #include "core/core_timing.h" diff --git a/src/core/hle/service/hle_ipc.cpp b/src/core/hle/service/hle_ipc.cpp index e0367e774c..8569d2bad8 100644 --- a/src/core/hle/service/hle_ipc.cpp +++ b/src/core/hle/service/hle_ipc.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,7 +13,7 @@ #include "common/assert.h" #include "common/common_funcs.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scratch_buffer.h" #include "core/guest_memory.h" #include "core/hle/kernel/k_auto_object.h" diff --git a/src/core/hle/service/jit/jit_context.cpp b/src/core/hle/service/jit/jit_context.cpp index a927318a7c..522d849e6f 100644 --- a/src/core/hle/service/jit/jit_context.cpp +++ b/src/core/hle/service/jit/jit_context.cpp @@ -16,7 +16,7 @@ #include "common/common_funcs.h" #include "common/div_ceil.h" #include "common/elf.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/jit/jit_context.h" #include "core/memory.h" diff --git a/src/core/hle/service/lbl/lbl.cpp b/src/core/hle/service/lbl/lbl.cpp index c14b241428..68a9bff2df 100644 --- a/src/core/hle/service/lbl/lbl.cpp +++ b/src/core/hle/service/lbl/lbl.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/lbl/lbl.h" #include "core/hle/service/server_manager.h" diff --git a/src/core/hle/service/ldn/lan_discovery.h b/src/core/hle/service/ldn/lan_discovery.h index d39197efff..fb24608ae1 100644 --- a/src/core/hle/service/ldn/lan_discovery.h +++ b/src/core/hle/service/ldn/lan_discovery.h @@ -17,7 +17,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/socket_types.h" #include "core/hle/result.h" #include "core/hle/service/ldn/ldn_results.h" diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp index 0ff5ac0440..26f7e0fc32 100644 --- a/src/core/hle/service/lm/lm.cpp +++ b/src/core/hle/service/lm/lm.cpp @@ -9,7 +9,7 @@ #include #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/lm/lm.h" diff --git a/src/core/hle/service/mii/mii.cpp b/src/core/hle/service/mii/mii.cpp index adaaea571a..51df5bc628 100644 --- a/src/core/hle/service/mii/mii.cpp +++ b/src/core/hle/service/mii/mii.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/cmif_serialization.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/mii/mii.h" diff --git a/src/core/hle/service/mii/mii_database_manager.cpp b/src/core/hle/service/mii/mii_database_manager.cpp index a0291d4b55..606df7953d 100644 --- a/src/core/hle/service/mii/mii_database_manager.cpp +++ b/src/core/hle/service/mii/mii_database_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #include "common/fs/file.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/string_util.h" #include "core/hle/service/mii/mii_database_manager.h" diff --git a/src/core/hle/service/mii/mii_manager.cpp b/src/core/hle/service/mii/mii_manager.cpp index dcfd6b2e2a..ed37830797 100644 --- a/src/core/hle/service/mii/mii_manager.cpp +++ b/src/core/hle/service/mii/mii_manager.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/mii/mii_database_manager.h" #include "core/hle/service/mii/mii_manager.h" #include "core/hle/service/mii/mii_result.h" diff --git a/src/core/hle/service/mm/mm_u.cpp b/src/core/hle/service/mm/mm_u.cpp index a5195da061..e5353ee42c 100644 --- a/src/core/hle/service/mm/mm_u.cpp +++ b/src/core/hle/service/mm/mm_u.cpp @@ -1,10 +1,10 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/mm/mm_u.h" #include "core/hle/service/server_manager.h" diff --git a/src/core/hle/service/mnpp/mnpp_app.cpp b/src/core/hle/service/mnpp/mnpp_app.cpp index b11a920560..19bbfd795b 100644 --- a/src/core/hle/service/mnpp/mnpp_app.cpp +++ b/src/core/hle/service/mnpp/mnpp_app.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/mnpp/mnpp_app.h" #include "core/hle/service/server_manager.h" diff --git a/src/core/hle/service/nfc/common/amiibo_crypto.cpp b/src/core/hle/service/nfc/common/amiibo_crypto.cpp index 1a0f799679..bca1ce0cb5 100644 --- a/src/core/hle/service/nfc/common/amiibo_crypto.cpp +++ b/src/core/hle/service/nfc/common/amiibo_crypto.cpp @@ -15,7 +15,7 @@ #include "common/fs/file.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/nfc/common/amiibo_crypto.h" namespace Service::NFP::AmiiboCrypto { diff --git a/src/core/hle/service/nfc/common/device.cpp b/src/core/hle/service/nfc/common/device.cpp index 98ed7b97bc..faa2b1f584 100644 --- a/src/core/hle/service/nfc/common/device.cpp +++ b/src/core/hle/service/nfc/common/device.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -23,7 +23,7 @@ #include "common/fs/fs.h" #include "common/fs/path_util.h" #include "common/input.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/string_util.h" #include "common/tiny_mt.h" #include "core/core.h" diff --git a/src/core/hle/service/nfc/common/device_manager.cpp b/src/core/hle/service/nfc/common/device_manager.cpp index 2dd3e9f892..a58b0f2aef 100644 --- a/src/core/hle/service/nfc/common/device_manager.cpp +++ b/src/core/hle/service/nfc/common/device_manager.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_event.h" #include "core/hle/service/glue/time/static.h" diff --git a/src/core/hle/service/nfc/nfc.cpp b/src/core/hle/service/nfc/nfc.cpp index 9d4808dbec..6583cd2445 100644 --- a/src/core/hle/service/nfc/nfc.cpp +++ b/src/core/hle/service/nfc/nfc.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/nfc/nfc.h" diff --git a/src/core/hle/service/nfc/nfc_interface.cpp b/src/core/hle/service/nfc/nfc_interface.cpp index c28e55431e..35849bd6c4 100644 --- a/src/core/hle/service/nfc/nfc_interface.cpp +++ b/src/core/hle/service/nfc/nfc_interface.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_event.h" #include "core/hle/service/ipc_helpers.h" diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp index 2eeabc1387..604daabbe2 100644 --- a/src/core/hle/service/nfp/nfp.cpp +++ b/src/core/hle/service/nfp/nfp.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/nfp/nfp.h" #include "core/hle/service/nfp/nfp_interface.h" diff --git a/src/core/hle/service/nfp/nfp_interface.cpp b/src/core/hle/service/nfp/nfp_interface.cpp index 5ba6d17424..5bda6704e0 100644 --- a/src/core/hle/service/nfp/nfp_interface.cpp +++ b/src/core/hle/service/nfp/nfp_interface.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_event.h" #include "core/hle/service/ipc_helpers.h" diff --git a/src/core/hle/service/ns/platform_service_manager.cpp b/src/core/hle/service/ns/platform_service_manager.cpp index e91e6451a8..bf93a2edfa 100644 --- a/src/core/hle/service/ns/platform_service_manager.cpp +++ b/src/core/hle/service/ns/platform_service_manager.cpp @@ -11,7 +11,7 @@ #include "common/assert.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/swap.h" #include "core/core.h" #include "core/file_sys/content_archive.h" diff --git a/src/core/hle/service/ns/query_service.cpp b/src/core/hle/service/ns/query_service.cpp index d4d5834f3f..ea605cb831 100644 --- a/src/core/hle/service/ns/query_service.cpp +++ b/src/core/hle/service/ns/query_service.cpp @@ -4,7 +4,7 @@ // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "common/uuid.h" #include "core/hle/service/cmif_serialization.h" #include "core/hle/service/ns/query_service.h" diff --git a/src/core/hle/service/nvdrv/core/nvmap.cpp b/src/core/hle/service/nvdrv/core/nvmap.cpp index 453cb58319..d3ab2f9a7c 100644 --- a/src/core/hle/service/nvdrv/core/nvmap.cpp +++ b/src/core/hle/service/nvdrv/core/nvmap.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2022 yuzu Emulator Project // SPDX-FileCopyrightText: 2022 Skyline Team and Contributors // SPDX-License-Identifier: GPL-3.0-or-later @@ -6,7 +9,7 @@ #include "common/alignment.h" #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/nvdrv/core/container.h" #include "core/hle/service/nvdrv/core/heap_mapper.h" #include "core/hle/service/nvdrv/core/nvmap.h" @@ -22,42 +25,33 @@ NvMap::Handle::Handle(u64 size_, Id id_) flags.raw = 0; } -NvResult NvMap::Handle::Alloc(Flags pFlags, u32 pAlign, u8 pKind, u64 pAddress, - NvCore::SessionId pSessionId) { - std::scoped_lock lock(mutex); +NvResult NvMap::Handle::Alloc(Flags pFlags, u32 pAlign, u8 pKind, u64 pAddress, NvCore::SessionId pSessionId) { // Handles cannot be allocated twice if (allocated) { return NvResult::AccessDenied; } - flags = pFlags; kind = pKind; align = pAlign < YUZU_PAGESIZE ? YUZU_PAGESIZE : pAlign; session_id = pSessionId; - // This flag is only applicable for handles with an address passed if (pAddress) { flags.keep_uncached_after_free.Assign(0); } else { - LOG_CRITICAL(Service_NVDRV, - "Mapping nvmap handles without a CPU side address is unimplemented!"); + LOG_CRITICAL(Service_NVDRV, "Mapping nvmap handles without a CPU side address is unimplemented!"); } - size = Common::AlignUp(size, YUZU_PAGESIZE); aligned_size = Common::AlignUp(size, align); address = pAddress; allocated = true; - return NvResult::Success; } NvResult NvMap::Handle::Duplicate(bool internal_session) { - std::scoped_lock lock(mutex); // Unallocated handles cannot be duplicated as duplication requires memory accounting (in HOS) if (!allocated) [[unlikely]] { return NvResult::BadValue; } - // If we internally use FromId the duplication tracking of handles won't work accurately due to // us not implementing per-process handle refs. if (internal_session) { @@ -65,16 +59,14 @@ NvResult NvMap::Handle::Duplicate(bool internal_session) { } else { dupes++; } - return NvResult::Success; } NvMap::NvMap(Container& core_, Tegra::Host1x::Host1x& host1x_) : host1x{host1x_}, core{core_} {} -void NvMap::AddHandle(std::shared_ptr handle_description) { - std::scoped_lock lock(handles_lock); - - handles.emplace(handle_description->id, std::move(handle_description)); +void NvMap::AddHandle(Handle&& handle_description) { + std::scoped_lock l(handles_lock); + handles.insert_or_assign(handle_description.id, std::move(handle_description)); } void NvMap::UnmapHandle(Handle& handle_description) { @@ -113,65 +105,54 @@ void NvMap::UnmapHandle(Handle& handle_description) { bool NvMap::TryRemoveHandle(const Handle& handle_description) { // No dupes left, we can remove from handle map if (handle_description.dupes == 0 && handle_description.internal_dupes == 0) { - std::scoped_lock lock(handles_lock); - - auto it{handles.find(handle_description.id)}; + std::scoped_lock l(handles_lock); + auto it = handles.find(handle_description.id); if (it != handles.end()) { handles.erase(it); } - return true; } else { return false; } } -NvResult NvMap::CreateHandle(u64 size, std::shared_ptr& result_out) { - if (!size) [[unlikely]] { +NvResult NvMap::CreateHandle(u64 size, Handle::Id& out_handle) { + if (!Common::AlignUp(size, YUZU_PAGESIZE)) { return NvResult::BadValue; } - - u32 id{next_handle_id.fetch_add(HandleIdIncrement, std::memory_order_relaxed)}; - auto handle_description{std::make_shared(size, id)}; - AddHandle(handle_description); - - result_out = handle_description; + u32 id = next_handle_id.fetch_add(HandleIdIncrement, std::memory_order_relaxed); + AddHandle(Handle(size, id)); + out_handle = id; return NvResult::Success; } -std::shared_ptr NvMap::GetHandle(Handle::Id handle) { - std::scoped_lock lock(handles_lock); - try { - return handles.at(handle); - } catch (std::out_of_range&) { - return nullptr; - } +std::optional> NvMap::GetHandle(Handle::Id handle) { + if (auto const it = handles.find(handle); it != handles.end()) + return {it->second}; + return std::nullopt; } DAddr NvMap::GetHandleAddress(Handle::Id handle) { - std::scoped_lock lock(handles_lock); - try { - return handles.at(handle)->d_address; - } catch (std::out_of_range&) { - return 0; - } + if (auto const it = handles.find(handle); it != handles.end()) + return it->second.d_address; + return 0; } DAddr NvMap::PinHandle(NvMap::Handle::Id handle, bool low_area_pin) { - auto handle_description{GetHandle(handle)}; - if (!handle_description) [[unlikely]] { + std::scoped_lock lock(handles_lock); + auto o = GetHandle(handle); + if (!o) [[unlikely]] { return 0; } - std::scoped_lock lock(handle_description->mutex); + auto handle_description = &o->get(); + const auto map_low_area = [&] { if (handle_description->pin_virt_address == 0) { auto& gmmu_allocator = host1x.Allocator(); auto& gmmu = host1x.GMMU(); - u32 address = - gmmu_allocator.Allocate(static_cast(handle_description->aligned_size)); - gmmu.Map(static_cast(address), handle_description->d_address, - handle_description->aligned_size); + u32 address = gmmu_allocator.Allocate(u32(handle_description->aligned_size)); + gmmu.Map(GPUVAddr(address), handle_description->d_address, handle_description->aligned_size); handle_description->pin_virt_address = address; } }; @@ -181,17 +162,15 @@ DAddr NvMap::PinHandle(NvMap::Handle::Id handle, bool low_area_pin) { { // Lock now to prevent our queue entry from being removed for allocation in-between the // following check and erase - std::scoped_lock queueLock(unmap_queue_lock); + std::scoped_lock ql(unmap_queue_lock); if (handle_description->unmap_queue_entry) { unmap_queue.erase(*handle_description->unmap_queue_entry); handle_description->unmap_queue_entry.reset(); - if (low_area_pin) { map_low_area(); handle_description->pins++; - return static_cast(handle_description->pin_virt_address); + return DAddr(handle_description->pin_virt_address); } - handle_description->pins++; return handle_description->d_address; } @@ -212,12 +191,11 @@ DAddr NvMap::PinHandle(NvMap::Handle::Id handle, bool low_area_pin) { while ((address = smmu.Allocate(aligned_up)) == 0) { // Free handles until the allocation succeeds std::scoped_lock queueLock(unmap_queue_lock); - if (auto freeHandleDesc{unmap_queue.front()}) { + if (auto free_handle = handles.find(unmap_queue.front()); free_handle != handles.end()) { // Handles in the unmap queue are guaranteed not to be pinned so don't bother // checking if they are before unmapping - std::scoped_lock freeLock(freeHandleDesc->mutex); if (handle_description->d_address) - UnmapHandle(*freeHandleDesc); + UnmapHandle(free_handle->second); } else { LOG_CRITICAL(Service_NVDRV, "Ran out of SMMU address space!"); } @@ -235,51 +213,44 @@ DAddr NvMap::PinHandle(NvMap::Handle::Id handle, bool low_area_pin) { handle_description->pins++; if (low_area_pin) { - return static_cast(handle_description->pin_virt_address); + return DAddr(handle_description->pin_virt_address); } return handle_description->d_address; } void NvMap::UnpinHandle(Handle::Id handle) { - auto handle_description{GetHandle(handle)}; - if (!handle_description) { - return; - } - - std::scoped_lock lock(handle_description->mutex); - if (--handle_description->pins < 0) { - LOG_WARNING(Service_NVDRV, "Pin count imbalance detected!"); - } else if (!handle_description->pins) { - std::scoped_lock queueLock(unmap_queue_lock); - - // Add to the unmap queue allowing this handle's memory to be freed if needed - unmap_queue.push_back(handle_description); - handle_description->unmap_queue_entry = std::prev(unmap_queue.end()); + std::scoped_lock lock(handles_lock); + if (auto o = GetHandle(handle); o) { + auto handle_description = &o->get(); + if (--handle_description->pins < 0) { + LOG_WARNING(Service_NVDRV, "Pin count imbalance detected!"); + } else if (!handle_description->pins) { + std::scoped_lock ql(unmap_queue_lock); + // Add to the unmap queue allowing this handle's memory to be freed if needed + unmap_queue.push_back(handle); + handle_description->unmap_queue_entry = std::prev(unmap_queue.end()); + } } } void NvMap::DuplicateHandle(Handle::Id handle, bool internal_session) { - auto handle_description{GetHandle(handle)}; - if (!handle_description) { + std::scoped_lock lock(handles_lock); + auto o = GetHandle(handle); + if (!o) { LOG_CRITICAL(Service_NVDRV, "Unregistered handle!"); return; } - - auto result = handle_description->Duplicate(internal_session); + auto result = o->get().Duplicate(internal_session); if (result != NvResult::Success) { LOG_CRITICAL(Service_NVDRV, "Could not duplicate handle!"); } } std::optional NvMap::FreeHandle(Handle::Id handle, bool internal_session) { - std::weak_ptr hWeak{GetHandle(handle)}; - FreeInfo freeInfo; - - // We use a weak ptr here so we can tell when the handle has been freed and report that back to - // guest - if (auto handle_description = hWeak.lock()) { - std::scoped_lock lock(handle_description->mutex); - + // We use a weak ptr here so we can tell when the handle has been freed and report that back to guest + std::scoped_lock lock(handles_lock); + if (auto o = GetHandle(handle); o) { + auto handle_description = &o->get(); if (internal_session) { if (--handle_description->internal_dupes < 0) LOG_WARNING(Service_NVDRV, "Internal duplicate count imbalance detected!"); @@ -289,25 +260,25 @@ std::optional NvMap::FreeHandle(Handle::Id handle, bool interna } else if (handle_description->dupes == 0) { // Force unmap the handle if (handle_description->d_address) { - std::scoped_lock queueLock(unmap_queue_lock); + std::scoped_lock ql(unmap_queue_lock); UnmapHandle(*handle_description); } - handle_description->pins = 0; } } - // Try to remove the shared ptr to the handle from the map, if nothing else is using the // handle then it will now be freed when `handle_description` goes out of scope if (TryRemoveHandle(*handle_description)) { LOG_DEBUG(Service_NVDRV, "Removed nvmap handle: {}", handle); } else { - LOG_DEBUG(Service_NVDRV, - "Tried to free nvmap handle: {} but didn't as it still has duplicates", - handle); + LOG_DEBUG(Service_NVDRV, "Tried to free nvmap handle: {} but didn't as it still has duplicates", handle); } - - freeInfo = { + // // If the handle hasn't been freed from memory, mark that + // if (!hWeak.expired()) { + // LOG_DEBUG(Service_NVDRV, "nvmap handle: {} wasn't freed as it is still in use", handle); + // freeInfo.can_unlock = false; + // } + return FreeInfo{ .address = handle_description->address, .size = handle_description->size, .was_uncached = handle_description->flags.map_uncached.Value() != 0, @@ -316,30 +287,15 @@ std::optional NvMap::FreeHandle(Handle::Id handle, bool interna } else { return std::nullopt; } - - // If the handle hasn't been freed from memory, mark that - if (!hWeak.expired()) { - LOG_DEBUG(Service_NVDRV, "nvmap handle: {} wasn't freed as it is still in use", handle); - freeInfo.can_unlock = false; - } - - return freeInfo; } void NvMap::UnmapAllHandles(NvCore::SessionId session_id) { - auto handles_copy = [&] { - std::scoped_lock lk{handles_lock}; - return handles; - }(); - - for (auto& [id, handle] : handles_copy) { - { - std::scoped_lock lk{handle->mutex}; - if (handle->session_id.id != session_id.id || handle->dupes <= 0) { - continue; - } + std::scoped_lock lk{handles_lock}; + for (auto it = handles.begin(); it != handles.end(); ++it) { + if (it->second.session_id.id != session_id.id || it->second.dupes <= 0) { + continue; } - FreeHandle(id, false); + FreeHandle(it->first, false); } } diff --git a/src/core/hle/service/nvdrv/core/nvmap.h b/src/core/hle/service/nvdrv/core/nvmap.h index 17b9ccd1c7..c61ae88847 100644 --- a/src/core/hle/service/nvdrv/core/nvmap.h +++ b/src/core/hle/service/nvdrv/core/nvmap.h @@ -12,6 +12,11 @@ #include #include #include +#if BOOST_VERSION >= 109000 +#include +#else +#include +#endif #include #include @@ -31,54 +36,36 @@ class Host1x; namespace Service::Nvidia::NvCore { class Container; -/** - * @brief The nvmap core class holds the global state for nvmap and provides methods to manage - * handles - */ +/// @brief The nvmap core class holds the global state for nvmap and provides methods to manage handles class NvMap { public: - /** - * @brief A handle to a contiguous block of memory in an application's address space - */ + /// @brief A handle to a contiguous block of memory in an application's address space struct Handle { - std::mutex mutex; - + using Id = u32; + std::optional::iterator> unmap_queue_entry{}; u64 align{}; //!< The alignment to use when pinning the handle onto the SMMU u64 size; //!< Page-aligned size of the memory the handle refers to u64 aligned_size; //!< `align`-aligned size of the memory the handle refers to u64 orig_size; //!< Original unaligned size of the memory this handle refers to - + DAddr d_address{}; //!< The memory location in the device's AS that this handle corresponds to, this can also be in the nvdrv tmem + VAddr address{}; //!< The memory location in the guest's AS that this handle corresponds to, this can also be in the nvdrv tmem + s64 pins{}; s32 dupes{1}; //!< How many guest references there are to this handle s32 internal_dupes{0}; //!< How many emulator-internal references there are to this handle - - using Id = u32; Id id; //!< A globally unique identifier for this handle - - s64 pins{}; u32 pin_virt_address{}; - std::optional>::iterator> unmap_queue_entry{}; - union Flags { u32 raw; BitField<0, 1, u32> map_uncached; //!< If the handle should be mapped as uncached - BitField<2, 1, u32> keep_uncached_after_free; //!< Only applicable when the handle was - //!< allocated with a fixed address - BitField<4, 1, u32> _unk0_; //!< Passed to IOVMM for pins + BitField<2, 1, u32> keep_uncached_after_free; //!< Only applicable when the handle was allocated with a fixed address + BitField<4, 1, u32> _unk0_; //!< Passed to IOVMM for pins } flags{}; static_assert(sizeof(Flags) == sizeof(u32)); - - VAddr address{}; //!< The memory location in the guest's AS that this handle corresponds to, - //!< this can also be in the nvdrv tmem - bool is_shared_mem_mapped{}; //!< If this nvmap has been mapped with the MapSharedMem IPC - //!< call - - u8 kind{}; //!< Used for memory compression - bool allocated{}; //!< If the handle has been allocated with `Alloc` - bool in_heap{}; NvCore::SessionId session_id{}; - - DAddr d_address{}; //!< The memory location in the device's AS that this handle corresponds - //!< to, this can also be in the nvdrv tmem + u8 kind{}; //!< Used for memory compression + bool allocated : 1 = false; //!< If the handle has been allocated with `Alloc` + bool in_heap : 1 = false; + bool is_shared_mem_mapped : 1 = false; //!< If this nvmap has been mapped with the MapSharedMem IPC < call Handle(u64 size, Id id); @@ -123,9 +110,9 @@ public: /** * @brief Creates an unallocated handle of the given size */ - [[nodiscard]] NvResult CreateHandle(u64 size, std::shared_ptr& result_out); + [[nodiscard]] NvResult CreateHandle(u64 size, Handle::Id& out_handle); - std::shared_ptr GetHandle(Handle::Id handle); + std::optional> GetHandle(Handle::Id handle); DAddr GetHandleAddress(Handle::Id handle); @@ -157,20 +144,21 @@ public: void UnmapAllHandles(NvCore::SessionId session_id); -private: - std::list> unmap_queue{}; + std::list unmap_queue{}; + /// Main owning map of handles +#if BOOST_VERSION >= 109000 + boost::unordered_node_map handles{}; +#else + std::unordered_map handles{}; +#endif std::mutex unmap_queue_lock{}; //!< Protects access to `unmap_queue` - - ankerl::unordered_dense::map> - handles{}; //!< Main owning map of handles std::mutex handles_lock; //!< Protects access to `handles` - - static constexpr u32 HandleIdIncrement{ - 4}; //!< Each new handle ID is an increment of 4 from the previous + static constexpr u32 HandleIdIncrement{4}; //!< Each new handle ID is an increment of 4 from the previous std::atomic next_handle_id{HandleIdIncrement}; Tegra::Host1x::Host1x& host1x; + Container& core; - void AddHandle(std::shared_ptr handle); + void AddHandle(Handle&& handle); /** * @brief Unmaps and frees the SMMU memory region a handle is mapped to @@ -184,7 +172,5 @@ private: * @return If the handle was removed from the map */ bool TryRemoveHandle(const Handle& handle_description); - - Container& core; }; } // namespace Service::Nvidia::NvCore diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp index 995646e250..f26f5347eb 100644 --- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp +++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/core_timing.h" #include "core/hle/service/nvdrv/core/container.h" diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp index 140c6eb6e3..b126ac5293 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2021 yuzu Emulator Project @@ -10,7 +10,7 @@ #include "common/alignment.h" #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/service/nvdrv/core/container.h" #include "core/hle/service/nvdrv/core/nvmap.h" @@ -351,13 +351,13 @@ NvResult nvhost_as_gpu::MapBufferEx(IoctlMapBufferEx& params) { } } - auto handle{nvmap.GetHandle(params.handle)}; - if (!handle) { + auto o = nvmap.GetHandle(params.handle); + if (!o) { return NvResult::BadValue; } + auto handle = &o->get(); - DAddr device_address{ - static_cast(nvmap.PinHandle(params.handle, false) + params.buffer_offset)}; + DAddr device_address = DAddr(nvmap.PinHandle(params.handle, false) + params.buffer_offset); u64 size{params.mapping_size ? params.mapping_size : handle->orig_size}; bool big_page{[&]() { diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp index 7a035cd2c0..b2580f2bb9 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-FileCopyrightText: 2021 Skyline Team and Contributors // SPDX-License-Identifier: GPL-3.0-or-later @@ -8,7 +11,7 @@ #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "core/core.h" #include "core/hle/kernel/k_event.h" diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp index d7a65ce445..ace1f7e8f7 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -6,7 +6,7 @@ #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/core_timing.h" #include "core/hle/service/nvdrv/devices/ioctl_serialization.h" diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp index aab4de39e4..5869bec903 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -6,7 +6,7 @@ #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_process.h" #include "core/hle/service/nvdrv/core/container.h" diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp index 60b89b6284..d64658bddc 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "audio_core/audio_core.h" #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/service/nvdrv/core/container.h" #include "core/hle/service/nvdrv/devices/ioctl_serialization.h" diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp index f7d6c33f77..d7ada3d5e6 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -9,7 +9,7 @@ #include "common/assert.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_process.h" #include "core/hle/service/nvdrv/core/container.h" @@ -103,17 +103,13 @@ NvResult nvhost_nvdec_common::Submit(IoctlSubmit& params, std::span data, De for (std::size_t i = 0; i < syncpt_increments.size(); i++) { const SyncptIncr& syncpt_incr = syncpt_increments[i]; - fence_thresholds[i] = - syncpoint_manager.IncrementSyncpointMaxExt(syncpt_incr.id, syncpt_incr.increments); + fence_thresholds[i] = syncpoint_manager.IncrementSyncpointMaxExt(syncpt_incr.id, syncpt_incr.increments); } for (const auto& cmd_buffer : command_buffers) { const auto object = nvmap.GetHandle(cmd_buffer.memory_id); ASSERT_OR_EXECUTE(object, return NvResult::InvalidState;); - Core::Memory::CpuGuestMemory - cmdlist(session->process->GetMemory(), object->address + cmd_buffer.offset, - cmd_buffer.word_count); + Core::Memory::CpuGuestMemory cmdlist(session->process->GetMemory(), object->get().address + cmd_buffer.offset, cmd_buffer.word_count); host1x.PushEntries(fd, std::move(cmdlist)); } diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp index f87d53f12c..90c68fdecf 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/nvdrv/devices/ioctl_serialization.h" #include "core/hle/service/nvdrv/devices/nvhost_nvjpg.h" diff --git a/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp b/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp index 8219a2c7e8..07391824d0 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/service/nvdrv/core/container.h" #include "core/hle/service/nvdrv/devices/ioctl_serialization.h" diff --git a/src/core/hle/service/nvdrv/devices/nvmap.cpp b/src/core/hle/service/nvdrv/devices/nvmap.cpp index b9131ee5ce..605ea3d35e 100644 --- a/src/core/hle/service/nvdrv/devices/nvmap.cpp +++ b/src/core/hle/service/nvdrv/devices/nvmap.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -10,7 +10,7 @@ #include "common/alignment.h" #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_page_table.h" #include "core/hle/kernel/k_process.h" @@ -83,17 +83,14 @@ void nvmap::OnClose(DeviceFD fd) { NvResult nvmap::IocCreate(IocCreateParams& params) { LOG_DEBUG(Service_NVDRV, "called, size=0x{:08X}", params.size); - std::shared_ptr handle_description{}; - auto result = - file.CreateHandle(Common::AlignUp(params.size, YUZU_PAGESIZE), handle_description); + NvCore::NvMap::Handle handle_description(0, 0); + // Orig size is the unaligned size, set the handle to that + auto result = file.CreateHandle(params.size, params.handle); if (result != NvResult::Success) { LOG_CRITICAL(Service_NVDRV, "Failed to create Object"); return result; } - handle_description->orig_size = params.size; // Orig size is the unaligned size - params.handle = handle_description->id; - LOG_DEBUG(Service_NVDRV, "handle: {}, size: {:#X}", handle_description->id, params.size); - + LOG_DEBUG(Service_NVDRV, "handle: {}, size: {:#X}", params.handle, params.size); return NvResult::Success; } @@ -115,30 +112,27 @@ NvResult nvmap::IocAlloc(IocAllocParams& params, DeviceFD fd) { params.align = YUZU_PAGESIZE; } - auto handle_description{file.GetHandle(params.handle)}; - if (!handle_description) { + std::scoped_lock lock(file.handles_lock); + auto o = file.GetHandle(params.handle); + if (!o) { LOG_CRITICAL(Service_NVDRV, "Object does not exist, handle={:08X}", params.handle); return NvResult::BadValue; } + auto handle_description = &o->get(); if (handle_description->allocated) { LOG_CRITICAL(Service_NVDRV, "Object is already allocated, handle={:08X}", params.handle); return NvResult::InsufficientMemory; } - const auto result = handle_description->Alloc(params.flags, params.align, params.kind, - params.address, sessions[fd]); + const auto result = handle_description->Alloc(params.flags, params.align, params.kind, params.address, sessions[fd]); if (result != NvResult::Success) { LOG_CRITICAL(Service_NVDRV, "Object failed to allocate, handle={:08X}", params.handle); return result; } bool is_out_io{}; auto process = container.GetSession(sessions[fd])->process; - ASSERT(process->GetPageTable() - .LockForMapDeviceAddressSpace(&is_out_io, handle_description->address, - handle_description->size, - Kernel::KMemoryPermission::None, true, false) - .IsSuccess()); + ASSERT(process->GetPageTable().LockForMapDeviceAddressSpace(&is_out_io, handle_description->address, handle_description->size, Kernel::KMemoryPermission::None, true, false).IsSuccess()); return result; } @@ -151,13 +145,13 @@ NvResult nvmap::IocGetId(IocGetIdParams& params) { return NvResult::BadValue; } - auto handle_description{file.GetHandle(params.handle)}; - if (!handle_description) { + std::scoped_lock lock(file.handles_lock); + auto o = file.GetHandle(params.handle); + if (!o) { LOG_CRITICAL(Service_NVDRV, "Error!"); - return NvResult::AccessDenied; // This will always return EPERM irrespective of if the - // handle exists or not + return NvResult::AccessDenied; // This will always return EPERM irrespective of if the handle exists or not } - + auto handle_description = &o->get(); params.id = handle_description->id; return NvResult::Success; } @@ -174,12 +168,14 @@ NvResult nvmap::IocFromId(IocFromIdParams& params) { return NvResult::BadValue; } - auto handle_description{file.GetHandle(params.id)}; - if (!handle_description) { + std::scoped_lock lock(file.handles_lock); + auto o = file.GetHandle(params.id); + if (!o) { LOG_CRITICAL(Service_NVDRV, "Unregistered handle!"); return NvResult::BadValue; } + auto handle_description = &o->get(); auto result = handle_description->Duplicate(false); if (result != NvResult::Success) { LOG_CRITICAL(Service_NVDRV, "Could not duplicate handle!"); @@ -199,12 +195,14 @@ NvResult nvmap::IocParam(IocParamParams& params) { return NvResult::BadValue; } - auto handle_description{file.GetHandle(params.handle)}; - if (!handle_description) { + std::scoped_lock lock(file.handles_lock); + auto o = file.GetHandle(params.handle); + if (!o) { LOG_CRITICAL(Service_NVDRV, "Not registered handle!"); return NvResult::BadValue; } + auto handle_description = &o->get(); switch (params.param) { case HandleParameterType::Size: params.result = static_cast(handle_description->orig_size); diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.cpp b/src/core/hle/service/nvdrv/nvdrv_interface.cpp index db9467f4d1..15983ba881 100644 --- a/src/core/hle/service/nvdrv/nvdrv_interface.cpp +++ b/src/core/hle/service/nvdrv/nvdrv_interface.cpp @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-FileCopyrightText: 2021 Skyline Team and Contributors // SPDX-License-Identifier: GPL-3.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "common/string_util.h" #include "core/core.h" diff --git a/src/core/hle/service/nvdrv/nvmemp.cpp b/src/core/hle/service/nvdrv/nvmemp.cpp index fc10f6406f..a5477faf1a 100644 --- a/src/core/hle/service/nvdrv/nvmemp.cpp +++ b/src/core/hle/service/nvdrv/nvmemp.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/nvdrv/nvmemp.h" namespace Service::Nvidia { diff --git a/src/core/hle/service/nvnflinger/buffer_item_consumer.cpp b/src/core/hle/service/nvnflinger/buffer_item_consumer.cpp index 123507123e..4ad0e967ec 100644 --- a/src/core/hle/service/nvnflinger/buffer_item_consumer.cpp +++ b/src/core/hle/service/nvnflinger/buffer_item_consumer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2012 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -5,7 +8,7 @@ // https://cs.android.com/android/platform/superproject/+/android-5.1.1_r38:frameworks/native/libs/gui/BufferItemConsumer.cpp #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/nvnflinger/buffer_item.h" #include "core/hle/service/nvnflinger/buffer_item_consumer.h" #include "core/hle/service/nvnflinger/buffer_queue_consumer.h" diff --git a/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp b/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp index c1bd58ee7e..1052dfa0ef 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp +++ b/src/core/hle/service/nvnflinger/buffer_queue_consumer.cpp @@ -8,7 +8,7 @@ // https://cs.android.com/android/platform/superproject/+/android-5.1.1_r38:frameworks/native/libs/gui/BufferQueueConsumer.cpp #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/nvnflinger/buffer_item.h" #include "core/hle/service/nvnflinger/buffer_queue_consumer.h" #include "core/hle/service/nvnflinger/buffer_queue_core.h" diff --git a/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp b/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp index 2aae24ba4b..436b0f4b05 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp +++ b/src/core/hle/service/nvnflinger/buffer_queue_producer.cpp @@ -8,7 +8,7 @@ // https://cs.android.com/android/platform/superproject/+/android-5.1.1_r38:frameworks/native/libs/gui/BufferQueueProducer.cpp #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/hle/kernel/k_event.h" #include "core/hle/kernel/k_readable_event.h" diff --git a/src/core/hle/service/nvnflinger/consumer_base.cpp b/src/core/hle/service/nvnflinger/consumer_base.cpp index e360ebfd8e..ee8edc88c4 100644 --- a/src/core/hle/service/nvnflinger/consumer_base.cpp +++ b/src/core/hle/service/nvnflinger/consumer_base.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2010 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -5,7 +8,7 @@ // https://cs.android.com/android/platform/superproject/+/android-5.1.1_r38:frameworks/native/libs/gui/ConsumerBase.cpp #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/nvnflinger/buffer_item.h" #include "core/hle/service/nvnflinger/buffer_queue_consumer.h" #include "core/hle/service/nvnflinger/buffer_queue_core.h" diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp b/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp index 800372cd5c..1514c74d36 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp +++ b/src/core/hle/service/nvnflinger/hos_binder_driver_server.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/nvnflinger/hos_binder_driver_server.h" namespace Service::Nvnflinger { diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp index bfc5539903..02fa82047d 100644 --- a/src/core/hle/service/prepo/prepo.cpp +++ b/src/core/hle/service/prepo/prepo.cpp @@ -5,7 +5,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "common/hex_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/uuid.h" #include diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp index 013cce3579..f144b8e497 100644 --- a/src/core/hle/service/ptm/psm.cpp +++ b/src/core/hle/service/ptm/psm.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -7,7 +7,7 @@ #include #include "common/device_power_state.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_event.h" #include "core/hle/service/ipc_helpers.h" diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 8b71a97320..e054ad441b 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -6,7 +6,7 @@ #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core.h" #include "core/hle/ipc.h" diff --git a/src/core/hle/service/set/settings_server.cpp b/src/core/hle/service/set/settings_server.cpp index f6080926a7..942dddc9bc 100644 --- a/src/core/hle/service/set/settings_server.cpp +++ b/src/core/hle/service/set/settings_server.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -7,7 +7,7 @@ #include #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/hle/service/cmif_serialization.h" #include "core/hle/service/ipc_helpers.h" diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp index 87d6bf2a36..c7a83e69f4 100644 --- a/src/core/hle/service/set/system_settings_server.cpp +++ b/src/core/hle/service/set/system_settings_server.cpp @@ -10,7 +10,7 @@ #include "common/fs/file.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/string_util.h" #include "core/core.h" diff --git a/src/core/hle/service/sm/sm_controller.cpp b/src/core/hle/service/sm/sm_controller.cpp index 6b7ea4d83d..00c88f6de1 100644 --- a/src/core/hle/service/sm/sm_controller.cpp +++ b/src/core/hle/service/sm/sm_controller.cpp @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_client_port.h" #include "core/hle/kernel/k_port.h" diff --git a/src/core/hle/service/sockets/sockets_translate.cpp b/src/core/hle/service/sockets/sockets_translate.cpp index 9d82d347eb..ea12977f62 100644 --- a/src/core/hle/service/sockets/sockets_translate.cpp +++ b/src/core/hle/service/sockets/sockets_translate.cpp @@ -8,7 +8,7 @@ #include "common/assert.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/sockets/sockets.h" #include "core/hle/service/sockets/sockets_translate.h" #include "core/internal_network/network.h" diff --git a/src/core/hle/service/spl/spl_module.cpp b/src/core/hle/service/spl/spl_module.cpp index 9097b8454c..17c9f8a887 100644 --- a/src/core/hle/service/spl/spl_module.cpp +++ b/src/core/hle/service/spl/spl_module.cpp @@ -8,7 +8,7 @@ #include #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/hle/api_version.h" #include "core/hle/service/ipc_helpers.h" diff --git a/src/core/hle/service/ssl/ssl_backend_none.cpp b/src/core/hle/service/ssl/ssl_backend_none.cpp index a7fafd0a30..3a8474e093 100644 --- a/src/core/hle/service/ssl/ssl_backend_none.cpp +++ b/src/core/hle/service/ssl/ssl_backend_none.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/ssl/ssl_backend.h" diff --git a/src/core/hle/service/usb/usb.cpp b/src/core/hle/service/usb/usb.cpp index f29fff1dd5..7f07cfef19 100644 --- a/src/core/hle/service/usb/usb.cpp +++ b/src/core/hle/service/usb/usb.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/server_manager.h" #include "core/hle/service/service.h" diff --git a/src/core/internal_network/emu_net_state.cpp b/src/core/internal_network/emu_net_state.cpp index d6d1a70a60..bd92bf18f7 100644 --- a/src/core/internal_network/emu_net_state.cpp +++ b/src/core/internal_network/emu_net_state.cpp @@ -1,7 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/internal_network/emu_net_state.h" #include "core/internal_network/network.h" #include "core/internal_network/network_interface.h" diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index f16da5a3d8..1b27934f69 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -29,7 +29,7 @@ #include "common/assert.h" #include "common/common_types.h" #include "common/expected.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/internal_network/network.h" #include "core/internal_network/network_interface.h" diff --git a/src/core/internal_network/network_interface.cpp b/src/core/internal_network/network_interface.cpp index 48be1e2dc4..f68d4617eb 100644 --- a/src/core/internal_network/network_interface.cpp +++ b/src/core/internal_network/network_interface.cpp @@ -36,7 +36,7 @@ #endif #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/string_util.h" #include "core/internal_network/emu_net_state.h" diff --git a/src/core/internal_network/socket_proxy.cpp b/src/core/internal_network/socket_proxy.cpp index f37fdc8795..744765bfcc 100644 --- a/src/core/internal_network/socket_proxy.cpp +++ b/src/core/internal_network/socket_proxy.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +7,7 @@ #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/zstd_compression.h" #include "core/internal_network/network.h" #include "core/internal_network/network_interface.h" diff --git a/src/core/internal_network/wifi_scanner.cpp b/src/core/internal_network/wifi_scanner.cpp index 1b97f69177..8c91f8b524 100644 --- a/src/core/internal_network/wifi_scanner.cpp +++ b/src/core/internal_network/wifi_scanner.cpp @@ -24,7 +24,7 @@ #include #endif -#include "common/logging/log.h" +#include "common/logging.h" #include "core/internal_network/network_interface.h" #include "core/internal_network/wifi_scanner.h" diff --git a/src/core/launch_timestamp_cache.cpp b/src/core/launch_timestamp_cache.cpp index 217b3f28da..c58ffa1d5e 100644 --- a/src/core/launch_timestamp_cache.cpp +++ b/src/core/launch_timestamp_cache.cpp @@ -16,7 +16,7 @@ #include "common/fs/fs.h" #include "common/fs/file.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" namespace Core::LaunchTimestampCache { namespace { diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp index 1775569fa8..4e0b119f21 100644 --- a/src/core/loader/deconstructed_rom_directory.cpp +++ b/src/core/loader/deconstructed_rom_directory.cpp @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core.h" #include "core/file_sys/content_archive.h" diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp index b4d50227d3..69bfa2e879 100644 --- a/src/core/loader/loader.cpp +++ b/src/core/loader/loader.cpp @@ -12,7 +12,7 @@ #include #include "common/concepts.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/string_util.h" #include "core/core.h" #include "core/file_sys/card_image.h" diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index f5a77a726f..b429aa9e80 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp @@ -9,7 +9,7 @@ #include "common/common_funcs.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/swap.h" #include "core/core.h" diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index f62b1f4957..482c853542 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp @@ -11,7 +11,7 @@ #include "common/common_funcs.h" #include "common/hex_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/lz4_compression.h" #include "common/settings.h" #include "common/swap.h" diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 0ad360c3df..5c57df424c 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -6,7 +6,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include -#include #include #include #include @@ -18,7 +17,7 @@ #include "common/atomic_ops.h" #include "common/common_types.h" #include "common/heap_tracker.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/page_table.h" #include "common/scope_exit.h" #include "common/settings.h" @@ -128,14 +127,83 @@ struct Memory::Impl { } } - [[nodiscard]] inline u8* GetPointerFromRasterizerCachedMemory(u64 vaddr) const { - auto const paddr = current_page_table->entries[vaddr >> YUZU_PAGEBITS].addr; - return paddr ? system.DeviceMemory().GetPointer(paddr + vaddr) : nullptr; + [[nodiscard]] u8* GetPointerFromRasterizerCachedMemory(u64 vaddr) const { + Common::PhysicalAddress const paddr = current_page_table->entries[vaddr >> YUZU_PAGEBITS].addr; + if (paddr) + return system.DeviceMemory().GetPointer(paddr + vaddr); + return {}; } - [[nodiscard]] inline u8* GetPointerFromDebugMemory(u64 vaddr) const { - auto const paddr = current_page_table->entries[vaddr >> YUZU_PAGEBITS].addr; - return paddr ? system.DeviceMemory().GetPointer(paddr + vaddr) : nullptr; + [[nodiscard]] u8* GetPointerFromDebugMemory(u64 vaddr) const { + const Common::PhysicalAddress paddr = current_page_table->entries[vaddr >> YUZU_PAGEBITS].addr; + if (paddr != 0) + return system.DeviceMemory().GetPointer(paddr + vaddr); + return {}; + } + + u8 Read8(const Common::ProcessAddress addr) { + return Read(addr); + } + + u16 Read16(const Common::ProcessAddress addr) { + if ((addr & 1) == 0) { + return Read(addr); + } else { + const u32 a{Read(addr)}; + const u32 b{Read(addr + sizeof(u8))}; + return static_cast((b << 8) | a); + } + } + + u32 Read32(const Common::ProcessAddress addr) { + if ((addr & 3) == 0) { + return Read(addr); + } else { + const u32 a{Read16(addr)}; + const u32 b{Read16(addr + sizeof(u16))}; + return (b << 16) | a; + } + } + + u64 Read64(const Common::ProcessAddress addr) { + if ((addr & 7) == 0) { + return Read(addr); + } else { + const u32 a{Read32(addr)}; + const u32 b{Read32(addr + sizeof(u32))}; + return (static_cast(b) << 32) | a; + } + } + + void Write8(const Common::ProcessAddress addr, const u8 data) { + Write(addr, data); + } + + void Write16(const Common::ProcessAddress addr, const u16 data) { + if ((addr & 1) == 0) { + Write(addr, data); + } else { + Write(addr, static_cast(data)); + Write(addr + sizeof(u8), static_cast(data >> 8)); + } + } + + void Write32(const Common::ProcessAddress addr, const u32 data) { + if ((addr & 3) == 0) { + Write(addr, data); + } else { + Write16(addr, static_cast(data)); + Write16(addr + sizeof(u16), static_cast(data >> 16)); + } + } + + void Write64(const Common::ProcessAddress addr, const u64 data) { + if ((addr & 7) == 0) { + Write(addr, data); + } else { + Write32(addr, static_cast(data)); + Write32(addr + sizeof(u32), static_cast(data >> 32)); + } } bool WriteExclusive8(const Common::ProcessAddress addr, const u8 data, const u8 expected) { @@ -590,7 +658,7 @@ struct Memory::Impl { } template - [[nodiscard]] inline u8* GetPointerImpl(u64 vaddr, F&& on_unmapped, G&& on_rasterizer) const { + [[nodiscard]] u8* GetPointerImpl(u64 vaddr, F&& on_unmapped, G&& on_rasterizer) const { // AARCH64 masks the upper 16 bit of all memory accesses vaddr &= 0xffffffffffffULL; if (AddressSpaceContains(*current_page_table, vaddr, 1)) [[likely]] { @@ -645,42 +713,18 @@ struct Memory::Impl { /// @returns The instance of T read from the specified virtual address. template inline T Read(Common::ProcessAddress vaddr) noexcept requires(std::is_trivially_copyable_v) { - auto const addr_c1 = GetInteger(vaddr); - if (!(sizeof(T) > 1 && (addr_c1 & 4095) + sizeof(T) > 4096)) { - if (auto const ptr_c1 = GetPointerImpl(addr_c1, [addr_c1] { - LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, addr_c1); - }, [&] { - HandleRasterizerDownload(addr_c1, sizeof(T)); - }); ptr_c1) { - // It may be tempting to rewrite this particular section to use "reinterpret_cast"; - // afterall, it's trivially copyable so surely it can be copied ov- Alignment. - // Remember, alignment. memcpy() will deal with all the alignment extremely fast. - T result{}; - std::memcpy(&result, ptr_c1, sizeof(T)); - return result; - } - } else { - auto const addr_c2 = (addr_c1 & (~0xfff)) + 0x1000; - // page crossing: say if sizeof(T) = 2, vaddr = 4095 - // 4095 + 2 mod 4096 = 1 => 2 - 1 = 1, thus c1=1, c2=1 - auto const count_c2 = (addr_c1 + sizeof(T)) & 4095; - auto const count_c1 = sizeof(T) - count_c2; - if (auto const ptr_c1 = GetPointerImpl(addr_c1, [addr_c1] { - LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, addr_c1); - }, [&] { - HandleRasterizerDownload(addr_c1, count_c1); - }); ptr_c1) { - if (auto const ptr_c2 = GetPointerImpl(addr_c2, [addr_c2] { - LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, addr_c2); - }, [&] { - HandleRasterizerDownload(addr_c2, count_c2); - }); ptr_c2) { - std::array result{}; - std::memcpy(result.data() + 0, ptr_c1, count_c1); - std::memcpy(result.data() + count_c1, ptr_c2, count_c2); - return std::bit_cast(result); - } - } + const u64 addr = GetInteger(vaddr); + if (auto const ptr = GetPointerImpl(addr, [addr]() { + LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, addr); + }, [&]() { + HandleRasterizerDownload(addr, sizeof(T)); + }); ptr) [[likely]] { + // It may be tempting to rewrite this particular section to use "reinterpret_cast"; + // afterall, it's trivially copyable so surely it can be copied ov- Alignment. + // Remember, alignment. memcpy() will deal with all the alignment extremely fast. + T result{}; + std::memcpy(&result, ptr, sizeof(T)); + return result; } return T{}; } @@ -690,37 +734,11 @@ struct Memory::Impl { /// @tparam T The data type to write to memory. template inline void Write(Common::ProcessAddress vaddr, const T data) noexcept requires(std::is_trivially_copyable_v) { - auto const addr_c1 = GetInteger(vaddr); - if (!(sizeof(T) > 1 && (addr_c1 & 4095) + sizeof(T) > 4096)) { - if (auto const ptr_c1 = GetPointerImpl(addr_c1, [addr_c1] { - LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, addr_c1); - }, [&] { - HandleRasterizerWrite(addr_c1, sizeof(T)); - }); ptr_c1) { - std::memcpy(ptr_c1, &data, sizeof(T)); - } - } else { - auto const addr_c2 = (addr_c1 & (~0xfff)) + 0x1000; - // page crossing: say if sizeof(T) = 2, vaddr = 4095 - // 4095 + 2 mod 4096 = 1 => 2 - 1 = 1, thus c1=1, c2=1 - auto const count_c2 = (addr_c1 + sizeof(T)) & 4095; - auto const count_c1 = sizeof(T) - count_c2; - if (auto const ptr_c1 = GetPointerImpl(addr_c1, [addr_c1] { - LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X}", sizeof(T) * 8, addr_c1); - }, [&] { - HandleRasterizerWrite(addr_c1, count_c1); - }); ptr_c1) { - if (auto const ptr_c2 = GetPointerImpl(addr_c2, [addr_c2] { - LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X}", sizeof(T) * 8, addr_c2); - }, [&] { - HandleRasterizerWrite(addr_c2, count_c2); - }); ptr_c2) { - std::array tmp = std::bit_cast>(data); - std::memcpy(ptr_c1, tmp.data() + 0, count_c1); - std::memcpy(ptr_c2, tmp.data() + count_c1, count_c2); - } - } - } + const u64 addr = GetInteger(vaddr); + if (auto const ptr = GetPointerImpl(addr, [addr, data]() { + LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8, addr, u64(data)); + }, [&]() { HandleRasterizerWrite(addr, sizeof(T)); }); ptr) [[likely]] + std::memcpy(ptr, &data, sizeof(T)); } template @@ -924,35 +942,35 @@ const u8* Memory::GetPointer(Common::ProcessAddress vaddr) const { } u8 Memory::Read8(const Common::ProcessAddress addr) { - return impl->Read(addr); + return impl->Read8(addr); } u16 Memory::Read16(const Common::ProcessAddress addr) { - return impl->Read(addr); + return impl->Read16(addr); } u32 Memory::Read32(const Common::ProcessAddress addr) { - return impl->Read(addr); + return impl->Read32(addr); } u64 Memory::Read64(const Common::ProcessAddress addr) { - return impl->Read(addr); + return impl->Read64(addr); } void Memory::Write8(Common::ProcessAddress addr, u8 data) { - impl->Write(addr, data); + impl->Write8(addr, data); } void Memory::Write16(Common::ProcessAddress addr, u16 data) { - impl->Write(addr, data); + impl->Write16(addr, data); } void Memory::Write32(Common::ProcessAddress addr, u32 data) { - impl->Write(addr, data); + impl->Write32(addr, data); } void Memory::Write64(Common::ProcessAddress addr, u64 data) { - impl->Write(addr, data); + impl->Write64(addr, data); } bool Memory::WriteExclusive8(Common::ProcessAddress addr, u8 data, u8 expected) { diff --git a/src/core/tools/freezer.cpp b/src/core/tools/freezer.cpp index 9d42c726e4..73a86b3c8c 100644 --- a/src/core/tools/freezer.cpp +++ b/src/core/tools/freezer.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/core_timing.h" #include "core/memory.h" diff --git a/src/dedicated_room/yuzu_room.cpp b/src/dedicated_room/yuzu_room.cpp index 126053f43f..d5b8c36141 100644 --- a/src/dedicated_room/yuzu_room.cpp +++ b/src/dedicated_room/yuzu_room.cpp @@ -28,8 +28,7 @@ #include "common/fs/file.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/backend.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scm_rev.h" #include "common/settings.h" #include "common/string_util.h" @@ -172,12 +171,6 @@ static void SaveBanList(const Network::Room::BanList& ban_list, const std::strin } } -static void InitializeLogging(const std::string& log_file) { - Common::Log::Initialize(); - Common::Log::SetColorConsoleBackendEnabled(true); - Common::Log::Start(); -} - /// Application entry point void LaunchRoom(int argc, char** argv, bool called_by_option) { @@ -225,7 +218,9 @@ void LaunchRoom(int argc, char** argv, bool called_by_option) {0, 0, 0, 0}, }; - InitializeLogging(log_file); + Common::Log::Initialize(); + Common::Log::SetColorConsoleBackendEnabled(true); + Common::Log::Start(); while (optind < argc) { int arg = getopt_long(argc, argv, "n:d:s:p:m:w:g:u:t:a:i:l:hv", long_options, &option_index); diff --git a/src/dynarmic/src/dynarmic/ir/microinstruction.h b/src/dynarmic/src/dynarmic/ir/microinstruction.h index 843b4cdf18..1700eb110b 100644 --- a/src/dynarmic/src/dynarmic/ir/microinstruction.h +++ b/src/dynarmic/src/dynarmic/ir/microinstruction.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. diff --git a/src/frontend_common/config.cpp b/src/frontend_common/config.cpp index 1648a0e538..f275727c17 100644 --- a/src/frontend_common/config.cpp +++ b/src/frontend_common/config.cpp @@ -8,7 +8,7 @@ #include #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/settings_common.h" #include "common/settings_enums.h" diff --git a/src/frontend_common/firmware_manager.cpp b/src/frontend_common/firmware_manager.cpp index 6f3f409aa8..79af202ed8 100644 --- a/src/frontend_common/firmware_manager.cpp +++ b/src/frontend_common/firmware_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include "firmware_manager.h" @@ -8,7 +8,7 @@ #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/backend.h" +#include "common/logging.h" #include "core/crypto/key_manager.h" #include "frontend_common/content_manager.h" diff --git a/src/frontend_common/mod_manager.cpp b/src/frontend_common/mod_manager.cpp index 2bf6c372d9..ddb196cf1a 100644 --- a/src/frontend_common/mod_manager.cpp +++ b/src/frontend_common/mod_manager.cpp @@ -6,7 +6,7 @@ #include #include "common/fs/fs.h" #include "common/fs/fs_types.h" -#include "common/logging/backend.h" +#include "common/logging.h" #include "frontend_common/data_manager.h" #include "mod_manager.h" diff --git a/src/frontend_common/play_time_manager.cpp b/src/frontend_common/play_time_manager.cpp index 58b320198f..3315cd713e 100644 --- a/src/frontend_common/play_time_manager.cpp +++ b/src/frontend_common/play_time_manager.cpp @@ -7,7 +7,7 @@ #include "common/fs/file.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/thread.h" #include "core/hle/service/acc/profile_manager.h" diff --git a/src/frontend_common/update_checker.cpp b/src/frontend_common/update_checker.cpp index 6b1fde720c..e14aadd757 100644 --- a/src/frontend_common/update_checker.cpp +++ b/src/frontend_common/update_checker.cpp @@ -9,7 +9,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scm_rev.h" #include "update_checker.h" diff --git a/src/hid_core/resource_manager.cpp b/src/hid_core/resource_manager.cpp index 62fec03b1a..0c10d1bec9 100644 --- a/src/hid_core/resource_manager.cpp +++ b/src/hid_core/resource_manager.cpp @@ -1,7 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/core_timing.h" #include "core/hle/service/ipc_helpers.h" diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index a0f72ab298..9355a88c4b 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -11,7 +11,7 @@ #include "common/assert.h" #include "common/bit_field.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core_timing.h" #include "core/hle/kernel/k_event.h" diff --git a/src/hid_core/resources/touch_screen/touch_screen_resource.cpp b/src/hid_core/resources/touch_screen/touch_screen_resource.cpp index 5d45f861c6..5d77fe5719 100644 --- a/src/hid_core/resources/touch_screen/touch_screen_resource.cpp +++ b/src/hid_core/resources/touch_screen/touch_screen_resource.cpp @@ -1,10 +1,10 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core_timing.h" #include "core/hle/kernel/k_event.h" #include "core/hle/kernel/k_shared_memory.h" diff --git a/src/input_common/drivers/gc_adapter.cpp b/src/input_common/drivers/gc_adapter.cpp index 690779c6aa..25df839aa0 100644 --- a/src/input_common/drivers/gc_adapter.cpp +++ b/src/input_common/drivers/gc_adapter.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/param_package.h" #include "common/polyfill_thread.h" #include "common/settings_input.h" diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index 81b0a2313a..948f650fb1 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -3,7 +3,7 @@ // SPDX-FileCopyrightText: 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "common/math_util.h" #include "common/param_package.h" #include "common/settings.h" diff --git a/src/input_common/drivers/tas_input.cpp b/src/input_common/drivers/tas_input.cpp index 5a7f858f16..32febc0839 100644 --- a/src/input_common/drivers/tas_input.cpp +++ b/src/input_common/drivers/tas_input.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,7 +11,7 @@ #include "common/fs/file.h" #include "common/fs/fs_types.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "input_common/drivers/tas_input.h" diff --git a/src/input_common/drivers/udp_client.cpp b/src/input_common/drivers/udp_client.cpp index 9e29d56cba..c930e19de3 100644 --- a/src/input_common/drivers/udp_client.cpp +++ b/src/input_common/drivers/udp_client.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2018 Citra Emulator Project @@ -9,7 +9,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/param_package.h" #include "common/settings.h" #include "input_common/drivers/udp_client.h" diff --git a/src/input_common/drivers/virtual_amiibo.cpp b/src/input_common/drivers/virtual_amiibo.cpp index a30b10b7b3..ccb740d158 100644 --- a/src/input_common/drivers/virtual_amiibo.cpp +++ b/src/input_common/drivers/virtual_amiibo.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -7,7 +10,7 @@ #include "common/fs/file.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "input_common/drivers/virtual_amiibo.h" diff --git a/src/input_common/helpers/joycon_driver.cpp b/src/input_common/helpers/joycon_driver.cpp index 0dd1c958a2..78df802b73 100644 --- a/src/input_common/helpers/joycon_driver.cpp +++ b/src/input_common/helpers/joycon_driver.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/input.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "common/swap.h" #include "common/thread.h" diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.cpp b/src/input_common/helpers/joycon_protocol/common_protocol.cpp index a6eecf9802..e825afa1b7 100644 --- a/src/input_common/helpers/joycon_protocol/common_protocol.cpp +++ b/src/input_common/helpers/joycon_protocol/common_protocol.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/input.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "input_common/helpers/joycon_protocol/common_protocol.h" namespace InputCommon::Joycon { diff --git a/src/input_common/helpers/joycon_protocol/generic_functions.cpp b/src/input_common/helpers/joycon_protocol/generic_functions.cpp index e9a056448c..623a7ac5c9 100644 --- a/src/input_common/helpers/joycon_protocol/generic_functions.cpp +++ b/src/input_common/helpers/joycon_protocol/generic_functions.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/input.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "input_common/helpers/joycon_protocol/generic_functions.h" namespace InputCommon::Joycon { diff --git a/src/input_common/helpers/joycon_protocol/irs.cpp b/src/input_common/helpers/joycon_protocol/irs.cpp index 5bf72114da..3f09d75338 100644 --- a/src/input_common/helpers/joycon_protocol/irs.cpp +++ b/src/input_common/helpers/joycon_protocol/irs.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/input.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "input_common/helpers/joycon_protocol/irs.h" namespace InputCommon::Joycon { diff --git a/src/input_common/helpers/joycon_protocol/nfc.cpp b/src/input_common/helpers/joycon_protocol/nfc.cpp index 67f789edd8..b71d0e8148 100644 --- a/src/input_common/helpers/joycon_protocol/nfc.cpp +++ b/src/input_common/helpers/joycon_protocol/nfc.cpp @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/input.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "input_common/helpers/joycon_protocol/nfc.h" namespace InputCommon::Joycon { diff --git a/src/input_common/helpers/joycon_protocol/poller.cpp b/src/input_common/helpers/joycon_protocol/poller.cpp index abb0216473..2384981f50 100644 --- a/src/input_common/helpers/joycon_protocol/poller.cpp +++ b/src/input_common/helpers/joycon_protocol/poller.cpp @@ -1,10 +1,10 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "input_common/helpers/joycon_protocol/poller.h" namespace InputCommon::Joycon { diff --git a/src/input_common/helpers/joycon_protocol/ringcon.cpp b/src/input_common/helpers/joycon_protocol/ringcon.cpp index 96414fb676..2a694a273f 100644 --- a/src/input_common/helpers/joycon_protocol/ringcon.cpp +++ b/src/input_common/helpers/joycon_protocol/ringcon.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/input.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "input_common/helpers/joycon_protocol/ringcon.h" namespace InputCommon::Joycon { diff --git a/src/input_common/helpers/joycon_protocol/rumble.cpp b/src/input_common/helpers/joycon_protocol/rumble.cpp index 62ad0fada0..2462167564 100644 --- a/src/input_common/helpers/joycon_protocol/rumble.cpp +++ b/src/input_common/helpers/joycon_protocol/rumble.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -8,7 +8,7 @@ #include #include "common/input.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "input_common/helpers/joycon_protocol/rumble.h" namespace InputCommon::Joycon { diff --git a/src/input_common/helpers/udp_protocol.cpp b/src/input_common/helpers/udp_protocol.cpp index e54a8fce1d..10ebf90410 100644 --- a/src/input_common/helpers/udp_protocol.cpp +++ b/src/input_common/helpers/udp_protocol.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "input_common/helpers/udp_protocol.h" namespace InputCommon::CemuhookUDP { diff --git a/src/input_common/input_engine.cpp b/src/input_common/input_engine.cpp index 1e24b588e3..ccfe3444ae 100644 --- a/src/input_common/input_engine.cpp +++ b/src/input_common/input_engine.cpp @@ -1,9 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "input_common/input_engine.h" namespace InputCommon { diff --git a/src/network/network.cpp b/src/network/network.cpp index 7d04c2241e..4946fcf3dd 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -1,10 +1,10 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "enet/enet.h" #include "network/network.h" diff --git a/src/network/room.cpp b/src/network/room.cpp index cf33763da2..7c257d2bd4 100644 --- a/src/network/room.cpp +++ b/src/network/room.cpp @@ -13,7 +13,7 @@ #include #include #include "common/polyfill_thread.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "enet/enet.h" #include "network/packet.h" #include "network/room.h" diff --git a/src/network/verify_user.h b/src/network/verify_user.h index 6fc64d8a3e..36aef5a817 100644 --- a/src/network/verify_user.h +++ b/src/network/verify_user.h @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include -#include "common/logging/log.h" +#include "common/logging.h" namespace Network::VerifyUser { diff --git a/src/qt_common/CMakeLists.txt b/src/qt_common/CMakeLists.txt index 65f5b1ee2b..904b03d288 100644 --- a/src/qt_common/CMakeLists.txt +++ b/src/qt_common/CMakeLists.txt @@ -1,6 +1,8 @@ # SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later +set(CMAKE_AUTOMOC ON) + add_library(qt_common STATIC qt_common.h qt_common.cpp @@ -26,7 +28,7 @@ add_library(qt_common STATIC util/mod.h util/mod.cpp abstract/frontend.h abstract/frontend.cpp - abstract/qt_progress_dialog.h abstract/qt_progress_dialog.cpp + abstract/progress.h abstract/progress.cpp qt_string_lookup.h qt_compat.h @@ -82,7 +84,7 @@ target_link_libraries(qt_common PRIVATE core Qt6::Core Qt6::Concurrent SimpleIni target_link_libraries(qt_common PUBLIC frozen::frozen-headers) target_link_libraries(qt_common PRIVATE gamemode::headers frontend_common) -if (NOT APPLE AND ENABLE_OPENGL) +if (ENABLE_OPENGL) target_compile_definitions(qt_common PUBLIC HAS_OPENGL) endif() @@ -93,3 +95,5 @@ if (UNIX AND NOT APPLE) target_link_libraries(qt_common PRIVATE Qt6::GuiPrivate) endif() endif() + +create_target_directory_groups(qt_common) diff --git a/src/qt_common/abstract/frontend.cpp b/src/qt_common/abstract/frontend.cpp index 620256c2d8..de362b253f 100644 --- a/src/qt_common/abstract/frontend.cpp +++ b/src/qt_common/abstract/frontend.cpp @@ -1,75 +1,27 @@ // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include #include "frontend.h" -#include "qt_common/qt_common.h" - -#ifdef YUZU_QT_WIDGETS -#include -#endif - -#include -#include namespace QtCommon::Frontend { -StandardButton ShowMessage(Icon icon, const QString& title, const QString& text, - StandardButtons buttons, QObject* parent) { -#ifdef YUZU_QT_WIDGETS - QMessageBox* box = new QMessageBox(icon, title, text, buttons, (QWidget*)parent); - return static_cast(box->exec()); -#endif - // TODO(crueter): If Qt Widgets is disabled... - // need a way to reference icon/buttons too -} - const QString GetOpenFileName(const QString& title, const QString& dir, const QString& filter, - QString* selectedFilter, Options options) { -#ifdef YUZU_QT_WIDGETS - return QFileDialog::getOpenFileName(rootObject, title, dir, filter, selectedFilter, options); -#endif + QString* selectedFilter) { + return QFileDialog::getOpenFileName(rootObject, title, dir, filter, selectedFilter); } const QStringList GetOpenFileNames(const QString& title, const QString& dir, const QString& filter, - QString* selectedFilter, Options options) { -#ifdef YUZU_QT_WIDGETS - return QFileDialog::getOpenFileNames(rootObject, title, dir, filter, selectedFilter, options); -#endif + QString* selectedFilter) { + return QFileDialog::getOpenFileNames(rootObject, title, dir, filter, selectedFilter); } const QString GetSaveFileName(const QString& title, const QString& dir, const QString& filter, - QString* selectedFilter, Options options) { -#ifdef YUZU_QT_WIDGETS - return QFileDialog::getSaveFileName(rootObject, title, dir, filter, selectedFilter, options); -#endif + QString* selectedFilter) { + return QFileDialog::getSaveFileName(rootObject, title, dir, filter, selectedFilter); } -const QString GetExistingDirectory(const QString& caption, const QString& dir, Options options) { -#ifdef YUZU_QT_WIDGETS - return QFileDialog::getExistingDirectory(rootObject, caption, dir, options); -#endif -} - -int Choice(const QString& title, const QString& caption, const QStringList& options) { - QMessageBox box(rootObject); - box.setText(caption); - box.setWindowTitle(title); - - for (const QString& opt : options) { - box.addButton(opt, QMessageBox::AcceptRole); - } - - box.addButton(QMessageBox::Cancel); - - box.exec(); - auto button = box.clickedButton(); - return options.indexOf(button->text()); -} - -const QString GetTextInput(const QString& title, const QString& caption, - const QString& defaultText) { - return QInputDialog::getText(rootObject, title, caption, QLineEdit::Normal, defaultText); +const QString GetExistingDirectory(const QString& caption, const QString& dir) { + return QFileDialog::getExistingDirectory(rootObject, caption, dir); } } // namespace QtCommon::Frontend diff --git a/src/qt_common/abstract/frontend.h b/src/qt_common/abstract/frontend.h index 40ef80cbb7..9b70f6849e 100644 --- a/src/qt_common/abstract/frontend.h +++ b/src/qt_common/abstract/frontend.h @@ -7,11 +7,7 @@ #include #include "qt_common/qt_common.h" -#ifdef YUZU_QT_WIDGETS #include -#include -#include -#endif /** * manages common functionality e.g. message boxes and such for Qt/QML @@ -20,60 +16,39 @@ namespace QtCommon::Frontend { Q_NAMESPACE -#ifdef YUZU_QT_WIDGETS -using Options = QFileDialog::Options; -using Option = QFileDialog::Option; - -using StandardButton = QMessageBox::StandardButton; -using StandardButtons = QMessageBox::StandardButtons; - -using Icon = QMessageBox::Icon; -#else -enum Option { - ShowDirsOnly = 0x00000001, - DontResolveSymlinks = 0x00000002, - DontConfirmOverwrite = 0x00000004, - DontUseNativeDialog = 0x00000008, - ReadOnly = 0x00000010, - HideNameFilterDetails = 0x00000020, - DontUseCustomDirectoryIcons = 0x00000040 -}; -Q_ENUM_NS(Option) -Q_DECLARE_FLAGS(Options, Option) -Q_FLAG_NS(Options) - enum StandardButton { - // keep this in sync with QDialogButtonBox::StandardButton and QPlatformDialogHelper::StandardButton - NoButton = 0x00000000, - Ok = 0x00000400, - Save = 0x00000800, - SaveAll = 0x00001000, - Open = 0x00002000, - Yes = 0x00004000, - YesToAll = 0x00008000, - No = 0x00010000, - NoToAll = 0x00020000, - Abort = 0x00040000, - Retry = 0x00080000, - Ignore = 0x00100000, - Close = 0x00200000, - Cancel = 0x00400000, - Discard = 0x00800000, - Help = 0x01000000, - Apply = 0x02000000, - Reset = 0x04000000, - RestoreDefaults = 0x08000000, + // keep this in sync with QDialogButtonBox::StandardButton and + // QPlatformDialogHelper::StandardButton + NoButton = 0x00000000, + Ok = 0x00000400, + Save = 0x00000800, + SaveAll = 0x00001000, + Open = 0x00002000, + Yes = 0x00004000, + YesToAll = 0x00008000, + No = 0x00010000, + NoToAll = 0x00020000, + Abort = 0x00040000, + Retry = 0x00080000, + Ignore = 0x00100000, + Close = 0x00200000, + Cancel = 0x00400000, + Discard = 0x00800000, + Help = 0x01000000, + Apply = 0x02000000, + Reset = 0x04000000, + RestoreDefaults = 0x08000000, - FirstButton = Ok, // internal - LastButton = RestoreDefaults, // internal + FirstButton = Ok, // internal + LastButton = RestoreDefaults, // internal - YesAll = YesToAll, // obsolete - NoAll = NoToAll, // obsolete + YesAll = YesToAll, // obsolete + NoAll = NoToAll, // obsolete - Default = 0x00000100, // obsolete - Escape = 0x00000200, // obsolete - FlagMask = 0x00000300, // obsolete - ButtonMask = ~FlagMask // obsolete + Default = 0x00000100, // obsolete + Escape = 0x00000200, // obsolete + FlagMask = 0x00000300, // obsolete + ButtonMask = ~FlagMask // obsolete }; Q_ENUM_NS(StandardButton) @@ -83,7 +58,7 @@ typedef StandardButton Button; Q_DECLARE_FLAGS(StandardButtons, StandardButton) Q_FLAG_NS(StandardButtons) -enum Icon { +enum class Icon { // keep this in sync with QMessageDialogOptions::StandardIcon NoIcon = 0, Information = 1, @@ -93,29 +68,26 @@ enum Icon { }; Q_ENUM_NS(Icon) -#endif - -// TODO(crueter) widgets-less impl, choices et al. -StandardButton ShowMessage(Icon icon, - const QString &title, - const QString &text, +StandardButton ShowMessage(Icon icon, const QString& title, const QString& text, StandardButtons buttons = StandardButton::NoButton, - QObject *parent = nullptr); + QObject* parent = nullptr); -#define UTIL_OVERRIDES(level) \ - inline StandardButton level(QObject *parent, \ - const QString &title, \ - const QString &text, \ - StandardButtons buttons = StandardButton::Ok) \ - { \ - return ShowMessage(Icon::level, title, text, buttons, parent); \ - } \ - inline StandardButton level(const QString title, \ - const QString &text, \ - StandardButtons buttons \ - = StandardButton::Ok) \ - { \ - return ShowMessage(Icon::level, title, text, buttons, rootObject); \ +#define UTIL_OVERRIDES(level) \ + inline StandardButton level(QObject* parent, const QString& title, const QString& text, \ + StandardButtons buttons) { \ + return ShowMessage(Icon::level, title, text, buttons, parent); \ + } \ + inline StandardButton level(QObject* parent, const QString& title, const QString& text, \ + int buttons = StandardButton::Ok) { \ + return ShowMessage(Icon::level, title, text, StandardButtons(buttons), parent); \ + } \ + inline StandardButton level(const QString title, const QString& text, \ + StandardButtons buttons) { \ + return ShowMessage(Icon::level, title, text, buttons, rootObject); \ + } \ + inline StandardButton level(const QString& title, const QString& text, \ + int buttons = StandardButton::Ok) { \ + return ShowMessage(Icon::level, title, text, StandardButtons(buttons), rootObject); \ } UTIL_OVERRIDES(Information) @@ -123,27 +95,17 @@ UTIL_OVERRIDES(Warning) UTIL_OVERRIDES(Critical) UTIL_OVERRIDES(Question) -const QString GetOpenFileName(const QString &title, - const QString &dir, - const QString &filter, - QString *selectedFilter = nullptr, - Options options = Options()); +const QString GetOpenFileName(const QString& title, const QString& dir, const QString& filter, + QString* selectedFilter = nullptr); -const QStringList GetOpenFileNames(const QString &title, - const QString &dir, - const QString &filter, - QString *selectedFilter = nullptr, - Options options = Options()); +const QStringList GetOpenFileNames(const QString& title, const QString& dir, const QString& filter, + QString* selectedFilter = nullptr); -const QString GetSaveFileName(const QString &title, - const QString &dir, - const QString &filter, - QString *selectedFilter = nullptr, - Options options = Options()); +const QString GetSaveFileName(const QString& title, const QString& dir, const QString& filter, + QString* selectedFilter = nullptr); -const QString GetExistingDirectory(const QString &caption = QString(), - const QString &dir = QString(), - Options options = Option::ShowDirsOnly); +const QString GetExistingDirectory(const QString& caption = QString(), + const QString& dir = QString()); int Choice(const QString& title = QString(), const QString& caption = QString(), const QStringList& options = {}); diff --git a/src/qt_common/abstract/progress.cpp b/src/qt_common/abstract/progress.cpp new file mode 100644 index 0000000000..2141e41d44 --- /dev/null +++ b/src/qt_common/abstract/progress.cpp @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "progress.h" + +namespace QtCommon::Frontend { + +QtProgressDialog::QtProgressDialog(const QString&, const QString&, int, int, QObject* parent, + Qt::WindowFlags) + : QObject(parent) {} + +} // namespace QtCommon::Frontend diff --git a/src/qt_common/abstract/progress.h b/src/qt_common/abstract/progress.h new file mode 100644 index 0000000000..b6f2975c1e --- /dev/null +++ b/src/qt_common/abstract/progress.h @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include + +namespace QtCommon::Frontend { + +class QtProgressDialog : public QObject { + Q_OBJECT +public: + QtProgressDialog(const QString& labelText, const QString& cancelButtonText, int minimum, + int maximum, QObject* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); + + virtual ~QtProgressDialog() = default; + + virtual bool wasCanceled() const = 0; + virtual void setWindowModality(Qt::WindowModality modality) = 0; + virtual void setMinimumDuration(int durationMs) = 0; + virtual void setAutoClose(bool autoClose) = 0; + virtual void setAutoReset(bool autoReset) = 0; + +public slots: + virtual void setTitle(QString title) = 0; + virtual void setLabelText(QString text) = 0; + virtual void setMinimum(int min) = 0; + virtual void setMaximum(int max) = 0; + virtual void setValue(int value) = 0; + + virtual bool close() = 0; + virtual void show() = 0; +}; + +std::unique_ptr newProgressDialog(const QString& labelText, + const QString& cancelButtonText, int minimum, + int maximum, + Qt::WindowFlags f = Qt::WindowFlags()); + +QtProgressDialog* newProgressDialogPtr(const QString& labelText, const QString& cancelButtonText, + int minimum, int maximum, + Qt::WindowFlags f = Qt::WindowFlags()); + +} // namespace QtCommon::Frontend diff --git a/src/qt_common/abstract/qt_progress_dialog.cpp b/src/qt_common/abstract/qt_progress_dialog.cpp deleted file mode 100644 index b4bf74c8bd..0000000000 --- a/src/qt_common/abstract/qt_progress_dialog.cpp +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "qt_progress_dialog.h" diff --git a/src/qt_common/abstract/qt_progress_dialog.h b/src/qt_common/abstract/qt_progress_dialog.h deleted file mode 100644 index 17f6817ffa..0000000000 --- a/src/qt_common/abstract/qt_progress_dialog.h +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef QT_PROGRESS_DIALOG_H -#define QT_PROGRESS_DIALOG_H - -#include - -#ifdef YUZU_QT_WIDGETS -#include -#endif - -namespace QtCommon::Frontend { -#ifdef YUZU_QT_WIDGETS - -using QtProgressDialog = QProgressDialog; - -// TODO(crueter): QML impl -#else -class QtProgressDialog -{ -public: - QtProgressDialog(const QString &labelText, - const QString &cancelButtonText, - int minimum, - int maximum, - QObject *parent = nullptr, - Qt::WindowFlags f = Qt::WindowFlags()); - - bool wasCanceled() const; - void setWindowModality(Qt::WindowModality modality); - void setMinimumDuration(int durationMs); - void setAutoClose(bool autoClose); - void setAutoReset(bool autoReset); - -public slots: - void setLabelText(QString &text); - void setRange(int min, int max); - void setValue(int progress); - bool close(); - - void show(); -}; -#endif // YUZU_QT_WIDGETS - -} -#endif // QT_PROGRESS_DIALOG_H diff --git a/src/qt_common/config/qt_config.cpp b/src/qt_common/config/qt_config.cpp index c5a8f62745..94a5cd5443 100644 --- a/src/qt_common/config/qt_config.cpp +++ b/src/qt_common/config/qt_config.cpp @@ -4,7 +4,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "input_common/main.h" #include "qt_config.h" #include "uisettings.h" @@ -319,7 +319,7 @@ void QtConfig::ReadUIGamelistValues() { } void QtConfig::ReadUILayoutValues() { - BeginGroup(Settings::TranslateCategory(Settings::Category::UiGameList)); + BeginGroup(Settings::TranslateCategory(Settings::Category::UiLayout)); ReadCategory(Settings::Category::UiLayout); @@ -578,10 +578,10 @@ void QtConfig::SaveMultiplayerValues() { } std::vector& QtConfig::FindRelevantList(Settings::Category category) { - auto& map = Settings::values.linkage.by_category; - if (map.contains(category)) { - return Settings::values.linkage.by_category[category]; - } + auto& list = Settings::values.linkage.by_category[category]; + if (!list.empty()) + return list; + return UISettings::values.linkage.by_category[category]; } diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index d1ed32134c..a0c4779b73 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -9,24 +9,23 @@ #include "shared_translation.h" +#include +#include +#include #include #include "common/settings.h" #include "common/settings_enums.h" #include "common/settings_setting.h" #include "common/time_zone.h" #include "qt_common/config/uisettings.h" -#include -#include -#include namespace ConfigurationShared { -std::unique_ptr InitializeTranslations(QObject* parent) -{ +std::unique_ptr InitializeTranslations(QObject* parent) { std::unique_ptr translations = std::make_unique(); const auto& tr = [parent](const char* text) -> QString { return parent->tr(text); }; -#define INSERT(SETTINGS, ID, NAME, TOOLTIP) \ +#define INSERT(SETTINGS, ID, NAME, TOOLTIP) \ translations->insert(std::pair{SETTINGS::values.ID.Id(), std::pair{(NAME), (TOOLTIP)}}) // A setting can be ignored by giving it a blank name @@ -47,10 +46,9 @@ std::unique_ptr InitializeTranslations(QObject* parent) INSERT(Settings, login_share_applet_mode, tr("Login share"), QString()); INSERT(Settings, wifi_web_auth_applet_mode, tr("Wifi web auth"), QString()); INSERT(Settings, my_page_applet_mode, tr("My page"), QString()); - INSERT(Settings, - enable_overlay, - tr("Enable Overlay Applet"), - tr("Enables Horizon\'s built-in overlay applet. Press and hold the home button for 1 second to show it.")); + INSERT(Settings, enable_overlay, tr("Enable Overlay Applet"), + tr("Enables Horizon\'s built-in overlay applet. Press and hold the home button for 1 " + "second to show it.")); // Audio INSERT(Settings, sink_id, tr("Output Engine:"), QString()); @@ -62,23 +60,16 @@ std::unique_ptr InitializeTranslations(QObject* parent) INSERT(UISettings, mute_when_in_background, tr("Mute audio when in background"), QString()); // Core - INSERT( - Settings, - use_multi_core, - tr("Multicore CPU Emulation"), - tr("This option increases CPU emulation thread use from 1 to the maximum of 4.\n" - "This is mainly a debug option and shouldn't be disabled.")); - INSERT( - Settings, - memory_layout_mode, - tr("Memory Layout"), - tr("Increases the amount of emulated RAM.\nDoesn't affect performance/stability but may allow HD texture " - "mods to load.")); + INSERT(Settings, use_multi_core, tr("Multicore CPU Emulation"), + tr("This option increases CPU emulation thread use from 1 to the maximum of 4.\n" + "This is mainly a debug option and shouldn't be disabled.")); + INSERT(Settings, memory_layout_mode, tr("Memory Layout"), + tr("Increases the amount of emulated RAM.\nDoesn't affect performance/stability but may " + "allow HD texture " + "mods to load.")); INSERT(Settings, use_speed_limit, QString(), QString()); INSERT(Settings, current_speed_mode, QString(), QString()); - INSERT(Settings, - speed_limit, - tr("Limit Speed Percent"), + INSERT(Settings, speed_limit, tr("Limit Speed Percent"), tr("Controls the game's maximum rendering speed, but it's up to each game if it runs " "faster or not.\n200% for a 30 FPS game is 60 FPS, and for a " "60 FPS game it will be 120 FPS.\nDisabling it means unlocking the framerate to the " @@ -91,171 +82,128 @@ std::unique_ptr InitializeTranslations(QObject* parent) tr("When the Slow Speed hotkey is pressed, the speed will be limited to this " "percentage.")); - INSERT(Settings, - sync_core_speed, - tr("Synchronize Core Speed"), + INSERT(Settings, sync_core_speed, tr("Synchronize Core Speed"), tr("Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS " "without affecting game speed (animations, physics, etc.).\n" "Can help reduce stuttering at lower framerates.")); // Cpu - INSERT(Settings, - cpu_accuracy, - tr("Accuracy:"), + INSERT(Settings, cpu_accuracy, tr("Accuracy:"), tr("Change the accuracy of the emulated CPU (for debugging only).")); INSERT(Settings, cpu_backend, tr("Backend:"), QString()); - INSERT(Settings, - fast_cpu_time, - tr("CPU Overclock"), - tr("Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see reduced performance, " - "and certain games may behave improperly.\nUse Boost (1700MHz) to run at the Switch's highest native " + INSERT(Settings, fast_cpu_time, tr("CPU Overclock"), + tr("Overclocks the emulated CPU to remove some FPS limiters. Weaker CPUs may see " + "reduced performance, " + "and certain games may behave improperly.\nUse Boost (1700MHz) to run at the " + "Switch's highest native " "clock, or Fast (2000MHz) to run at 2x clock.")); INSERT(Settings, use_custom_cpu_ticks, QString(), QString()); - INSERT(Settings, - cpu_ticks, - tr("Custom CPU Ticks"), + INSERT(Settings, cpu_ticks, tr("Custom CPU Ticks"), tr("Set a custom value of CPU ticks. Higher values can increase performance, but may " "cause deadlocks. A range of 77-21000 is recommended.")); INSERT(Settings, cpu_backend, tr("Backend:"), QString()); - INSERT(Settings, vtable_bouncing, - tr("Virtual Table Bouncing"), - tr("Bounces (by emulating a 0-valued return) any functions that triggers a prefetch abort")); + INSERT(Settings, vtable_bouncing, tr("Virtual Table Bouncing"), + tr("Bounces (by emulating a 0-valued return) any functions that triggers a prefetch " + "abort")); // Cpu Debug // Cpu Unsafe - INSERT(Settings, cpuopt_unsafe_host_mmu, tr("Enable Host MMU Emulation (fastmem)"), - tr("This optimization speeds up memory accesses by the guest program.\nEnabling it causes guest memory reads/writes to be done directly into memory and make use of Host's MMU.\nDisabling this forces all memory accesses to use Software MMU Emulation.")); INSERT( - Settings, - cpuopt_unsafe_unfuse_fma, + Settings, cpuopt_unsafe_host_mmu, tr("Enable Host MMU Emulation (fastmem)"), + tr("This optimization speeds up memory accesses by the guest program.\nEnabling it causes " + "guest memory reads/writes to be done directly into memory and make use of Host's " + "MMU.\nDisabling this forces all memory accesses to use Software MMU Emulation.")); + INSERT( + Settings, cpuopt_unsafe_unfuse_fma, tr("Unfuse FMA (improve performance on CPUs without FMA)"), tr("This option improves speed by reducing accuracy of fused-multiply-add instructions on " "CPUs without native FMA support.")); INSERT( - Settings, - cpuopt_unsafe_reduce_fp_error, - tr("Faster FRSQRTE and FRECPE"), + Settings, cpuopt_unsafe_reduce_fp_error, tr("Faster FRSQRTE and FRECPE"), tr("This option improves the speed of some approximate floating-point functions by using " "less accurate native approximations.")); - INSERT(Settings, - cpuopt_unsafe_ignore_standard_fpcr, + INSERT(Settings, cpuopt_unsafe_ignore_standard_fpcr, tr("Faster ASIMD instructions (32 bits only)"), tr("This option improves the speed of 32 bits ASIMD floating-point functions by running " "with incorrect rounding modes.")); - INSERT(Settings, - cpuopt_unsafe_inaccurate_nan, - tr("Inaccurate NaN handling"), + INSERT(Settings, cpuopt_unsafe_inaccurate_nan, tr("Inaccurate NaN handling"), tr("This option improves speed by removing NaN checking.\nPlease note this also reduces " "accuracy of certain floating-point instructions.")); - INSERT(Settings, - cpuopt_unsafe_fastmem_check, - tr("Disable address space checks"), + INSERT(Settings, cpuopt_unsafe_fastmem_check, tr("Disable address space checks"), tr("This option improves speed by eliminating a safety check before every memory " "operation.\nDisabling it may allow arbitrary code execution.")); INSERT( - Settings, - cpuopt_unsafe_ignore_global_monitor, - tr("Ignore global monitor"), + Settings, cpuopt_unsafe_ignore_global_monitor, tr("Ignore global monitor"), tr("This option improves speed by relying only on the semantics of cmpxchg to ensure " "safety of exclusive access instructions.\nPlease note this may result in deadlocks and " "other race conditions.")); // Renderer - INSERT( - Settings, - renderer_backend, - tr("API:"), - tr("Changes the output graphics API.\nVulkan is recommended.")); - INSERT(Settings, - vulkan_device, - tr("Device:"), + INSERT(Settings, renderer_backend, tr("API:"), + tr("Changes the output graphics API.\nVulkan is recommended.")); + INSERT(Settings, vulkan_device, tr("Device:"), tr("This setting selects the GPU to use (Vulkan only).")); - INSERT(Settings, - resolution_setup, - tr("Resolution:"), + INSERT(Settings, resolution_setup, tr("Resolution:"), tr("Forces to render at a different resolution.\n" "Higher resolutions require more VRAM and bandwidth.\n" "Options lower than 1X can cause artifacts.")); INSERT(Settings, scaling_filter, tr("Window Adapting Filter:"), QString()); - INSERT(Settings, - fsr_sharpening_slider, - tr("FSR Sharpness:"), + INSERT(Settings, fsr_sharpening_slider, tr("FSR Sharpness:"), tr("Determines how sharpened the image will look using FSR's dynamic contrast.")); - INSERT(Settings, - anti_aliasing, - tr("Anti-Aliasing Method:"), + INSERT(Settings, anti_aliasing, tr("Anti-Aliasing Method:"), tr("The anti-aliasing method to use.\nSMAA offers the best quality.\nFXAA " "can produce a more stable picture in lower resolutions.")); - INSERT(Settings, - fullscreen_mode, - tr("Fullscreen Mode:"), + INSERT(Settings, fullscreen_mode, tr("Fullscreen Mode:"), tr("The method used to render the window in fullscreen.\nBorderless offers the best " "compatibility with the on-screen keyboard that some games request for " "input.\nExclusive " "fullscreen may offer better performance and better Freesync/Gsync support.")); - INSERT(Settings, - aspect_ratio, - tr("Aspect Ratio:"), + INSERT(Settings, aspect_ratio, tr("Aspect Ratio:"), tr("Stretches the renderer to fit the specified aspect ratio.\nMost games only support " "16:9, so modifications are required to get other ratios.\nAlso controls the " "aspect ratio of captured screenshots.")); - INSERT(Settings, - use_disk_shader_cache, - tr("Use persistent pipeline cache"), + INSERT(Settings, use_disk_shader_cache, tr("Use persistent pipeline cache"), tr("Allows saving shaders to storage for faster loading on following game " "boots.\nDisabling it is only intended for debugging.")); - INSERT(Settings, - optimize_spirv_output, - tr("Optimize SPIRV output"), + INSERT(Settings, optimize_spirv_output, tr("Optimize SPIRV output"), tr("Runs an additional optimization pass over generated SPIRV shaders.\n" "Will increase time required for shader compilation.\nMay slightly improve " "performance.\nThis feature is experimental.")); - INSERT(Settings, - nvdec_emulation, - tr("NVDEC emulation:"), + INSERT(Settings, nvdec_emulation, tr("NVDEC emulation:"), tr("Specifies how videos should be decoded.\nIt can either use the CPU or the GPU for " "decoding, or perform no decoding at all (black screen on videos).\n" "In most cases, GPU decoding provides the best performance.")); - INSERT(Settings, - accelerate_astc, - tr("ASTC Decoding Method:"), + INSERT(Settings, accelerate_astc, tr("ASTC Decoding Method:"), tr("This option controls how ASTC textures should be decoded.\n" "CPU: Use the CPU for decoding.\n" "GPU: Use the GPU's compute shaders to decode ASTC textures (recommended).\n" "CPU Asynchronously: Use the CPU to decode ASTC textures on demand. Eliminates" "ASTC decoding\nstuttering but may present artifacts.")); - INSERT( - Settings, - astc_recompression, - tr("ASTC Recompression Method:"), - tr("Most GPUs lack support for ASTC textures and must decompress to an" - "intermediate format: RGBA8.\n" - "BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format,\n" - " saving VRAM but degrading image quality.")); + INSERT(Settings, astc_recompression, tr("ASTC Recompression Method:"), + tr("Most GPUs lack support for ASTC textures and must decompress to an" + "intermediate format: RGBA8.\n" + "BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format,\n" + " saving VRAM but degrading image quality.")); INSERT(Settings, frame_pacing_mode, tr("Frame Pacing Mode (Vulkan only)"), - tr("Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent.")); - INSERT(Settings, - vram_usage_mode, - tr("VRAM Usage Mode:"), - tr("Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance.\nAggressive mode may impact performance of other applications such as recording software.")); - INSERT(Settings, - skip_cpu_inner_invalidation, - tr("Skip CPU Inner Invalidation"), + tr("Controls how the emulator manages frame pacing to reduce stuttering and make the " + "frame rate smoother and more consistent.")); + INSERT(Settings, vram_usage_mode, tr("VRAM Usage Mode:"), + tr("Selects whether the emulator should prefer to conserve memory or make maximum usage " + "of available video memory for performance.\nAggressive mode may impact performance " + "of other applications such as recording software.")); + INSERT(Settings, skip_cpu_inner_invalidation, tr("Skip CPU Inner Invalidation"), tr("Skips certain cache invalidations during memory updates, reducing CPU usage and " "improving latency. This may cause soft-crashes.")); - INSERT( - Settings, - vsync_mode, - tr("VSync Mode:"), - tr("FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen " - "refresh rate.\nFIFO Relaxed allows tearing as it recovers from a slow down.\n" - "Mailbox can have lower latency than FIFO and does not tear but may drop " - "frames.\nImmediate (no synchronization) presents whatever is available and can " - "exhibit tearing.")); + INSERT(Settings, vsync_mode, tr("VSync Mode:"), + tr("FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen " + "refresh rate.\nFIFO Relaxed allows tearing as it recovers from a slow down.\n" + "Mailbox can have lower latency than FIFO and does not tear but may drop " + "frames.\nImmediate (no synchronization) presents whatever is available and can " + "exhibit tearing.")); INSERT(Settings, bg_red, QString(), QString()); INSERT(Settings, bg_green, QString(), QString()); INSERT(Settings, bg_blue, QString(), QString()); @@ -264,103 +212,74 @@ std::unique_ptr InitializeTranslations(QObject* parent) INSERT(Settings, use_asynchronous_gpu_emulation, QString(), QString()); INSERT(Settings, sync_memory_operations, tr("Sync Memory Operations"), - tr("Ensures data consistency between compute and memory operations.\nThis option fixes issues in games, but may degrade performance.\nUnreal Engine 4 games often see the most significant changes thereof.")); - INSERT(Settings, - async_presentation, - tr("Enable asynchronous presentation (Vulkan only)"), + tr("Ensures data consistency between compute and memory operations.\nThis option fixes " + "issues in games, but may degrade performance.\nUnreal Engine 4 games often see the " + "most significant changes thereof.")); + INSERT(Settings, async_presentation, tr("Enable asynchronous presentation (Vulkan only)"), tr("Slightly improves performance by moving presentation to a separate CPU thread.")); INSERT( - Settings, - renderer_force_max_clock, - tr("Force maximum clocks (Vulkan only)"), + Settings, renderer_force_max_clock, tr("Force maximum clocks (Vulkan only)"), tr("Runs work in the background while waiting for graphics commands to keep the GPU from " "lowering its clock speed.")); - INSERT(Settings, - max_anisotropy, - tr("Anisotropic Filtering:"), - tr("Controls the quality of texture rendering at oblique angles.\nSafe to set at 16x on most GPUs.")); - INSERT(Settings, - gpu_accuracy, - tr("GPU Mode:"), - tr("Controls the GPU emulation mode.\nMost games render fine with Fast or Balanced modes, but Accurate is still " + INSERT(Settings, max_anisotropy, tr("Anisotropic Filtering:"), + tr("Controls the quality of texture rendering at oblique angles.\nSafe to set at 16x on " + "most GPUs.")); + INSERT(Settings, gpu_accuracy, tr("GPU Mode:"), + tr("Controls the GPU emulation mode.\nMost games render fine with Fast or Balanced " + "modes, but Accurate is still " "required for some.\nParticles tend to only render correctly with Accurate mode.")); - INSERT(Settings, - dma_accuracy, - tr("DMA Accuracy:"), - tr("Controls the DMA precision accuracy. Safe precision fixes issues in some games but may degrade performance.")); - INSERT(Settings, - use_asynchronous_shaders, - tr("Enable asynchronous shader compilation"), + INSERT(Settings, dma_accuracy, tr("DMA Accuracy:"), + tr("Controls the DMA precision accuracy. Safe precision fixes issues in some games but " + "may degrade performance.")); + INSERT(Settings, use_asynchronous_shaders, tr("Enable asynchronous shader compilation"), tr("May reduce shader stutter.")); - INSERT(Settings, - fast_gpu_time, - tr("Fast GPU Time"), + INSERT(Settings, fast_gpu_time, tr("Fast GPU Time"), tr("Overclocks the emulated GPU to increase dynamic resolution and render " "distance.\nUse 256 for maximal performance and 512 for maximal graphics fidelity.")); - INSERT(Settings, - gpu_unswizzle_enabled, - tr("GPU Unswizzle"), + INSERT(Settings, gpu_unswizzle_enabled, tr("GPU Unswizzle"), tr("Accelerates BCn 3D texture decoding using GPU compute.\n" "Disable if experiencing crashes or graphical glitches.")); - INSERT(Settings, - gpu_unswizzle_texture_size, - tr("GPU Unswizzle Max Texture Size"), + INSERT(Settings, gpu_unswizzle_texture_size, tr("GPU Unswizzle Max Texture Size"), tr("Sets the maximum size (MiB) for GPU-based texture unswizzling.\n" - "While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones.\n" + "While the GPU is faster for medium and large textures, the CPU may be more " + "efficient for very small ones.\n" "Adjust this to find the balance between GPU acceleration and CPU overhead.")); - INSERT(Settings, - gpu_unswizzle_stream_size, - tr("GPU Unswizzle Stream Size"), + INSERT(Settings, gpu_unswizzle_stream_size, tr("GPU Unswizzle Stream Size"), tr("Sets the maximum amount of texture data (in MiB) processed per frame.\n" - "Higher values can reduce stutter during texture loading but may impact frame consistency.")); - INSERT(Settings, - gpu_unswizzle_chunk_size, - tr("GPU Unswizzle Chunk Size"), + "Higher values can reduce stutter during texture loading but may impact frame " + "consistency.")); + INSERT(Settings, gpu_unswizzle_chunk_size, tr("GPU Unswizzle Chunk Size"), tr("Determines the number of depth slices processed in a single dispatch.\n" - "Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware.")); + "Increasing this can improve throughput on high-end GPUs but may cause TDR or driver " + "timeouts on weaker hardware.")); - INSERT(Settings, - use_vulkan_driver_pipeline_cache, - tr("Use Vulkan pipeline cache"), + INSERT(Settings, use_vulkan_driver_pipeline_cache, tr("Use Vulkan pipeline cache"), tr("Enables GPU vendor-specific pipeline cache.\nThis option can improve shader loading " "time significantly in cases where the Vulkan driver does not store pipeline cache " "files internally.")); + INSERT(Settings, enable_compute_pipelines, tr("Enable Compute Pipelines (Intel Vulkan Only)"), + tr("Required by some games.\nThis setting only exists for Intel " + "proprietary drivers and may crash if enabled.\nCompute pipelines are always enabled " + "on all other drivers.")); INSERT( - Settings, - enable_compute_pipelines, - tr("Enable Compute Pipelines (Intel Vulkan Only)"), - tr("Required by some games.\nThis setting only exists for Intel " - "proprietary drivers and may crash if enabled.\nCompute pipelines are always enabled " - "on all other drivers.")); - INSERT( - Settings, - use_reactive_flushing, - tr("Enable Reactive Flushing"), + Settings, use_reactive_flushing, tr("Enable Reactive Flushing"), tr("Uses reactive flushing instead of predictive flushing, allowing more accurate memory " "syncing.")); - INSERT(Settings, - use_video_framerate, - tr("Sync to framerate of video playback"), + INSERT(Settings, use_video_framerate, tr("Sync to framerate of video playback"), tr("Run the game at normal speed during video playback, even when the framerate is " "unlocked.")); - INSERT(Settings, - barrier_feedback_loops, - tr("Barrier feedback loops"), + INSERT(Settings, barrier_feedback_loops, tr("Barrier feedback loops"), tr("Improves rendering of transparency effects in specific games.")); - INSERT(Settings, - enable_buffer_history, - tr("Enable buffer history"), - tr("Enables access to previous buffer states.\nThis option may improve rendering quality and performance consistency in some games.")); - INSERT(Settings, - fix_bloom_effects, - tr("Fix bloom effects"), - tr("Removes bloom in Burnout.")); + INSERT(Settings, enable_buffer_history, tr("Enable buffer history"), + tr("Enables access to previous buffer states.\nThis option may improve rendering " + "quality and performance consistency in some games.")); + INSERT(Settings, fix_bloom_effects, tr("Fix bloom effects"), tr("Removes bloom in Burnout.")); - INSERT(Settings, - rescale_hack, - tr("Enable Legacy Rescale Pass"), - tr("May fix rescale issues in some games by relying on behavior from the previous implementation.\n" - "Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3.")); + INSERT(Settings, rescale_hack, tr("Enable Legacy Rescale Pass"), + tr("May fix rescale issues in some games by relying on behavior from the previous " + "implementation.\n" + "Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and " + "grey texture flicker on Nvidia GPUs in Luigis Mansion 3.")); // Renderer (Extensions) INSERT(Settings, dyna_state, tr("Extended Dynamic State"), @@ -368,59 +287,42 @@ std::unique_ptr InitializeTranslations(QObject* parent) "Higher states allow for more features and can increase performance, but may cause " "additional graphical issues.")); - INSERT(Settings, - vertex_input_dynamic_state, - tr("Vertex Input Dynamic State"), + INSERT(Settings, vertex_input_dynamic_state, tr("Vertex Input Dynamic State"), tr("Enables vertex input dynamic state feature for better quality and performance.")); - INSERT(Settings, - provoking_vertex, - tr("Provoking Vertex"), + INSERT(Settings, provoking_vertex, tr("Provoking Vertex"), tr("Improves lighting and vertex handling in some games.\n" "Only Vulkan 1.0+ devices support this extension.")); - INSERT(Settings, - descriptor_indexing, - tr("Descriptor Indexing"), + INSERT(Settings, descriptor_indexing, tr("Descriptor Indexing"), tr("Improves texture & buffer handling and the Maxwell translation layer.\n" "Some Vulkan 1.1+ and all 1.2+ devices support this extension.")); - INSERT(Settings, - sample_shading, - tr("Sample Shading"), - tr("Allows the fragment shader to execute per sample in a multi-sampled fragment " - "instead of once per fragment. Improves graphics quality at the cost of performance.\n" - "Higher values improve quality but degrade performance.")); + INSERT( + Settings, sample_shading, tr("Sample Shading"), + tr("Allows the fragment shader to execute per sample in a multi-sampled fragment " + "instead of once per fragment. Improves graphics quality at the cost of performance.\n" + "Higher values improve quality but degrade performance.")); // Renderer (Debug) // System - INSERT(Settings, - rng_seed, - tr("RNG Seed"), + INSERT(Settings, rng_seed, tr("RNG Seed"), tr("Controls the seed of the random number generator.\nMainly used for speedrunning.")); INSERT(Settings, rng_seed_enabled, QString(), QString()); INSERT(Settings, device_name, tr("Device Name"), tr("The name of the console.")); - INSERT(Settings, - custom_rtc, - tr("Custom RTC Date:"), + INSERT(Settings, custom_rtc, tr("Custom RTC Date:"), tr("This option allows to change the clock of the console.\n" "Can be used to manipulate time in games.")); INSERT(Settings, custom_rtc_enabled, QString(), QString()); - INSERT(Settings, - custom_rtc_offset, - QStringLiteral(" "), + INSERT(Settings, custom_rtc_offset, QStringLiteral(" "), tr("The number of seconds from the current unix time")); - INSERT(Settings, - language_index, - tr("Language:"), + INSERT(Settings, language_index, tr("Language:"), tr("This option can be overridden when region setting is auto-select")); INSERT(Settings, region_index, tr("Region:"), tr("The region of the console.")); INSERT(Settings, time_zone_index, tr("Time Zone:"), tr("The time zone of the console.")); INSERT(Settings, sound_index, tr("Sound Output Mode:"), QString()); - INSERT(Settings, - use_docked_mode, - tr("Console Mode:"), + INSERT(Settings, use_docked_mode, tr("Console Mode:"), tr("Selects if the console is in Docked or Handheld mode.\nGames will change " "their resolution, details and supported controllers and depending on this setting.\n" "Setting to Handheld can help improve performance for low end systems.")); @@ -444,31 +346,19 @@ std::unique_ptr InitializeTranslations(QObject* parent) // Ui // Ui General - INSERT(UISettings, - select_user_on_boot, - tr("Prompt for user profile on boot"), + INSERT(UISettings, select_user_on_boot, tr("Prompt for user profile on boot"), tr("Useful if multiple people use the same PC.")); - INSERT(UISettings, - pause_when_in_background, - tr("Pause when not in focus"), + INSERT(UISettings, pause_when_in_background, tr("Pause when not in focus"), tr("Pauses emulation when focusing on other windows.")); - INSERT(UISettings, - confirm_before_stopping, - tr("Confirm before stopping emulation"), + INSERT(UISettings, confirm_before_stopping, tr("Confirm before stopping emulation"), tr("Overrides prompts asking to confirm stopping the emulation.\nEnabling " "it bypasses such prompts and directly exits the emulation.")); - INSERT(UISettings, - hide_mouse, - tr("Hide mouse on inactivity"), + INSERT(UISettings, hide_mouse, tr("Hide mouse on inactivity"), tr("Hides the mouse after 2.5s of inactivity.")); - INSERT(UISettings, - controller_applet_disabled, - tr("Disable controller applet"), + INSERT(UISettings, controller_applet_disabled, tr("Disable controller applet"), tr("Forcibly disables the use of the controller applet in emulated programs.\n" - "When a program attempts to open the controller applet, it is immediately closed.")); - INSERT(UISettings, - check_for_updates, - tr("Check for updates"), + "When a program attempts to open the controller applet, it is immediately closed.")); + INSERT(UISettings, check_for_updates, tr("Check for updates"), tr("Whether or not to check for updates upon startup.")); // Linux @@ -489,9 +379,9 @@ std::unique_ptr InitializeTranslations(QObject* parent) return translations; } -std::unique_ptr ComboboxEnumeration(QObject* parent) -{ - std::unique_ptr translations = std::make_unique(); +std::unique_ptr ComboboxEnumeration(QObject* parent) { + std::unique_ptr translations = + std::make_unique(); const auto& tr = [&](const char* text, const char* context = "") { return parent->tr(text, context); }; @@ -537,15 +427,15 @@ std::unique_ptr ComboboxEnumeration(QObject* parent) PAIR(VramUsageMode, Conservative, tr("Conservative")), PAIR(VramUsageMode, Aggressive, tr("Aggressive")), }}); - translations->insert({Settings::EnumMetadata::Index(), { - PAIR(RendererBackend, Vulkan, tr("Vulkan")), + translations->insert( + {Settings::EnumMetadata::Index(), + {PAIR(RendererBackend, Vulkan, tr("Vulkan")), #ifdef HAS_OPENGL - PAIR(RendererBackend, OpenGL_GLSL, tr("OpenGL GLSL")), - PAIR(RendererBackend, OpenGL_GLASM, tr("OpenGL GLASM (Assembly Shaders, NVIDIA Only)")), - PAIR(RendererBackend, OpenGL_SPIRV, tr("OpenGL SPIR-V (Experimental, AMD/Mesa Only)")), + PAIR(RendererBackend, OpenGL_GLSL, tr("OpenGL GLSL")), + PAIR(RendererBackend, OpenGL_GLASM, tr("OpenGL GLASM (Assembly Shaders, NVIDIA Only)")), + PAIR(RendererBackend, OpenGL_SPIRV, tr("OpenGL SPIR-V (Experimental, AMD/Mesa Only)")), #endif - PAIR(RendererBackend, Null, tr("Null")) - }}); + PAIR(RendererBackend, Null, tr("Null"))}}); translations->insert({Settings::EnumMetadata::Index(), { PAIR(GpuAccuracy, Low, tr("Fast")), @@ -679,58 +569,58 @@ std::unique_ptr ComboboxEnumeration(QObject* parent) translations->insert( {Settings::EnumMetadata::Index(), { - {static_cast(Settings::TimeZone::Auto), - tr("Auto (%1)", "Auto select time zone") - .arg(QString::fromStdString( - Settings::GetTimeZoneString(Settings::TimeZone::Auto)))}, - {static_cast(Settings::TimeZone::Default), - tr("Default (%1)", "Default time zone") - .arg(QString::fromStdString(Common::TimeZone::GetDefaultTimeZone()))}, - PAIR(TimeZone, Cet, tr("CET")), - PAIR(TimeZone, Cst6Cdt, tr("CST6CDT")), - PAIR(TimeZone, Cuba, tr("Cuba")), - PAIR(TimeZone, Eet, tr("EET")), - PAIR(TimeZone, Egypt, tr("Egypt")), - PAIR(TimeZone, Eire, tr("Eire")), - PAIR(TimeZone, Est, tr("EST")), - PAIR(TimeZone, Est5Edt, tr("EST5EDT")), - PAIR(TimeZone, Gb, tr("GB")), - PAIR(TimeZone, GbEire, tr("GB-Eire")), - PAIR(TimeZone, Gmt, tr("GMT")), - PAIR(TimeZone, GmtPlusZero, tr("GMT+0")), - PAIR(TimeZone, GmtMinusZero, tr("GMT-0")), - PAIR(TimeZone, GmtZero, tr("GMT0")), - PAIR(TimeZone, Greenwich, tr("Greenwich")), - PAIR(TimeZone, Hongkong, tr("Hongkong")), - PAIR(TimeZone, Hst, tr("HST")), - PAIR(TimeZone, Iceland, tr("Iceland")), - PAIR(TimeZone, Iran, tr("Iran")), - PAIR(TimeZone, Israel, tr("Israel")), - PAIR(TimeZone, Jamaica, tr("Jamaica")), - PAIR(TimeZone, Japan, tr("Japan")), - PAIR(TimeZone, Kwajalein, tr("Kwajalein")), - PAIR(TimeZone, Libya, tr("Libya")), - PAIR(TimeZone, Met, tr("MET")), - PAIR(TimeZone, Mst, tr("MST")), - PAIR(TimeZone, Mst7Mdt, tr("MST7MDT")), - PAIR(TimeZone, Navajo, tr("Navajo")), - PAIR(TimeZone, Nz, tr("NZ")), - PAIR(TimeZone, NzChat, tr("NZ-CHAT")), - PAIR(TimeZone, Poland, tr("Poland")), - PAIR(TimeZone, Portugal, tr("Portugal")), - PAIR(TimeZone, Prc, tr("PRC")), - PAIR(TimeZone, Pst8Pdt, tr("PST8PDT")), - PAIR(TimeZone, Roc, tr("ROC")), - PAIR(TimeZone, Rok, tr("ROK")), - PAIR(TimeZone, Singapore, tr("Singapore")), - PAIR(TimeZone, Turkey, tr("Turkey")), - PAIR(TimeZone, Uct, tr("UCT")), - PAIR(TimeZone, Universal, tr("Universal")), - PAIR(TimeZone, Utc, tr("UTC")), - PAIR(TimeZone, WSu, tr("W-SU")), - PAIR(TimeZone, Wet, tr("WET")), - PAIR(TimeZone, Zulu, tr("Zulu")), - }}); + {static_cast(Settings::TimeZone::Auto), + tr("Auto (%1)", "Auto select time zone") + .arg(QString::fromStdString( + Settings::GetTimeZoneString(Settings::TimeZone::Auto)))}, + {static_cast(Settings::TimeZone::Default), + tr("Default (%1)", "Default time zone") + .arg(QString::fromStdString(Common::TimeZone::GetDefaultTimeZone()))}, + PAIR(TimeZone, Cet, tr("CET")), + PAIR(TimeZone, Cst6Cdt, tr("CST6CDT")), + PAIR(TimeZone, Cuba, tr("Cuba")), + PAIR(TimeZone, Eet, tr("EET")), + PAIR(TimeZone, Egypt, tr("Egypt")), + PAIR(TimeZone, Eire, tr("Eire")), + PAIR(TimeZone, Est, tr("EST")), + PAIR(TimeZone, Est5Edt, tr("EST5EDT")), + PAIR(TimeZone, Gb, tr("GB")), + PAIR(TimeZone, GbEire, tr("GB-Eire")), + PAIR(TimeZone, Gmt, tr("GMT")), + PAIR(TimeZone, GmtPlusZero, tr("GMT+0")), + PAIR(TimeZone, GmtMinusZero, tr("GMT-0")), + PAIR(TimeZone, GmtZero, tr("GMT0")), + PAIR(TimeZone, Greenwich, tr("Greenwich")), + PAIR(TimeZone, Hongkong, tr("Hongkong")), + PAIR(TimeZone, Hst, tr("HST")), + PAIR(TimeZone, Iceland, tr("Iceland")), + PAIR(TimeZone, Iran, tr("Iran")), + PAIR(TimeZone, Israel, tr("Israel")), + PAIR(TimeZone, Jamaica, tr("Jamaica")), + PAIR(TimeZone, Japan, tr("Japan")), + PAIR(TimeZone, Kwajalein, tr("Kwajalein")), + PAIR(TimeZone, Libya, tr("Libya")), + PAIR(TimeZone, Met, tr("MET")), + PAIR(TimeZone, Mst, tr("MST")), + PAIR(TimeZone, Mst7Mdt, tr("MST7MDT")), + PAIR(TimeZone, Navajo, tr("Navajo")), + PAIR(TimeZone, Nz, tr("NZ")), + PAIR(TimeZone, NzChat, tr("NZ-CHAT")), + PAIR(TimeZone, Poland, tr("Poland")), + PAIR(TimeZone, Portugal, tr("Portugal")), + PAIR(TimeZone, Prc, tr("PRC")), + PAIR(TimeZone, Pst8Pdt, tr("PST8PDT")), + PAIR(TimeZone, Roc, tr("ROC")), + PAIR(TimeZone, Rok, tr("ROK")), + PAIR(TimeZone, Singapore, tr("Singapore")), + PAIR(TimeZone, Turkey, tr("Turkey")), + PAIR(TimeZone, Uct, tr("UCT")), + PAIR(TimeZone, Universal, tr("Universal")), + PAIR(TimeZone, Utc, tr("UTC")), + PAIR(TimeZone, WSu, tr("W-SU")), + PAIR(TimeZone, Wet, tr("WET")), + PAIR(TimeZone, Zulu, tr("Zulu")), + }}); translations->insert({Settings::EnumMetadata::Index(), { PAIR(AudioMode, Mono, tr("Mono")), @@ -803,9 +693,9 @@ std::unique_ptr ComboboxEnumeration(QObject* parent) }}); translations->insert({Settings::EnumMetadata::Index(), - { - PAIR(GameListMode, TreeView, tr("Tree View")), - PAIR(GameListMode, GridView, tr("Grid View")), + { + PAIR(GameListMode, TreeView, tr("Tree View")), + PAIR(GameListMode, GridView, tr("Grid View")), }}); #undef PAIR diff --git a/src/qt_common/config/shared_translation.h b/src/qt_common/config/shared_translation.h index afb18ec435..6529c7bf40 100644 --- a/src/qt_common/config/shared_translation.h +++ b/src/qt_common/config/shared_translation.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 Torzu Emulator Project @@ -13,8 +13,8 @@ #include #include #include -#include #include +#include #include "common/common_types.h" #include "common/settings_enums.h" @@ -23,7 +23,7 @@ using TranslationMap = std::map>; using ComboboxTranslations = std::vector>; using ComboboxTranslationMap = std::map; -std::unique_ptr InitializeTranslations(QObject *parent); +std::unique_ptr InitializeTranslations(QObject* parent); std::unique_ptr ComboboxEnumeration(QObject* parent); @@ -39,15 +39,15 @@ static const std::map scaling_filter_texts_map {Settings::ScalingFilter::Bilinear, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Bilinear"))}, {Settings::ScalingFilter::Bicubic, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Bicubic"))}, - {Settings::ScalingFilter::ZeroTangent, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Zero-Tangent"))}, + {Settings::ScalingFilter::ZeroTangent, + QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Zero-Tangent"))}, {Settings::ScalingFilter::BSpline, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "B-Spline"))}, - {Settings::ScalingFilter::Mitchell, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Mitchell"))}, - {Settings::ScalingFilter::Spline1, - QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Spline-1"))}, + {Settings::ScalingFilter::Mitchell, + QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Mitchell"))}, + {Settings::ScalingFilter::Spline1, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Spline-1"))}, {Settings::ScalingFilter::Gaussian, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Gaussian"))}, - {Settings::ScalingFilter::Lanczos, - QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Lanczos"))}, + {Settings::ScalingFilter::Lanczos, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Lanczos"))}, {Settings::ScalingFilter::ScaleForce, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "ScaleForce"))}, {Settings::ScalingFilter::Fsr, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "FSR"))}, @@ -68,9 +68,12 @@ static const std::map gpu_accuracy_texts_map = { static const std::map renderer_backend_texts_map = { {Settings::RendererBackend::Vulkan, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Vulkan"))}, - {Settings::RendererBackend::OpenGL_GLSL, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "OpenGL GLSL"))}, - {Settings::RendererBackend::OpenGL_SPIRV, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "OpenGL SPIRV"))}, - {Settings::RendererBackend::OpenGL_GLASM, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "OpenGL GLASM"))}, + {Settings::RendererBackend::OpenGL_GLSL, + QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "OpenGL GLSL"))}, + {Settings::RendererBackend::OpenGL_SPIRV, + QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "OpenGL SPIRV"))}, + {Settings::RendererBackend::OpenGL_GLASM, + QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "OpenGL GLASM"))}, {Settings::RendererBackend::Null, QStringLiteral(QT_TRANSLATE_NOOP("MainWindow", "Null"))}, }; diff --git a/src/qt_common/config/uisettings.h b/src/qt_common/config/uisettings.h index 49205c5b84..c2a14858dd 100644 --- a/src/qt_common/config/uisettings.h +++ b/src/qt_common/config/uisettings.h @@ -145,14 +145,15 @@ struct Values { // Linux/MinGW may support (requires libdl support) SwitchableSetting enable_gamemode{linkage, #ifndef _MSC_VER - true, + true, #else - false, + false, #endif - "enable_gamemode", Category::UiGeneral}; + "enable_gamemode", Category::UiGeneral}; #ifdef __unix__ SwitchableSetting gui_force_x11{linkage, false, "gui_force_x11", Category::UiGeneral}; - Setting gui_hide_backend_warning{linkage, false, "gui_hide_backend_warning", Category::UiGeneral}; + Setting gui_hide_backend_warning{linkage, false, "gui_hide_backend_warning", + Category::UiGeneral}; #endif // Discord RPC @@ -210,7 +211,8 @@ struct Values { Setting folder_icon_size{linkage, 48, "folder_icon_size", Category::UiGameList}; Setting row_1_text_id{linkage, 3, "row_1_text_id", Category::UiGameList}; Setting row_2_text_id{linkage, 2, "row_2_text_id", Category::UiGameList}; - Setting game_list_mode{linkage, Settings::GameListMode::TreeView, "game_list_mode", Category::UiGameList}; + Setting game_list_mode{linkage, Settings::GameListMode::TreeView, + "game_list_mode", Category::UiGameList}; Setting show_game_name{linkage, true, "show_game_name", Category::UiGameList}; std::atomic_bool is_game_list_reload_pending{false}; diff --git a/src/qt_common/discord/discord_impl.cpp b/src/qt_common/discord/discord_impl.cpp index 3bf5544198..37b24cdd57 100644 --- a/src/qt_common/discord/discord_impl.cpp +++ b/src/qt_common/discord/discord_impl.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2018 Citra Emulator Project @@ -70,7 +70,9 @@ std::string DiscordImpl::GetGameString(const std::string& title) { } static constexpr char DEFAULT_DISCORD_TEXT[] = "Eden is an emulator for the Nintendo Switch"; -static constexpr char DEFAULT_DISCORD_IMAGE[] = "https://git.eden-emu.dev/eden-emu/eden/raw/branch/master/dist/qt_themes/default/icons/256x256/eden.png"; +static constexpr char DEFAULT_DISCORD_IMAGE[] = + "https://git.eden-emu.dev/eden-emu/eden/raw/branch/master/dist/qt_themes/default/icons/256x256/" + "eden.png"; void DiscordImpl::UpdateGameStatus(bool use_default) { const std::string url = use_default ? std::string{DEFAULT_DISCORD_IMAGE} : game_url; @@ -120,7 +122,9 @@ void DiscordImpl::Update() { return; } - s64 start_time = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + s64 start_time = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()) + .count(); DiscordRichPresence presence{}; presence.largeImageKey = DEFAULT_DISCORD_IMAGE; presence.largeImageText = DEFAULT_DISCORD_TEXT; diff --git a/src/qt_common/gamemode.cpp b/src/qt_common/gamemode.cpp index 6a3d870aae..b5fece244a 100644 --- a/src/qt_common/gamemode.cpp +++ b/src/qt_common/gamemode.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -9,9 +9,9 @@ #ifdef __unix__ #include #endif -#include "qt_common/gamemode.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "qt_common/config/uisettings.h" +#include "qt_common/gamemode.h" namespace Common::FeralGamemode { @@ -49,4 +49,4 @@ void Stop() noexcept { } } -} // namespace Common::Linux +} // namespace Common::FeralGamemode diff --git a/src/qt_common/gui_settings.cpp b/src/qt_common/gui_settings.cpp index 982d28bbcb..8b85fe43d6 100644 --- a/src/qt_common/gui_settings.cpp +++ b/src/qt_common/gui_settings.cpp @@ -1,16 +1,17 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "gui_settings.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" +#include "gui_settings.h" namespace FS = Common::FS; namespace GraphicsBackend { QString GuiConfigPath() { - return QString::fromStdString(FS::PathToUTF8String(FS::GetEdenPath(FS::EdenPath::ConfigDir) / "gui_config.ini")); + return QString::fromStdString( + FS::PathToUTF8String(FS::GetEdenPath(FS::EdenPath::ConfigDir) / "gui_config.ini")); } void SetForceX11(bool state) { diff --git a/src/qt_common/qt_common.cpp b/src/qt_common/qt_common.cpp index af4e4ffa61..3091171df8 100644 --- a/src/qt_common/qt_common.cpp +++ b/src/qt_common/qt_common.cpp @@ -1,21 +1,16 @@ // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "qt_common.h" #include "common/fs/fs.h" -#include "common/fs/ryujinx_compat.h" +#include "qt_common.h" #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/frontend/emu_window.h" -#include "qt_common/abstract/frontend.h" -#include "qt_common/qt_string_lookup.h" #include -#include - #include #if !defined(WIN32) && !defined(__APPLE__) @@ -27,18 +22,13 @@ namespace QtCommon { -#ifdef YUZU_QT_WIDGETS QWidget* rootObject = nullptr; -#else -QObject* rootObject = nullptr; -#endif std::unique_ptr system = nullptr; std::shared_ptr vfs = nullptr; std::unique_ptr provider = nullptr; -Core::Frontend::WindowSystemType GetWindowSystemType() -{ +Core::Frontend::WindowSystemType GetWindowSystemType() { // Determine WSI type based on Qt platform. QString platform_name = QGuiApplication::platformName(); if (platform_name == QStringLiteral("windows")) @@ -60,8 +50,7 @@ Core::Frontend::WindowSystemType GetWindowSystemType() return Core::Frontend::WindowSystemType::Windows; } // namespace Core::Frontend::WindowSystemType -Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window) -{ +Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window) { Core::Frontend::EmuWindow::WindowSystemInfo wsi; wsi.type = GetWindowSystemType(); @@ -69,8 +58,8 @@ Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window) // Our Win32 Qt external doesn't have the private API. wsi.render_surface = reinterpret_cast(window->winId()); #elif defined(__APPLE__) - id layer = reinterpret_cast( - objc_msgSend)(reinterpret_cast(window->winId()), sel_registerName("layer")); + id layer = reinterpret_cast(objc_msgSend)( + reinterpret_cast(window->winId()), sel_registerName("layer")); // In Qt 6, the layer of the NSView might be a QContainerLayer. // MoltenVK needs a CAMetalLayer. We search for it in sublayers. @@ -78,15 +67,20 @@ Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window) id metal_layer = nullptr; if (layer) { - if (reinterpret_cast(objc_msgSend)(layer, sel_registerName("isKindOfClass:"), metal_layer_class)) { + if (reinterpret_cast(objc_msgSend)( + layer, sel_registerName("isKindOfClass:"), metal_layer_class)) { metal_layer = layer; } else { - id sublayers = reinterpret_cast(objc_msgSend)(layer, sel_registerName("sublayers")); + id sublayers = reinterpret_cast(objc_msgSend)( + layer, sel_registerName("sublayers")); if (sublayers) { - unsigned long count = reinterpret_cast(objc_msgSend)(sublayers, sel_registerName("count")); + unsigned long count = reinterpret_cast(objc_msgSend)( + sublayers, sel_registerName("count")); for (unsigned long i = 0; i < count; ++i) { - id sublayer = reinterpret_cast(objc_msgSend)(sublayers, sel_registerName("objectAtIndex:"), i); - if (reinterpret_cast(objc_msgSend)(sublayer, sel_registerName("isKindOfClass:"), metal_layer_class)) { + id sublayer = reinterpret_cast(objc_msgSend)( + sublayers, sel_registerName("objectAtIndex:"), i); + if (reinterpret_cast(objc_msgSend)( + sublayer, sel_registerName("isKindOfClass:"), metal_layer_class)) { metal_layer = sublayer; break; } @@ -108,30 +102,22 @@ Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window) return wsi; } -const QString tr(const char* str) -{ +const QString tr(const char* str) { return QGuiApplication::tr(str); } -const QString tr(const std::string& str) -{ +const QString tr(const std::string& str) { return QGuiApplication::tr(str.c_str()); } -#ifdef YUZU_QT_WIDGETS -void Init(QWidget* root) -#else -void Init(QObject* root) -#endif -{ +void Init(QWidget* root) { system = std::make_unique(); rootObject = root; vfs = std::make_unique(); provider = std::make_unique(); } -std::filesystem::path GetEdenCommand() -{ +std::filesystem::path GetEdenCommand() { std::filesystem::path command; // TODO: flatpak? diff --git a/src/qt_common/qt_common.h b/src/qt_common/qt_common.h index a2700427ab..19c09ef5d0 100644 --- a/src/qt_common/qt_common.h +++ b/src/qt_common/qt_common.h @@ -1,24 +1,20 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #ifndef QT_COMMON_H #define QT_COMMON_H +#include #include +#include #include "core/core.h" #include "core/file_sys/registered_cache.h" -#include -#include #include namespace QtCommon { -#ifdef YUZU_QT_WIDGETS -extern QWidget *rootObject; -#else -extern QObject *rootObject; -#endif +extern QWidget* rootObject; extern std::unique_ptr system; extern std::shared_ptr vfs; @@ -28,16 +24,12 @@ typedef std::function QtProgressCallback; Core::Frontend::WindowSystemType GetWindowSystemType(); -Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow *window); +Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window); -#ifdef YUZU_QT_WIDGETS -void Init(QWidget *root); -#else -void Init(QObject *root); -#endif +void Init(QWidget* root); -const QString tr(const char *str); -const QString tr(const std::string &str); +const QString tr(const char* str); +const QString tr(const std::string& str); std::filesystem::path GetEdenCommand(); } // namespace QtCommon diff --git a/src/qt_common/qt_string_lookup.h b/src/qt_common/qt_string_lookup.h index 5b7dbd5f0c..daefe20a1a 100644 --- a/src/qt_common/qt_string_lookup.h +++ b/src/qt_common/qt_string_lookup.h @@ -11,8 +11,9 @@ /// Small helper to look up enums. /// res = the result code /// base = the base matching value in the StringKey table -#define LOOKUP_ENUM(res, base) QtCommon::StringLookup::Lookup( \ - QtCommon::StringLookup::StringKey((int) res + (int) QtCommon::StringLookup::base)) +#define LOOKUP_ENUM(res, base) \ + QtCommon::StringLookup::Lookup( \ + QtCommon::StringLookup::StringKey((int)res + (int)QtCommon::StringLookup::base)) namespace QtCommon::StringLookup { @@ -111,16 +112,14 @@ static const constexpr frozen::map strings = { QT_TR_NOOP("Would you like to migrate your data for use in Eden?\n" "Select the corresponding button to migrate data from that emulator.\n" "This may take a while.")}, - {MigrationTooltipClearShader, - QT_TR_NOOP("Clearing shader cache is recommended for all " - "users.\nDo not uncheck unless you know what " - "you're doing.")}, + {MigrationTooltipClearShader, QT_TR_NOOP("Clearing shader cache is recommended for all " + "users.\nDo not uncheck unless you know what " + "you're doing.")}, {MigrationTooltipKeepOld, QT_TR_NOOP("Keeps the old data directory. This is recommended if you aren't\n" "space-constrained and want to keep separate data for the old emulator.")}, - {MigrationTooltipClearOld, - QT_TR_NOOP("Deletes the old data directory.\nThis is recommended on " - "devices with space constraints.")}, + {MigrationTooltipClearOld, QT_TR_NOOP("Deletes the old data directory.\nThis is recommended on " + "devices with space constraints.")}, {MigrationTooltipLinkOld, QT_TR_NOOP("Creates a filesystem link between the old directory and Eden directory.\n" "This is recommended if you want to share data between emulators.")}, @@ -135,8 +134,7 @@ static const constexpr frozen::map strings = { {RyujinxNoSaveId, QT_TR_NOOP("Title %1 not found in Ryujinx title database.")}, }; -static inline const QString Lookup(StringKey key) -{ +static inline const QString Lookup(StringKey key) { return QObject::tr(strings.at(key).data()); } diff --git a/src/qt_common/util/applet.h b/src/qt_common/util/applet.h index 2b48d16698..f88aa066b2 100644 --- a/src/qt_common/util/applet.h +++ b/src/qt_common/util/applet.h @@ -1,11 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #ifndef QT_APPLET_UTIL_H #define QT_APPLET_UTIL_H // TODO -namespace QtCommon::Applets { - -} +namespace QtCommon::Applets {} #endif // QT_APPLET_UTIL_H diff --git a/src/qt_common/util/compress.cpp b/src/qt_common/util/compress.cpp index 94dca41151..c86e190bee 100644 --- a/src/qt_common/util/compress.cpp +++ b/src/qt_common/util/compress.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include "compress.h" @@ -10,11 +10,8 @@ /** This is a modified version of JlCompress **/ namespace QtCommon::Compress { -bool compressDir(QString fileCompressed, - QString dir, - const Options &options, - QtCommon::QtProgressCallback callback) -{ +bool compressDir(QString fileCompressed, QString dir, const Options& options, + QtCommon::QtProgressCallback callback) { // Create zip QuaZip zip(fileCompressed); QDir().mkpath(QFileInfo(fileCompressed).absolutePath()); @@ -26,8 +23,7 @@ bool compressDir(QString fileCompressed, // See how big the overall fs structure is // good approx. of total progress // TODO(crueter): QDirListing impl... or fs::recursive_dir_iterator - QDirIterator iter(dir, - QDir::NoDotAndDotDot | QDir::Hidden | QDir::Files, + QDirIterator iter(dir, QDir::NoDotAndDotDot | QDir::Hidden | QDir::Files, QDirIterator::Subdirectories); std::size_t total = 0; @@ -54,14 +50,8 @@ bool compressDir(QString fileCompressed, return true; } -bool compressSubDir(QuaZip *zip, - QString dir, - QString origDir, - const Options &options, - std::size_t total, - std::size_t &progress, - QtProgressCallback callback) -{ +bool compressSubDir(QuaZip* zip, QString dir, QString origDir, const Options& options, + std::size_t total, std::size_t& progress, QtProgressCallback callback) { // zip: object where to add the file // dir: current real directory // origDir: original real directory @@ -69,22 +59,20 @@ bool compressSubDir(QuaZip *zip, if (!zip) return false; - if (zip->getMode() != QuaZip::mdCreate && zip->getMode() != QuaZip::mdAppend - && zip->getMode() != QuaZip::mdAdd) + if (zip->getMode() != QuaZip::mdCreate && zip->getMode() != QuaZip::mdAppend && + zip->getMode() != QuaZip::mdAdd) return false; QDir directory(dir); if (!directory.exists()) return false; - QDir origDirectory(origDir); if (dir != origDir) { QuaZipFile dirZipFile(zip); std::unique_ptr qzni; - qzni = std::make_unique(origDirectory.relativeFilePath(dir) - + QLatin1String("/"), - dir); + qzni = std::make_unique( + origDirectory.relativeFilePath(dir) + QLatin1String("/"), dir); if (!dirZipFile.open(QIODevice::WriteOnly, *qzni, nullptr, 0, 0)) { return false; } @@ -92,18 +80,18 @@ bool compressSubDir(QuaZip *zip, } // For each subfolder - QFileInfoList subfiles = directory.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot - | QDir::Hidden | QDir::Dirs); - for (const auto &file : std::as_const(subfiles)) { - if (!compressSubDir( - zip, file.absoluteFilePath(), origDir, options, total, progress, callback)) { + QFileInfoList subfiles = + directory.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::Dirs); + for (const auto& file : std::as_const(subfiles)) { + if (!compressSubDir(zip, file.absoluteFilePath(), origDir, options, total, progress, + callback)) { return false; } } // For each file in directory QFileInfoList files = directory.entryInfoList(QDir::Hidden | QDir::Files); - for (const auto &file : std::as_const(files)) { + for (const auto& file : std::as_const(files)) { // If it's not a file or it's the compressed file being created if (!file.isFile() || file.absoluteFilePath() == zip->getZipName()) continue; @@ -112,7 +100,8 @@ bool compressSubDir(QuaZip *zip, QString filename = origDirectory.relativeFilePath(file.absoluteFilePath()); // Compress the file - if (!compressFile(zip, file.absoluteFilePath(), filename, options, total, progress, callback)) { + if (!compressFile(zip, file.absoluteFilePath(), filename, options, total, progress, + callback)) { return false; } } @@ -120,40 +109,26 @@ bool compressSubDir(QuaZip *zip, return true; } -bool compressFile(QuaZip *zip, - QString fileName, - QString fileDest, - const Options &options, - std::size_t total, - std::size_t &progress, - QtCommon::QtProgressCallback callback) -{ +bool compressFile(QuaZip* zip, QString fileName, QString fileDest, const Options& options, + std::size_t total, std::size_t& progress, QtCommon::QtProgressCallback callback) { // zip: object where to add the file // fileName: real file name // fileDest: file name inside the zip object if (!zip) return false; - if (zip->getMode() != QuaZip::mdCreate && zip->getMode() != QuaZip::mdAppend - && zip->getMode() != QuaZip::mdAdd) + if (zip->getMode() != QuaZip::mdCreate && zip->getMode() != QuaZip::mdAppend && + zip->getMode() != QuaZip::mdAdd) return false; QuaZipFile outFile(zip); if (options.getDateTime().isNull()) { - if (!outFile.open(QIODevice::WriteOnly, - QuaZipNewInfo(fileDest, fileName), - nullptr, - 0, - options.getCompressionMethod(), - options.getCompressionLevel())) + if (!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(fileDest, fileName), nullptr, 0, + options.getCompressionMethod(), options.getCompressionLevel())) return false; } else { - if (!outFile.open(QIODevice::WriteOnly, - QuaZipNewInfo(fileDest, fileName), - nullptr, - 0, - options.getCompressionMethod(), - options.getCompressionLevel())) + if (!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(fileDest, fileName), nullptr, 0, + options.getCompressionMethod(), options.getCompressionLevel())) return false; } @@ -171,7 +146,8 @@ bool compressFile(QuaZip *zip, if (!inFile.open(QIODevice::ReadOnly)) { return false; } - if (!copyData(inFile, outFile, total, progress, callback) || outFile.getZipError() != UNZ_OK) { + if (!copyData(inFile, outFile, total, progress, callback) || + outFile.getZipError() != UNZ_OK) { return false; } inFile.close(); @@ -181,12 +157,8 @@ bool compressFile(QuaZip *zip, return outFile.getZipError() == UNZ_OK; } -bool copyData(QIODevice &inFile, - QIODevice &outFile, - std::size_t total, - std::size_t &progress, - QtProgressCallback callback) -{ +bool copyData(QIODevice& inFile, QIODevice& outFile, std::size_t total, std::size_t& progress, + QtProgressCallback callback) { while (!inFile.atEnd()) { char buf[4096]; qint64 readLen = inFile.read(buf, 4096); @@ -203,15 +175,13 @@ bool copyData(QIODevice &inFile, return true; } -QStringList extractDir(QString fileCompressed, QString dir, QtCommon::QtProgressCallback callback) -{ +QStringList extractDir(QString fileCompressed, QString dir, QtCommon::QtProgressCallback callback) { // Open zip QuaZip zip(fileCompressed); return extractDir(zip, dir, callback); } -QStringList extractDir(QuaZip &zip, const QString &dir, QtCommon::QtProgressCallback callback) -{ +QStringList extractDir(QuaZip& zip, const QString& dir, QtCommon::QtProgressCallback callback) { if (!zip.open(QuaZip::mdUnzip)) { return QStringList(); } @@ -226,7 +196,7 @@ QStringList extractDir(QuaZip &zip, const QString &dir, QtCommon::QtProgressCall } std::size_t total = 0; - for (const QuaZipFileInfo64 &info : zip.getFileInfoList64()) { + for (const QuaZipFileInfo64& info : zip.getFileInfoList64()) { total += info.uncompressedSize; } @@ -256,13 +226,8 @@ QStringList extractDir(QuaZip &zip, const QString &dir, QtCommon::QtProgressCall return extracted; } -bool extractFile(QuaZip *zip, - QString fileName, - QString fileDest, - std::size_t total, - std::size_t &progress, - QtCommon::QtProgressCallback callback) -{ +bool extractFile(QuaZip* zip, QString fileName, QString fileDest, std::size_t total, + std::size_t& progress, QtCommon::QtProgressCallback callback) { // zip: object where to add the file // filename: real file name // fileincompress: file name of the compressed file @@ -334,8 +299,7 @@ bool extractFile(QuaZip *zip, return true; } -bool removeFile(QStringList listFile) -{ +bool removeFile(QStringList listFile) { bool ret = true; // For each file for (int i = 0; i < listFile.count(); i++) { diff --git a/src/qt_common/util/compress.h b/src/qt_common/util/compress.h index 2b3ffd1cbd..640dcad420 100644 --- a/src/qt_common/util/compress.h +++ b/src/qt_common/util/compress.h @@ -1,13 +1,13 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include #include -#include "qt_common/qt_common.h" #include #include +#include "qt_common/qt_common.h" /** This is a modified version of JlCompress **/ namespace QtCommon::Compress { @@ -15,49 +15,49 @@ namespace QtCommon::Compress { class Options { public: /** - * The enum values refer to the comments in the open function of the quazipfile.h file. - * - * The value is represented by two hexadecimal characters, - * the left character indicating the compression method, - * and the right character indicating the compression level. - * - * method == 0 indicates that the file is not compressed but rather stored as is. - * method == 8(Z_DEFLATED) indicates that zlib compression is used. - * - * A higher value of level indicates a smaller size of the compressed file, - * although it also implies more time consumed during the compression process. - */ - enum CompressionStrategy - { + * The enum values refer to the comments in the open function of the quazipfile.h file. + * + * The value is represented by two hexadecimal characters, + * the left character indicating the compression method, + * and the right character indicating the compression level. + * + * method == 0 indicates that the file is not compressed but rather stored as is. + * method == 8(Z_DEFLATED) indicates that zlib compression is used. + * + * A higher value of level indicates a smaller size of the compressed file, + * although it also implies more time consumed during the compression process. + */ + enum CompressionStrategy { /// Storage without compression - Storage = 0x00, // Z_NO_COMPRESSION 0 - /// The fastest compression speed - Fastest = 0x81, // Z_BEST_SPEED 1 - /// Relatively fast compression speed - Faster = 0x83, + Storage = 0x00, // Z_NO_COMPRESSION 0 + /// The fastest compression speed + Fastest = 0x81, // Z_BEST_SPEED 1 + /// Relatively fast compression speed + Faster = 0x83, /// Standard compression speed and ratio Standard = 0x86, /// Better compression ratio - Better = 0x87, + Better = 0x87, /// The best compression ratio - Best = 0x89, // Z_BEST_COMPRESSION 9 - /// The default compression strategy, according to the open function of quazipfile.h, - /// the value of method is Z_DEFLATED, and the value of level is Z_DEFAULT_COMPRESSION -1 (equals lvl 6) - Default = 0xff + Best = 0x89, // Z_BEST_COMPRESSION 9 + /// The default compression strategy, according to the open function of + /// quazipfile.h, the value of method is Z_DEFLATED, and the value of level is + /// Z_DEFAULT_COMPRESSION -1 (equals lvl 6) + Default = 0xff }; public: - explicit Options(const CompressionStrategy& strategy) - : m_compressionStrategy(strategy) {} + explicit Options(const CompressionStrategy& strategy) : m_compressionStrategy(strategy) {} - explicit Options(const QDateTime& dateTime = QDateTime(), const CompressionStrategy& strategy = Default) + explicit Options(const QDateTime& dateTime = QDateTime(), + const CompressionStrategy& strategy = Default) : m_dateTime(dateTime), m_compressionStrategy(strategy) {} QDateTime getDateTime() const { return m_dateTime; } - void setDateTime(const QDateTime &dateTime) { + void setDateTime(const QDateTime& dateTime) { m_dateTime = dateTime; } @@ -70,10 +70,11 @@ public: } int getCompressionLevel() const { - return m_compressionStrategy != Default ? m_compressionStrategy & 0x0f : Z_DEFAULT_COMPRESSION; + return m_compressionStrategy != Default ? m_compressionStrategy & 0x0f + : Z_DEFAULT_COMPRESSION; } - void setCompressionStrategy(const CompressionStrategy &strategy) { + void setCompressionStrategy(const CompressionStrategy& strategy) { m_compressionStrategy = strategy; } @@ -89,34 +90,21 @@ private: * @param fileCompressed Destination file * @param dir The directory to compress * @param options Compression level, etc - * @param callback Callback that takes in two std::size_t (total, progress) and returns false if the current operation should be cancelled. + * @param callback Callback that takes in two std::size_t (total, progress) and returns false + * if the current operation should be cancelled. */ -bool compressDir(QString fileCompressed, - QString dir, - const Options& options = Options(), +bool compressDir(QString fileCompressed, QString dir, const Options& options = Options(), QtCommon::QtProgressCallback callback = {}); // Internal // -bool compressSubDir(QuaZip *zip, - QString dir, - QString origDir, - const Options &options, - std::size_t total, - std::size_t &progress, +bool compressSubDir(QuaZip* zip, QString dir, QString origDir, const Options& options, + std::size_t total, std::size_t& progress, QtCommon::QtProgressCallback callback); -bool compressFile(QuaZip *zip, - QString fileName, - QString fileDest, - const Options &options, - std::size_t total, - std::size_t &progress, - QtCommon::QtProgressCallback callback); +bool compressFile(QuaZip* zip, QString fileName, QString fileDest, const Options& options, + std::size_t total, std::size_t& progress, QtCommon::QtProgressCallback callback); -bool copyData(QIODevice &inFile, - QIODevice &outFile, - std::size_t total, - std::size_t &progress, +bool copyData(QIODevice& inFile, QIODevice& outFile, std::size_t total, std::size_t& progress, QtCommon::QtProgressCallback callback); // Extract // @@ -125,20 +113,18 @@ bool copyData(QIODevice &inFile, * @brief Extract a zip file and report its progress. * @param fileCompressed Compressed file * @param dir The directory to push the results to - * @param callback Callback that takes in two std::size_t (total, progress) and returns false if the current operation should be cancelled. + * @param callback Callback that takes in two std::size_t (total, progress) and returns false + * if the current operation should be cancelled. */ -QStringList extractDir(QString fileCompressed, QString dir, QtCommon::QtProgressCallback callback = {}); +QStringList extractDir(QString fileCompressed, QString dir, + QtCommon::QtProgressCallback callback = {}); // Internal // -QStringList extractDir(QuaZip &zip, const QString &dir, QtCommon::QtProgressCallback callback); +QStringList extractDir(QuaZip& zip, const QString& dir, QtCommon::QtProgressCallback callback); -bool extractFile(QuaZip *zip, - QString fileName, - QString fileDest, - std::size_t total, - std::size_t &progress, - QtCommon::QtProgressCallback callback); +bool extractFile(QuaZip* zip, QString fileName, QString fileDest, std::size_t total, + std::size_t& progress, QtCommon::QtProgressCallback callback); bool removeFile(QStringList listFile); -} +} // namespace QtCommon::Compress diff --git a/src/qt_common/util/content.cpp b/src/qt_common/util/content.cpp index 9ba5ab264c..4d9b324608 100644 --- a/src/qt_common/util/content.cpp +++ b/src/qt_common/util/content.cpp @@ -12,63 +12,54 @@ #include "compress.h" #include "qt_common/abstract/frontend.h" -#include "qt_common/abstract/qt_progress_dialog.h" +#include "qt_common/abstract/progress.h" #include "qt_common/qt_common.h" +#include #include #include #include -#include namespace QtCommon::Content { -bool CheckGameFirmware(u64 program_id, QObject* parent) -{ - if (FirmwareManager::GameRequiresFirmware(program_id) - && !FirmwareManager::CheckFirmwarePresence(*system)) { - auto result = QtCommon::Frontend::ShowMessage( - QMessageBox::Warning, +bool CheckGameFirmware(u64 program_id) { + if (FirmwareManager::GameRequiresFirmware(program_id) && + !FirmwareManager::CheckFirmwarePresence(*system)) { + auto result = QtCommon::Frontend::Warning( tr("Game Requires Firmware"), tr("The game you are trying to launch requires firmware to boot or to get past the " "opening menu. Please " "dump and install firmware, or press \"OK\" to launch anyways."), - QMessageBox::Ok | QMessageBox::Cancel, - parent); + QtCommon::Frontend::Ok | QtCommon::Frontend::Cancel); - return result == QMessageBox::Ok; + return result == QtCommon::Frontend::Ok; } return true; } -void InstallFirmware(const QString& location, bool recursive) -{ - QtCommon::Frontend::QtProgressDialog progress(tr("Installing Firmware..."), - tr("Cancel"), - 0, - 100, - rootObject); - progress.setWindowModality(Qt::WindowModal); - progress.setMinimumDuration(100); - progress.setAutoClose(false); - progress.setAutoReset(false); - progress.show(); +void InstallFirmware(const QString& location, bool recursive) { + // Initialize a progress dialog. + auto progress = + QtCommon::Frontend::newProgressDialog(tr("Installing Firmware..."), tr("Cancel"), 0, 100); + progress->show(); + + QGuiApplication::processEvents(); // Declare progress callback. auto callback = [&](size_t total_size, size_t processed_size) { - progress.setValue(static_cast((processed_size * 100) / total_size)); - return progress.wasCanceled(); + QGuiApplication::processEvents(); + progress->setValue(static_cast((processed_size * 100) / total_size)); + return progress->wasCanceled(); }; QString failedTitle = tr("Firmware Install Failed"); QString successTitle = tr("Firmware Install Succeeded"); - QMessageBox::Icon icon; + QtCommon::Frontend::Icon icon; FirmwareInstallResult result; const auto ShowMessage = [&]() { - QtCommon::Frontend::ShowMessage(icon, - failedTitle, - GetFirmwareInstallResultString(result)); + QtCommon::Frontend::ShowMessage(icon, failedTitle, GetFirmwareInstallResultString(result)); }; LOG_INFO(Frontend, "Installing firmware from {}", location.toStdString()); @@ -93,28 +84,26 @@ void InstallFirmware(const QString& location, bool recursive) callback(100, 10); if (recursive) { - Common::FS::IterateDirEntriesRecursively(firmware_source_path, - dir_callback, + Common::FS::IterateDirEntriesRecursively(firmware_source_path, dir_callback, Common::FS::DirEntryFilter::File); } else { - Common::FS::IterateDirEntries(firmware_source_path, - dir_callback, + Common::FS::IterateDirEntries(firmware_source_path, dir_callback, Common::FS::DirEntryFilter::File); } if (out.size() <= 0) { result = FirmwareInstallResult::NoNCAs; - icon = QMessageBox::Warning; + icon = QtCommon::Frontend::Icon::Warning; ShowMessage(); return; } // Locate and erase the content of nand/system/Content/registered/*.nca, if any. auto sysnand_content_vdir = system->GetFileSystemController().GetSystemNANDContentDirectory(); - if (sysnand_content_vdir->IsWritable() - && !sysnand_content_vdir->CleanSubdirectoryRecursive("registered")) { + if (sysnand_content_vdir->IsWritable() && + !sysnand_content_vdir->CleanSubdirectoryRecursive("registered")) { result = FirmwareInstallResult::FailedDelete; - icon = QMessageBox::Critical; + icon = QtCommon::Frontend::Icon::Critical; ShowMessage(); return; } @@ -130,22 +119,20 @@ void InstallFirmware(const QString& location, bool recursive) int i = 0; for (const auto& firmware_src_path : out) { i++; - auto firmware_src_vfile = vfs->OpenFile(firmware_src_path.generic_string(), - FileSys::OpenMode::Read); - auto firmware_dst_vfile = firmware_vdir->CreateFileRelative( - firmware_src_path.filename().string()); + auto firmware_src_vfile = + vfs->OpenFile(firmware_src_path.generic_string(), FileSys::OpenMode::Read); + auto firmware_dst_vfile = + firmware_vdir->CreateFileRelative(firmware_src_path.filename().string()); if (!VfsRawCopy(firmware_src_vfile, firmware_dst_vfile)) { - LOG_ERROR(Frontend, - "Failed to copy firmware file {} to {} in registered folder!", - firmware_src_path.generic_string(), - firmware_src_path.filename().string()); + LOG_ERROR(Frontend, "Failed to copy firmware file {} to {} in registered folder!", + firmware_src_path.generic_string(), firmware_src_path.filename().string()); success = false; } if (callback(100, 20 + static_cast(((i) / static_cast(out.size())) * 70.0))) { result = FirmwareInstallResult::FailedCorrupted; - icon = QMessageBox::Warning; + icon = QtCommon::Frontend::Icon::Warning; ShowMessage(); return; } @@ -153,7 +140,7 @@ void InstallFirmware(const QString& location, bool recursive) if (!success) { result = FirmwareInstallResult::FailedCopy; - icon = QMessageBox::Critical; + icon = QtCommon::Frontend::Icon::Critical; ShowMessage(); return; } @@ -162,39 +149,37 @@ void InstallFirmware(const QString& location, bool recursive) system->GetFileSystemController().CreateFactories(*vfs); auto VerifyFirmwareCallback = [&](size_t total_size, size_t processed_size) { - progress.setValue(90 + static_cast((processed_size * 10) / total_size)); - return progress.wasCanceled(); + QGuiApplication::processEvents(); + progress->setValue(90 + static_cast((processed_size * 10) / total_size)); + return progress->wasCanceled(); }; - auto results = ContentManager::VerifyInstalledContents(*QtCommon::system, - *QtCommon::provider, - VerifyFirmwareCallback, - true); + auto results = ContentManager::VerifyInstalledContents(*QtCommon::system, *QtCommon::provider, + VerifyFirmwareCallback, true); if (results.size() > 0) { - const auto failed_names = QString::fromStdString( - fmt::format("{}", fmt::join(results, "\n"))); - progress.close(); + const auto failed_names = + QString::fromStdString(fmt::format("{}", fmt::join(results, "\n"))); + progress->close(); QtCommon::Frontend::Critical( tr("Firmware integrity verification failed!"), tr("Verification failed for the following files:\n\n%1").arg(failed_names)); return; } - progress.close(); + progress->close(); + QGuiApplication::processEvents(); const auto pair = FirmwareManager::GetFirmwareVersion(*system); const auto firmware_data = pair.first; const std::string display_version(firmware_data.display_version.data()); result = FirmwareInstallResult::Success; - QtCommon::Frontend::Information(successTitle, - GetFirmwareInstallResultString(result).arg( - QString::fromStdString(display_version))); + QtCommon::Frontend::Information(successTitle, GetFirmwareInstallResultString(result).arg( + QString::fromStdString(display_version))); } -QString UnzipFirmwareToTmp(const QString& location) -{ +QString UnzipFirmwareToTmp(const QString& location) { namespace fs = std::filesystem; fs::path tmp{fs::temp_directory_path()}; @@ -219,59 +204,47 @@ QString UnzipFirmwareToTmp(const QString& location) } // Content // -void VerifyGameContents(const std::string& game_path) -{ - QtCommon::Frontend::QtProgressDialog progress(tr("Verifying integrity..."), - tr("Cancel"), - 0, - 100, - rootObject); - progress.setWindowModality(Qt::WindowModal); - progress.setMinimumDuration(100); - progress.setAutoClose(false); - progress.setAutoReset(false); +void VerifyGameContents(const std::string& game_path) { + auto progress = + QtCommon::Frontend::newProgressDialog(tr("Verifying integrity..."), tr("Cancel"), 0, 100); + progress->show(); + + QGuiApplication::processEvents(); const auto callback = [&](size_t total_size, size_t processed_size) { - progress.setValue(static_cast((processed_size * 100) / total_size)); - return progress.wasCanceled(); + QGuiApplication::processEvents(); + progress->setValue(static_cast((processed_size * 100) / total_size)); + return progress->wasCanceled(); }; const auto result = ContentManager::VerifyGameContents(*system, game_path, callback); switch (result) { case ContentManager::GameVerificationResult::Success: - QtCommon::Frontend::Information(rootObject, - tr("Integrity verification succeeded!"), + QtCommon::Frontend::Information(rootObject, tr("Integrity verification succeeded!"), tr("The operation completed successfully.")); break; case ContentManager::GameVerificationResult::Failed: - QtCommon::Frontend::Critical(rootObject, - tr("Integrity verification failed!"), + QtCommon::Frontend::Critical(rootObject, tr("Integrity verification failed!"), tr("File contents may be corrupt or missing.")); break; case ContentManager::GameVerificationResult::NotImplemented: QtCommon::Frontend::Warning( - rootObject, - tr("Integrity verification couldn't be performed"), + rootObject, tr("Integrity verification couldn't be performed"), tr("Firmware installation cancelled, firmware may be in a bad state or corrupted. " "File contents could not be checked for validity.")); } } -void InstallKeys() -{ - const QString key_source_location - = QtCommon::Frontend::GetOpenFileName(tr("Select Dumped Keys Location"), - {}, - QStringLiteral("Decryption Keys (*.keys)"), - {}, - QtCommon::Frontend::Option::ReadOnly); +void InstallKeys() { + const QString key_source_location = QtCommon::Frontend::GetOpenFileName( + tr("Select Dumped Keys Location"), {}, QStringLiteral("Decryption Keys (*.keys)"), {}); if (key_source_location.isEmpty()) return; - FirmwareManager::KeyInstallResult result - = FirmwareManager::InstallKeys(key_source_location.toStdString(), "keys"); + FirmwareManager::KeyInstallResult result = + FirmwareManager::InstallKeys(key_source_location.toStdString(), "keys"); system->GetFileSystemController().CreateFactories(*QtCommon::vfs); @@ -286,46 +259,42 @@ void InstallKeys() } } -void VerifyInstalledContents() -{ +void VerifyInstalledContents() { // Initialize a progress dialog. - QtCommon::Frontend::QtProgressDialog progress(tr("Verifying integrity..."), - tr("Cancel"), - 0, - 100, - rootObject); - progress.setWindowModality(Qt::WindowModal); - progress.setMinimumDuration(100); - progress.setAutoClose(false); - progress.setAutoReset(false); + auto progress = + QtCommon::Frontend::newProgressDialog(tr("Verifying integrity..."), tr("Cancel"), 0, 100); + progress->show(); + + QGuiApplication::processEvents(); // Declare progress callback. auto QtProgressCallback = [&](size_t total_size, size_t processed_size) { - progress.setValue(static_cast((processed_size * 100) / total_size)); - return progress.wasCanceled(); + QGuiApplication::processEvents(); + progress->setValue(static_cast((processed_size * 100) / total_size)); + return progress->wasCanceled(); }; - const std::vector result - = ContentManager::VerifyInstalledContents(*QtCommon::system, - *QtCommon::provider, - QtProgressCallback); - progress.close(); + const std::vector result = ContentManager::VerifyInstalledContents( + *QtCommon::system, *QtCommon::provider, QtProgressCallback); + + progress->close(); if (result.empty()) { QtCommon::Frontend::Information(tr("Integrity verification succeeded!"), tr("The operation completed successfully.")); } else { - const auto failed_names = QString::fromStdString(fmt::format("{}", fmt::join(result, "\n"))); + const auto failed_names = + QString::fromStdString(fmt::format("{}", fmt::join(result, "\n"))); QtCommon::Frontend::Critical( tr("Integrity verification failed!"), tr("Verification failed for the following files:\n\n%1").arg(failed_names)); } } -void FixProfiles() -{ +void FixProfiles() { // Reset user save files after config is initialized and migration is done. - // Doing it at init time causes profiles to read from the wrong place entirely if NAND dir is not default + // Doing it at init time causes profiles to read from the wrong place entirely if NAND dir is + // not default // TODO: better solution system->GetProfileManager().ResetUserSaveFile(); std::vector orphaned = system->GetProfileManager().FindOrphanedProfiles(); @@ -365,79 +334,66 @@ void FixProfiles() "%2

" "Click \"OK\" to open your save folder and fix up your profiles.
" "Hint: copy the contents of the largest or last-modified folder elsewhere, " - "delete all orphaned profiles, and move your copied contents to the good profile.

" - "Still confused? See the help page.
") + "delete all orphaned profiles, and move your copied contents to the good " + "profile.

" + "Still confused? See the help page.
") .arg(qorphaned, qgood)); QtCommon::Game::OpenSaveFolder(); } -void ClearDataDir(FrontendCommon::DataManager::DataDir dir, const std::string& user_id) -{ - auto result = QtCommon::Frontend::Warning(tr("Really clear data?"), - tr("Important data may be lost!"), - QMessageBox::Yes | QMessageBox::No); +void ClearDataDir(FrontendCommon::DataManager::DataDir dir, const std::string& user_id) { + using namespace QtCommon::Frontend; + auto result = Warning(tr("Really clear data?"), tr("Important data may be lost!"), Yes | No); - if (result != QMessageBox::Yes) + if (result != Yes) return; - result = QtCommon::Frontend::Warning( - tr("Are you REALLY sure?"), - tr("Once deleted, your data will NOT come back!\n" - "Only do this if you're 100% sure you want to delete this data."), - QMessageBox::Yes | QMessageBox::No); + result = Warning(tr("Are you REALLY sure?"), + tr("Once deleted, your data will NOT come back!\n" + "Only do this if you're 100% sure you want to delete this data."), + Yes | No); - if (result != QMessageBox::Yes) + if (result != Yes) return; - QtCommon::Frontend::QtProgressDialog dialog(tr("Clearing..."), QString(), 0, 0); - dialog.show(); + auto dialog = newProgressDialog(tr("Clearing..."), QString(), 0, 0); + dialog->show(); FrontendCommon::DataManager::ClearDir(dir, user_id); - dialog.close(); + dialog->close(); } -void ExportDataDir(FrontendCommon::DataManager::DataDir data_dir, - const std::string& user_id, - const QString& name, - std::function callback) -{ +void ExportDataDir(FrontendCommon::DataManager::DataDir data_dir, const std::string& user_id, + const QString& name, std::function callback) { using namespace QtCommon::Frontend; const std::string dir = FrontendCommon::DataManager::GetDataDirString(data_dir, user_id); - const QString zip_dump_location = GetSaveFileName(tr("Select Export Location"), - tr("%1.zip").arg(name), - tr("Zipped Archives (*.zip)")); + const QString zip_dump_location = GetSaveFileName( + tr("Select Export Location"), tr("%1.zip").arg(name), tr("Zipped Archives (*.zip)")); if (zip_dump_location.isEmpty()) return; - QtProgressDialog* progress = new QtProgressDialog( - tr("Exporting data. This may take a while..."), tr("Cancel"), 0, 100, rootObject); + auto progress = QtCommon::Frontend::newProgressDialogPtr( + tr("Exporting data. This may take a while..."), tr("Cancel"), 0, 100); - progress->setWindowTitle(tr("Exporting")); - progress->setWindowModality(Qt::WindowModal); - progress->setMinimumDuration(100); - progress->setAutoClose(false); - progress->setAutoReset(false); + progress->setTitle(tr("Exporting")); progress->show(); - QGuiApplication::processEvents(); - auto progress_callback = [=](size_t total_size, size_t processed_size) { - QMetaObject::invokeMethod(progress, - "setValue", - Qt::DirectConnection, - Q_ARG(int, static_cast((processed_size * 100) / total_size))); + QMetaObject::invokeMethod( + progress, "setValue", Qt::DirectConnection, + Q_ARG(int, static_cast((processed_size * 100) / total_size))); return !progress->wasCanceled(); }; QFuture future = QtConcurrent::run([=]() { - return QtCommon::Compress::compressDir(zip_dump_location, - QString::fromStdString(dir), - QtCommon::Compress::Options(), - progress_callback); + return QtCommon::Compress::compressDir(zip_dump_location, QString::fromStdString(dir), + QtCommon::Compress::Options(), progress_callback); }); QFutureWatcher* watcher = new QFutureWatcher(rootObject); @@ -464,42 +420,32 @@ void ExportDataDir(FrontendCommon::DataManager::DataDir data_dir, watcher->setFuture(future); } -void ImportDataDir(FrontendCommon::DataManager::DataDir data_dir, - const std::string& user_id, - std::function callback) -{ +void ImportDataDir(FrontendCommon::DataManager::DataDir data_dir, const std::string& user_id, + std::function callback) { const std::string dir = FrontendCommon::DataManager::GetDataDirString(data_dir, user_id); using namespace QtCommon::Frontend; - const QString zip_dump_location = GetOpenFileName(tr("Select Import Location"), - {}, - tr("Zipped Archives (*.zip)")); + const QString zip_dump_location = + GetOpenFileName(tr("Select Import Location"), {}, tr("Zipped Archives (*.zip)")); if (zip_dump_location.isEmpty()) return; - StandardButton button = Warning( - tr("Import Warning"), - tr("All previous data in this directory will be deleted. Are you sure you wish to " - "proceed?"), - StandardButton::Yes | StandardButton::No); + StandardButton button = + Warning(tr("Import Warning"), + tr("All previous data in this directory will be deleted. Are you sure you wish to " + "proceed?"), + StandardButton::Yes | StandardButton::No); - if (button != QMessageBox::Yes) + if (button != QtCommon::Frontend::Yes) return; - QtProgressDialog* progress = new QtProgressDialog( - tr("Importing data. This may take a while..."), tr("Cancel"), 0, 100, rootObject); + QtProgressDialog* progress = + newProgressDialogPtr(tr("Importing data. This may take a while..."), tr("Cancel"), 0, 100); - progress->setWindowTitle(tr("Importing")); - progress->setWindowModality(Qt::WindowModal); - progress->setMinimumDuration(100); - progress->setAutoClose(false); - progress->setAutoReset(false); + progress->setTitle(tr("Importing")); progress->show(); - progress->setValue(0); - - QGuiApplication::processEvents(); // to prevent GUI mangling we have to run this in a thread as well QFuture delete_future = QtConcurrent::run([=]() { @@ -512,17 +458,14 @@ void ImportDataDir(FrontendCommon::DataManager::DataDir data_dir, QObject::connect(delete_watcher, &QFutureWatcher::finished, rootObject, [=]() { auto progress_callback = [=](size_t total_size, size_t processed_size) { - QMetaObject::invokeMethod(progress, - "setValue", - Qt::DirectConnection, - Q_ARG(int, - static_cast((processed_size * 100) / total_size))); + QMetaObject::invokeMethod( + progress, "setValue", Qt::DirectConnection, + Q_ARG(int, static_cast((processed_size * 100) / total_size))); return !progress->wasCanceled(); }; QFuture future = QtConcurrent::run([=]() { - return !QtCommon::Compress::extractDir(zip_dump_location, - QString::fromStdString(dir), + return !QtCommon::Compress::extractDir(zip_dump_location, QString::fromStdString(dir), progress_callback) .empty(); }); @@ -553,4 +496,5 @@ void ImportDataDir(FrontendCommon::DataManager::DataDir data_dir, }); } +// TODO(crueter): Port InstallFirmware et al. from QML Branch } // namespace QtCommon::Content diff --git a/src/qt_common/util/content.h b/src/qt_common/util/content.h index 6e8642083f..20dacf540a 100644 --- a/src/qt_common/util/content.h +++ b/src/qt_common/util/content.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #ifndef QT_CONTENT_UTIL_H @@ -13,7 +13,7 @@ namespace QtCommon::Content { // -bool CheckGameFirmware(u64 program_id, QObject *parent); +bool CheckGameFirmware(u64 program_id); enum class FirmwareInstallResult { Success, @@ -23,8 +23,7 @@ enum class FirmwareInstallResult { FailedCorrupted, }; -inline const QString GetFirmwareInstallResultString(FirmwareInstallResult result) -{ +inline const QString GetFirmwareInstallResultString(FirmwareInstallResult result) { return LOOKUP_ENUM(result, FwInstallSuccess); } @@ -33,30 +32,29 @@ inline const QString GetFirmwareInstallResultString(FirmwareInstallResult result * \param result The result code. * \return A string representation of the passed result code. */ -inline const QString GetKeyInstallResultString(FirmwareManager::KeyInstallResult result) -{ +inline const QString GetKeyInstallResultString(FirmwareManager::KeyInstallResult result) { return LOOKUP_ENUM(result, KeyInstallSuccess); } -void InstallFirmware(const QString &location, bool recursive); +void InstallFirmware(const QString& location, bool recursive); -QString UnzipFirmwareToTmp(const QString &location); +QString UnzipFirmwareToTmp(const QString& location); // Keys // void InstallKeys(); // Content // -void VerifyGameContents(const std::string &game_path); +void VerifyGameContents(const std::string& game_path); void VerifyInstalledContents(); -void ClearDataDir(FrontendCommon::DataManager::DataDir dir, const std::string &user_id = ""); -void ExportDataDir(FrontendCommon::DataManager::DataDir dir, - const std::string &user_id = "", - const QString &name = QStringLiteral("export"), +void ClearDataDir(FrontendCommon::DataManager::DataDir dir, const std::string& user_id = ""); +void ExportDataDir(FrontendCommon::DataManager::DataDir dir, const std::string& user_id = "", + const QString& name = QStringLiteral("export"), + std::function callback = {}); +void ImportDataDir(FrontendCommon::DataManager::DataDir dir, const std::string& user_id = "", std::function callback = {}); -void ImportDataDir(FrontendCommon::DataManager::DataDir dir, const std::string &user_id = "", std::function callback = {}); // Profiles // void FixProfiles(); -} +} // namespace QtCommon::Content #endif // QT_CONTENT_UTIL_H diff --git a/src/qt_common/util/fs.cpp b/src/qt_common/util/fs.cpp index dd105849aa..b5f2844bbf 100644 --- a/src/qt_common/util/fs.cpp +++ b/src/qt_common/util/fs.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include @@ -13,8 +13,7 @@ namespace fs = std::filesystem; namespace QtCommon::FS { -void LinkRyujinx(std::filesystem::path &from, std::filesystem::path &to) -{ +void LinkRyujinx(std::filesystem::path& from, std::filesystem::path& to) { std::error_code ec; // "ignore" errors--if the dir fails to be deleted, error handling later will handle it @@ -25,12 +24,12 @@ void LinkRyujinx(std::filesystem::path &from, std::filesystem::path &to) } else { QtCommon::Frontend::Critical( tr("Failed to link save data"), - tr("Could not link directory:\n\t%1\nTo:\n\t%2").arg(QString::fromStdString(from.string()), QString::fromStdString(to.string()))); + tr("Could not link directory:\n\t%1\nTo:\n\t%2") + .arg(QString::fromStdString(from.string()), QString::fromStdString(to.string()))); } } -bool CheckUnlink(const fs::path &eden_dir, const fs::path &ryu_dir) -{ +bool CheckUnlink(const fs::path& eden_dir, const fs::path& ryu_dir) { bool eden_link = Common::FS::IsSymlink(eden_dir); bool ryu_link = Common::FS::IsSymlink(ryu_dir); @@ -64,7 +63,7 @@ bool CheckUnlink(const fs::path &eden_dir, const fs::path &ryu_dir) // NB: do NOT use remove_all, as Windows treats this as a remove_all to the target, // NOT the junction fs::remove(linked); - } catch (std::exception &e) { + } catch (std::exception& e) { QtCommon::Frontend::Critical( tr("Failed to unlink old directory"), tr("OS returned error: %1").arg(QString::fromStdString(e.what()))); @@ -74,7 +73,7 @@ bool CheckUnlink(const fs::path &eden_dir, const fs::path &ryu_dir) // then COPY the other dir try { fs::copy(orig, linked, fs::copy_options::recursive); - } catch (std::exception &e) { + } catch (std::exception& e) { QtCommon::Frontend::Critical( tr("Failed to copy save data"), tr("OS returned error: %1").arg(QString::fromStdString(e.what()))); @@ -87,8 +86,7 @@ bool CheckUnlink(const fs::path &eden_dir, const fs::path &ryu_dir) return true; } -const fs::path GetRyujinxSavePath(const fs::path &path_hint, const u64 &program_id) -{ +const fs::path GetRyujinxSavePath(const fs::path& path_hint, const u64& program_id) { auto ryu_path = path_hint; auto kvdb_path = Common::FS::GetKvdbPath(ryu_path); @@ -99,10 +97,13 @@ const fs::path GetRyujinxSavePath(const fs::path &path_hint, const u64 &program_ tr("Could not find Ryujinx installation"), tr("Could not find a valid Ryujinx installation. This may typically occur if you are " "using Ryujinx in portable mode.\n\nWould you like to manually select a portable " - "folder to use?"), StandardButton::Yes | StandardButton::No); + "folder to use?"), + StandardButton::Yes | StandardButton::No); if (res == StandardButton::Yes) { - auto selected_path = GetExistingDirectory(tr("Ryujinx Portable Location"), QDir::homePath()).toStdString(); + auto selected_path = + GetExistingDirectory(tr("Ryujinx Portable Location"), QDir::homePath()) + .toStdString(); if (selected_path.empty()) return fs::path{}; @@ -131,7 +132,7 @@ const fs::path GetRyujinxSavePath(const fs::path &path_hint, const u64 &program_ Common::FS::IMENReadResult res = Common::FS::ReadKvdb(kvdb_path, imens); if (res == Common::FS::IMENReadResult::Success) { - for (const Common::FS::IMEN &imen : imens) { + for (const Common::FS::IMEN& imen : imens) { if (imen.title_id == program_id) return Common::FS::GetRyuSavePath(ryu_path, imen.save_id); } diff --git a/src/qt_common/util/fs.h b/src/qt_common/util/fs.h index 41669e8019..5ab59e2a45 100644 --- a/src/qt_common/util/fs.h +++ b/src/qt_common/util/fs.h @@ -1,19 +1,19 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "common/common_types.h" #include #include +#include "common/common_types.h" #pragma once namespace QtCommon::FS { -void LinkRyujinx(std::filesystem::path &from, std::filesystem::path &to); -const std::filesystem::path GetRyujinxSavePath(const std::filesystem::path &path_hint, const u64 &program_id); +void LinkRyujinx(std::filesystem::path& from, std::filesystem::path& to); +const std::filesystem::path GetRyujinxSavePath(const std::filesystem::path& path_hint, + const u64& program_id); /// returns FALSE if the dirs are NOT linked -bool CheckUnlink(const std::filesystem::path& eden_dir, - const std::filesystem::path& ryu_dir); +bool CheckUnlink(const std::filesystem::path& eden_dir, const std::filesystem::path& ryu_dir); } // namespace QtCommon::FS diff --git a/src/qt_common/util/game.cpp b/src/qt_common/util/game.cpp index 34fbd04ff9..e037fdae6c 100644 --- a/src/qt_common/util/game.cpp +++ b/src/qt_common/util/game.cpp @@ -18,40 +18,34 @@ #include #ifdef _WIN32 -#include "common/scope_exit.h" -#include "common/string_util.h" #include #include +#include "common/scope_exit.h" +#include "common/string_util.h" #else -#include "fmt/ostream.h" #include +#include "fmt/ostream.h" #endif namespace QtCommon::Game { -bool CreateShortcutLink(const std::filesystem::path& shortcut_path, - const std::string& comment, +bool CreateShortcutLink(const std::filesystem::path& shortcut_path, const std::string& comment, const std::filesystem::path& icon_path, - const std::filesystem::path& command, - const std::string& arguments, - const std::string& categories, - const std::string& keywords, - const std::string& name) -try { + const std::filesystem::path& command, const std::string& arguments, + const std::string& categories, const std::string& keywords, + const std::string& name) try { #ifdef _WIN32 // Windows HRESULT hr = CoInitialize(nullptr); if (FAILED(hr)) { LOG_ERROR(Frontend, "CoInitialize failed"); return false; } - SCOPE_EXIT - { + SCOPE_EXIT { CoUninitialize(); }; IShellLinkW* ps1 = nullptr; IPersistFile* persist_file = nullptr; - SCOPE_EXIT - { + SCOPE_EXIT { if (persist_file != nullptr) { persist_file->Release(); } @@ -59,10 +53,7 @@ try { ps1->Release(); } }; - HRESULT hres = CoCreateInstance(CLSID_ShellLink, - nullptr, - CLSCTX_INPROC_SERVER, - IID_IShellLinkW, + HRESULT hres = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_IShellLinkW, reinterpret_cast(&ps1)); if (FAILED(hres)) { LOG_ERROR(Frontend, "Failed to create IShellLinkW instance"); @@ -142,10 +133,8 @@ try { return false; } -bool MakeShortcutIcoPath(const u64 program_id, - const std::string_view game_file_name, - std::filesystem::path& out_icon_path) -{ +bool MakeShortcutIcoPath(const u64 program_id, const std::string_view game_file_name, + std::filesystem::path& out_icon_path) { // Get path to Yuzu icons directory & icon extension std::string ico_extension = "png"; #if defined(_WIN32) @@ -166,46 +155,38 @@ bool MakeShortcutIcoPath(const u64 program_id, return true; } -void OpenEdenFolder(const Common::FS::EdenPath& path) -{ +void OpenEdenFolder(const Common::FS::EdenPath& path) { QDesktopServices::openUrl( QUrl::fromLocalFile(QString::fromStdString(Common::FS::GetEdenPathString(path)))); } -void OpenRootDataFolder() -{ +void OpenRootDataFolder() { OpenEdenFolder(Common::FS::EdenPath::EdenDir); } -void OpenNANDFolder() -{ +void OpenNANDFolder() { OpenEdenFolder(Common::FS::EdenPath::NANDDir); } -void OpenSaveFolder() -{ - const auto path = Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir) - / "user/save/0000000000000000"; +void OpenSaveFolder() { + const auto path = + Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir) / "user/save/0000000000000000"; QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromStdString(path.string()))); } -void OpenSDMCFolder() -{ +void OpenSDMCFolder() { OpenEdenFolder(Common::FS::EdenPath::SDMCDir); } -void OpenModFolder() -{ +void OpenModFolder() { OpenEdenFolder(Common::FS::EdenPath::LoadDir); } -void OpenLogFolder() -{ +void OpenLogFolder() { OpenEdenFolder(Common::FS::EdenPath::LogDir); } -static QString GetGameListErrorRemoving(QtCommon::Game::InstalledEntryType type) -{ +static QString GetGameListErrorRemoving(QtCommon::Game::InstalledEntryType type) { switch (type) { case QtCommon::Game::InstalledEntryType::Game: return tr("Error Removing Contents"); @@ -219,10 +200,9 @@ static QString GetGameListErrorRemoving(QtCommon::Game::InstalledEntryType type) } // Game Content // -void RemoveBaseContent(u64 program_id, InstalledEntryType type) -{ - const auto res = ContentManager::RemoveBaseContent(system->GetFileSystemController(), - program_id); +void RemoveBaseContent(u64 program_id, InstalledEntryType type) { + const auto res = + ContentManager::RemoveBaseContent(system->GetFileSystemController(), program_id); if (res) { QtCommon::Frontend::Information(tr("Successfully Removed"), tr("Successfully removed the installed base game.")); @@ -234,8 +214,7 @@ void RemoveBaseContent(u64 program_id, InstalledEntryType type) } } -void RemoveUpdateContent(u64 program_id, InstalledEntryType type) -{ +void RemoveUpdateContent(u64 program_id, InstalledEntryType type) { const auto res = ContentManager::RemoveUpdate(system->GetFileSystemController(), program_id); if (res) { QtCommon::Frontend::Information(tr("Successfully Removed"), @@ -246,8 +225,7 @@ void RemoveUpdateContent(u64 program_id, InstalledEntryType type) } } -void RemoveAddOnContent(u64 program_id, InstalledEntryType type) -{ +void RemoveAddOnContent(u64 program_id, InstalledEntryType type) { const size_t count = ContentManager::RemoveAllDLC(*system, program_id); if (count == 0) { QtCommon::Frontend::Warning(GetGameListErrorRemoving(type), @@ -261,8 +239,7 @@ void RemoveAddOnContent(u64 program_id, InstalledEntryType type) // Global Content // -void RemoveTransferableShaderCache(u64 program_id, GameListRemoveTarget target) -{ +void RemoveTransferableShaderCache(u64 program_id, GameListRemoveTarget target) { const auto target_file_name = [target] { switch (target) { case GameListRemoveTarget::GlShaderCache: @@ -291,8 +268,7 @@ void RemoveTransferableShaderCache(u64 program_id, GameListRemoveTarget target) } } -void RemoveVulkanDriverPipelineCache(u64 program_id) -{ +void RemoveVulkanDriverPipelineCache(u64 program_id) { static constexpr std::string_view target_file_name = "vulkan_pipelines.bin"; const auto shader_cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); @@ -308,8 +284,7 @@ void RemoveVulkanDriverPipelineCache(u64 program_id) } } -void RemoveAllTransferableShaderCaches(u64 program_id) -{ +void RemoveAllTransferableShaderCaches(u64 program_id) { const auto shader_cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); const auto program_shader_cache_dir = shader_cache_dir / fmt::format("{:016x}", program_id); @@ -329,14 +304,13 @@ void RemoveAllTransferableShaderCaches(u64 program_id) } } -void RemoveCustomConfiguration(u64 program_id, const std::string& game_path) -{ +void RemoveCustomConfiguration(u64 program_id, const std::string& game_path) { const auto file_path = std::filesystem::path(Common::FS::ToU8String(game_path)); - const auto config_file_name - = program_id == 0 ? Common::FS::PathToUTF8String(file_path.filename()).append(".ini") - : fmt::format("{:016X}.ini", program_id); - const auto custom_config_file_path = Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir) - / "custom" / config_file_name; + const auto config_file_name = + program_id == 0 ? Common::FS::PathToUTF8String(file_path.filename()).append(".ini") + : fmt::format("{:016X}.ini", program_id); + const auto custom_config_file_path = + Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir) / "custom" / config_file_name; if (!Common::FS::Exists(custom_config_file_path)) { QtCommon::Frontend::Warning(tr("Error Removing Custom Configuration"), @@ -353,20 +327,14 @@ void RemoveCustomConfiguration(u64 program_id, const std::string& game_path) } } -void RemoveCacheStorage(u64 program_id) -{ +void RemoveCacheStorage(u64 program_id) { const auto nand_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir); - auto vfs_nand_dir = vfs->OpenDirectory(Common::FS::PathToUTF8String(nand_dir), - FileSys::OpenMode::Read); + auto vfs_nand_dir = + vfs->OpenDirectory(Common::FS::PathToUTF8String(nand_dir), FileSys::OpenMode::Read); - const auto cache_storage_path - = FileSys::SaveDataFactory::GetFullPath({}, - vfs_nand_dir, - FileSys::SaveDataSpaceId::User, - FileSys::SaveDataType::Cache, - 0 /* program_id */, - {}, - 0); + const auto cache_storage_path = FileSys::SaveDataFactory::GetFullPath( + {}, vfs_nand_dir, FileSys::SaveDataSpaceId::User, FileSys::SaveDataType::Cache, + 0 /* program_id */, {}, 0); const auto path = Common::FS::ConcatPathSafe(nand_dir, cache_storage_path); @@ -400,32 +368,31 @@ void ResetMetadata(bool show_message) { // Uhhh // // Messages in pre-defined message boxes for less code spaghetti -inline constexpr bool CreateShortcutMessagesGUI(ShortcutMessages imsg, const QString& game_title) -{ +inline constexpr bool CreateShortcutMessagesGUI(ShortcutMessages imsg, const QString& game_title) { int result = 0; - QMessageBox::StandardButtons buttons; + using namespace QtCommon::Frontend; + int buttons; + switch (imsg) { case ShortcutMessages::Fullscreen: - buttons = QMessageBox::Yes | QMessageBox::No; - result - = QtCommon::Frontend::Information(tr("Create Shortcut"), - tr("Do you want to launch the game in fullscreen?"), - buttons); - return result == QMessageBox::Yes; + buttons = Yes | No; + result = QtCommon::Frontend::Information( + tr("Create Shortcut"), tr("Do you want to launch the game in fullscreen?"), buttons); + return result == Yes; case ShortcutMessages::Success: - QtCommon::Frontend::Information(tr("Shortcut Created"), - tr("Successfully created a shortcut to %1").arg(game_title)); + QtCommon::Frontend::Information( + tr("Shortcut Created"), tr("Successfully created a shortcut to %1").arg(game_title)); return false; case ShortcutMessages::Volatile: - buttons = QMessageBox::StandardButton::Ok | QMessageBox::StandardButton::Cancel; + buttons = Ok | Cancel; result = QtCommon::Frontend::Warning( tr("Shortcut may be Volatile!"), tr("This will create a shortcut to the current AppImage. This may " "not work well if you update. Continue?"), buttons); - return result == QMessageBox::Ok; + return result == Ok; default: - buttons = QMessageBox::Ok; + buttons = Ok; QtCommon::Frontend::Critical(tr("Failed to Create Shortcut"), tr("Failed to create a shortcut to %1").arg(game_title), buttons); @@ -433,13 +400,9 @@ inline constexpr bool CreateShortcutMessagesGUI(ShortcutMessages imsg, const QSt } } -void CreateShortcut(const std::string& game_path, - const u64 program_id, - const std::string& game_title_, - const ShortcutTarget& target, - std::string arguments_, - const bool needs_title) -{ +void CreateShortcut(const std::string& game_path, const u64 program_id, + const std::string& game_title_, const ShortcutTarget& target, + std::string arguments_, const bool needs_title) { // Get path to Eden executable std::filesystem::path command = GetEdenCommand(); @@ -453,13 +416,11 @@ void CreateShortcut(const std::string& game_path, return; } - const FileSys::PatchManager pm{program_id, - QtCommon::system->GetFileSystemController(), + const FileSys::PatchManager pm{program_id, QtCommon::system->GetFileSystemController(), QtCommon::system->GetContentProvider()}; const auto control = pm.GetControlMetadata(); - const auto loader = Loader::GetLoader(*QtCommon::system, - QtCommon::vfs->OpenFile(game_path, - FileSys::OpenMode::Read)); + const auto loader = Loader::GetLoader( + *QtCommon::system, QtCommon::vfs->OpenFile(game_path, FileSys::OpenMode::Read)); std::string game_title{game_title_}; @@ -490,8 +451,8 @@ void CreateShortcut(const std::string& game_path, LOG_WARNING(Frontend, "Could not read icon from {:s}", game_path); } - QImage icon_data = QImage::fromData(icon_image_file.data(), - static_cast(icon_image_file.size())); + QImage icon_data = + QImage::fromData(icon_image_file.data(), static_cast(icon_image_file.size())); std::filesystem::path out_icon_path; if (QtCommon::Game::MakeShortcutIcoPath(program_id, game_title, out_icon_path)) { if (!SaveIconToFile(out_icon_path, icon_data)) { @@ -524,39 +485,32 @@ void CreateShortcut(const std::string& game_path, const std::string categories = "Game;Emulator;Qt;"; const std::string keywords = "Switch;Nintendo;"; - if (QtCommon::Game::CreateShortcutLink(shortcut_path, - comment, - out_icon_path, - command, - arguments, - categories, - keywords, - game_title)) { + if (QtCommon::Game::CreateShortcutLink(shortcut_path, comment, out_icon_path, command, + arguments, categories, keywords, game_title)) { CreateShortcutMessagesGUI(ShortcutMessages::Success, qgame_title); return; } CreateShortcutMessagesGUI(ShortcutMessages::Failed, qgame_title); } -// TODO: You want this to be constexpr? Well too bad, clang19 doesn't believe this is a string literal -std::string GetShortcutPath(ShortcutTarget target) -{ +// TODO: You want this to be constexpr? Well too bad, clang19 doesn't believe this is a string +// literal +std::string GetShortcutPath(ShortcutTarget target) { { std::string shortcut_path{}; if (target == ShortcutTarget::Desktop) { - shortcut_path - = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation).toStdString(); + shortcut_path = + QStandardPaths::writableLocation(QStandardPaths::DesktopLocation).toStdString(); } else if (target == ShortcutTarget::Applications) { - shortcut_path - = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation).toStdString(); + shortcut_path = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + .toStdString(); } return shortcut_path; } } -void CreateHomeMenuShortcut(ShortcutTarget target) -{ +void CreateHomeMenuShortcut(ShortcutTarget target) { constexpr u64 QLaunchId = static_cast(Service::AM::AppletProgramId::QLaunch); auto bis_system = QtCommon::system->GetFileSystemController().GetSystemNANDContents(); if (!bis_system) { diff --git a/src/qt_common/util/game.h b/src/qt_common/util/game.h index 2a7c77ef2d..0d7f03fa86 100644 --- a/src/qt_common/util/game.h +++ b/src/qt_common/util/game.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #ifndef QT_GAME_UTIL_H @@ -29,27 +29,18 @@ enum class ShortcutTarget { Applications, }; -enum class ShortcutMessages{ - Fullscreen = 0, - Success = 1, - Volatile = 2, - Failed = 3 -}; +enum class ShortcutMessages { Fullscreen = 0, Success = 1, Volatile = 2, Failed = 3 }; -bool CreateShortcutLink(const std::filesystem::path& shortcut_path, - const std::string& comment, +bool CreateShortcutLink(const std::filesystem::path& shortcut_path, const std::string& comment, const std::filesystem::path& icon_path, - const std::filesystem::path& command, - const std::string& arguments, - const std::string& categories, - const std::string& keywords, + const std::filesystem::path& command, const std::string& arguments, + const std::string& categories, const std::string& keywords, const std::string& name); -bool MakeShortcutIcoPath(const u64 program_id, - const std::string_view game_file_name, +bool MakeShortcutIcoPath(const u64 program_id, const std::string_view game_file_name, std::filesystem::path& out_icon_path); -void OpenEdenFolder(const Common::FS::EdenPath &path); +void OpenEdenFolder(const Common::FS::EdenPath& path); void OpenRootDataFolder(); void OpenNANDFolder(); void OpenSaveFolder(); @@ -71,16 +62,13 @@ void RemoveCacheStorage(u64 program_id); void ResetMetadata(bool show_message = true); // Shortcuts // -void CreateShortcut(const std::string& game_path, - const u64 program_id, - const std::string& game_title_, - const ShortcutTarget& target, - std::string arguments_, - const bool needs_title); +void CreateShortcut(const std::string& game_path, const u64 program_id, + const std::string& game_title_, const ShortcutTarget& target, + std::string arguments_, const bool needs_title); std::string GetShortcutPath(ShortcutTarget target); void CreateHomeMenuShortcut(ShortcutTarget target); -} +} // namespace QtCommon::Game #endif // QT_GAME_UTIL_H diff --git a/src/qt_common/util/meta.cpp b/src/qt_common/util/meta.cpp index 4c7f1409e3..4607321285 100644 --- a/src/qt_common/util/meta.cpp +++ b/src/qt_common/util/meta.cpp @@ -1,7 +1,6 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "qt_common/util/meta.h" #include "common/common_types.h" #include "core/core.h" #include "core/frontend/applets/cabinet.h" @@ -9,11 +8,11 @@ #include "core/frontend/applets/profile_select.h" #include "core/frontend/applets/software_keyboard.h" #include "core/hle/service/am/frontend/applet_web_browser_types.h" +#include "qt_common/util/meta.h" namespace QtCommon::Meta { -void RegisterMetaTypes() -{ +void RegisterMetaTypes() { // Register integral and floating point types qRegisterMetaType("u8"); qRegisterMetaType("u16"); @@ -72,4 +71,4 @@ void RegisterMetaTypes() qRegisterMetaType("Core::SystemResultStatus"); } -} +} // namespace QtCommon::Meta diff --git a/src/qt_common/util/meta.h b/src/qt_common/util/meta.h index c0a37db983..ae6dbc49d8 100644 --- a/src/qt_common/util/meta.h +++ b/src/qt_common/util/meta.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #ifndef QT_META_H @@ -11,5 +11,5 @@ namespace QtCommon::Meta { // void RegisterMetaTypes(); -} +} // namespace QtCommon::Meta #endif // QT_META_H diff --git a/src/qt_common/util/mod.cpp b/src/qt_common/util/mod.cpp index 1ab05af9b6..38bc8f5be0 100644 --- a/src/qt_common/util/mod.cpp +++ b/src/qt_common/util/mod.cpp @@ -43,7 +43,8 @@ QStringList GetModFolders(const QString& root, const QString& fallbackName) { QString name = QtCommon::Frontend::GetTextInput( tr("Mod Name"), tr("What should this mod be called?"), default_name); - if (name.isEmpty()) return {}; + if (name.isEmpty()) + return {}; // if std_path is empty, frontend_common could not determine mod type and/or name. // so we have to prompt the user and set up the structure ourselves diff --git a/src/qt_common/util/mod.h b/src/qt_common/util/mod.h index 8bdb4bc9dd..2148bed65c 100644 --- a/src/qt_common/util/mod.h +++ b/src/qt_common/util/mod.h @@ -7,8 +7,8 @@ namespace QtCommon::Mod { -QStringList GetModFolders(const QString &root, const QString &fallbackName); +QStringList GetModFolders(const QString& root, const QString& fallbackName); -const QString ExtractMod(const QString &path); +const QString ExtractMod(const QString& path); -} +} // namespace QtCommon::Mod diff --git a/src/qt_common/util/path.cpp b/src/qt_common/util/path.cpp index 73689058c6..a99d3b03ea 100644 --- a/src/qt_common/util/path.cpp +++ b/src/qt_common/util/path.cpp @@ -1,28 +1,24 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "qt_common/util/path.h" #include #include #include +#include #include "common/fs/fs.h" #include "common/fs/path_util.h" #include "qt_common/abstract/frontend.h" -#include +#include "qt_common/util/path.h" namespace QtCommon::Path { -bool OpenShaderCache(u64 program_id, QObject *parent) -{ +bool OpenShaderCache(u64 program_id, QObject* parent) { const auto shader_cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); const auto shader_cache_folder_path{shader_cache_dir / fmt::format("{:016x}", program_id)}; if (!Common::FS::CreateDirs(shader_cache_folder_path)) { - QtCommon::Frontend::ShowMessage(QMessageBox::Warning, - tr("Error Opening Shader Cache"), - tr("Failed to create or open shader cache for this title, " - "ensure your app data directory has write permissions."), - QMessageBox::Ok, - parent); + QtCommon::Frontend::Warning(tr("Error Opening Shader Cache"), + tr("Failed to create or open shader cache for this title, " + "ensure your app data directory has write permissions.")); } const auto shader_path_string{Common::FS::PathToUTF8String(shader_cache_folder_path)}; @@ -30,4 +26,4 @@ bool OpenShaderCache(u64 program_id, QObject *parent) return QDesktopServices::openUrl(QUrl::fromLocalFile(qt_shader_cache_path)); } -} +} // namespace QtCommon::Path diff --git a/src/qt_common/util/path.h b/src/qt_common/util/path.h index 855b06caa9..aff0009f34 100644 --- a/src/qt_common/util/path.h +++ b/src/qt_common/util/path.h @@ -1,12 +1,14 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #ifndef QT_PATH_UTIL_H #define QT_PATH_UTIL_H -#include "common/common_types.h" #include +#include "common/common_types.h" -namespace QtCommon::Path { bool OpenShaderCache(u64 program_id, QObject *parent); } +namespace QtCommon::Path { +bool OpenShaderCache(u64 program_id, QObject* parent); +} #endif // QT_PATH_UTIL_H diff --git a/src/qt_common/util/rom.cpp b/src/qt_common/util/rom.cpp index 1617548db3..c77fa9530d 100644 --- a/src/qt_common/util/rom.cpp +++ b/src/qt_common/util/rom.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include "qt_common/util/rom.h" @@ -7,13 +7,8 @@ namespace QtCommon::ROM { -bool RomFSRawCopy(size_t total_size, - size_t& read_size, - QtProgressCallback callback, - const FileSys::VirtualDir& src, - const FileSys::VirtualDir& dest, - bool full) -{ +bool RomFSRawCopy(size_t total_size, size_t& read_size, QtProgressCallback callback, + const FileSys::VirtualDir& src, const FileSys::VirtualDir& dest, bool full) { // TODO(crueter) // if (src == nullptr || dest == nullptr || !src->IsReadable() || !dest->IsWritable()) // return false; @@ -75,4 +70,4 @@ bool RomFSRawCopy(size_t total_size, return true; } -} +} // namespace QtCommon::ROM diff --git a/src/qt_common/util/rom.h b/src/qt_common/util/rom.h index f76b09753d..5ceadaf46b 100644 --- a/src/qt_common/util/rom.h +++ b/src/qt_common/util/rom.h @@ -1,20 +1,16 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #ifndef QT_ROM_UTIL_H #define QT_ROM_UTIL_H -#include "qt_common/qt_common.h" #include +#include "qt_common/qt_common.h" namespace QtCommon::ROM { -bool RomFSRawCopy(size_t total_size, - size_t& read_size, - QtProgressCallback callback, - const FileSys::VirtualDir& src, - const FileSys::VirtualDir& dest, - bool full); +bool RomFSRawCopy(size_t total_size, size_t& read_size, QtProgressCallback callback, + const FileSys::VirtualDir& src, const FileSys::VirtualDir& dest, bool full); } #endif // QT_ROM_UTIL_H diff --git a/src/shader_recompiler/exception.h b/src/shader_recompiler/exception.h index 322fce6579..b97b68a3b6 100644 --- a/src/shader_recompiler/exception.h +++ b/src/shader_recompiler/exception.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include #include -#include "common/logging/formatter.h" +#include "common/logging.h" namespace Shader { diff --git a/src/tests/common/param_package.cpp b/src/tests/common/param_package.cpp index 41575def44..1840c73380 100644 --- a/src/tests/common/param_package.cpp +++ b/src/tests/common/param_package.cpp @@ -1,15 +1,17 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include -#include "common/logging/backend.h" +#include "common/logging.h" #include "common/param_package.h" namespace Common { TEST_CASE("ParamPackage", "[common]") { - Common::Log::DisableLoggingInTests(); ParamPackage original{ {"abc", "xyz"}, {"def", "42"}, diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index a58a73cd3c..3324682639 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -111,64 +111,14 @@ add_library(video_core STATIC rasterizer_interface.h renderer_base.cpp renderer_base.h + + # Null renderer_null/null_rasterizer.cpp renderer_null/null_rasterizer.h renderer_null/renderer_null.cpp renderer_null/renderer_null.h - renderer_opengl/present/filters.cpp - renderer_opengl/present/filters.h - renderer_opengl/present/fsr.cpp - renderer_opengl/present/fsr.h - renderer_opengl/present/fxaa.cpp - renderer_opengl/present/fxaa.h - renderer_opengl/present/layer.cpp - renderer_opengl/present/layer.h - renderer_opengl/present/present_uniforms.h - renderer_opengl/present/smaa.cpp - renderer_opengl/present/smaa.h - renderer_opengl/present/util.h - renderer_opengl/present/window_adapt_pass.cpp - renderer_opengl/present/window_adapt_pass.h - renderer_opengl/blit_image.cpp - renderer_opengl/blit_image.h - renderer_opengl/gl_blit_screen.cpp - renderer_opengl/gl_blit_screen.h - renderer_opengl/gl_buffer_cache_base.cpp - renderer_opengl/gl_buffer_cache.cpp - renderer_opengl/gl_buffer_cache.h - renderer_opengl/gl_compute_pipeline.cpp - renderer_opengl/gl_compute_pipeline.h - renderer_opengl/gl_device.cpp - renderer_opengl/gl_device.h - renderer_opengl/gl_fence_manager.cpp - renderer_opengl/gl_fence_manager.h - renderer_opengl/gl_graphics_pipeline.cpp - renderer_opengl/gl_graphics_pipeline.h - renderer_opengl/gl_rasterizer.cpp - renderer_opengl/gl_rasterizer.h - renderer_opengl/gl_resource_manager.cpp - renderer_opengl/gl_resource_manager.h - renderer_opengl/gl_shader_cache.cpp - renderer_opengl/gl_shader_cache.h - renderer_opengl/gl_shader_manager.cpp - renderer_opengl/gl_shader_manager.h - renderer_opengl/gl_shader_context.h - renderer_opengl/gl_shader_util.cpp - renderer_opengl/gl_shader_util.h - renderer_opengl/gl_state_tracker.cpp - renderer_opengl/gl_state_tracker.h - renderer_opengl/gl_staging_buffer_pool.cpp - renderer_opengl/gl_staging_buffer_pool.h - renderer_opengl/gl_texture_cache.cpp - renderer_opengl/gl_texture_cache.h - renderer_opengl/gl_texture_cache_base.cpp - renderer_opengl/gl_query_cache.cpp - renderer_opengl/gl_query_cache.h - renderer_opengl/maxwell_to_gl.h - renderer_opengl/renderer_opengl.cpp - renderer_opengl/renderer_opengl.h - renderer_opengl/util_shaders.cpp - renderer_opengl/util_shaders.h + + # Vulkan renderer_vulkan/present/anti_alias_pass.h renderer_vulkan/present/filters.cpp renderer_vulkan/present/filters.h @@ -244,6 +194,25 @@ add_library(video_core STATIC renderer_vulkan/vk_turbo_mode.h renderer_vulkan/vk_update_descriptor.cpp renderer_vulkan/vk_update_descriptor.h + vulkan_common/vulkan_debug_callback.cpp + vulkan_common/vulkan_debug_callback.h + vulkan_common/vulkan_device.cpp + vulkan_common/vulkan_device.h + vulkan_common/vulkan_instance.cpp + vulkan_common/vulkan_instance.h + vulkan_common/vulkan_library.cpp + vulkan_common/vulkan_library.h + vulkan_common/vulkan_memory_allocator.cpp + vulkan_common/vulkan_memory_allocator.h + vulkan_common/vulkan_surface.cpp + vulkan_common/vulkan_surface.h + vulkan_common/vulkan_wrapper.cpp + vulkan_common/vulkan_wrapper.h + vulkan_common/nsight_aftermath_tracker.cpp + vulkan_common/nsight_aftermath_tracker.h + vulkan_common/vma.h + vulkan_common/vulkan.h + shader_cache.cpp shader_cache.h shader_environment.cpp @@ -293,26 +262,67 @@ add_library(video_core STATIC transform_feedback.h video_core.cpp video_core.h - vulkan_common/vulkan_debug_callback.cpp - vulkan_common/vulkan_debug_callback.h - vulkan_common/vulkan_device.cpp - vulkan_common/vulkan_device.h - vulkan_common/vulkan_instance.cpp - vulkan_common/vulkan_instance.h - vulkan_common/vulkan_library.cpp - vulkan_common/vulkan_library.h - vulkan_common/vulkan_memory_allocator.cpp - vulkan_common/vulkan_memory_allocator.h - vulkan_common/vulkan_surface.cpp - vulkan_common/vulkan_surface.h - vulkan_common/vulkan_wrapper.cpp - vulkan_common/vulkan_wrapper.h - vulkan_common/nsight_aftermath_tracker.cpp - vulkan_common/nsight_aftermath_tracker.h - vulkan_common/vma.h - vulkan_common/vulkan.h ) +if (ENABLE_OPENGL) + target_sources(video_core PRIVATE + renderer_opengl/present/filters.cpp + renderer_opengl/present/filters.h + renderer_opengl/present/fsr.cpp + renderer_opengl/present/fsr.h + renderer_opengl/present/fxaa.cpp + renderer_opengl/present/fxaa.h + renderer_opengl/present/layer.cpp + renderer_opengl/present/layer.h + renderer_opengl/present/present_uniforms.h + renderer_opengl/present/smaa.cpp + renderer_opengl/present/smaa.h + renderer_opengl/present/util.h + renderer_opengl/present/window_adapt_pass.cpp + renderer_opengl/present/window_adapt_pass.h + renderer_opengl/blit_image.cpp + renderer_opengl/blit_image.h + renderer_opengl/gl_blit_screen.cpp + renderer_opengl/gl_blit_screen.h + renderer_opengl/gl_buffer_cache_base.cpp + renderer_opengl/gl_buffer_cache.cpp + renderer_opengl/gl_buffer_cache.h + renderer_opengl/gl_compute_pipeline.cpp + renderer_opengl/gl_compute_pipeline.h + renderer_opengl/gl_device.cpp + renderer_opengl/gl_device.h + renderer_opengl/gl_fence_manager.cpp + renderer_opengl/gl_fence_manager.h + renderer_opengl/gl_graphics_pipeline.cpp + renderer_opengl/gl_graphics_pipeline.h + renderer_opengl/gl_rasterizer.cpp + renderer_opengl/gl_rasterizer.h + renderer_opengl/gl_resource_manager.cpp + renderer_opengl/gl_resource_manager.h + renderer_opengl/gl_shader_cache.cpp + renderer_opengl/gl_shader_cache.h + renderer_opengl/gl_shader_manager.cpp + renderer_opengl/gl_shader_manager.h + renderer_opengl/gl_shader_context.h + renderer_opengl/gl_shader_util.cpp + renderer_opengl/gl_shader_util.h + renderer_opengl/gl_state_tracker.cpp + renderer_opengl/gl_state_tracker.h + renderer_opengl/gl_staging_buffer_pool.cpp + renderer_opengl/gl_staging_buffer_pool.h + renderer_opengl/gl_texture_cache.cpp + renderer_opengl/gl_texture_cache.h + renderer_opengl/gl_texture_cache_base.cpp + renderer_opengl/gl_query_cache.cpp + renderer_opengl/gl_query_cache.h + renderer_opengl/maxwell_to_gl.h + renderer_opengl/renderer_opengl.cpp + renderer_opengl/renderer_opengl.h + renderer_opengl/util_shaders.cpp + renderer_opengl/util_shaders.h + ) +endif() + target_link_libraries(video_core PUBLIC common core) target_link_libraries(video_core PUBLIC glad shader_recompiler stb bc_decoder gpu_logging) @@ -371,6 +381,10 @@ else() endif() endif() +if (ENABLE_OPENGL) + target_compile_definitions(video_core PUBLIC HAS_OPENGL) +endif() + if (ARCHITECTURE_x86_64) target_link_libraries(video_core PUBLIC xbyak::xbyak) endif() diff --git a/src/video_core/engines/fermi_2d.cpp b/src/video_core/engines/fermi_2d.cpp index 17fbe9961c..b442c5cc76 100644 --- a/src/video_core/engines/fermi_2d.cpp +++ b/src/video_core/engines/fermi_2d.cpp @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "video_core/engines/fermi_2d.h" #include "video_core/engines/sw_blitter/blitter.h" #include "video_core/memory_manager.h" diff --git a/src/video_core/engines/kepler_compute.cpp b/src/video_core/engines/kepler_compute.cpp index cd61ab222b..7b4efeb1e0 100644 --- a/src/video_core/engines/kepler_compute.cpp +++ b/src/video_core/engines/kepler_compute.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "video_core/engines/kepler_compute.h" #include "video_core/engines/maxwell_3d.h" diff --git a/src/video_core/engines/kepler_memory.cpp b/src/video_core/engines/kepler_memory.cpp index c026801a35..5d4c4720d3 100644 --- a/src/video_core/engines/kepler_memory.cpp +++ b/src/video_core/engines/kepler_memory.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "video_core/engines/kepler_memory.h" #include "video_core/engines/maxwell_3d.h" diff --git a/src/video_core/engines/maxwell_dma.cpp b/src/video_core/engines/maxwell_dma.cpp index 747759bf41..089d118a09 100644 --- a/src/video_core/engines/maxwell_dma.cpp +++ b/src/video_core/engines/maxwell_dma.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -6,7 +6,7 @@ #include "common/algorithm.h" #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include #include "common/settings.h" #include "core/core.h" diff --git a/src/video_core/engines/nv01_timer.h b/src/video_core/engines/nv01_timer.h index a8e60f9f53..add9886f41 100644 --- a/src/video_core/engines/nv01_timer.h +++ b/src/video_core/engines/nv01_timer.h @@ -11,7 +11,7 @@ #include "common/bit_field.h" #include "common/common_funcs.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "video_core/engines/engine_interface.h" #include "video_core/engines/engine_upload.h" diff --git a/src/video_core/engines/puller.cpp b/src/video_core/engines/puller.cpp index b5b4e5d7fa..4030f93d49 100644 --- a/src/video_core/engines/puller.cpp +++ b/src/video_core/engines/puller.cpp @@ -5,7 +5,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core.h" #include "video_core/control/channel_state.h" diff --git a/src/video_core/gpu_logging/freedreno_debug.cpp b/src/video_core/gpu_logging/freedreno_debug.cpp index 14ffe04f78..8b65bd0cd5 100644 --- a/src/video_core/gpu_logging/freedreno_debug.cpp +++ b/src/video_core/gpu_logging/freedreno_debug.cpp @@ -4,7 +4,7 @@ #ifdef ANDROID #include "video_core/gpu_logging/freedreno_debug.h" -#include "common/logging/log.h" +#include "common/logging.h" #include diff --git a/src/video_core/gpu_logging/gpu_logging.cpp b/src/video_core/gpu_logging/gpu_logging.cpp index 059e8a6c06..5f5e376e99 100644 --- a/src/video_core/gpu_logging/gpu_logging.cpp +++ b/src/video_core/gpu_logging/gpu_logging.cpp @@ -10,7 +10,7 @@ #include "common/fs/fs.h" #include "common/fs/path_util.h" #include "common/literals.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" namespace GPU::Logging { diff --git a/src/video_core/gpu_logging/qualcomm_debug.cpp b/src/video_core/gpu_logging/qualcomm_debug.cpp index 4862bc2349..272b3e4de1 100644 --- a/src/video_core/gpu_logging/qualcomm_debug.cpp +++ b/src/video_core/gpu_logging/qualcomm_debug.cpp @@ -2,7 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "video_core/gpu_logging/qualcomm_debug.h" -#include "common/logging/log.h" +#include "common/logging.h" namespace GPU::Logging::Qualcomm { diff --git a/src/video_core/host1x/ffmpeg/ffmpeg.cpp b/src/video_core/host1x/ffmpeg/ffmpeg.cpp index 011e6d45a0..486fd9365c 100644 --- a/src/video_core/host1x/ffmpeg/ffmpeg.cpp +++ b/src/video_core/host1x/ffmpeg/ffmpeg.cpp @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "common/settings.h" #include "core/memory.h" diff --git a/src/video_core/host1x/vic.cpp b/src/video_core/host1x/vic.cpp index 02a9aa61e0..37972c045f 100644 --- a/src/video_core/host1x/vic.cpp +++ b/src/video_core/host1x/vic.cpp @@ -26,7 +26,7 @@ extern "C" { #include "common/alignment.h" #include "common/assert.h" #include "common/bit_field.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/polyfill_thread.h" #include "common/settings.h" diff --git a/src/video_core/macro.cpp b/src/video_core/macro.cpp index 0d1fe0a52b..66cea5afbd 100644 --- a/src/video_core/macro.cpp +++ b/src/video_core/macro.cpp @@ -38,7 +38,7 @@ #include "common/assert.h" #include "common/bit_field.h" -#include "common/logging/log.h" +#include "common/logging.h" #ifdef ARCHITECTURE_x86_64 #include "common/x64/xbyak_abi.h" #include "common/x64/xbyak_util.h" diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index be97f5ab05..41806bfd29 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -8,7 +8,7 @@ #include "common/alignment.h" #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" #include "core/hle/kernel/k_page_table.h" #include "core/hle/kernel/k_process.h" diff --git a/src/video_core/query_cache/query_cache.h b/src/video_core/query_cache/query_cache.h index 3aeeb8dcab..4ed42487aa 100644 --- a/src/video_core/query_cache/query_cache.h +++ b/src/video_core/query_cache/query_cache.h @@ -15,7 +15,7 @@ #include "common/assert.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "common/settings.h" #include "video_core/engines/maxwell_3d.h" diff --git a/src/video_core/renderer_base.cpp b/src/video_core/renderer_base.cpp index 4002fa72bb..9b6fb69af3 100644 --- a/src/video_core/renderer_base.cpp +++ b/src/video_core/renderer_base.cpp @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2015 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "core/frontend/emu_window.h" #include "core/frontend/graphics_context.h" #include "video_core/renderer_base.h" diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp index b49568b77d..0829e6dd33 100644 --- a/src/video_core/renderer_opengl/gl_device.cpp +++ b/src/video_core/renderer_opengl/gl_device.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -16,7 +16,7 @@ #include #include "common/literals.h" -#include "common/logging/log.h" +#include "common/logging.h" #include #include "common/settings.h" #include "shader_recompiler/stage.h" diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 602509bfdb..e268c4d2c6 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2015 Citra Emulator Project @@ -14,7 +14,7 @@ #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/math_util.h" #include "common/scope_exit.h" #include "common/settings.h" diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index 70a13d6a69..aac7732005 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp @@ -15,7 +15,7 @@ #include "common/assert.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/thread_worker.h" #include "shader_recompiler/backend/glasm/emit_glasm.h" diff --git a/src/video_core/renderer_opengl/gl_shader_util.cpp b/src/video_core/renderer_opengl/gl_shader_util.cpp index a0d9d10ef0..bdebf4da47 100644 --- a/src/video_core/renderer_opengl/gl_shader_util.cpp +++ b/src/video_core/renderer_opengl/gl_shader_util.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "video_core/renderer_opengl/gl_shader_util.h" diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 3412b1d998..1c72147113 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2014 Citra Emulator Project @@ -12,7 +12,7 @@ #include #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core_timing.h" #include "core/frontend/emu_window.h" diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp index 024c72b38e..930f06daf6 100644 --- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp +++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -8,7 +8,7 @@ #include "common/assert.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "video_core/engines/maxwell_3d.h" #include "video_core/renderer_vulkan/maxwell_to_vk.h" diff --git a/src/video_core/renderer_vulkan/pipeline_statistics.cpp b/src/video_core/renderer_vulkan/pipeline_statistics.cpp index 545971bd88..ad288436a8 100644 --- a/src/video_core/renderer_vulkan/pipeline_statistics.cpp +++ b/src/video_core/renderer_vulkan/pipeline_statistics.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ #include #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "video_core/renderer_vulkan/pipeline_statistics.h" #include "video_core/vulkan_common/vulkan_device.h" #include "video_core/vulkan_common/vulkan_wrapper.h" diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 1725bc8ccc..010cfd225d 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -14,7 +14,7 @@ #include -#include "common/logging/log.h" +#include "common/logging.h" #include #include "common/scope_exit.h" #include "common/settings.h" diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index c842cce709..74f06427dd 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp @@ -109,14 +109,6 @@ VkBufferView Buffer::View(u32 offset, u32 size, VideoCore::Surface::PixelFormat // Null buffer not supported, adjust offset and size offset = 0; size = 0; - } else { - // Align offset down to minTexelBufferOffsetAlignment - const u32 alignment = static_cast(device->GetMinTexelBufferOffsetAlignment()); - if (alignment > 1) { - const u32 aligned_offset = offset & ~(alignment - 1); - size += offset - aligned_offset; - offset = aligned_offset; - } } const auto it{std::ranges::find_if(views, [offset, size, format](const BufferView& view) { return offset == view.offset && size == view.size && format == view.format; diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index 7cdb3acadd..656e2c7317 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -880,8 +880,6 @@ private: } has_flushed_end_pending = false; - // Refresh buffer state before ending transform feedback to ensure counters_count is up-to-date. - UpdateBuffers(); if (buffers_count == 0) { LOG_DEBUG(Render_Vulkan, "EndTransformFeedbackEXT called with no counters (buffers_count=0)"); scheduler.Record([](vk::CommandBuffer cmdbuf) { diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 60b899a811..f867980a6f 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -14,7 +14,7 @@ #include "video_core/renderer_vulkan/renderer_vulkan.h" #include "common/assert.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "common/settings.h" #include "video_core/buffer_cache/buffer_cache.h" diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index cd8f948d8b..5d55cf551b 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -9,7 +9,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/settings_enums.h" #include "video_core/renderer_vulkan/vk_scheduler.h" diff --git a/src/video_core/renderer_vulkan/vk_update_descriptor.cpp b/src/video_core/renderer_vulkan/vk_update_descriptor.cpp index 0630ebda5e..aa7de7b632 100644 --- a/src/video_core/renderer_vulkan/vk_update_descriptor.cpp +++ b/src/video_core/renderer_vulkan/vk_update_descriptor.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "video_core/renderer_vulkan/vk_scheduler.h" #include "video_core/renderer_vulkan/vk_update_descriptor.h" #include "video_core/vulkan_common/vulkan_device.h" diff --git a/src/video_core/shader_environment.cpp b/src/video_core/shader_environment.cpp index 85cdb948f3..5f5633d4d1 100644 --- a/src/video_core/shader_environment.cpp +++ b/src/video_core/shader_environment.cpp @@ -17,7 +17,7 @@ #include "common/div_ceil.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include #include "shader_recompiler/environment.h" #include "video_core/engines/kepler_compute.h" diff --git a/src/video_core/surface.h b/src/video_core/surface.h index 8916510f83..a97bcb39b5 100644 --- a/src/video_core/surface.h +++ b/src/video_core/surface.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +9,7 @@ #include #include "common/assert.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "video_core/gpu.h" #include "video_core/textures/texture.h" diff --git a/src/video_core/texture_cache/format_lookup_table.cpp b/src/video_core/texture_cache/format_lookup_table.cpp index 8c774f512c..a9e03b375d 100644 --- a/src/video_core/texture_cache/format_lookup_table.cpp +++ b/src/video_core/texture_cache/format_lookup_table.cpp @@ -1,8 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "video_core/texture_cache/format_lookup_table.h" namespace VideoCommon { diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index e32f21d2ce..71210ffe6e 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -70,10 +70,14 @@ TextureCache

::TextureCache(Runtime& runtime_, Tegra::MaxwellDeviceMemoryManag (std::max)((std::min)(device_local_memory - min_vacancy_critical, min_spacing_critical), DEFAULT_CRITICAL_MEMORY)); minimum_memory = static_cast((device_local_memory - mem_threshold) / 2); + + lowmemorydevice = false; } else { expected_memory = DEFAULT_EXPECTED_MEMORY + 512_MiB; critical_memory = DEFAULT_CRITICAL_MEMORY + 1_GiB; minimum_memory = 0; + + lowmemorydevice = true; } const bool gpu_unswizzle_enabled = Settings::values.gpu_unswizzle_enabled.GetValue(); @@ -118,46 +122,102 @@ void TextureCache

::RunGarbageCollector() { bool aggressive_mode = false; u64 ticks_to_destroy = 0; size_t num_iterations = 0; + const auto Configure = [&](bool allow_aggressive) { high_priority_mode = total_used_memory >= expected_memory; aggressive_mode = allow_aggressive && total_used_memory >= critical_memory; ticks_to_destroy = aggressive_mode ? 10ULL : high_priority_mode ? 25ULL : 50ULL; num_iterations = aggressive_mode ? 40 : (high_priority_mode ? 20 : 10); }; - const auto Cleanup = [this, &num_iterations, &high_priority_mode, &aggressive_mode](ImageId image_id) { + + const auto Cleanup = [this, &num_iterations, &high_priority_mode, + &aggressive_mode](ImageId image_id) { if (num_iterations == 0) { return true; } --num_iterations; auto& image = slot_images[image_id]; - if (True(image.flags & ImageFlagBits::IsDecoding)) { + + // Never delete recently allocated sparse textures (within 3 frames) + const bool is_recently_allocated = image.allocation_tick >= frame_tick - 3; + if (is_recently_allocated && image.info.is_sparse) { return false; } - const bool must_download = image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap); - if (must_download && !image.info.is_sparse) { + + if (True(image.flags & ImageFlagBits::IsDecoding)) { + // This image is still being decoded, deleting it will invalidate the slot + // used by the async decoder thread. + return false; + } + + // Prioritize large sparse textures for cleanup + const bool is_large_sparse = lowmemorydevice && + image.info.is_sparse && + image.guest_size_bytes >= 256_MiB; + + if (!aggressive_mode && !is_large_sparse && + True(image.flags & ImageFlagBits::CostlyLoad)) { + return false; + } + + const bool must_download = + image.IsSafeDownload() && False(image.flags & ImageFlagBits::BadOverlap); + if (!high_priority_mode && !is_large_sparse && must_download) { + return false; + } + + if (must_download && !is_large_sparse) { auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes); const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); image.DownloadMemory(map, copies); runtime.Finish(); - SwizzleImage(*gpu_memory, image.gpu_addr, image.info, copies, map.mapped_span, swizzle_data_buffer); + SwizzleImage(*gpu_memory, image.gpu_addr, image.info, copies, map.mapped_span, + swizzle_data_buffer); } + if (True(image.flags & ImageFlagBits::Tracked)) { UntrackImage(image, image_id); } UnregisterImage(image_id); - DeleteImage(image_id, (frame_tick - image.scale_tick) > 5 || aggressive_mode); - if (aggressive_mode && total_used_memory < critical_memory) { - num_iterations >>= 2; - aggressive_mode = false; - } - if (high_priority_mode && total_used_memory < expected_memory) { - num_iterations >>= 1; - high_priority_mode = false; + DeleteImage(image_id, image.scale_tick > frame_tick + 5); + + if (total_used_memory < critical_memory) { + if (aggressive_mode) { + // Sink the aggresiveness. + num_iterations >>= 2; + aggressive_mode = false; + return false; + } + if (high_priority_mode && total_used_memory < expected_memory) { + num_iterations >>= 1; + high_priority_mode = false; + } } return false; }; + + // Aggressively clear massive sparse textures + if (total_used_memory >= expected_memory) { + lru_cache.ForEachItemBelow(frame_tick, [&](ImageId image_id) { + auto& image = slot_images[image_id]; + // Only target sparse textures that are old enough + if (lowmemorydevice && + image.info.is_sparse && + image.guest_size_bytes >= 256_MiB && + image.allocation_tick < frame_tick - 3) { + LOG_DEBUG(HW_GPU, "GC targeting old sparse texture at 0x{:X} ({} MiB, age: {} frames)", + image.gpu_addr, image.guest_size_bytes / (1024 * 1024), + frame_tick - image.allocation_tick); + return Cleanup(image_id); + } + return false; + }); + } + Configure(false); lru_cache.ForEachItemBelow(frame_tick - ticks_to_destroy, Cleanup); + + // If pressure is still too high, prune aggressively. if (total_used_memory >= critical_memory) { Configure(true); lru_cache.ForEachItemBelow(frame_tick - ticks_to_destroy, Cleanup); @@ -1136,6 +1196,9 @@ void TextureCache

::RefreshContents(Image& image, ImageId image_id) { } image.flags &= ~ImageFlagBits::CpuModified; + if( lowmemorydevice && image.info.format == PixelFormat::BC1_RGBA_UNORM && MapSizeBytes(image) >= 256_MiB ) { + return; + } TrackImage(image, image_id); @@ -1556,6 +1619,39 @@ ImageId TextureCache

::InsertImage(const ImageInfo& info, GPUVAddr gpu_addr, } } ASSERT_MSG(cpu_addr, "Tried to insert an image to an invalid gpu_addr=0x{:x}", gpu_addr); + + // For large sparse textures, aggressively clean up old allocations at same address + if (lowmemorydevice && info.is_sparse && CalculateGuestSizeInBytes(info) >= 256_MiB) { + const auto alloc_it = image_allocs_table.find(gpu_addr); + if (alloc_it != image_allocs_table.end()) { + const ImageAllocId alloc_id = alloc_it->second; + auto& alloc_images = slot_image_allocs[alloc_id].images; + + // Collect old images at this address that were created more than 2 frames ago + boost::container::small_vector to_delete; + for (ImageId old_image_id : alloc_images) { + Image& old_image = slot_images[old_image_id]; + if (old_image.info.is_sparse && + old_image.gpu_addr == gpu_addr && + old_image.allocation_tick < frame_tick - 2) { // Try not to delete fresh textures + to_delete.push_back(old_image_id); + } + } + + // Delete old images immediately + for (ImageId old_id : to_delete) { + Image& old_image = slot_images[old_id]; + LOG_DEBUG(HW_GPU, "Immediately deleting old sparse texture at 0x{:X} ({} MiB)", + gpu_addr, old_image.guest_size_bytes / (1024 * 1024)); + if (True(old_image.flags & ImageFlagBits::Tracked)) { + UntrackImage(old_image, old_id); + } + UnregisterImage(old_id); + DeleteImage(old_id, true); + } + } + } + const ImageId image_id = JoinImages(info, gpu_addr, *cpu_addr); const Image& image = slot_images[image_id]; // Using "image.gpu_addr" instead of "gpu_addr" is important because it might be different @@ -1571,6 +1667,27 @@ template ImageId TextureCache

::JoinImages(const ImageInfo& info, GPUVAddr gpu_addr, DAddr cpu_addr) { ImageInfo new_info = info; const size_t size_bytes = CalculateGuestSizeInBytes(new_info); + + // Proactive cleanup for large sparse texture allocations + if (lowmemorydevice && new_info.is_sparse && size_bytes >= 256_MiB) { + const u64 estimated_alloc_size = size_bytes; + + if (total_used_memory + estimated_alloc_size >= critical_memory) { + LOG_DEBUG(HW_GPU, "Large sparse texture allocation ({} MiB) - running aggressive GC. " + "Current memory: {} MiB, Critical: {} MiB", + size_bytes / (1024 * 1024), + total_used_memory / (1024 * 1024), + critical_memory / (1024 * 1024)); + RunGarbageCollector(); + + // If still over threshold after GC, try one more aggressive pass + if (total_used_memory + estimated_alloc_size >= critical_memory) { + LOG_DEBUG(HW_GPU, "Still critically low on memory, running second GC pass"); + RunGarbageCollector(); + } + } + } + const bool broken_views = runtime.HasBrokenTextureViewFormats(); const bool native_bgr = runtime.HasNativeBgr(); join_overlap_ids.clear(); diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h index 47f52c5c99..4b4061f21d 100644 --- a/src/video_core/texture_cache/texture_cache_base.h +++ b/src/video_core/texture_cache/texture_cache_base.h @@ -478,6 +478,7 @@ private: u64 minimum_memory; u64 expected_memory; u64 critical_memory; + bool lowmemorydevice = false; size_t gpu_unswizzle_maxsize = 0; size_t swizzle_chunk_size = 0; u32 swizzle_slices_per_batch = 0; diff --git a/src/video_core/video_core.cpp b/src/video_core/video_core.cpp index 4a9751e208..1ac7a0bc35 100644 --- a/src/video_core/video_core.cpp +++ b/src/video_core/video_core.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2014 Citra Emulator Project @@ -6,29 +6,32 @@ #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core.h" +#include "core/frontend/emu_window.h" +#include "core/frontend/graphics_context.h" #include "video_core/host1x/gpu_device_memory_manager.h" #include "video_core/host1x/host1x.h" #include "video_core/renderer_base.h" #include "video_core/renderer_null/renderer_null.h" +#ifdef HAS_OPENGL #include "video_core/renderer_opengl/renderer_opengl.h" +#endif #include "video_core/renderer_vulkan/renderer_vulkan.h" #include "video_core/video_core.h" namespace { -std::unique_ptr CreateRenderer( - Core::System& system, Core::Frontend::EmuWindow& emu_window, Tegra::GPU& gpu, - std::unique_ptr context) { - auto& device_memory = system.Host1x().MemoryManager(); - +std::unique_ptr CreateRenderer(Core::System& system, Core::Frontend::EmuWindow& emu_window, Tegra::GPU& gpu, std::unique_ptr context) { + [[maybe_unused]] auto& device_memory = system.Host1x().MemoryManager(); switch (Settings::values.renderer_backend.GetValue()) { +#ifdef HAS_OPENGL case Settings::RendererBackend::OpenGL_GLSL: case Settings::RendererBackend::OpenGL_GLASM: case Settings::RendererBackend::OpenGL_SPIRV: return std::make_unique(emu_window, device_memory, gpu, std::move(context)); +#endif case Settings::RendererBackend::Vulkan: return std::make_unique(emu_window, device_memory, gpu, std::move(context)); case Settings::RendererBackend::Null: diff --git a/src/video_core/vulkan_common/nsight_aftermath_tracker.cpp b/src/video_core/vulkan_common/nsight_aftermath_tracker.cpp index 9d57e3635f..3bfb7d4bdc 100644 --- a/src/video_core/vulkan_common/nsight_aftermath_tracker.cpp +++ b/src/video_core/vulkan_common/nsight_aftermath_tracker.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -16,7 +19,7 @@ #include "common/fs/file.h" #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scope_exit.h" #include "video_core/vulkan_common/nsight_aftermath_tracker.h" diff --git a/src/video_core/vulkan_common/vulkan_debug_callback.cpp b/src/video_core/vulkan_common/vulkan_debug_callback.cpp index cd6653c86e..d1bd009c8f 100644 --- a/src/video_core/vulkan_common/vulkan_debug_callback.cpp +++ b/src/video_core/vulkan_common/vulkan_debug_callback.cpp @@ -2,7 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "video_core/vulkan_common/vulkan_debug_callback.h" #include "video_core/gpu_logging/gpu_logging.h" diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index d29a8cd3f3..caf91104df 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -14,7 +14,7 @@ #include #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "video_core/vulkan_common/vulkan_wrapper.h" @@ -318,11 +318,6 @@ public: return properties.properties.limits.minStorageBufferOffsetAlignment; } - /// Returns texel buffer offset alignment requirement. - VkDeviceSize GetMinTexelBufferOffsetAlignment() const { - return properties.properties.limits.minTexelBufferOffsetAlignment; - } - /// Returns the maximum range for storage buffers. VkDeviceSize GetMaxStorageBufferRange() const { return properties.properties.limits.maxStorageBufferRange; diff --git a/src/video_core/vulkan_common/vulkan_instance.cpp b/src/video_core/vulkan_common/vulkan_instance.cpp index 47e18dd6a5..b1a53ab4f3 100644 --- a/src/video_core/vulkan_common/vulkan_instance.cpp +++ b/src/video_core/vulkan_common/vulkan_instance.cpp @@ -12,7 +12,7 @@ #include "common/common_types.h" #include "common/dynamic_library.h" -#include "common/logging/log.h" +#include "common/logging.h" #include #include #include "core/frontend/emu_window.h" diff --git a/src/video_core/vulkan_common/vulkan_library.cpp b/src/video_core/vulkan_common/vulkan_library.cpp index 0130f6a0d9..271b622e65 100644 --- a/src/video_core/vulkan_common/vulkan_library.cpp +++ b/src/video_core/vulkan_common/vulkan_library.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #include "common/dynamic_library.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "video_core/vulkan_common/vulkan_library.h" namespace Vulkan { diff --git a/src/video_core/vulkan_common/vulkan_memory_allocator.cpp b/src/video_core/vulkan_common/vulkan_memory_allocator.cpp index ab93f256c0..9c7cd8a61f 100644 --- a/src/video_core/vulkan_common/vulkan_memory_allocator.cpp +++ b/src/video_core/vulkan_common/vulkan_memory_allocator.cpp @@ -16,7 +16,7 @@ #include "common/assert.h" #include "common/common_types.h" #include "common/literals.h" -#include "common/logging/log.h" +#include "common/logging.h" #include #include "video_core/vulkan_common/vma.h" #include "video_core/vulkan_common/vulkan_device.h" diff --git a/src/video_core/vulkan_common/vulkan_surface.cpp b/src/video_core/vulkan_common/vulkan_surface.cpp index 761b7759c8..8b9dcb4d42 100644 --- a/src/video_core/vulkan_common/vulkan_surface.cpp +++ b/src/video_core/vulkan_common/vulkan_surface.cpp @@ -4,7 +4,7 @@ // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging/log.h" +#include "common/logging.h" #include "core/frontend/emu_window.h" #include "video_core/vulkan_common/vulkan_surface.h" #include "video_core/vulkan_common/vulkan_wrapper.h" diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 926f48de89..a2fa2b50c6 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -11,7 +11,7 @@ #include #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "video_core/vulkan_common/vk_enum_string_helper.h" #include "video_core/vulkan_common/vma.h" #include "video_core/vulkan_common/vulkan_wrapper.h" diff --git a/src/web_service/announce_room_json.cpp b/src/web_service/announce_room_json.cpp index f1020a5b88..b80caa49dc 100644 --- a/src/web_service/announce_room_json.cpp +++ b/src/web_service/announce_room_json.cpp @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include #include "common/detached_tasks.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "web_service/announce_room_json.h" #include "web_service/web_backend.h" diff --git a/src/web_service/verify_user_jwt.cpp b/src/web_service/verify_user_jwt.cpp index f88f676206..f9b310e235 100644 --- a/src/web_service/verify_user_jwt.cpp +++ b/src/web_service/verify_user_jwt.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,7 +15,7 @@ #endif #include -#include "common/logging/log.h" +#include "common/logging.h" #include "web_service/verify_user_jwt.h" #include "web_service/web_backend.h" #include "web_service/web_result.h" diff --git a/src/web_service/web_backend.cpp b/src/web_service/web_backend.cpp index 1dfe6039da..60b11fff5a 100644 --- a/src/web_service/web_backend.cpp +++ b/src/web_service/web_backend.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2017 Citra Emulator Project @@ -25,7 +25,7 @@ #include #endif -#include "common/logging/log.h" +#include "common/logging.h" #include "web_service/web_backend.h" #include "web_service/web_result.h" diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 99fb2fec15..982c0eb196 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -244,6 +244,7 @@ add_executable(yuzu configuration/addon/mod_select_dialog.h configuration/addon/mod_select_dialog.cpp configuration/addon/mod_select_dialog.ui render/performance_overlay.h render/performance_overlay.cpp render/performance_overlay.ui + libqt_common.h libqt_common.cpp ) set_target_properties(yuzu PROPERTIES OUTPUT_NAME "eden") diff --git a/src/yuzu/about_dialog.cpp b/src/yuzu/about_dialog.cpp index 9f7597f471..2694f421cb 100644 --- a/src/yuzu/about_dialog.cpp +++ b/src/yuzu/about_dialog.cpp @@ -1,29 +1,24 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "yuzu/about_dialog.h" #include +#include #include "common/scm_rev.h" #include "ui_aboutdialog.h" -#include +#include "yuzu/about_dialog.h" AboutDialog::AboutDialog(QWidget* parent) - : QDialog(parent) - , ui{std::make_unique()} -{ + : QDialog(parent), ui{std::make_unique()} { static const std::string build_id = std::string{Common::g_build_id}; - static const std::string yuzu_build = fmt::format("{} | {} | {}", - std::string{Common::g_build_name}, - std::string{Common::g_build_version}, - std::string{Common::g_compiler_id} - ); + static const std::string yuzu_build = + fmt::format("{} | {} | {}", std::string{Common::g_build_name}, + std::string{Common::g_build_version}, std::string{Common::g_compiler_id}); - const auto override_build = fmt::format(fmt::runtime( - std::string(Common::g_title_bar_format_idle)), - build_id); + const auto override_build = + fmt::format(fmt::runtime(std::string(Common::g_title_bar_format_idle)), build_id); const auto yuzu_build_version = override_build.empty() ? yuzu_build : override_build; ui->setupUi(this); diff --git a/src/yuzu/applets/qt_controller.cpp b/src/yuzu/applets/qt_controller.cpp index aa210caf77..e7fa93a793 100644 --- a/src/yuzu/applets/qt_controller.cpp +++ b/src/yuzu/applets/qt_controller.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -17,8 +17,8 @@ #include "hid_core/hid_core.h" #include "hid_core/hid_types.h" #include "hid_core/resources/npad/npad.h" -#include "ui_qt_controller.h" #include "qt_common/qt_compat.h" +#include "ui_qt_controller.h" #include "yuzu/applets/qt_controller.h" #include "yuzu/configuration/configure_input.h" #include "yuzu/configuration/configure_input_profile_dialog.h" @@ -188,14 +188,15 @@ QtControllerSelectorDialog::QtControllerSelectorDialog( CheckIfParametersMet(); }); - connect(connected_controller_checkboxes[i], &QCheckBox::STATE_CHANGED, [this, i](int state) { - player_groupboxes[i]->setChecked(state == Qt::Checked); - UpdateControllerIcon(i); - UpdateControllerState(i); - UpdateLEDPattern(i); - UpdateBorderColor(i); - CheckIfParametersMet(); - }); + connect(connected_controller_checkboxes[i], &QCheckBox::STATE_CHANGED, + [this, i](int state) { + player_groupboxes[i]->setChecked(state == Qt::Checked); + UpdateControllerIcon(i); + UpdateControllerState(i); + UpdateLEDPattern(i); + UpdateBorderColor(i); + CheckIfParametersMet(); + }); if (i == 0) { connect(emulated_controllers[i], qOverload(&QComboBox::currentIndexChanged), diff --git a/src/yuzu/applets/qt_software_keyboard.cpp b/src/yuzu/applets/qt_software_keyboard.cpp index 0b894bf51a..aa77e082bd 100644 --- a/src/yuzu/applets/qt_software_keyboard.cpp +++ b/src/yuzu/applets/qt_software_keyboard.cpp @@ -7,7 +7,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/string_util.h" #include "core/core.h" @@ -1499,22 +1499,22 @@ void QtSoftwareKeyboardDialog::StartInputThread() { input_interpreter->PollInput(); HandleButtonPressedOnce< Core::HID::NpadButton::A, Core::HID::NpadButton::B, Core::HID::NpadButton::X, - Core::HID::NpadButton::Y, Core::HID::NpadButton::StickL, Core::HID::NpadButton::StickR, - Core::HID::NpadButton::L, Core::HID::NpadButton::R, Core::HID::NpadButton::Plus, - Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, Core::HID::NpadButton::Right, - Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft, - Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight, - Core::HID::NpadButton::StickLDown, Core::HID::NpadButton::StickRLeft, - Core::HID::NpadButton::StickRUp, Core::HID::NpadButton::StickRRight, - Core::HID::NpadButton::StickRDown>(); + Core::HID::NpadButton::Y, Core::HID::NpadButton::StickL, + Core::HID::NpadButton::StickR, Core::HID::NpadButton::L, Core::HID::NpadButton::R, + Core::HID::NpadButton::Plus, Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, + Core::HID::NpadButton::Right, Core::HID::NpadButton::Down, + Core::HID::NpadButton::StickLLeft, Core::HID::NpadButton::StickLUp, + Core::HID::NpadButton::StickLRight, Core::HID::NpadButton::StickLDown, + Core::HID::NpadButton::StickRLeft, Core::HID::NpadButton::StickRUp, + Core::HID::NpadButton::StickRRight, Core::HID::NpadButton::StickRDown>(); HandleButtonHold(); + Core::HID::NpadButton::R, Core::HID::NpadButton::Left, + Core::HID::NpadButton::Up, Core::HID::NpadButton::Right, + Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft, + Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight, + Core::HID::NpadButton::StickLDown, Core::HID::NpadButton::StickRLeft, + Core::HID::NpadButton::StickRUp, Core::HID::NpadButton::StickRRight, + Core::HID::NpadButton::StickRDown>(); std::this_thread::sleep_for(std::chrono::milliseconds(50)); } }); diff --git a/src/yuzu/applets/qt_web_browser.cpp b/src/yuzu/applets/qt_web_browser.cpp index 2141b9d0e7..4bbe789d34 100644 --- a/src/yuzu/applets/qt_web_browser.cpp +++ b/src/yuzu/applets/qt_web_browser.cpp @@ -7,7 +7,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #ifdef YUZU_USE_QT_WEB_ENGINE #include @@ -63,8 +63,8 @@ QtNXWebEngineView::QtNXWebEngineView(QWidget* parent, Core::System& system, : QWebEngineView(parent), input_subsystem{input_subsystem_}, url_interceptor(std::make_unique()), input_interpreter(std::make_unique(system)), - default_profile{QWebEngineProfile::defaultProfile()}, global_settings{ - default_profile->settings()} { + default_profile{QWebEngineProfile::defaultProfile()}, + global_settings{default_profile->settings()} { default_profile->setPersistentStoragePath(QString::fromStdString(Common::FS::PathToUTF8String( Common::FS::GetEdenPath(Common::FS::EdenPath::EdenDir) / "qtwebengine"))); @@ -299,21 +299,21 @@ void QtNXWebEngineView::StartInputThread() { while (!stoken.stop_requested()) { input_interpreter->PollInput(); - HandleWindowFooterButtonPressedOnce(); + HandleWindowFooterButtonPressedOnce< + Core::HID::NpadButton::A, Core::HID::NpadButton::B, Core::HID::NpadButton::X, + Core::HID::NpadButton::Y, Core::HID::NpadButton::L, Core::HID::NpadButton::R>(); HandleWindowKeyButtonPressedOnce< - Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, Core::HID::NpadButton::Right, - Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft, - Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight, - Core::HID::NpadButton::StickLDown>(); + Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, + Core::HID::NpadButton::Right, Core::HID::NpadButton::Down, + Core::HID::NpadButton::StickLLeft, Core::HID::NpadButton::StickLUp, + Core::HID::NpadButton::StickLRight, Core::HID::NpadButton::StickLDown>(); HandleWindowKeyButtonHold< - Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, Core::HID::NpadButton::Right, - Core::HID::NpadButton::Down, Core::HID::NpadButton::StickLLeft, - Core::HID::NpadButton::StickLUp, Core::HID::NpadButton::StickLRight, - Core::HID::NpadButton::StickLDown>(); + Core::HID::NpadButton::Left, Core::HID::NpadButton::Up, + Core::HID::NpadButton::Right, Core::HID::NpadButton::Down, + Core::HID::NpadButton::StickLLeft, Core::HID::NpadButton::StickLUp, + Core::HID::NpadButton::StickLRight, Core::HID::NpadButton::StickLDown>(); std::this_thread::sleep_for(std::chrono::milliseconds(50)); } diff --git a/src/yuzu/applets/qt_web_browser.h b/src/yuzu/applets/qt_web_browser.h index 6a2dd0c8ba..f6869bbb35 100644 --- a/src/yuzu/applets/qt_web_browser.h +++ b/src/yuzu/applets/qt_web_browser.h @@ -169,7 +169,8 @@ private: std::unique_ptr input_interpreter; std::jthread input_thread; std::atomic finished{}; - Service::AM::Frontend::WebExitReason exit_reason{Service::AM::Frontend::WebExitReason::EndButtonPressed}; + Service::AM::Frontend::WebExitReason exit_reason{ + Service::AM::Frontend::WebExitReason::EndButtonPressed}; std::string last_url{"http://localhost/"}; bool is_local{}; QWebEngineProfile* default_profile; diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index 72a5157fc4..0c0ce6e90c 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp @@ -54,12 +54,12 @@ #include "input_common/drivers/tas_input.h" #include "input_common/drivers/touch_screen.h" #include "input_common/main.h" +#include "qt_common/qt_common.h" #include "video_core/gpu.h" #include "video_core/rasterizer_interface.h" #include "video_core/renderer_base.h" #include "yuzu/bootmanager.h" #include "yuzu/main_window.h" -#include "qt_common/qt_common.h" class QObject; class QPaintEngine; @@ -282,8 +282,8 @@ struct NullRenderWidget : public RenderWidget { GRenderWindow::GRenderWindow(MainWindow* parent, EmuThread* emu_thread_, std::shared_ptr input_subsystem_, Core::System& system_) - : QWidget(parent), - emu_thread(emu_thread_), input_subsystem{std::move(input_subsystem_)}, system{system_} { + : QWidget(parent), emu_thread(emu_thread_), input_subsystem{std::move(input_subsystem_)}, + system{system_} { setWindowTitle(QStringLiteral("Eden %1 | %2-%3") .arg(QString::fromUtf8(Common::g_build_name), QString::fromUtf8(Common::g_scm_branch), @@ -887,13 +887,14 @@ void GRenderWindow::resizeEvent(QResizeEvent* event) { std::unique_ptr GRenderWindow::CreateSharedContext() const { #ifdef HAS_OPENGL - if (Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL_GLSL - || Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL_GLASM - || Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL_SPIRV) { + if (Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL_GLSL || + Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL_GLASM || + Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL_SPIRV) { auto c = static_cast(main_context.get()); // Bind the shared contexts to the main surface in case the backend wants to take over // presentation - return std::make_unique(c->GetShareContext(), child_widget->windowHandle()); + return std::make_unique(c->GetShareContext(), + child_widget->windowHandle()); } #endif return std::make_unique(); @@ -940,9 +941,9 @@ bool GRenderWindow::InitRenderTarget() { OnFramebufferSizeChanged(); BackupGeometry(); - if (Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL_GLSL - || Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL_GLASM - || Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL_SPIRV) + if (Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL_GLSL || + Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL_GLASM || + Settings::values.renderer_backend.GetValue() == Settings::RendererBackend::OpenGL_SPIRV) return LoadOpenGL(); return true; } @@ -1019,8 +1020,7 @@ bool GRenderWindow::InitializeOpenGL() { return true; #else - QMessageBox::warning(this, tr("OpenGL not available!"), - tr("Eden has not been compiled with OpenGL support.")); + QMessageBox::warning(this, tr("OpenGL not available!"), tr("Eden has not been compiled with OpenGL support.")); return false; #endif } @@ -1030,7 +1030,6 @@ bool GRenderWindow::InitializeVulkan() { child_widget = child; child_widget->windowHandle()->create(); main_context = std::make_unique(); - return true; } @@ -1050,21 +1049,23 @@ bool GRenderWindow::LoadOpenGL() { } // Display various warnings (but not fatal errors) for missing OpenGL extensions or lack of // OpenGL 4.6 support - const QString renderer = QString::fromUtf8(reinterpret_cast(glGetString(GL_RENDERER))); + const QString renderer = + QString::fromUtf8(reinterpret_cast(glGetString(GL_RENDERER))); if (!GLAD_GL_VERSION_4_6) { QMessageBox::warning(this, tr("Error while initializing OpenGL 4.6!"), - tr("Your GPU may not support OpenGL 4.6, or you do not have the " - "latest graphics driver.

GL Renderer:
%1") - .arg(renderer)); + tr("Your GPU may not support OpenGL 4.6, or you do not have the " + "latest graphics driver.

GL Renderer:
%1") + .arg(renderer)); return false; } if (QStringList missing_ext = GetUnsupportedGLExtensions(); !missing_ext.empty()) { QMessageBox::warning( this, tr("Error while initializing OpenGL!"), tr("Your GPU may not support one or more required OpenGL extensions. Please ensure you " - "have the latest graphics driver.

GL Renderer:
%1

Unsupported " - "extensions:
%2") - .arg(renderer).arg(missing_ext.join(QStringLiteral("
")))); + "have the latest graphics driver.

GL Renderer:
%1

Unsupported " + "extensions:
%2") + .arg(renderer) + .arg(missing_ext.join(QStringLiteral("
")))); // Non fatal } return true; diff --git a/src/yuzu/bootmanager.h b/src/yuzu/bootmanager.h index 837156a725..e763cd9868 100644 --- a/src/yuzu/bootmanager.h +++ b/src/yuzu/bootmanager.h @@ -27,7 +27,7 @@ #include #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/polyfill_thread.h" #include "common/thread.h" #include "core/frontend/emu_window.h" diff --git a/src/yuzu/compatdb.cpp b/src/yuzu/compatdb.cpp index 6d5d263e16..b47cdd2116 100644 --- a/src/yuzu/compatdb.cpp +++ b/src/yuzu/compatdb.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2017 Citra Emulator Project @@ -8,7 +8,7 @@ #include #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "ui_compatdb.h" #include "yuzu/compatdb.h" diff --git a/src/yuzu/configuration/addon/mod_select_dialog.cpp b/src/yuzu/configuration/addon/mod_select_dialog.cpp index e6c361b94f..467de5a764 100644 --- a/src/yuzu/configuration/addon/mod_select_dialog.cpp +++ b/src/yuzu/configuration/addon/mod_select_dialog.cpp @@ -43,7 +43,8 @@ ModSelectDialog::ModSelectDialog(const QStringList& mods, QWidget* parent) width = qMax(width, item_model->item(i)->sizeHint().width()); } - width += ui->treeView->contentsMargins().left() * 4 + ui->treeView->contentsMargins().right() * 4; + width += + ui->treeView->contentsMargins().left() * 4 + ui->treeView->contentsMargins().right() * 4; ui->treeView->setMinimumHeight(qMin(height, 600)); ui->treeView->setMinimumWidth(qMin(width, 700)); adjustSize(); diff --git a/src/yuzu/configuration/addon/mod_select_dialog.h b/src/yuzu/configuration/addon/mod_select_dialog.h index d23c435e7a..ab6d4686b0 100644 --- a/src/yuzu/configuration/addon/mod_select_dialog.h +++ b/src/yuzu/configuration/addon/mod_select_dialog.h @@ -14,11 +14,12 @@ class ModSelectDialog : public QDialog { Q_OBJECT public: - explicit ModSelectDialog(const QStringList &mods, QWidget* parent = nullptr); + explicit ModSelectDialog(const QStringList& mods, QWidget* parent = nullptr); ~ModSelectDialog(); signals: - void modsSelected(const QStringList &mods); + void modsSelected(const QStringList& mods); + private: Ui::ModSelectDialog* ui; diff --git a/src/yuzu/configuration/configure_audio.cpp b/src/yuzu/configuration/configure_audio.cpp index 10eacf39cb..65b8b16301 100644 --- a/src/yuzu/configuration/configure_audio.cpp +++ b/src/yuzu/configuration/configure_audio.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -16,12 +16,12 @@ #include "common/settings.h" #include "common/settings_common.h" #include "core/core.h" +#include "qt_common/config/shared_translation.h" +#include "qt_common/config/uisettings.h" #include "ui_configure_audio.h" #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_audio.h" -#include "qt_common/config/shared_translation.h" #include "yuzu/configuration/shared_widget.h" -#include "qt_common/config/uisettings.h" ConfigureAudio::ConfigureAudio(const Core::System& system_, std::shared_ptr> group_, @@ -188,8 +188,8 @@ void ConfigureAudio::SetOutputSinkFromSinkID() { const std::string new_sink_id = []() -> const std::string { const Settings::AudioEngine sink_id = Settings::values.sink_id.GetValue(); - const auto canonicalizations - = Settings::EnumMetadata::Canonicalizations(); + const auto canonicalizations = + Settings::EnumMetadata::Canonicalizations(); for (u32 i = 0; i < canonicalizations.size(); ++i) { const Settings::AudioEngine value = canonicalizations[i].second; @@ -242,8 +242,8 @@ void ConfigureAudio::ApplyConfiguration() { const u32 new_sink_id = [this]() { const std::string sink_id = sink_combo_box->currentText().toStdString(); - const auto canonicalizations - = Settings::EnumMetadata::Canonicalizations(); + const auto canonicalizations = + Settings::EnumMetadata::Canonicalizations(); for (u32 i = 0; i < canonicalizations.size(); ++i) { if (sink_id == canonicalizations[i].first) @@ -291,7 +291,8 @@ void ConfigureAudio::InitializeAudioSinkComboBox() { sink_combo_box->clear(); sink_combo_box->addItem(QString::fromUtf8(AudioCore::Sink::auto_device_name)); for (const auto& id : AudioCore::Sink::GetSinkIDs()) - sink_combo_box->addItem(QString::fromStdString(std::string{Settings::CanonicalizeEnum(id)})); + sink_combo_box->addItem( + QString::fromStdString(std::string{Settings::CanonicalizeEnum(id)})); } void ConfigureAudio::RetranslateUI() { diff --git a/src/yuzu/configuration/configure_cpu.cpp b/src/yuzu/configuration/configure_cpu.cpp index bc1140d835..eee1c677b7 100644 --- a/src/yuzu/configuration/configure_cpu.cpp +++ b/src/yuzu/configuration/configure_cpu.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -76,9 +76,9 @@ void ConfigureCpu::Setup(const ConfigurationShared::Builder& builder) { } else if (setting->Id() == Settings::values.cpu_backend.Id()) { backend_layout->addWidget(widget); backend_combobox = widget->combobox; - } else if (setting->Id() == Settings::values.fast_cpu_time.Id() - || setting->Id() == Settings::values.vtable_bouncing.Id() - || setting->Id() == Settings::values.cpu_ticks.Id()) { + } else if (setting->Id() == Settings::values.fast_cpu_time.Id() || + setting->Id() == Settings::values.vtable_bouncing.Id() || + setting->Id() == Settings::values.cpu_ticks.Id()) { ui->general_layout->addWidget(widget); } else { // Presently, all other settings here are unsafe checkboxes @@ -93,12 +93,12 @@ void ConfigureCpu::Setup(const ConfigurationShared::Builder& builder) { UpdateGroup(); } -void ConfigureCpu::UpdateGroup() -{ +void ConfigureCpu::UpdateGroup() { const u32 accuracy = accuracy_combobox->currentIndex(); const u32 backend = backend_combobox->currentIndex(); // TODO(crueter): see if this works on NCE - ui->unsafe_group->setVisible(accuracy == (u32) Settings::CpuAccuracy::Unsafe && backend == (u32) Settings::CpuBackend::Dynarmic); + ui->unsafe_group->setVisible(accuracy == (u32)Settings::CpuAccuracy::Unsafe && + backend == (u32)Settings::CpuBackend::Dynarmic); } void ConfigureCpu::ApplyConfiguration() { diff --git a/src/yuzu/configuration/configure_cpu.h b/src/yuzu/configuration/configure_cpu.h index 461ca7f85e..2b0ae890d7 100644 --- a/src/yuzu/configuration/configure_cpu.h +++ b/src/yuzu/configuration/configure_cpu.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -9,8 +9,8 @@ #include #include #include -#include "yuzu/configuration/configuration_shared.h" #include "qt_common/config/shared_translation.h" +#include "yuzu/configuration/configuration_shared.h" class QComboBox; diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp index e0bdbaeaa1..fadaf1c01a 100644 --- a/src/yuzu/configuration/configure_debug.cpp +++ b/src/yuzu/configuration/configure_debug.cpp @@ -8,15 +8,14 @@ #include #include #include "common/fs/path_util.h" -#include "common/logging/backend.h" -#include "common/logging/filter.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core.h" #include "core/crypto/key_manager.h" +#include "qt_common/config/uisettings.h" #include "ui_configure_debug.h" #include "yuzu/configuration/configure_debug.h" #include "yuzu/debugger/console.h" -#include "qt_common/config/uisettings.h" ConfigureDebug::ConfigureDebug(const Core::System& system_, QWidget* parent) : QScrollArea(parent), ui{std::make_unique()}, system{system_} { @@ -60,7 +59,8 @@ void ConfigureDebug::SetConfiguration() { // Immutable after starting ui->homebrew_args_edit->setEnabled(runtime_lock); - ui->homebrew_args_edit->setText(QString::fromStdString(Settings::values.program_args.GetValue())); + ui->homebrew_args_edit->setText( + QString::fromStdString(Settings::values.program_args.GetValue())); ui->toggle_console->setEnabled(runtime_lock); ui->toggle_console->setChecked(UISettings::values.show_console.GetValue()); ui->fs_access_log->setEnabled(runtime_lock); @@ -84,7 +84,8 @@ void ConfigureDebug::SetConfiguration() { ui->disable_macro_hle->setEnabled(runtime_lock); ui->disable_macro_hle->setChecked(Settings::values.disable_macro_hle.GetValue()); ui->disable_loop_safety_checks->setEnabled(runtime_lock); - ui->disable_loop_safety_checks->setChecked(Settings::values.disable_shader_loop_safety_checks.GetValue()); + ui->disable_loop_safety_checks->setChecked( + Settings::values.disable_shader_loop_safety_checks.GetValue()); ui->perform_vulkan_check->setChecked(Settings::values.perform_vulkan_check.GetValue()); ui->debug_knobs_spinbox->setValue(Settings::values.debug_knobs.GetValue()); #ifdef YUZU_USE_QT_WEB_ENGINE @@ -118,7 +119,8 @@ void ConfigureDebug::ApplyConfiguration() { Settings::values.enable_nsight_aftermath = ui->enable_nsight_aftermath->isChecked(); Settings::values.dump_shaders = ui->dump_shaders->isChecked(); Settings::values.dump_macros = ui->dump_macros->isChecked(); - Settings::values.disable_shader_loop_safety_checks = ui->disable_loop_safety_checks->isChecked(); + Settings::values.disable_shader_loop_safety_checks = + ui->disable_loop_safety_checks->isChecked(); Settings::values.disable_macro_jit = ui->disable_macro_jit->isChecked(); Settings::values.disable_macro_hle = ui->disable_macro_hle->isChecked(); Settings::values.extended_logging = ui->extended_logging->isChecked(); diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index 1107c77e8c..d4a16e9f73 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -5,10 +5,11 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/settings_enums.h" #include "core/core.h" +#include "qt_common/config/uisettings.h" #include "ui_configure.h" #include "vk_device_info.h" #include "yuzu/configuration/configure_applets.h" @@ -30,15 +31,14 @@ #include "yuzu/configuration/configure_ui.h" #include "yuzu/configuration/configure_web.h" #include "yuzu/hotkeys.h" -#include "qt_common/config/uisettings.h" ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, InputCommon::InputSubsystem* input_subsystem, std::vector& vk_device_records, Core::System& system_, bool enable_web_config) - : QDialog(parent), ui{std::make_unique()}, - registry(registry_), system{system_}, builder{std::make_unique( - this, !system_.IsPoweredOn())}, + : QDialog(parent), ui{std::make_unique()}, registry(registry_), + system{system_}, + builder{std::make_unique(this, !system_.IsPoweredOn())}, applets_tab{std::make_unique(system_, nullptr, *builder, this)}, audio_tab{std::make_unique(system_, nullptr, *builder, this)}, cpu_tab{std::make_unique(system_, nullptr, *builder, this)}, @@ -46,9 +46,9 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, filesystem_tab{std::make_unique(this)}, general_tab{std::make_unique(system_, nullptr, *builder, this)}, graphics_advanced_tab{ - std::make_unique(system_, nullptr, *builder, this)}, + std::make_unique(system_, nullptr, *builder, this)}, graphics_extensions_tab{ - std::make_unique(system_, nullptr, *builder, this)}, + std::make_unique(system_, nullptr, *builder, this)}, ui_tab{std::make_unique(system_, this)}, graphics_tab{std::make_unique( system_, vk_device_records, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, @@ -113,7 +113,7 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, adjustSize(); ui->selectorList->setCurrentRow(0); - // Selects the leftmost button on the bottom bar (Cancel as of writing) + // Selects the leftmost button on the bottom bar (Cancel as of writing) ui->buttonBox->setFocus(); } @@ -172,16 +172,17 @@ Q_DECLARE_METATYPE(QList); void ConfigureDialog::PopulateSelectionList() { const std::array>, 6> items{ - {{tr("General"), - {general_tab.get(), hotkeys_tab.get(), ui_tab.get(), web_tab.get(), debug_tab_tab.get()}}, - {tr("System"), - {system_tab.get(), profile_tab.get(), network_tab.get(), filesystem_tab.get(), - applets_tab.get()}}, - {tr("CPU"), {cpu_tab.get()}}, - {tr("Graphics"), {graphics_tab.get(), graphics_advanced_tab.get(), graphics_extensions_tab.get()}}, - {tr("Audio"), {audio_tab.get()}}, - {tr("Controls"), input_tab->GetSubTabs()}}, - }; + {{tr("General"), + {general_tab.get(), hotkeys_tab.get(), ui_tab.get(), web_tab.get(), debug_tab_tab.get()}}, + {tr("System"), + {system_tab.get(), profile_tab.get(), network_tab.get(), filesystem_tab.get(), + applets_tab.get()}}, + {tr("CPU"), {cpu_tab.get()}}, + {tr("Graphics"), + {graphics_tab.get(), graphics_advanced_tab.get(), graphics_extensions_tab.get()}}, + {tr("Audio"), {audio_tab.get()}}, + {tr("Controls"), input_tab->GetSubTabs()}}, + }; [[maybe_unused]] const QSignalBlocker blocker(ui->selectorList); diff --git a/src/yuzu/configuration/configure_dialog.h b/src/yuzu/configuration/configure_dialog.h index 9d79e6f0ac..5c504c9a16 100644 --- a/src/yuzu/configuration/configure_dialog.h +++ b/src/yuzu/configuration/configure_dialog.h @@ -10,8 +10,8 @@ #include #include #include "configuration/shared_widget.h" -#include "yuzu/configuration/configuration_shared.h" #include "qt_common/config/shared_translation.h" +#include "yuzu/configuration/configuration_shared.h" #include "yuzu/vk_device_info.h" namespace Core { diff --git a/src/yuzu/configuration/configure_filesystem.cpp b/src/yuzu/configuration/configure_filesystem.cpp index 27af4c8055..ee1e4bbc20 100644 --- a/src/yuzu/configuration/configure_filesystem.cpp +++ b/src/yuzu/configuration/configure_filesystem.cpp @@ -4,7 +4,6 @@ // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "yuzu/configuration/configure_filesystem.h" #include #include #include @@ -12,10 +11,11 @@ #include "common/fs/fs.h" #include "common/fs/path_util.h" #include "common/settings.h" +#include "qt_common/config/uisettings.h" #include "qt_common/qt_compat.h" #include "qt_common/util/game.h" -#include "qt_common/config/uisettings.h" #include "ui_configure_filesystem.h" +#include "yuzu/configuration/configure_filesystem.h" ConfigureFilesystem::ConfigureFilesystem(QWidget* parent) : QWidget(parent), ui(std::make_unique()) { @@ -26,8 +26,7 @@ ConfigureFilesystem::ConfigureFilesystem(QWidget* parent) [this] { SetDirectory(DirectoryTarget::NAND, ui->nand_directory_edit); }); connect(ui->sdmc_directory_button, &QToolButton::pressed, this, [this] { SetDirectory(DirectoryTarget::SD, ui->sdmc_directory_edit); }); - connect(ui->save_directory_button, &QToolButton::pressed, this, - [this] { SetSaveDirectory(); }); + connect(ui->save_directory_button, &QToolButton::pressed, this, [this] { SetSaveDirectory(); }); connect(ui->gamecard_path_button, &QToolButton::pressed, this, [this] { SetDirectory(DirectoryTarget::Gamecard, ui->gamecard_path_edit); }); connect(ui->dump_path_button, &QToolButton::pressed, this, @@ -221,9 +220,9 @@ void ConfigureFilesystem::PromptSaveMigration(const QString& from_path, const QS .arg(QString::fromStdString(dest_save_dir.string())); } - QMessageBox::StandardButton reply = QMessageBox::question( - this, tr("Migrate Save Data"), message, - QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + QMessageBox::StandardButton reply = + QMessageBox::question(this, tr("Migrate Save Data"), message, + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if (reply != QMessageBox::Yes) { return; @@ -249,17 +248,17 @@ void ConfigureFilesystem::PromptSaveMigration(const QString& from_path, const QS progress.close(); if (ec) { - QMessageBox::warning(this, tr("Migration Failed"), - tr("Failed to migrate save data:\n%1") - .arg(QString::fromStdString(ec.message()))); + QMessageBox::warning( + this, tr("Migration Failed"), + tr("Failed to migrate save data:\n%1").arg(QString::fromStdString(ec.message()))); return; } - QMessageBox::StandardButton deleteReply = QMessageBox::question( - this, tr("Migration Complete"), - tr("Save data has been migrated successfully.\n\n" - "Would you like to delete the old save data?"), - QMessageBox::Yes | QMessageBox::No, QMessageBox::No); + QMessageBox::StandardButton deleteReply = + QMessageBox::question(this, tr("Migration Complete"), + tr("Save data has been migrated successfully.\n\n" + "Would you like to delete the old save data?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No); if (deleteReply == QMessageBox::Yes) { Common::FS::RemoveDirRecursively(source_save_dir); @@ -278,7 +277,6 @@ void ConfigureFilesystem::UpdateEnabledControls() { !ui->gamecard_current_game->isChecked()); } - void ConfigureFilesystem::RetranslateUI() { ui->retranslateUi(this); } diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp index f628abeab3..a311765f2f 100644 --- a/src/yuzu/configuration/configure_general.cpp +++ b/src/yuzu/configuration/configure_general.cpp @@ -13,11 +13,11 @@ #include #include "common/settings.h" #include "core/core.h" +#include "qt_common/config/uisettings.h" #include "ui_configure_general.h" #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_general.h" #include "yuzu/configuration/shared_widget.h" -#include "qt_common/config/uisettings.h" ConfigureGeneral::ConfigureGeneral(const Core::System& system_, std::shared_ptr> group_, diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index b0c63aff4f..54835aea5a 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -35,16 +35,16 @@ #include "common/common_types.h" #include "common/dynamic_library.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/settings_enums.h" #include "core/core.h" +#include "qt_common/config/uisettings.h" +#include "qt_common/qt_common.h" #include "ui_configure_graphics.h" #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_graphics.h" #include "yuzu/configuration/shared_widget.h" -#include "qt_common/qt_common.h" -#include "qt_common/config/uisettings.h" #include "yuzu/vk_device_info.h" static const std::vector default_present_modes{VK_PRESENT_MODE_IMMEDIATE_KHR, @@ -91,8 +91,7 @@ ConfigureGraphics::ConfigureGraphics( : ConfigurationShared::Tab(group_, parent), ui{std::make_unique()}, records{records_}, expose_compute_option{expose_compute_option_}, update_aspect_ratio{update_aspect_ratio_}, system{system_}, - combobox_translations{builder.ComboboxTranslations()} -{ + combobox_translations{builder.ComboboxTranslations()} { vulkan_device = Settings::values.vulkan_device.GetValue(); RetrieveVulkanDevices(); @@ -215,9 +214,9 @@ void ConfigureGraphics::PopulateVSyncModeSelection(bool use_setting) { const Settings::VSyncMode global_vsync_mode = Settings::values.vsync_mode.GetValue(true); vsync_restore_global_button->setEnabled( - ((backend == Settings::RendererBackend::OpenGL_GLSL - || backend == Settings::RendererBackend::OpenGL_GLASM - || backend == Settings::RendererBackend::OpenGL_SPIRV) && + ((backend == Settings::RendererBackend::OpenGL_GLSL || + backend == Settings::RendererBackend::OpenGL_GLASM || + backend == Settings::RendererBackend::OpenGL_SPIRV) && (global_vsync_mode == Settings::VSyncMode::Immediate || global_vsync_mode == Settings::VSyncMode::Fifo)) || backend == Settings::RendererBackend::Vulkan); @@ -286,7 +285,9 @@ void ConfigureGraphics::Setup(const ConfigurationShared::Builder& builder) { api_combobox = widget->combobox; api_restore_global_button = widget->restore_button; if (!Settings::IsConfiguringGlobal()) { - api_restore_global_button->connect(api_restore_global_button, &QAbstractButton::clicked, [this](bool) { UpdateAPILayout(); }); + api_restore_global_button->connect(api_restore_global_button, + &QAbstractButton::clicked, + [this](bool) { UpdateAPILayout(); }); // Detach API's restore button and place it where we want // Lets us put it on the side, and it will automatically scale if there's a // second combobox (vulkan_device) @@ -312,20 +313,21 @@ void ConfigureGraphics::Setup(const ConfigurationShared::Builder& builder) { widget->layout()->addWidget(restore_button); restore_button->connect(restore_button, &QAbstractButton::clicked, - [restore_button, this](bool) { - Settings::values.vsync_mode.SetGlobal(true); - PopulateVSyncModeSelection(true); + [restore_button, this](bool) { + Settings::values.vsync_mode.SetGlobal(true); + PopulateVSyncModeSelection(true); - restore_button->setVisible(false); - }); + restore_button->setVisible(false); + }); std::function set_non_global = [restore_button, this]() { Settings::values.vsync_mode.SetGlobal(false); UpdateVsyncSetting(); restore_button->setVisible(true); }; - widget->combobox->connect(widget->combobox, QOverload::of(&QComboBox::activated), - [set_non_global]() { set_non_global(); }); + widget->combobox->connect(widget->combobox, + QOverload::of(&QComboBox::activated), + [set_non_global]() { set_non_global(); }); vsync_restore_global_button = restore_button; } hold_graphics.emplace(setting->Id(), widget); @@ -364,15 +366,15 @@ void ConfigureGraphics::Setup(const ConfigurationShared::Builder& builder) { ui->bg_widget->layout()->addWidget(bg_restore_button); bg_restore_button->connect(bg_restore_button, &QAbstractButton::clicked, - [bg_restore_button, this](bool) { - const int r = Settings::values.bg_red.GetValue(true); - const int g = Settings::values.bg_green.GetValue(true); - const int b = Settings::values.bg_blue.GetValue(true); - UpdateBackgroundColorButton(QColor::fromRgb(r, g, b)); + [bg_restore_button, this](bool) { + const int r = Settings::values.bg_red.GetValue(true); + const int g = Settings::values.bg_green.GetValue(true); + const int b = Settings::values.bg_blue.GetValue(true); + UpdateBackgroundColorButton(QColor::fromRgb(r, g, b)); - bg_restore_button->setVisible(false); - bg_restore_button->setEnabled(false); - }); + bg_restore_button->setVisible(false); + bg_restore_button->setEnabled(false); + }); ui->bg_button->connect(ui->bg_button, &QAbstractButton::clicked, [bg_restore_button](bool) { bg_restore_button->setVisible(true); @@ -397,17 +399,19 @@ const QString ConfigureGraphics::TranslateVSyncMode(VkPresentModeKHR mode, Settings::RendererBackend backend) const { switch (mode) { case VK_PRESENT_MODE_IMMEDIATE_KHR: - return (backend == Settings::RendererBackend::OpenGL_GLSL - || backend == Settings::RendererBackend::OpenGL_GLASM - || backend == Settings::RendererBackend::OpenGL_SPIRV) - ? tr("Off") : QStringLiteral("Immediate (%1)").arg(tr("VSync Off")); + return (backend == Settings::RendererBackend::OpenGL_GLSL || + backend == Settings::RendererBackend::OpenGL_GLASM || + backend == Settings::RendererBackend::OpenGL_SPIRV) + ? tr("Off") + : QStringLiteral("Immediate (%1)").arg(tr("VSync Off")); case VK_PRESENT_MODE_MAILBOX_KHR: return QStringLiteral("Mailbox (%1)").arg(tr("Recommended")); case VK_PRESENT_MODE_FIFO_KHR: - return (backend == Settings::RendererBackend::OpenGL_GLSL - || backend == Settings::RendererBackend::OpenGL_GLASM - || backend == Settings::RendererBackend::OpenGL_SPIRV) - ? tr("On") : QStringLiteral("FIFO (%1)").arg(tr("VSync On")); + return (backend == Settings::RendererBackend::OpenGL_GLSL || + backend == Settings::RendererBackend::OpenGL_GLASM || + backend == Settings::RendererBackend::OpenGL_SPIRV) + ? tr("On") + : QStringLiteral("FIFO (%1)").arg(tr("VSync On")); case VK_PRESENT_MODE_FIFO_RELAXED_KHR: return QStringLiteral("FIFO Relaxed"); default: @@ -416,7 +420,9 @@ const QString ConfigureGraphics::TranslateVSyncMode(VkPresentModeKHR mode, } int ConfigureGraphics::FindIndex(u32 enumeration, int value) const { - for (u32 i = 0; enumeration < combobox_translations.size() && i < combobox_translations.at(enumeration).size(); i++) + for (u32 i = 0; enumeration < combobox_translations.size() && + i < combobox_translations.at(enumeration).size(); + i++) if (combobox_translations.at(enumeration)[i].first == u32(value)) return i; return -1; @@ -432,10 +438,14 @@ void ConfigureGraphics::ApplyConfiguration() { Settings::values.vulkan_device.SetGlobal(true); auto const index = Settings::EnumMetadata::Index(); - if (Settings::IsConfiguringGlobal() || (!Settings::IsConfiguringGlobal() && api_restore_global_button->isEnabled())) { - auto backend = index >= combobox_translations.size() || size_t(api_combobox->currentIndex()) >= combobox_translations.at(index).size() - ? Settings::values.renderer_backend.GetValue() - : Settings::RendererBackend(combobox_translations.at(index)[api_combobox->currentIndex()].first); + if (Settings::IsConfiguringGlobal() || + (!Settings::IsConfiguringGlobal() && api_restore_global_button->isEnabled())) { + auto backend = + index >= combobox_translations.size() || + size_t(api_combobox->currentIndex()) >= combobox_translations.at(index).size() + ? Settings::values.renderer_backend.GetValue() + : Settings::RendererBackend( + combobox_translations.at(index)[api_combobox->currentIndex()].first); switch (backend) { case Settings::RendererBackend::Vulkan: Settings::values.vulkan_device.SetGlobal(Settings::IsConfiguringGlobal()); @@ -506,12 +516,15 @@ Settings::RendererBackend ConfigureGraphics::GetCurrentGraphicsBackend() const { auto const index = Settings::EnumMetadata::Index(); if (!Settings::IsConfiguringGlobal() && !api_restore_global_button->isEnabled()) return Settings::values.renderer_backend.GetValue(true); - return index >= combobox_translations.size() || size_t(api_combobox->currentIndex()) >= combobox_translations.at(index).size() - ? Settings::values.renderer_backend.GetValue() - : Settings::RendererBackend(combobox_translations.at(index).at(api_combobox->currentIndex()).first); + return index >= combobox_translations.size() || size_t(api_combobox->currentIndex()) >= + combobox_translations.at(index).size() + ? Settings::values.renderer_backend.GetValue() + : Settings::RendererBackend( + combobox_translations.at(index).at(api_combobox->currentIndex()).first); }(); - if (selected_backend == Settings::RendererBackend::Vulkan && UISettings::values.has_broken_vulkan) + if (selected_backend == Settings::RendererBackend::Vulkan && + UISettings::values.has_broken_vulkan) return Settings::RendererBackend::OpenGL_GLSL; return selected_backend; } diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp index 9096e3252d..2ffb3a0b30 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.cpp +++ b/src/yuzu/configuration/configure_graphics_advanced.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -9,10 +9,10 @@ #include #include "common/settings.h" #include "core/core.h" +#include "qt_common/config/shared_translation.h" #include "ui_configure_graphics_advanced.h" #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_graphics_advanced.h" -#include "qt_common/config/shared_translation.h" #include "yuzu/configuration/shared_widget.h" ConfigureGraphicsAdvanced::ConfigureGraphicsAdvanced( diff --git a/src/yuzu/configuration/configure_graphics_extensions.cpp b/src/yuzu/configuration/configure_graphics_extensions.cpp index 7334eccc97..8154dfa6ca 100644 --- a/src/yuzu/configuration/configure_graphics_extensions.cpp +++ b/src/yuzu/configuration/configure_graphics_extensions.cpp @@ -1,26 +1,27 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include -#include -#include #include +#include #include +#include #include "common/settings.h" #include "core/core.h" +#include "qt_common/config/shared_translation.h" #include "ui_configure_graphics_extensions.h" #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_graphics_extensions.h" -#include "qt_common/config/shared_translation.h" #include "yuzu/configuration/shared_widget.h" ConfigureGraphicsExtensions::ConfigureGraphicsExtensions( const Core::System& system_, std::shared_ptr> group_, const ConfigurationShared::Builder& builder, QWidget* parent) - : Tab(group_, parent), ui{std::make_unique()}, system{system_} { + : Tab(group_, parent), ui{std::make_unique()}, + system{system_} { ui->setupUi(this); @@ -44,8 +45,8 @@ void ConfigureGraphicsExtensions::Setup(const ConfigurationShared::Builder& buil if (setting->Id() == Settings::values.sample_shading.Id()) { // TODO(crueter): should support this natively perhaps? return builder.BuildWidget( - setting, apply_funcs, ConfigurationShared::RequestType::Slider, true, - 1.0f, nullptr, tr("%", "Sample Shading percentage (e.g. 50%)")); + setting, apply_funcs, ConfigurationShared::RequestType::Slider, true, 1.0f, + nullptr, tr("%", "Sample Shading percentage (e.g. 50%)")); } else { return builder.BuildWidget(setting, apply_funcs); } @@ -64,7 +65,8 @@ void ConfigureGraphicsExtensions::Setup(const ConfigurationShared::Builder& buil #ifdef __APPLE__ if (setting->Id() == Settings::values.dyna_state.Id()) { widget->setEnabled(false); - widget->setToolTip(tr("Extended Dynamic State is disabled on macOS due to MoltenVK compatibility issues that cause black screens.")); + widget->setToolTip(tr("Extended Dynamic State is disabled on macOS due to MoltenVK " + "compatibility issues that cause black screens.")); } #endif } diff --git a/src/yuzu/configuration/configure_hotkeys.cpp b/src/yuzu/configuration/configure_hotkeys.cpp index dfd3727120..9e19cb49bf 100644 --- a/src/yuzu/configuration/configure_hotkeys.cpp +++ b/src/yuzu/configuration/configure_hotkeys.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2017 Citra Emulator Project @@ -13,10 +13,10 @@ #include "hid_core/hid_core.h" #include "frontend_common/config.h" +#include "qt_common/config/uisettings.h" #include "ui_configure_hotkeys.h" #include "yuzu/configuration/configure_hotkeys.h" #include "yuzu/hotkeys.h" -#include "qt_common/config/uisettings.h" #include "yuzu/util/sequence_dialog/sequence_dialog.h" constexpr int name_column = 0; diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp index 1a2d36efe6..4473df901e 100644 --- a/src/yuzu/configuration/configure_input.cpp +++ b/src/yuzu/configuration/configure_input.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project @@ -15,10 +15,10 @@ #include "core/hle/service/sm/sm.h" #include "hid_core/frontend/emulated_controller.h" #include "hid_core/hid_core.h" +#include "qt_common/qt_compat.h" #include "ui_configure_input.h" #include "ui_configure_input_advanced.h" #include "ui_configure_input_player.h" -#include "qt_common/qt_compat.h" #include "yuzu/configuration/configure_camera.h" #include "yuzu/configuration/configure_debug_controller.h" #include "yuzu/configuration/configure_input.h" @@ -102,7 +102,7 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem, }; for (std::size_t i = 0; i < player_tabs.size(); ++i) { - QHBoxLayout *tab_layout = new QHBoxLayout(player_tabs[i]); + QHBoxLayout* tab_layout = new QHBoxLayout(player_tabs[i]); tab_layout->addWidget(player_controllers[i]); connect(player_controllers[i], &ConfigureInputPlayer::Connected, [this, i](bool checked) { // Ensures that connecting a controller changes the number of players @@ -125,10 +125,11 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem, &ConfigureInput::UpdateAllInputDevices); connect(player_controllers[i], &ConfigureInputPlayer::RefreshInputProfiles, this, &ConfigureInput::UpdateAllInputProfiles, Qt::QueuedConnection); - connect(connected_controller_checkboxes[i], &QCheckBox::STATE_CHANGED, [this, i](int state) { - // Keep activated controllers synced with the "Connected Controllers" checkboxes - player_controllers[i]->ConnectPlayer(state == Qt::Checked); - }); + connect(connected_controller_checkboxes[i], &QCheckBox::STATE_CHANGED, + [this, i](int state) { + // Keep activated controllers synced with the "Connected Controllers" checkboxes + player_controllers[i]->ConnectPlayer(state == Qt::Checked); + }); // Remove/hide all the elements that exceed max_players, if applicable. if (i >= max_players) { diff --git a/src/yuzu/configuration/configure_input_advanced.cpp b/src/yuzu/configuration/configure_input_advanced.cpp index b1c19114bf..d8f0ab7e6c 100644 --- a/src/yuzu/configuration/configure_input_advanced.cpp +++ b/src/yuzu/configuration/configure_input_advanced.cpp @@ -9,8 +9,8 @@ #include "core/core.h" #include "hid_core/frontend/emulated_controller.h" #include "hid_core/hid_core.h" -#include "ui_configure_input_advanced.h" #include "qt_common/qt_compat.h" +#include "ui_configure_input_advanced.h" #include "yuzu/configuration/configure_input_advanced.h" ConfigureInputAdvanced::ConfigureInputAdvanced(Core::HID::HIDCore& hid_core_, QWidget* parent) diff --git a/src/yuzu/configuration/configure_input_per_game.h b/src/yuzu/configuration/configure_input_per_game.h index a1b6098dca..1e389a7a69 100644 --- a/src/yuzu/configuration/configure_input_per_game.h +++ b/src/yuzu/configuration/configure_input_per_game.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2022 yuzu Emulator Project @@ -10,9 +10,9 @@ #include +#include "qt_common/config/qt_config.h" #include "ui_configure_input_per_game.h" #include "yuzu/configuration/input_profiles.h" -#include "qt_common/config/qt_config.h" class QComboBox; diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 6bc37d4347..821825f6e1 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project @@ -14,13 +14,13 @@ #include #include "common/assert.h" #include "common/param_package.h" -#include "qt_common/config/qt_config.h" #include "hid_core/frontend/emulated_controller.h" #include "hid_core/hid_core.h" #include "hid_core/hid_types.h" #include "input_common/drivers/keyboard.h" #include "input_common/drivers/mouse.h" #include "input_common/main.h" +#include "qt_common/config/qt_config.h" #include "ui_configure_input_player.h" #include "yuzu/bootmanager.h" #include "yuzu/configuration/configure_input_player.h" @@ -294,11 +294,11 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i InputCommon::InputSubsystem* input_subsystem_, InputProfiles* profiles_, Core::HID::HIDCore& hid_core_, bool is_powered_on_, bool debug_) - : QWidget(parent), - ui(std::make_unique()), player_index{player_index_}, debug{debug_}, - is_powered_on{is_powered_on_}, input_subsystem{input_subsystem_}, profiles(profiles_), - timeout_timer(std::make_unique()), - poll_timer(std::make_unique()), bottom_row{bottom_row_}, hid_core{hid_core_} { + : QWidget(parent), ui(std::make_unique()), + player_index{player_index_}, debug{debug_}, is_powered_on{is_powered_on_}, + input_subsystem{input_subsystem_}, profiles(profiles_), + timeout_timer(std::make_unique()), poll_timer(std::make_unique()), + bottom_row{bottom_row_}, hid_core{hid_core_} { if (player_index == 0) { auto* emulated_controller_p1 = hid_core.GetEmulatedController(Core::HID::NpadIdType::Player1); @@ -1215,10 +1215,8 @@ void ConfigureInputPlayer::UpdateControllerAvailableButtons() { case Core::HID::NpadStyleIndex::Fullkey: case Core::HID::NpadStyleIndex::Handheld: layout_hidden = { - ui->buttonShoulderButtonsSLSRLeft, - ui->buttonShoulderButtonsSLSRRight, - ui->horizontalSpacerShoulderButtonsWidget2, - ui->horizontalSpacerShoulderButtonsWidget4, + ui->buttonShoulderButtonsSLSRLeft, ui->buttonShoulderButtonsSLSRRight, + ui->horizontalSpacerShoulderButtonsWidget2, ui->horizontalSpacerShoulderButtonsWidget4, ui->buttonMiscButtonsScreenshotGroup, }; break; diff --git a/src/yuzu/configuration/configure_input_player_widget.cpp b/src/yuzu/configuration/configure_input_player_widget.cpp index 3228b5f17f..790a860002 100644 --- a/src/yuzu/configuration/configure_input_player_widget.cpp +++ b/src/yuzu/configuration/configure_input_player_widget.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -2432,7 +2432,8 @@ void PlayerControlPreview::DrawProJoystick(QPainter& p, const QPointF center, co 1.0 - std::sqrt((offset.x() * offset.x()) + (offset.y() * offset.y())) * 0.1f); const float rotation = - ((offset.x() == 0.f) ? std::atan(1.f) * 2.f : std::atan(offset.y() / offset.x())) * (180.f / (std::atan(1.f) * 4.f)); + ((offset.x() == 0.f) ? std::atan(1.f) * 2.f : std::atan(offset.y() / offset.x())) * + (180.f / (std::atan(1.f) * 4.f)); p.save(); p.translate(offset_center); diff --git a/src/yuzu/configuration/configure_motion_touch.cpp b/src/yuzu/configuration/configure_motion_touch.cpp index 79a367258f..d1bcac12aa 100644 --- a/src/yuzu/configuration/configure_motion_touch.cpp +++ b/src/yuzu/configuration/configure_motion_touch.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2018 Citra Emulator Project @@ -10,7 +10,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "input_common/drivers/udp_client.h" #include "input_common/helpers/udp_protocol.h" diff --git a/src/yuzu/configuration/configure_network.cpp b/src/yuzu/configuration/configure_network.cpp index 62a097117e..b1fdd018fd 100644 --- a/src/yuzu/configuration/configure_network.cpp +++ b/src/yuzu/configuration/configure_network.cpp @@ -12,10 +12,7 @@ #include "yuzu/configuration/configure_network.h" ConfigureNetwork::ConfigureNetwork(const Core::System& system_, QWidget* parent) - : QWidget(parent) - , ui(std::make_unique()) - , system{system_} -{ + : QWidget(parent), ui(std::make_unique()), system{system_} { ui->setupUi(this); for (const auto& iface : Network::GetAvailableNetworkInterfaces()) ui->network_interface->addItem(QString::fromStdString(iface.name)); diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp index 00e0a14aa3..dcf40d678f 100644 --- a/src/yuzu/configuration/configure_per_game.cpp +++ b/src/yuzu/configuration/configure_per_game.cpp @@ -29,28 +29,28 @@ #include "core/file_sys/xts_archive.h" #include "core/loader/loader.h" #include "frontend_common/config.h" +#include "qt_common/config/uisettings.h" #include "ui_configure_per_game.h" #include "yuzu/configuration/configuration_shared.h" +#include "yuzu/configuration/configure_applets.h" #include "yuzu/configuration/configure_audio.h" #include "yuzu/configuration/configure_cpu.h" #include "yuzu/configuration/configure_graphics.h" #include "yuzu/configuration/configure_graphics_advanced.h" #include "yuzu/configuration/configure_graphics_extensions.h" #include "yuzu/configuration/configure_input_per_game.h" +#include "yuzu/configuration/configure_network.h" #include "yuzu/configuration/configure_per_game.h" #include "yuzu/configuration/configure_per_game_addons.h" #include "yuzu/configuration/configure_system.h" -#include "yuzu/configuration/configure_network.h" -#include "yuzu/configuration/configure_applets.h" -#include "qt_common/config/uisettings.h" #include "yuzu/util/util.h" #include "yuzu/vk_device_info.h" ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::string& file_name, std::vector& vk_device_records, Core::System& system_) - : QDialog(parent), - ui(std::make_unique()), title_id{title_id_}, system{system_}, + : QDialog(parent), ui(std::make_unique()), title_id{title_id_}, + system{system_}, builder{std::make_unique(this, !system_.IsPoweredOn())}, tab_group{std::make_shared>()} { const auto file_path = std::filesystem::path(Common::FS::ToU8String(file_name)); diff --git a/src/yuzu/configuration/configure_per_game.h b/src/yuzu/configuration/configure_per_game.h index 442daab9cb..ca973db8b0 100644 --- a/src/yuzu/configuration/configure_per_game.h +++ b/src/yuzu/configuration/configure_per_game.h @@ -16,10 +16,10 @@ #include "configuration/shared_widget.h" #include "core/file_sys/vfs/vfs_types.h" #include "frontend_common/config.h" -#include "vk_device_info.h" -#include "yuzu/configuration/configuration_shared.h" #include "qt_common/config/qt_config.h" #include "qt_common/config/shared_translation.h" +#include "vk_device_info.h" +#include "yuzu/configuration/configuration_shared.h" namespace Core { class System; diff --git a/src/yuzu/configuration/configure_per_game_addons.cpp b/src/yuzu/configuration/configure_per_game_addons.cpp index 1d2d358672..7d0e15accc 100644 --- a/src/yuzu/configuration/configure_per_game_addons.cpp +++ b/src/yuzu/configuration/configure_per_game_addons.cpp @@ -80,7 +80,8 @@ ConfigurePerGameAddons::ConfigurePerGameAddons(Core::System& system_, QWidget* p connect(ui->folder, &QAbstractButton::clicked, this, &ConfigurePerGameAddons::InstallModFolder); connect(ui->zip, &QAbstractButton::clicked, this, &ConfigurePerGameAddons::InstallModZip); - connect(tree_view, &QTreeView::customContextMenuRequested, this, &ConfigurePerGameAddons::showContextMenu); + connect(tree_view, &QTreeView::customContextMenuRequested, this, + &ConfigurePerGameAddons::showContextMenu); } ConfigurePerGameAddons::~ConfigurePerGameAddons() = default; @@ -92,10 +93,10 @@ void ConfigurePerGameAddons::OnItemChanged(QStandardItem* item) { for (auto* update_item : update_items) { if (update_item != item && update_item->checkState() == Qt::Checked) { disconnect(item_model, &QStandardItemModel::itemChanged, this, - &ConfigurePerGameAddons::OnItemChanged); + &ConfigurePerGameAddons::OnItemChanged); update_item->setCheckState(Qt::Unchecked); connect(item_model, &QStandardItemModel::itemChanged, this, - &ConfigurePerGameAddons::OnItemChanged); + &ConfigurePerGameAddons::OnItemChanged); } } } @@ -109,7 +110,8 @@ void ConfigurePerGameAddons::ApplyConfiguration() { const auto disabled = item.front()->checkState() == Qt::Unchecked; if (disabled) { QVariant userData = item.front()->data(Qt::UserRole); - if (userData.isValid() && userData.canConvert() && item.front()->text() == QStringLiteral("Update")) { + if (userData.isValid() && userData.canConvert() && + item.front()->text() == QStringLiteral("Update")) { quint32 numeric_version = userData.toUInt(); disabled_addons.push_back(fmt::format("Update@{}", numeric_version)); } else { @@ -164,7 +166,7 @@ void ConfigurePerGameAddons::InstallMods(const QStringList& mods) { } } -void ConfigurePerGameAddons::InstallModPath(const QString& path, const QString &fallbackName) { +void ConfigurePerGameAddons::InstallModPath(const QString& path, const QString& fallbackName) { const auto mods = QtCommon::Mod::GetModFolders(path, fallbackName); if (mods.size() > 1) { @@ -203,8 +205,9 @@ void ConfigurePerGameAddons::InstallModZip() { void ConfigurePerGameAddons::AddonDeleteRequested(QList selected) { QList filtered; - for (const QModelIndex &index : selected) { - if (!index.data(PATCH_LOCATION).toString().isEmpty()) filtered << index; + for (const QModelIndex& index : selected) { + if (!index.data(PATCH_LOCATION).toString().isEmpty()) + filtered << index; } if (filtered.empty()) { @@ -215,10 +218,9 @@ void ConfigurePerGameAddons::AddonDeleteRequested(QList selected) { return; } - const auto header = tr("You are about to delete the following installed mods:\n"); QString selected_str; - for (const QModelIndex &index : filtered) { + for (const QModelIndex& index : filtered) { selected_str = selected_str % index.data().toString() % QStringLiteral("\n"); } @@ -231,9 +233,10 @@ void ConfigurePerGameAddons::AddonDeleteRequested(QList selected) { QtCommon::Frontend::StandardButton::Yes | QtCommon::Frontend::StandardButton::No); - if (choice == QtCommon::Frontend::StandardButton::No) return; + if (choice == QtCommon::Frontend::StandardButton::No) + return; - for (const QModelIndex &index : filtered) { + for (const QModelIndex& index : filtered) { std::filesystem::remove_all(index.data(PATCH_LOCATION).toString().toStdString()); } @@ -252,17 +255,18 @@ void ConfigurePerGameAddons::showContextMenu(const QPoint& pos) { auto selected = tree_view->selectionModel()->selectedRows(); if (index.isValid() && selected.empty()) { QModelIndex idx = item_model->index(index.row(), 0); - if (idx.isValid()) selected << idx; + if (idx.isValid()) + selected << idx; } - if (selected.empty()) return; + if (selected.empty()) + return; QMenu menu(this); - QAction *remove = menu.addAction(tr("&Delete")); - connect(remove, &QAction::triggered, this, [this, selected]() { - AddonDeleteRequested(selected); - }); + QAction* remove = menu.addAction(tr("&Delete")); + connect(remove, &QAction::triggered, this, + [this, selected]() { AddonDeleteRequested(selected); }); if (selected.length() == 1) { auto loc = selected.at(0).data(PATCH_LOCATION).toString(); @@ -333,9 +337,11 @@ void ConfigurePerGameAddons::LoadConfiguration() { bool patch_disabled = false; if (is_external_update) { std::string disabled_key = fmt::format("Update@{}", patch.numeric_version); - patch_disabled = std::find(disabled.begin(), disabled.end(), disabled_key) != disabled.end(); + patch_disabled = + std::find(disabled.begin(), disabled.end(), disabled_key) != disabled.end(); } else { - patch_disabled = std::find(disabled.begin(), disabled.end(), name.toStdString()) != disabled.end(); + patch_disabled = + std::find(disabled.begin(), disabled.end(), name.toStdString()) != disabled.end(); } bool should_enable = !patch_disabled; diff --git a/src/yuzu/configuration/configure_per_game_addons.h b/src/yuzu/configuration/configure_per_game_addons.h index 20ab39541b..9dd3b06928 100644 --- a/src/yuzu/configuration/configure_per_game_addons.h +++ b/src/yuzu/configuration/configure_per_game_addons.h @@ -32,10 +32,7 @@ class ConfigurePerGameAddons : public QWidget { Q_OBJECT public: - enum PatchData { - NUMERIC_VERSION = Qt::UserRole, - PATCH_LOCATION - }; + enum PatchData { NUMERIC_VERSION = Qt::UserRole, PATCH_LOCATION }; explicit ConfigurePerGameAddons(Core::System& system_, QWidget* parent = nullptr); ~ConfigurePerGameAddons() override; @@ -48,7 +45,7 @@ public: void SetTitleId(u64 id); public slots: - void InstallMods(const QStringList &mods); + void InstallMods(const QStringList& mods); void InstallModPath(const QString& path, const QString& fallbackName = {}); void InstallModFolder(); diff --git a/src/yuzu/configuration/configure_profile_manager.cpp b/src/yuzu/configuration/configure_profile_manager.cpp index aa19203498..0d86fb5ef9 100644 --- a/src/yuzu/configuration/configure_profile_manager.cpp +++ b/src/yuzu/configuration/configure_profile_manager.cpp @@ -106,7 +106,8 @@ ConfigureProfileManager::ConfigureProfileManager(Core::System& system_, QWidget* ui->scrollArea->setLayout(layout); - connect(tree_view, &QTreeView::customContextMenuRequested, this, &ConfigureProfileManager::showContextMenu); + connect(tree_view, &QTreeView::customContextMenuRequested, this, + &ConfigureProfileManager::showContextMenu); connect(tree_view, &QTreeView::clicked, this, &ConfigureProfileManager::SelectUser); @@ -229,8 +230,7 @@ void ConfigureProfileManager::showContextMenu(const QPoint& pos) { QAction* edit = menu.addAction(tr("&Edit")); QAction* remove = menu.addAction(tr("&Delete")); - QAction* chosen = - menu.exec(tree_view->viewport()->mapToGlobal(pos)); + QAction* chosen = menu.exec(tree_view->viewport()->mapToGlobal(pos)); if (!chosen) return; @@ -250,7 +250,7 @@ void ConfigureProfileManager::SelectUser(const QModelIndex& index) { } void ConfigureProfileManager::AddUser() { - NewUserDialog *dialog = new NewUserDialog(this); + NewUserDialog* dialog = new NewUserDialog(this); connect(dialog, &NewUserDialog::userAdded, this, [dialog, this](User user) { auto uuid = user.uuid; @@ -285,35 +285,37 @@ void ConfigureProfileManager::EditUser() { std::string username; username.reserve(32); - std::ranges::copy_if(profile.username, std::back_inserter(username), [](u8 byte) { return byte != 0; }); + std::ranges::copy_if(profile.username, std::back_inserter(username), + [](u8 byte) { return byte != 0; }); - NewUserDialog *dialog = new NewUserDialog(uuid.value(), username, tr("Edit User"), this); + NewUserDialog* dialog = new NewUserDialog(uuid.value(), username, tr("Edit User"), this); - connect(dialog, &NewUserDialog::userAdded, this, [dialog, profile, user_idx, uuid, this](User user) mutable { - // TODO: MOVE UUID - // auto new_uuid = user.uuid; - auto new_username = user.username; - auto pixmap = user.pixmap; + connect(dialog, &NewUserDialog::userAdded, this, + [dialog, profile, user_idx, uuid, this](User user) mutable { + // TODO: MOVE UUID + // auto new_uuid = user.uuid; + auto new_username = user.username; + auto pixmap = user.pixmap; - auto const uuid_val = uuid.value(); + auto const uuid_val = uuid.value(); - const auto username_std = new_username.toStdString(); - std::fill(profile.username.begin(), profile.username.end(), '\0'); - std::copy(username_std.begin(), username_std.end(), profile.username.begin()); + const auto username_std = new_username.toStdString(); + std::fill(profile.username.begin(), profile.username.end(), '\0'); + std::copy(username_std.begin(), username_std.end(), profile.username.begin()); - profile_manager.SetProfileBase(uuid_val, profile); - profile_manager.WriteUserSaveFile(); + profile_manager.SetProfileBase(uuid_val, profile); + profile_manager.WriteUserSaveFile(); - item_model->setItem( - user_idx, 0, - new QStandardItem{pixmap, - FormatUserEntryText(QString::fromStdString(username_std), uuid_val)}); + item_model->setItem( + user_idx, 0, + new QStandardItem{pixmap, FormatUserEntryText( + QString::fromStdString(username_std), uuid_val)}); - saveImage(pixmap, uuid_val); - UpdateCurrentUser(); + saveImage(pixmap, uuid_val); + UpdateCurrentUser(); - dialog->deleteLater(); - }); + dialog->deleteLater(); + }); connect(dialog, &QDialog::rejected, dialog, &QObject::deleteLater); diff --git a/src/yuzu/configuration/configure_profile_manager.h b/src/yuzu/configuration/configure_profile_manager.h index 6e8c762452..48cd5d215f 100644 --- a/src/yuzu/configuration/configure_profile_manager.h +++ b/src/yuzu/configuration/configure_profile_manager.h @@ -47,8 +47,7 @@ public: explicit ConfigureProfileManagerDeleteDialog(QWidget* parent); ~ConfigureProfileManagerDeleteDialog(); - void SetInfo(const QString& username, const Common::UUID& uuid, - int index); + void SetInfo(const QString& username, const Common::UUID& uuid, int index); signals: void deleteUser(int index); @@ -71,7 +70,7 @@ public: private slots: void saveImage(QPixmap pixmap, Common::UUID uuid); - void showContextMenu(const QPoint &pos); + void showContextMenu(const QPoint& pos); void DeleteUser(const int index); private: diff --git a/src/yuzu/configuration/configure_ringcon.cpp b/src/yuzu/configuration/configure_ringcon.cpp index dfb1540584..4c842bd069 100644 --- a/src/yuzu/configuration/configure_ringcon.cpp +++ b/src/yuzu/configuration/configure_ringcon.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -11,12 +11,12 @@ #include #include -#include "qt_common/config/qt_config.h" #include "hid_core/frontend/emulated_controller.h" #include "hid_core/hid_core.h" #include "input_common/drivers/keyboard.h" #include "input_common/drivers/mouse.h" #include "input_common/main.h" +#include "qt_common/config/qt_config.h" #include "ui_configure_ringcon.h" #include "yuzu/bootmanager.h" #include "yuzu/configuration/configure_ringcon.h" diff --git a/src/yuzu/configuration/configure_system.cpp b/src/yuzu/configuration/configure_system.cpp index 56e3e29f90..36920b1ff9 100644 --- a/src/yuzu/configuration/configure_system.cpp +++ b/src/yuzu/configuration/configure_system.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project @@ -19,8 +19,8 @@ #include "common/settings.h" #include "core/core.h" -#include "ui_configure_system.h" #include "qt_common/qt_compat.h" +#include "ui_configure_system.h" #include "yuzu/configuration/configuration_shared.h" #include "yuzu/configuration/configure_system.h" #include "yuzu/configuration/shared_widget.h" @@ -87,7 +87,8 @@ ConfigureSystem::ConfigureSystem(Core::System& system_, connect(combo_language, qOverload(&QComboBox::currentIndexChanged), this, locale_check); connect(combo_region, qOverload(&QComboBox::currentIndexChanged), this, locale_check); - connect(checkbox_rtc, qOverload(&QCheckBox::STATE_CHANGED), this, update_rtc_date); + connect(checkbox_rtc, qOverload(&QCheckBox::STATE_CHANGED), this, + update_rtc_date); connect(date_rtc_offset, qOverload(&QSpinBox::valueChanged), this, update_rtc_date); connect(date_rtc, &QDateTimeEdit::dateTimeChanged, this, update_date_offset); diff --git a/src/yuzu/configuration/configure_tas.cpp b/src/yuzu/configuration/configure_tas.cpp index 75d5a5eeaf..d737b46d2c 100644 --- a/src/yuzu/configuration/configure_tas.cpp +++ b/src/yuzu/configuration/configure_tas.cpp @@ -9,9 +9,9 @@ #include "common/fs/fs.h" #include "common/fs/path_util.h" #include "common/settings.h" +#include "qt_common/config/uisettings.h" #include "ui_configure_tas.h" #include "yuzu/configuration/configure_tas.h" -#include "qt_common/config/uisettings.h" ConfigureTasDialog::ConfigureTasDialog(QWidget* parent) : QDialog(parent), ui(std::make_unique()) { @@ -35,7 +35,8 @@ void ConfigureTasDialog::LoadConfiguration() { ui->tas_enable->setChecked(Settings::values.tas_enable.GetValue()); ui->tas_loop_script->setChecked(Settings::values.tas_loop.GetValue()); ui->tas_pause_on_load->setChecked(Settings::values.pause_tas_on_load.GetValue()); - ui->tas_show_recording_dialog->setChecked(Settings::values.tas_show_recording_dialog.GetValue()); + ui->tas_show_recording_dialog->setChecked( + Settings::values.tas_show_recording_dialog.GetValue()); } void ConfigureTasDialog::ApplyConfiguration() { diff --git a/src/yuzu/configuration/configure_touch_from_button.cpp b/src/yuzu/configuration/configure_touch_from_button.cpp index 2a4ae3bc89..bbd52e4bfa 100644 --- a/src/yuzu/configuration/configure_touch_from_button.cpp +++ b/src/yuzu/configuration/configure_touch_from_button.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include @@ -548,9 +548,8 @@ bool TouchScreenPreview::eventFilter(QObject* obj, QEvent* event) { } const auto mouse_event = static_cast(event); if (!drag_state.active) { - drag_state.active = - (mouse_event->globalPosition().toPoint() - drag_state.start_pos).manhattanLength() >= - QApplication::startDragDistance(); + drag_state.active = (mouse_event->globalPosition().toPoint() - drag_state.start_pos) + .manhattanLength() >= QApplication::startDragDistance(); if (!drag_state.active) { break; } diff --git a/src/yuzu/configuration/configure_ui.cpp b/src/yuzu/configuration/configure_ui.cpp index 0e91a1a9fd..af8d9fecce 100644 --- a/src/yuzu/configuration/configure_ui.cpp +++ b/src/yuzu/configuration/configure_ui.cpp @@ -26,8 +26,8 @@ #include "core/frontend/framebuffer_layout.h" #include "ui_configure_ui.h" -#include "qt_common/qt_compat.h" #include "qt_common/config/uisettings.h" +#include "qt_common/qt_compat.h" namespace { diff --git a/src/yuzu/configuration/configure_web.cpp b/src/yuzu/configuration/configure_web.cpp index c5e9256a48..987de5989a 100644 --- a/src/yuzu/configuration/configure_web.cpp +++ b/src/yuzu/configuration/configure_web.cpp @@ -1,12 +1,12 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "yuzu/configuration/configure_web.h" #include #include +#include "yuzu/configuration/configure_web.h" #if QT_VERSION_MAJOR >= 6 #include @@ -16,28 +16,25 @@ #include #include "common/settings.h" -#include "ui_configure_web.h" #include "qt_common/config/uisettings.h" +#include "ui_configure_web.h" ConfigureWeb::ConfigureWeb(QWidget* parent) - : QWidget(parent) - , ui(std::make_unique()) - , m_rng{QRandomGenerator::system()} -{ + : QWidget(parent), ui(std::make_unique()), m_rng{QRandomGenerator::system()} { ui->setupUi(this); QString user_regex = QStringLiteral(".{4,20}"); QString token_regex = QStringLiteral("[a-z]{48}"); #if QT_VERSION_MAJOR >= 6 - QRegularExpressionValidator *username_validator = new QRegularExpressionValidator(this); - QRegularExpressionValidator *token_validator = new QRegularExpressionValidator(this); + QRegularExpressionValidator* username_validator = new QRegularExpressionValidator(this); + QRegularExpressionValidator* token_validator = new QRegularExpressionValidator(this); username_validator->setRegularExpression(QRegularExpression(user_regex)); token_validator->setRegularExpression(QRegularExpression(token_regex)); #else - QRegExpValidator *username_validator = new QRegExpValidator(this); - QRegExpValidator *token_validator = new QRegExpValidator(this); + QRegExpValidator* username_validator = new QRegExpValidator(this); + QRegExpValidator* token_validator = new QRegExpValidator(this); username_validator->setRegExp(QRegExp(user_regex)); token_validator->setRegExp(QRegExp(token_regex)); @@ -121,7 +118,8 @@ void ConfigureWeb::VerifyLogin() { ui->label_token_verified->setToolTip(tr("All Good", "Tooltip")); } else { ui->label_token_verified->setPixmap(failed); - ui->label_token_verified->setToolTip(tr("Must be 48 characters, and lowercase a-z", "Tooltip")); + ui->label_token_verified->setToolTip( + tr("Must be 48 characters, and lowercase a-z", "Tooltip")); } } diff --git a/src/yuzu/configuration/configure_web.h b/src/yuzu/configuration/configure_web.h index 3da7e5eccc..d37db5c020 100644 --- a/src/yuzu/configuration/configure_web.h +++ b/src/yuzu/configuration/configure_web.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2017 Citra Emulator Project @@ -8,8 +8,8 @@ #include -#include #include +#include namespace Ui { class ConfigureWeb; @@ -32,7 +32,7 @@ private: void SetConfiguration(); std::unique_ptr ui; - QRandomGenerator *m_rng; + QRandomGenerator* m_rng; private slots: void GenerateToken(); diff --git a/src/yuzu/configuration/input_profiles.cpp b/src/yuzu/configuration/input_profiles.cpp index df80be8252..952b5ab7b0 100644 --- a/src/yuzu/configuration/input_profiles.cpp +++ b/src/yuzu/configuration/input_profiles.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #include "common/fs/fs.h" #include "common/fs/path_util.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "frontend_common/config.h" #include "yuzu/configuration/input_profiles.h" diff --git a/src/yuzu/configuration/shared_widget.cpp b/src/yuzu/configuration/shared_widget.cpp index b663ac51ee..ce11763f91 100644 --- a/src/yuzu/configuration/shared_widget.cpp +++ b/src/yuzu/configuration/shared_widget.cpp @@ -42,11 +42,11 @@ #include "common/assert.h" #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "common/settings_common.h" -#include "qt_common/qt_compat.h" #include "qt_common/config/shared_translation.h" +#include "qt_common/qt_compat.h" namespace ConfigurationShared { @@ -170,7 +170,7 @@ QWidget* Widget::CreateCombobox(std::function& serializer, if (!Settings::IsConfiguringGlobal()) { combobox->connect(combobox, QOverload::of(&QComboBox::activated), - [touch]() { touch(); }); + [touch]() { touch(); }); } return combobox; @@ -413,13 +413,13 @@ QWidget* Widget::CreateDoubleSpinBox(const QString& given_suffix, }; if (!Settings::IsConfiguringGlobal()) { - double_spinbox->connect(double_spinbox, QOverload::of(&QDoubleSpinBox::valueChanged), - [this, touch]() { - if (double_spinbox->value() != - std::strtod(setting.ToStringGlobal().c_str(), nullptr)) { - touch(); - } - }); + double_spinbox->connect( + double_spinbox, QOverload::of(&QDoubleSpinBox::valueChanged), [this, touch]() { + if (double_spinbox->value() != + std::strtod(setting.ToStringGlobal().c_str(), nullptr)) { + touch(); + } + }); } return double_spinbox; @@ -491,11 +491,11 @@ QWidget* Widget::CreateDateTimeEdit(bool disabled, bool restrict, if (!Settings::IsConfiguringGlobal()) { date_time_edit->connect(date_time_edit, &QDateTimeEdit::editingFinished, - [this, get_clear_val, touch]() { - if (date_time_edit->dateTime() != get_clear_val()) { - touch(); - } - }); + [this, get_clear_val, touch]() { + if (date_time_edit->dateTime() != get_clear_val()) { + touch(); + } + }); } return date_time_edit; @@ -570,7 +570,8 @@ void Widget::SetupComponent(const QString& label, std::function& load_fu } if (require_checkbox) { - QWidget* lhs = CreateCheckBox(other_setting, label, checkbox_serializer, checkbox_restore_func, touch); + QWidget* lhs = + CreateCheckBox(other_setting, label, checkbox_serializer, checkbox_restore_func, touch); layout->addWidget(lhs, 1); } else if (type_id != "bool") { QLabel* qt_label = CreateLabel(label); @@ -665,16 +666,16 @@ void Widget::SetupComponent(const QString& label, std::function& load_fu layout->addWidget(restore_button); restore_button->connect(restore_button, &QAbstractButton::clicked, - [this, restore_func, checkbox_restore_func](bool) { - LOG_DEBUG(Frontend, "Restore global state for \"{}\"", - setting.GetLabel()); + [this, restore_func, checkbox_restore_func](bool) { + LOG_DEBUG(Frontend, "Restore global state for \"{}\"", + setting.GetLabel()); - restore_button->setEnabled(false); - restore_button->setVisible(false); + restore_button->setEnabled(false); + restore_button->setVisible(false); - checkbox_restore_func(); - restore_func(); - }); + checkbox_restore_func(); + restore_func(); + }); load_func = [this, serializer, require_checkbox, checkbox_serializer, other_setting]() { bool using_global = !restore_button->isEnabled(); @@ -766,8 +767,8 @@ Widget::Widget(Settings::BasicSetting* setting_, const TranslationMap& translati Builder::Builder(QWidget* parent_, bool runtime_lock_) : translations{InitializeTranslations(parent_)}, - combobox_translations{ComboboxEnumeration(parent_)}, parent{parent_}, runtime_lock{ - runtime_lock_} {} + combobox_translations{ComboboxEnumeration(parent_)}, parent{parent_}, + runtime_lock{runtime_lock_} {} Builder::~Builder() = default; diff --git a/src/yuzu/configuration/shared_widget.h b/src/yuzu/configuration/shared_widget.h index b07804ac00..f687d0b20c 100644 --- a/src/yuzu/configuration/shared_widget.h +++ b/src/yuzu/configuration/shared_widget.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -10,10 +10,10 @@ #include #include #include +#include #include #include #include -#include #include #include "qt_common/config/shared_translation.h" diff --git a/src/yuzu/configuration/system/new_user_dialog.h b/src/yuzu/configuration/system/new_user_dialog.h index 656d8d7290..e81007aefe 100644 --- a/src/yuzu/configuration/system/new_user_dialog.h +++ b/src/yuzu/configuration/system/new_user_dialog.h @@ -20,15 +20,15 @@ struct User { QPixmap pixmap; }; -class NewUserDialog : public QDialog -{ +class NewUserDialog : public QDialog { Q_OBJECT Q_PROPERTY(bool isDefaultAvatar READ isDefaultAvatar WRITE setIsDefaultAvatar NOTIFY isDefaultAvatarChanged FINAL) public: - explicit NewUserDialog(QWidget *parent = nullptr); - explicit NewUserDialog(Common::UUID uuid, const std::string &username, const QString &title, QWidget *parent = nullptr); + explicit NewUserDialog(QWidget* parent = nullptr); + explicit NewUserDialog(Common::UUID uuid, const std::string& username, const QString& title, + QWidget* parent = nullptr); ~NewUserDialog(); bool isDefaultAvatar() const; @@ -39,8 +39,8 @@ public: static QPixmap DefaultAvatar(); private: - Ui::NewUserDialog *ui; - QGraphicsScene *m_scene; + Ui::NewUserDialog* ui; + QGraphicsScene* m_scene; QPixmap m_pixmap; ProfileAvatarDialog* avatar_dialog; @@ -48,12 +48,12 @@ private: bool m_isDefaultAvatar = true; bool m_editing = false; - void setup(Common::UUID uuid, const std::string &username, const QString &title); + void setup(Common::UUID uuid, const std::string& username, const QString& title); bool LoadAvatarData(); std::vector DecompressYaz0(const FileSys::VirtualFile& file); public slots: - void setImage(const QPixmap &pixmap); + void setImage(const QPixmap& pixmap); void selectImage(); void setAvatar(); diff --git a/src/yuzu/data_dialog.cpp b/src/yuzu/data_dialog.cpp index 8caa362bdf..bbe5d43e05 100644 --- a/src/yuzu/data_dialog.cpp +++ b/src/yuzu/data_dialog.cpp @@ -1,10 +1,10 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include "data_dialog.h" #include "frontend_common/data_manager.h" -#include "qt_common/util/content.h" #include "qt_common/qt_string_lookup.h" +#include "qt_common/util/content.h" #include "ui_data_dialog.h" #include "util/util.h" @@ -18,18 +18,14 @@ #include -DataDialog::DataDialog(QWidget *parent) - : QDialog(parent) - , ui(std::make_unique()) -{ +DataDialog::DataDialog(QWidget* parent) : QDialog(parent), ui(std::make_unique()) { ui->setupUi(this); // TODO: Should we make this a single widget that pulls data from a model? -#define WIDGET(label, name) \ - ui->page->addWidget(new DataWidget(FrontendCommon::DataManager::DataDir::name, \ - QtCommon::StringLookup::DataManager##name##Tooltip, \ - QStringLiteral(#name), \ - this)); \ +#define WIDGET(label, name) \ + ui->page->addWidget(new DataWidget(FrontendCommon::DataManager::DataDir::name, \ + QtCommon::StringLookup::DataManager##name##Tooltip, \ + QStringLiteral(#name), this)); \ ui->labels->addItem(label); WIDGET(tr("Shaders"), Shaders) @@ -53,14 +49,10 @@ DataDialog::DataDialog(QWidget *parent) DataDialog::~DataDialog() = default; DataWidget::DataWidget(FrontendCommon::DataManager::DataDir data_dir, - QtCommon::StringLookup::StringKey tooltip, - const QString &exportName, - QWidget *parent) - : QWidget(parent) - , ui(std::make_unique()) - , m_dir(data_dir) - , m_exportName(exportName) -{ + QtCommon::StringLookup::StringKey tooltip, const QString& exportName, + QWidget* parent) + : QWidget(parent), ui(std::make_unique()), m_dir(data_dir), + m_exportName(exportName) { ui->setupUi(this); ui->tooltip->setText(QtCommon::StringLookup::Lookup(tooltip)); @@ -78,28 +70,24 @@ DataWidget::DataWidget(FrontendCommon::DataManager::DataDir data_dir, scan(); } -void DataWidget::clear() -{ +void DataWidget::clear() { std::string user_id = selectProfile(); QtCommon::Content::ClearDataDir(m_dir, user_id); scan(); } -void DataWidget::open() -{ +void DataWidget::open() { std::string user_id = selectProfile(); QDesktopServices::openUrl(QUrl::fromLocalFile( QString::fromStdString(FrontendCommon::DataManager::GetDataDirString(m_dir, user_id)))); } -void DataWidget::upload() -{ +void DataWidget::upload() { std::string user_id = selectProfile(); QtCommon::Content::ExportDataDir(m_dir, user_id, m_exportName); } -void DataWidget::download() -{ +void DataWidget::download() { std::string user_id = selectProfile(); QtCommon::Content::ImportDataDir(m_dir, user_id, std::bind(&DataWidget::scan, this)); } @@ -107,7 +95,7 @@ void DataWidget::download() void DataWidget::scan() { ui->size->setText(tr("Calculating...")); - QFutureWatcher *watcher = new QFutureWatcher(this); + QFutureWatcher* watcher = new QFutureWatcher(this); connect(watcher, &QFutureWatcher::finished, this, [=, this]() { u64 size = watcher->result(); @@ -120,8 +108,7 @@ void DataWidget::scan() { QtConcurrent::run([this]() { return FrontendCommon::DataManager::DataDirSize(m_dir); })); } -std::string DataWidget::selectProfile() -{ +std::string DataWidget::selectProfile() { std::string user_id{}; if (m_dir == FrontendCommon::DataManager::DataDir::Saves) { user_id = GetProfileIDString(); diff --git a/src/yuzu/data_dialog.h b/src/yuzu/data_dialog.h index 70714be7cb..7f988f6047 100644 --- a/src/yuzu/data_dialog.h +++ b/src/yuzu/data_dialog.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #ifndef DATA_DIALOG_H @@ -14,26 +14,23 @@ namespace Ui { class DataDialog; } -class DataDialog : public QDialog -{ +class DataDialog : public QDialog { Q_OBJECT public: - explicit DataDialog(QWidget *parent = nullptr); + explicit DataDialog(QWidget* parent = nullptr); ~DataDialog(); private: std::unique_ptr ui; }; -class DataWidget : public QWidget -{ +class DataWidget : public QWidget { Q_OBJECT public: explicit DataWidget(FrontendCommon::DataManager::DataDir data_dir, - QtCommon::StringLookup::StringKey tooltip, - const QString &exportName, - QWidget *parent = nullptr); + QtCommon::StringLookup::StringKey tooltip, const QString& exportName, + QWidget* parent = nullptr); public slots: void clear(); diff --git a/src/yuzu/debugger/console.cpp b/src/yuzu/debugger/console.cpp index e93a8b9265..8965c7a08f 100644 --- a/src/yuzu/debugger/console.cpp +++ b/src/yuzu/debugger/console.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -10,9 +10,10 @@ #include #endif -#include "common/logging/backend.h" +#include "common/logging.h" #include "yuzu/debugger/console.h" #include "qt_common/config/uisettings.h" +#include "yuzu/debugger/console.h" namespace Debugger { void ToggleConsole() { diff --git a/src/yuzu/deps_dialog.cpp b/src/yuzu/deps_dialog.cpp index ffbd0a0e74..e490bfc163 100644 --- a/src/yuzu/deps_dialog.cpp +++ b/src/yuzu/deps_dialog.cpp @@ -1,24 +1,21 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "yuzu/deps_dialog.h" #include #include #include #include #include #include +#include #include "dep_hashes.h" #include "ui_deps_dialog.h" -#include +#include "yuzu/deps_dialog.h" -DepsDialog::DepsDialog(QWidget* parent) - : QDialog(parent) - , ui{std::make_unique()} -{ +DepsDialog::DepsDialog(QWidget* parent) : QDialog(parent), ui{std::make_unique()} { ui->setupUi(this); - constexpr int rows = (int) Common::dep_hashes.size(); + constexpr int rows = (int)Common::dep_hashes.size(); ui->tableDeps->setRowCount(rows); QStringList labels; @@ -36,8 +33,8 @@ DepsDialog::DepsDialog(QWidget* parent) std::string dependency = fmt::format("{}", url, name); - QTableWidgetItem *nameItem = new QTableWidgetItem(QString::fromStdString(dependency)); - QTableWidgetItem *shaItem = new QTableWidgetItem(QString::fromStdString(sha)); + QTableWidgetItem* nameItem = new QTableWidgetItem(QString::fromStdString(dependency)); + QTableWidgetItem* shaItem = new QTableWidgetItem(QString::fromStdString(sha)); ui->tableDeps->setItem(i, 0, nameItem); ui->tableDeps->setItem(i, 1, shaItem); @@ -48,14 +45,10 @@ DepsDialog::DepsDialog(QWidget* parent) DepsDialog::~DepsDialog() = default; -LinkItemDelegate::LinkItemDelegate(QObject *parent) - : QStyledItemDelegate(parent) -{} +LinkItemDelegate::LinkItemDelegate(QObject* parent) : QStyledItemDelegate(parent) {} -void LinkItemDelegate::paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const -{ +void LinkItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, + const QModelIndex& index) const { auto options = option; initStyleOption(&options, index); @@ -71,8 +64,8 @@ void LinkItemDelegate::paint(QPainter *painter, painter->restore(); } -QSize LinkItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const -{ +QSize LinkItemDelegate::sizeHint(const QStyleOptionViewItem& option, + const QModelIndex& index) const { QStyleOptionViewItem options = option; initStyleOption(&options, index); @@ -82,13 +75,10 @@ QSize LinkItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QMode return QSize(doc.idealWidth(), doc.size().height()); } -bool LinkItemDelegate::editorEvent(QEvent *event, - QAbstractItemModel *model, - const QStyleOptionViewItem &option, - const QModelIndex &index) -{ +bool LinkItemDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, + const QStyleOptionViewItem& option, const QModelIndex& index) { if (event->type() == QEvent::MouseButtonRelease) { - QMouseEvent *mouseEvent = static_cast(event); + QMouseEvent* mouseEvent = static_cast(event); if (mouseEvent->button() == Qt::LeftButton) { QString html = index.data(Qt::DisplayRole).toString(); QTextDocument doc; @@ -96,7 +86,7 @@ bool LinkItemDelegate::editorEvent(QEvent *event, doc.setTextWidth(option.rect.width()); // this is kinda silly but it werks - QAbstractTextDocumentLayout *layout = doc.documentLayout(); + QAbstractTextDocumentLayout* layout = doc.documentLayout(); QPoint pos = mouseEvent->pos() - option.rect.topLeft(); int charPos = layout->hitTest(pos, Qt::ExactHit); diff --git a/src/yuzu/deps_dialog.h b/src/yuzu/deps_dialog.h index f8e7f1d987..fab2f0b1ca 100644 --- a/src/yuzu/deps_dialog.h +++ b/src/yuzu/deps_dialog.h @@ -1,41 +1,38 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once +#include #include #include #include -#include -namespace Ui { class DepsDialog; } +namespace Ui { +class DepsDialog; +} -class DepsDialog : public QDialog -{ +class DepsDialog : public QDialog { Q_OBJECT public: - explicit DepsDialog(QWidget *parent); + explicit DepsDialog(QWidget* parent); ~DepsDialog() override; private: std::unique_ptr ui; }; -class LinkItemDelegate : public QStyledItemDelegate -{ +class LinkItemDelegate : public QStyledItemDelegate { Q_OBJECT public: - explicit LinkItemDelegate(QObject *parent = 0); + explicit LinkItemDelegate(QObject* parent = 0); protected: - void paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const override; - QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; - bool editorEvent(QEvent *event, - QAbstractItemModel *model, - const QStyleOptionViewItem &option, - const QModelIndex &index) override; + void paint(QPainter* painter, const QStyleOptionViewItem& option, + const QModelIndex& index) const override; + QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override; + bool editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, + const QModelIndex& index) override; }; diff --git a/src/yuzu/game/game_card.cpp b/src/yuzu/game/game_card.cpp index 26ab99faaf..ba60b54fcc 100644 --- a/src/yuzu/game/game_card.cpp +++ b/src/yuzu/game/game_card.cpp @@ -73,9 +73,7 @@ void GameCard::paint(QPainter* painter, const QStyleOptionViewItem& option, painter->restore(); } else { // if there is no icon just draw a blank rect - iconRect = QRect(cardRect.left() + padding, - cardRect.top() + padding, - _iconsize, _iconsize); + iconRect = QRect(cardRect.left() + padding, cardRect.top() + padding, _iconsize, _iconsize); } if (UISettings::values.show_game_name.GetValue()) { diff --git a/src/yuzu/game/game_card.h b/src/yuzu/game/game_card.h index 9fd0ec081a..86387452b6 100644 --- a/src/yuzu/game/game_card.h +++ b/src/yuzu/game/game_card.h @@ -14,12 +14,10 @@ class GameCard : public QStyledItemDelegate { public: explicit GameCard(QObject* parent = nullptr); - void paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const override; + void paint(QPainter* painter, const QStyleOptionViewItem& option, + const QModelIndex& index) const override; - QSize sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const override; + QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override; void setSize(const QSize& newSize, const int padding); private: diff --git a/src/yuzu/game/game_list.cpp b/src/yuzu/game/game_list.cpp index c57198848f..0e2b6cf7e6 100644 --- a/src/yuzu/game/game_list.cpp +++ b/src/yuzu/game/game_list.cpp @@ -21,7 +21,7 @@ #include #include #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core.h" #include "core/file_sys/patch_manager.h" @@ -218,11 +218,13 @@ void GameList::OnTextChanged(const QString& new_text) { for (int i = 0; i < row_count; ++i) { QStandardItem* item = item_model->item(i, 0); - if (!item) continue; + if (!item) + continue; children_total++; - const QString file_path = item->data(GameListItemPath::FullPathRole).toString().toLower(); + const QString file_path = + item->data(GameListItemPath::FullPathRole).toString().toLower(); const QString file_title = item->data(GameListItemPath::TitleRole).toString().toLower(); const QString file_name = file_path.mid(file_path.lastIndexOf(QLatin1Char{'/'}) + 1) + QLatin1Char{' '} + file_title; @@ -236,7 +238,8 @@ void GameList::OnTextChanged(const QString& new_text) { } search_field->setFilterResult(result_count, children_total); } else if (edit_filter_text.isEmpty()) { - hide(0, UISettings::values.favorited_ids.size() == 0, item_model->invisibleRootItem()->index()); + hide(0, UISettings::values.favorited_ids.size() == 0, + item_model->invisibleRootItem()->index()); for (int i = 1; i < item_model->rowCount() - 1; ++i) { folder = item_model->item(i, 0); const QModelIndex folder_index = folder->index(); @@ -362,7 +365,8 @@ GameList::GameList(FileSys::VirtualFilesystem vfs_, FileSys::ManualContentProvid external_watcher = new QFileSystemWatcher(this); ResetExternalWatcher(); - connect(external_watcher, &QFileSystemWatcher::directoryChanged, this, &GameList::RefreshExternalContent); + connect(external_watcher, &QFileSystemWatcher::directoryChanged, this, + &GameList::RefreshExternalContent); this->main_window = parent; layout = new QVBoxLayout; @@ -471,7 +475,7 @@ bool GameList::IsTreeMode() { } void GameList::ResetViewMode() { - auto &setting = UISettings::values.game_list_mode; + auto& setting = UISettings::values.game_list_mode; bool newTreeMode = false; switch (setting.GetValue()) { @@ -678,7 +682,7 @@ void GameList::PopupContextMenu(const QPoint& menu_location) { return; QMenu blank_menu; - QAction *addGameDirAction = blank_menu.addAction(tr("&Add New Game Directory")); + QAction* addGameDirAction = blank_menu.addAction(tr("&Add New Game Directory")); connect(addGameDirAction, &QAction::triggered, this, &GameList::AddDirectory); blank_menu.exec(m_currentView->viewport()->mapToGlobal(menu_location)); @@ -1113,8 +1117,7 @@ const QStringList GameList::supported_file_extensions = { QStringLiteral("nso"), QStringLiteral("nro"), QStringLiteral("nca"), QStringLiteral("xci"), QStringLiteral("nsp"), QStringLiteral("kip")}; -void GameList::RefreshGameDirectory() -{ +void GameList::RefreshGameDirectory() { // Reset the externals watcher whenever the game list is reloaded, // primarily ensures that new titles and external dirs are caught. ResetExternalWatcher(); @@ -1142,7 +1145,7 @@ void GameList::ResetExternalWatcher() { external_watcher->removePaths(watch_dirs); } - for (const std::string &dir : Settings::values.external_content_dirs) { + for (const std::string& dir : Settings::values.external_content_dirs) { external_watcher->addPath(QString::fromStdString(dir)); } } @@ -1286,8 +1289,8 @@ bool GameList::eventFilter(QObject* obj, QEvent* event) { horizontal_scroll_target = m_currentView->horizontalScrollBar()->value(); horizontal_scroll_target -= deltaX; - horizontal_scroll_target = - qBound(0, horizontal_scroll_target, m_currentView->horizontalScrollBar()->maximum()); + horizontal_scroll_target = qBound(0, horizontal_scroll_target, + m_currentView->horizontalScrollBar()->maximum()); horizontal_scroll->stop(); horizontal_scroll->setStartValue(m_currentView->horizontalScrollBar()->value()); diff --git a/src/yuzu/game/game_list.h b/src/yuzu/game/game_list.h index 7de622b714..42efcbdc3b 100644 --- a/src/yuzu/game/game_list.h +++ b/src/yuzu/game/game_list.h @@ -21,10 +21,10 @@ #include "common/common_types.h" #include "core/core.h" +#include "frontend_common/play_time_manager.h" #include "qt_common/config/uisettings.h" #include "qt_common/util/game.h" #include "yuzu/compatibility_list.h" -#include "frontend_common/play_time_manager.h" class QVariantAnimation; @@ -124,7 +124,7 @@ signals: void NavigateToGamedbEntryRequested(u64 program_id, const CompatibilityList& compatibility_list); void OpenPerGameGeneralRequested(const std::string& file); - void LinkToRyujinxRequested(const u64 &program_id); + void LinkToRyujinxRequested(const u64& program_id); void OpenDirectory(const QString& directory); void AddDirectory(); void ShowList(bool show); @@ -170,8 +170,8 @@ private: QVBoxLayout* layout = nullptr; QTreeView* tree_view = nullptr; - QListView *list_view = nullptr; - GameCard *m_gameCard = nullptr; + QListView* list_view = nullptr; + GameCard* m_gameCard = nullptr; QStandardItemModel* item_model = nullptr; std::unique_ptr current_worker; @@ -194,7 +194,7 @@ private: Core::System& system; bool m_isTreeMode = true; - QAbstractItemView *m_currentView = tree_view; + QAbstractItemView* m_currentView = tree_view; }; class GameListPlaceholder : public QWidget { diff --git a/src/yuzu/game/game_list_p.h b/src/yuzu/game/game_list_p.h index 9bae5b9e01..f9d714fb8b 100644 --- a/src/yuzu/game/game_list_p.h +++ b/src/yuzu/game/game_list_p.h @@ -14,13 +14,13 @@ #include #include #include +#include #include #include #include -#include #include "common/common_types.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/string_util.h" #include "frontend_common/play_time_manager.h" #include "qt_common/config/uisettings.h" @@ -77,7 +77,7 @@ public: GameListItemPath() = default; GameListItemPath(const QString& game_path, const std::vector& picture_data, const QString& game_name, const QString& game_type, u64 program_id, - u64 play_time, const QString &patch_versions) { + u64 play_time, const QString& patch_versions) { setData(type(), TypeRole); setData(game_path, FullPathRole); setData(game_name, TitleRole); @@ -85,14 +85,15 @@ public: setData(game_type, FileTypeRole); const auto readable_play_time = - play_time > 0 - ? QObject::tr("Play Time: %1").arg(QString::fromStdString(PlayTime::PlayTimeManager::GetReadablePlayTime(play_time))) - : QObject::tr("Never Played"); + play_time > 0 ? QObject::tr("Play Time: %1") + .arg(QString::fromStdString( + PlayTime::PlayTimeManager::GetReadablePlayTime(play_time))) + : QObject::tr("Never Played"); const auto enabled_update = [patch_versions]() -> QString { const QStringList lines = patch_versions.split(QLatin1Char('\n')); const QRegularExpression regex{QStringLiteral(R"(^Update \(([0-9\.]+)\))")}; - for (const QString &line : std::as_const(lines)) { + for (const QString& line : std::as_const(lines)) { const auto match = regex.match(line); if (match.hasMatch() && match.hasCaptured(1)) return QObject::tr("Version: %1").arg(match.captured(1)); @@ -100,9 +101,7 @@ public: return QObject::tr("Version: 1.0.0"); }(); - const auto tooltip = QStringLiteral("%1\n%2").arg( - readable_play_time, - enabled_update); + const auto tooltip = QStringLiteral("%1\n%2").arg(readable_play_time, enabled_update); setData(tooltip, Qt::ToolTipRole); @@ -145,7 +144,7 @@ public: return row1.toLower(); } - // None + // None if (row2_id == 4) { return row1; } @@ -163,7 +162,6 @@ public: default: break; } - } return GameListItem::data(role); diff --git a/src/yuzu/game/game_list_worker.cpp b/src/yuzu/game/game_list_worker.cpp index 81012e4374..777122e135 100644 --- a/src/yuzu/game/game_list_worker.cpp +++ b/src/yuzu/game/game_list_worker.cpp @@ -30,11 +30,11 @@ #include "core/file_sys/romfs.h" #include "core/file_sys/submission_package.h" #include "core/loader/loader.h" +#include "qt_common/config/uisettings.h" #include "yuzu/compatibility_list.h" #include "yuzu/game/game_list.h" #include "yuzu/game/game_list_p.h" #include "yuzu/game/game_list_worker.h" -#include "qt_common/config/uisettings.h" namespace { @@ -198,26 +198,24 @@ QString FormatPatchNameVersions(const FileSys::PatchManager& patch_manager, return out; } -QList MakeGameListEntry(const std::string& path, - const std::string& name, - const std::size_t size, - const std::vector& icon, - Loader::AppLoader& loader, - u64 program_id, +QList MakeGameListEntry(const std::string& path, const std::string& name, + const std::size_t size, const std::vector& icon, + Loader::AppLoader& loader, u64 program_id, const CompatibilityList& compatibility_list, const PlayTime::PlayTimeManager& play_time_manager, - const FileSys::PatchManager& patch) -{ + const FileSys::PatchManager& patch) { auto const it = FindMatchingCompatibilityEntry(compatibility_list, program_id); // The game list uses 99 as compatibility number for untested games - QString compatibility = it != compatibility_list.end() ? it->second.first : QStringLiteral("99"); + QString compatibility = + it != compatibility_list.end() ? it->second.first : QStringLiteral("99"); auto const file_type = loader.GetFileType(); auto const file_type_string = QString::fromStdString(Loader::GetFileTypeString(file_type)); - QString patch_versions = GetGameListCachedObject(fmt::format("{:016X}", patch.GetTitleID()), "pv.txt", [&patch, &loader] { - return FormatPatchNameVersions(patch, loader, loader.IsRomFSUpdatable()); - }); + QString patch_versions = GetGameListCachedObject( + fmt::format("{:016X}", patch.GetTitleID()), "pv.txt", [&patch, &loader] { + return FormatPatchNameVersions(patch, loader, loader.IsRomFSUpdatable()); + }); u64 play_time = play_time_manager.GetPlayTime(program_id); return QList{ @@ -238,13 +236,9 @@ GameListWorker::GameListWorker(FileSys::VirtualFilesystem vfs_, const CompatibilityList& compatibility_list_, const PlayTime::PlayTimeManager& play_time_manager_, Core::System& system_) - : vfs{std::move(vfs_)} - , provider{provider_} - , game_dirs{game_dirs_} - , compatibility_list{compatibility_list_} - , play_time_manager{play_time_manager_} - , system{system_} -{ + : vfs{std::move(vfs_)}, provider{provider_}, game_dirs{game_dirs_}, + compatibility_list{compatibility_list_}, play_time_manager{play_time_manager_}, + system{system_} { // We want the game list to manage our lifetime. setAutoDelete(false); } @@ -338,15 +332,8 @@ void GameListWorker::AddTitlesToGameList(GameListDir* parent_dir) { GetMetadataFromControlNCA(patch, *control, icon, name); } - auto entry = MakeGameListEntry(file->GetFullPath(), - name, - file->GetSize(), - icon, - *loader, - program_id, - compatibility_list, - play_time_manager, - patch); + auto entry = MakeGameListEntry(file->GetFullPath(), name, file->GetSize(), icon, *loader, + program_id, compatibility_list, play_time_manager, patch); RecordEvent([=](GameList* game_list) { game_list->AddEntry(entry, parent_dir); }); } } @@ -424,15 +411,9 @@ void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_pa const FileSys::PatchManager patch{id, system.GetFileSystemController(), system.GetContentProvider()}; - auto entry = MakeGameListEntry(physical_name, - name, - Common::FS::GetSize(physical_name), - icon, - *loader, - id, - compatibility_list, - play_time_manager, - patch); + auto entry = MakeGameListEntry( + physical_name, name, Common::FS::GetSize(physical_name), icon, *loader, + id, compatibility_list, play_time_manager, patch); RecordEvent( [=](GameList* game_list) { game_list->AddEntry(entry, parent_dir); }); @@ -447,15 +428,9 @@ void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_pa const FileSys::PatchManager patch{program_id, system.GetFileSystemController(), system.GetContentProvider()}; - auto entry = MakeGameListEntry(physical_name, - name, - Common::FS::GetSize(physical_name), - icon, - *loader, - program_id, - compatibility_list, - play_time_manager, - patch); + auto entry = MakeGameListEntry( + physical_name, name, Common::FS::GetSize(physical_name), icon, *loader, + program_id, compatibility_list, play_time_manager, patch); RecordEvent( [=](GameList* game_list) { game_list->AddEntry(entry, parent_dir); }); diff --git a/src/yuzu/game/game_list_worker.h b/src/yuzu/game/game_list_worker.h index 76153f7917..bf67585fe6 100644 --- a/src/yuzu/game/game_list_worker.h +++ b/src/yuzu/game/game_list_worker.h @@ -18,9 +18,9 @@ #include "common/thread.h" #include "core/file_sys/registered_cache.h" +#include "frontend_common/play_time_manager.h" #include "qt_common/config/uisettings.h" #include "yuzu/compatibility_list.h" -#include "frontend_common/play_time_manager.h" namespace Core { class System; diff --git a/src/yuzu/hotkeys.cpp b/src/yuzu/hotkeys.cpp index 10e407402b..5ca437a597 100644 --- a/src/yuzu/hotkeys.cpp +++ b/src/yuzu/hotkeys.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2014 Citra Emulator Project @@ -10,8 +10,8 @@ #include #include "hid_core/frontend/emulated_controller.h" -#include "yuzu/hotkeys.h" #include "qt_common/config/uisettings.h" +#include "yuzu/hotkeys.h" HotkeyRegistry::HotkeyRegistry() = default; HotkeyRegistry::~HotkeyRegistry() = default; diff --git a/src/yuzu/install_dialog.cpp b/src/yuzu/install_dialog.cpp index 1b772a0eba..de42297618 100644 --- a/src/yuzu/install_dialog.cpp +++ b/src/yuzu/install_dialog.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -10,8 +10,8 @@ #include #include #include -#include "yuzu/install_dialog.h" #include "qt_common/config/uisettings.h" +#include "yuzu/install_dialog.h" InstallDialog::InstallDialog(QWidget* parent, const QStringList& files) : QDialog(parent) { file_list = new QListWidget(this); diff --git a/src/yuzu/libqt_common.cpp b/src/yuzu/libqt_common.cpp new file mode 100644 index 0000000000..198d1b66be --- /dev/null +++ b/src/yuzu/libqt_common.cpp @@ -0,0 +1,119 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include +#include +#include + +#include "libqt_common.h" +#include "qt_common/abstract/frontend.h" +#include "qt_common/abstract/progress.h" +#include "qt_common/qt_common.h" + +namespace QtCommon::Frontend { + +StandardButton ShowMessage(Icon icon, const QString& title, const QString& text, + StandardButtons buttons, QObject* parent) { + QMessageBox* box = + new QMessageBox(QMessageBox::Icon(int(icon)), title, text, + QMessageBox::StandardButtons(int(buttons)), (QWidget*)parent); + return StandardButton(box->exec()); +} + +WidgetsProgressDialog::WidgetsProgressDialog(const QString& labelText, + const QString& cancelButtonText, int minimum, + int maximum, QWidget* parent, Qt::WindowFlags f) + : QtProgressDialog(labelText, cancelButtonText, minimum, maximum, parent, f), + m_dialog(new QProgressDialog(labelText, cancelButtonText, minimum, maximum, parent, f)) { + m_dialog->setAutoClose(false); + m_dialog->setAutoReset(false); + m_dialog->setMinimumDuration(100); + m_dialog->setWindowModality(Qt::WindowModal); +} + +bool WidgetsProgressDialog::wasCanceled() const { + return m_dialog->wasCanceled(); +} + +void WidgetsProgressDialog::setWindowModality(Qt::WindowModality modality) { + m_dialog->setWindowModality(modality); +} + +void WidgetsProgressDialog::setMinimumDuration(int durationMs) { + m_dialog->setMinimumDuration(durationMs); +} + +void WidgetsProgressDialog::setAutoClose(bool autoClose) { + m_dialog->setAutoClose(autoClose); +} + +void WidgetsProgressDialog::setAutoReset(bool autoReset) { + m_dialog->setAutoReset(autoReset); +} + +void WidgetsProgressDialog::setTitle(QString title) { + m_dialog->setWindowTitle(title); +} + +void WidgetsProgressDialog::setLabelText(QString text) { + m_dialog->setLabelText(text); +} + +void WidgetsProgressDialog::setMinimum(int min) { + m_dialog->setMinimum(min); +} + +void WidgetsProgressDialog::setMaximum(int max) { + m_dialog->setMaximum(max); +} + +void WidgetsProgressDialog::setValue(int value) { + m_dialog->setValue(value); +} + +bool WidgetsProgressDialog::close() { + m_dialog->close(); + return true; +} + +void WidgetsProgressDialog::show() { + m_dialog->show(); +} + +std::unique_ptr newProgressDialog(const QString& labelText, + const QString& cancelButtonText, int minimum, + int maximum, Qt::WindowFlags f) { + return std::make_unique(labelText, cancelButtonText, minimum, maximum, + (QWidget*)rootObject, f); +} + +QtProgressDialog* newProgressDialogPtr(const QString& labelText, const QString& cancelButtonText, + int minimum, int maximum, Qt::WindowFlags f) { + return new WidgetsProgressDialog(labelText, cancelButtonText, minimum, maximum, + (QWidget*)rootObject, f); +} + +int Choice(const QString& title, const QString& caption, const QStringList& options) { + QMessageBox box(rootObject); + box.setText(caption); + box.setWindowTitle(title); + + for (const QString& opt : options) { + box.addButton(opt, QMessageBox::AcceptRole); + } + + box.addButton(QMessageBox::Cancel); + + box.exec(); + auto button = box.clickedButton(); + return options.indexOf(button->text()); +} + +const QString GetTextInput(const QString& title, const QString& caption, + const QString& defaultText) { + return QInputDialog::getText(rootObject, title, caption, QLineEdit::Normal, defaultText); +} + +} // namespace QtCommon::Frontend diff --git a/src/yuzu/libqt_common.h b/src/yuzu/libqt_common.h new file mode 100644 index 0000000000..356fd65d2b --- /dev/null +++ b/src/yuzu/libqt_common.h @@ -0,0 +1,37 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "qt_common/abstract/progress.h" + +#include + +namespace QtCommon::Frontend { + +class WidgetsProgressDialog : public QtProgressDialog { + Q_OBJECT +public: + WidgetsProgressDialog(const QString& labelText, const QString& cancelButtonText, int minimum, + int maximum, QWidget* parent = nullptr, Qt::WindowFlags f = {}); + + bool wasCanceled() const override; + void setWindowModality(Qt::WindowModality modality) override; + void setMinimumDuration(int durationMs) override; + void setAutoClose(bool autoClose) override; + void setAutoReset(bool autoReset) override; + +public slots: + void setTitle(QString title) override; + void setLabelText(QString text) override; + void setMinimum(int min) override; + void setMaximum(int max) override; + void setValue(int value) override; + bool close() override; + void show() override; + +private: + QProgressDialog* m_dialog; +}; + +} // namespace QtCommon::Frontend diff --git a/src/yuzu/loading_screen.cpp b/src/yuzu/loading_screen.cpp index d6550a2c81..d67667a91d 100644 --- a/src/yuzu/loading_screen.cpp +++ b/src/yuzu/loading_screen.cpp @@ -4,7 +4,6 @@ // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include #include #include #include @@ -14,6 +13,7 @@ #include #include #include +#include #include "core/frontend/framebuffer_layout.h" #include "core/loader/loader.h" #include "ui_loading_screen.h" diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index c6b4fde83e..f8528d9671 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -5,8 +5,8 @@ #include "startup_checks.h" #if YUZU_ROOM -#include "dedicated_room/yuzu_room.h" #include +#include "dedicated_room/yuzu_room.h" #endif #include @@ -62,9 +62,8 @@ static Qt::HighDpiScaleFactorRoundingPolicy GetHighDpiRoundingPolicy() { // Get the lower of the 2 ratios and truncate, this is the maximum integer scale. const qreal max_ratio = std::trunc(std::min(width_ratio, height_ratio)); - return max_ratio > real_ratio - ? Qt::HighDpiScaleFactorRoundingPolicy::Round - : Qt::HighDpiScaleFactorRoundingPolicy::Floor; + return max_ratio > real_ratio ? Qt::HighDpiScaleFactorRoundingPolicy::Round + : Qt::HighDpiScaleFactorRoundingPolicy::Floor; #else // Other OSes should be better than Windows at fractional scaling. return Qt::HighDpiScaleFactorRoundingPolicy::PassThrough; @@ -174,7 +173,7 @@ int main(int argc, char* argv[]) { main_window.show(); app.connect(&app, &QGuiApplication::applicationStateChanged, &main_window, - &MainWindow::OnAppFocusStateChanged); + &MainWindow::OnAppFocusStateChanged); int result = app.exec(); detached_tasks.WaitForAllTasks(); diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 399b3bd976..2e7cef0953 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -19,8 +19,8 @@ #include "ui_main.h" // Other Yuzu stuff // -#include "debugger/controller.h" #include "debugger/console.h" +#include "debugger/controller.h" #include "about_dialog.h" #include "data_dialog.h" @@ -28,18 +28,18 @@ #include "install_dialog.h" #include "bootmanager.h" -#include "yuzu/game/game_list.h" #include "loading_screen.h" #include "ryujinx_dialog.h" #include "set_play_time_dialog.h" #include "util/util.h" #include "vk_device_info.h" +#include "yuzu/game/game_list.h" #include "applets/qt_amiibo_settings.h" #include "applets/qt_controller.h" +#include "applets/qt_error.h" #include "applets/qt_profile_select.h" #include "applets/qt_software_keyboard.h" -#include "applets/qt_error.h" #include "applets/qt_web_browser.h" #include "configuration/configure_dialog.h" @@ -48,8 +48,8 @@ #include "configuration/configure_tas.h" #include "util/clickable_label.h" -#include "util/overlay_dialog.h" #include "util/controller_navigation.h" +#include "util/overlay_dialog.h" #include "multiplayer/state.h" @@ -60,6 +60,7 @@ #include #endif +#include #include #include #include @@ -68,32 +69,32 @@ #include #include #include +#include #include #include #include #include #include #include -#include -#include // Qt Common // -#include "qt_common/config/uisettings.h" #include "qt_common/config/shared_translation.h" +#include "qt_common/config/uisettings.h" #include "qt_common/abstract/frontend.h" #include "qt_common/qt_common.h" -#include "qt_common/util/path.h" -#include "qt_common/util/meta.h" #include "qt_common/util/content.h" #include "qt_common/util/fs.h" +#include "qt_common/util/meta.h" #include "qt_common/util/mod.h" +#include "qt_common/util/path.h" // These are wrappers to avoid the calls to CreateDirectory and CreateFile because of the Windows // defines. -static FileSys::VirtualDir VfsFilesystemCreateDirectoryWrapper(const std::string& path, FileSys::OpenMode mode) { +static FileSys::VirtualDir VfsFilesystemCreateDirectoryWrapper(const std::string& path, + FileSys::OpenMode mode) { return QtCommon::vfs->CreateDirectory(path, mode); } @@ -111,7 +112,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual // Common // #include "common/fs/fs.h" -#include "common/logging/backend.h" +#include "common/logging.h" #include "common/memory_detect.h" #include "common/scm_rev.h" #include "common/scope_exit.h" @@ -122,14 +123,14 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #endif // Core // -#include "core/frontend/applets/software_keyboard.h" -#include "core/frontend/applets/mii_edit.h" #include "core/frontend/applets/general.h" +#include "core/frontend/applets/mii_edit.h" +#include "core/frontend/applets/software_keyboard.h" +#include "core/hle/kernel/k_process.h" #include "core/hle/service/acc/profile_manager.h" #include "core/hle/service/am/applet_manager.h" #include "core/hle/service/am/frontend/applet_web_browser_types.h" -#include "core/hle/kernel/k_process.h" #include "core/file_sys/card_image.h" #include "core/file_sys/romfs.h" @@ -142,8 +143,8 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #include "core/crypto/key_manager.h" // Input // -#include "hid_core/hid_core.h" #include "hid_core/frontend/emulated_controller.h" +#include "hid_core/hid_core.h" #include "input_common/drivers/virtual_amiibo.h" // Video Core // @@ -165,17 +166,17 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #ifdef __unix__ #include +#include #include #include "qt_common/gui_settings.h" -#include #endif #include "qt_common/gamemode.h" #ifdef _WIN32 -#include "core/core_timing.h" #include "common/windows/timer_resolution.h" +#include "core/core_timing.h" #include #include @@ -381,7 +382,7 @@ static QString PrettyProductName() { namespace { -constexpr std::array, 5> default_game_icon_sizes{ +constexpr std::array, 5> default_game_icon_sizes{ std::make_pair(0, QT_TRANSLATE_NOOP("MainWindow", "None")), std::make_pair(32, QT_TRANSLATE_NOOP("MainWindow", "Small (32x32)")), std::make_pair(64, QT_TRANSLATE_NOOP("MainWindow", "Standard (64x64)")), @@ -393,7 +394,7 @@ QString GetTranslatedGameIconSize(size_t index) { return QCoreApplication::translate("MainWindow", default_game_icon_sizes[index].second); } -} +} // namespace #ifndef _WIN32 // TODO(crueter): carboxyl does this, is it needed in qml? @@ -412,7 +413,7 @@ inline static bool isDarkMode() { MainWindow::MainWindow(bool has_broken_vulkan) : ui{std::make_unique()}, - input_subsystem{std::make_shared()}, user_data_migrator{this} { + input_subsystem{std::make_shared()}, user_data_migrator{this} { QtCommon::Init(this); Common::FS::CreateEdenPaths(); @@ -423,17 +424,14 @@ MainWindow::MainWindow(bool has_broken_vulkan) using namespace Common::FS; - static constexpr const std::array paths = {EdenPath::NANDDir, - EdenPath::SDMCDir, - EdenPath::DumpDir, - EdenPath::LoadDir}; + static constexpr const std::array paths = { + EdenPath::NANDDir, EdenPath::SDMCDir, EdenPath::DumpDir, EdenPath::LoadDir}; for (const EdenPath& path : paths) { std::string str_path = Common::FS::GetEdenPathString(path); if (str_path.starts_with(user_data_migrator.selected_emu.get_user_dir())) { - boost::replace_all(str_path, - user_data_migrator.selected_emu.lower_name().toStdString(), - "eden"); + boost::replace_all( + str_path, user_data_migrator.selected_emu.lower_name().toStdString(), "eden"); Common::FS::SetEdenPath(path, str_path); } } @@ -531,7 +529,8 @@ MainWindow::MainWindow(bool has_broken_vulkan) std::chrono::duration_cast>( Common::Windows::SetCurrentTimerResolutionToMaximum()) .count()); - QtCommon::system->CoreTiming().SetTimerResolutionNs(Common::Windows::GetCurrentTimerResolution()); + QtCommon::system->CoreTiming().SetTimerResolutionNs( + Common::Windows::GetCurrentTimerResolution()); #endif UpdateWindowTitle(); @@ -539,9 +538,8 @@ MainWindow::MainWindow(bool has_broken_vulkan) #ifdef ENABLE_UPDATE_CHECKER if (UISettings::values.check_for_updates) { - update_future = QtConcurrent::run([]() -> std::optional { - return UpdateChecker::GetUpdate(); - }); + update_future = QtConcurrent::run( + []() -> std::optional { return UpdateChecker::GetUpdate(); }); update_watcher.connect(&update_watcher, &QFutureWatcher::finished, this, &MainWindow::OnEmulatorUpdateAvailable); update_watcher.setFuture(update_future); @@ -590,7 +588,8 @@ MainWindow::MainWindow(bool has_broken_vulkan) if (has_broken_vulkan) { UISettings::values.has_broken_vulkan = true; - QMessageBox::warning(this, tr("Broken Vulkan Installation Detected"), tr("Vulkan initialization failed during boot.")); + QMessageBox::warning(this, tr("Broken Vulkan Installation Detected"), + tr("Vulkan initialization failed during boot.")); #ifdef HAS_OPENGL Settings::values.renderer_backend = Settings::RendererBackend::OpenGL_GLSL; #else @@ -652,7 +651,8 @@ MainWindow::MainWindow(bool has_broken_vulkan) if (!argument_ok) { // try to look it up by username, only finds the first username that matches. std::string const user_arg_str = args[user_arg_idx].toStdString(); - auto const user_idx = QtCommon::system->GetProfileManager().GetUserIndex(user_arg_str); + auto const user_idx = + QtCommon::system->GetProfileManager().GetUserIndex(user_arg_str); if (user_idx != std::nullopt) { selected_user = user_idx.value(); } else { @@ -670,6 +670,9 @@ MainWindow::MainWindow(bool has_broken_vulkan) // Launch game at path game_path = args[++i]; has_gamepath = true; + } else if (args[i] == QStringLiteral("-input-profile") && i < args.size() - 1) { + auto& players = Settings::values.players.GetValue(); + players[0].profile_name = args[++i].toStdString(); } else if (args[i] == QStringLiteral("-qlaunch")) { should_launch_qlaunch = true; } else if (args[i] == QStringLiteral("-setup")) { @@ -711,7 +714,7 @@ MainWindow::~MainWindow() { } void MainWindow::AmiiboSettingsShowDialog(const Core::Frontend::CabinetParameters& parameters, - std::shared_ptr nfp_device) { + std::shared_ptr nfp_device) { cabinet_applet = new QtAmiiboSettingsDialog(this, parameters, input_subsystem.get(), nfp_device); SCOPE_EXIT { @@ -915,7 +918,7 @@ void MainWindow::SoftwareKeyboardExit() { } void MainWindow::WebBrowserOpenWebPage(const std::string& main_url, - const std::string& additional_args, bool is_local) { + const std::string& additional_args, bool is_local) { #ifdef YUZU_USE_QT_WEB_ENGINE // Raw input breaks with the web applet, Disable web applets if enabled @@ -1072,7 +1075,8 @@ void MainWindow::InitializeWidgets() { render_window = new GRenderWindow(this, emu_thread.get(), input_subsystem, *QtCommon::system); render_window->hide(); - game_list = new GameList(QtCommon::vfs, QtCommon::provider.get(), *play_time_manager, *QtCommon::system, this); + game_list = new GameList(QtCommon::vfs, QtCommon::provider.get(), *play_time_manager, + *QtCommon::system, this); ui->horizontalLayout->addWidget(game_list); game_list_placeholder = new GameListPlaceholder(this); @@ -1229,8 +1233,7 @@ void MainWindow::InitializeWidgets() { filter_status_button = new QPushButton(); filter_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton")); filter_status_button->setFocusPolicy(Qt::NoFocus); - connect(filter_status_button, &QPushButton::clicked, this, - &MainWindow::OnToggleAdaptingFilter); + connect(filter_status_button, &QPushButton::clicked, this, &MainWindow::OnToggleAdaptingFilter); UpdateFilterText(); filter_status_button->setCheckable(true); filter_status_button->setChecked(true); @@ -1369,7 +1372,7 @@ void MainWindow::InitializeRecentFileMenuActions() { } void MainWindow::LinkActionShortcut(QAction* action, const QString& action_name, - const bool tas_allowed) { + const bool tas_allowed) { static const auto main_window = std::string("Main Window"); action->setShortcut(hotkey_registry.GetKeySequence(main_window, action_name.toStdString())); action->setShortcutContext( @@ -1378,7 +1381,8 @@ void MainWindow::LinkActionShortcut(QAction* action, const QString& action_name, this->addAction(action); - auto* controller = QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); + auto* controller = + QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); const auto* controller_hotkey = hotkey_registry.GetControllerHotkey(main_window, action_name.toStdString(), controller); connect( @@ -1404,17 +1408,16 @@ void MainWindow::InitializeHotkeys() { LinkActionShortcut(ui->action_Stop, QStringLiteral("Stop Emulation")); LinkActionShortcut(ui->action_Show_Filter_Bar, QStringLiteral("Toggle Filter Bar")); LinkActionShortcut(ui->action_Show_Status_Bar, QStringLiteral("Toggle Status Bar")); - LinkActionShortcut(ui->action_Show_Performance_Overlay, QStringLiteral("Toggle Performance Overlay")); + LinkActionShortcut(ui->action_Show_Performance_Overlay, + QStringLiteral("Toggle Performance Overlay")); LinkActionShortcut(ui->action_Fullscreen, QStringLiteral("Fullscreen")); LinkActionShortcut(ui->action_Capture_Screenshot, QStringLiteral("Capture Screenshot")); LinkActionShortcut(ui->action_TAS_Start, QStringLiteral("TAS Start/Stop"), true); LinkActionShortcut(ui->action_TAS_Record, QStringLiteral("TAS Record"), true); LinkActionShortcut(ui->action_TAS_Reset, QStringLiteral("TAS Reset"), true); - LinkActionShortcut(ui->action_View_Lobby, - QStringLiteral("Browse Public Game Lobby")); + LinkActionShortcut(ui->action_View_Lobby, QStringLiteral("Browse Public Game Lobby")); LinkActionShortcut(ui->action_Start_Room, QStringLiteral("Create Room")); - LinkActionShortcut(ui->action_Connect_To_Room, - QStringLiteral("Direct Connect to Room")); + LinkActionShortcut(ui->action_Connect_To_Room, QStringLiteral("Direct Connect to Room")); LinkActionShortcut(ui->action_Show_Room, QStringLiteral("Show Current Room")); LinkActionShortcut(ui->action_Leave_Room, QStringLiteral("Leave Room")); LinkActionShortcut(ui->action_Configure, QStringLiteral("Configure")); @@ -1424,7 +1427,8 @@ void MainWindow::InitializeHotkeys() { const auto connect_shortcut = [&](const QString& action_name, const Fn& function) { const auto* hotkey = hotkey_registry.GetHotkey(main_window.toStdString(), action_name.toStdString(), this); - auto* controller = QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); + auto* controller = + QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); const auto* controller_hotkey = hotkey_registry.GetControllerHotkey( main_window.toStdString(), action_name.toStdString(), controller); connect(hotkey, &QShortcut::activated, this, function); @@ -1438,8 +1442,7 @@ void MainWindow::InitializeHotkeys() { ToggleFullscreen(); } }); - connect_shortcut(QStringLiteral("Change Adapting Filter"), - &MainWindow::OnToggleAdaptingFilter); + connect_shortcut(QStringLiteral("Change Adapting Filter"), &MainWindow::OnToggleAdaptingFilter); connect_shortcut(QStringLiteral("Change Docked Mode"), &MainWindow::OnToggleDockedMode); connect_shortcut(QStringLiteral("Change GPU Mode"), &MainWindow::OnToggleGpuAccuracy); connect_shortcut(QStringLiteral("Audio Mute/Unmute"), &MainWindow::OnMute); @@ -1513,8 +1516,10 @@ void MainWindow::RestoreUIState() { ui->action_Show_Status_Bar->setChecked(UISettings::values.show_status_bar.GetValue()); statusBar()->setVisible(ui->action_Show_Status_Bar->isChecked()); - ui->action_Show_Performance_Overlay->setChecked(UISettings::values.show_perf_overlay.GetValue()); - if (perf_overlay) perf_overlay->setVisible(ui->action_Show_Performance_Overlay->isChecked()); + ui->action_Show_Performance_Overlay->setChecked( + UISettings::values.show_perf_overlay.GetValue()); + if (perf_overlay) + perf_overlay->setVisible(ui->action_Show_Performance_Overlay->isChecked()); Debugger::ToggleConsole(); } @@ -1554,16 +1559,14 @@ void MainWindow::ConnectWidgetEvents() { connect(game_list, &GameList::GameChosen, this, &MainWindow::OnGameListLoadFile); connect(game_list, &GameList::OpenDirectory, this, &MainWindow::OnGameListOpenDirectory); connect(game_list, &GameList::OpenFolderRequested, this, &MainWindow::OnGameListOpenFolder); - connect(game_list, &GameList::OpenTransferableShaderCacheRequested, this, [this](u64 program_id) { - QtCommon::Path::OpenShaderCache(program_id, this); - }); + connect(game_list, &GameList::OpenTransferableShaderCacheRequested, this, + [this](u64 program_id) { QtCommon::Path::OpenShaderCache(program_id, this); }); connect(game_list, &GameList::RemoveInstalledEntryRequested, this, &MainWindow::OnGameListRemoveInstalledEntry); connect(game_list, &GameList::RemoveFileRequested, this, &MainWindow::OnGameListRemoveFile); connect(game_list, &GameList::RemovePlayTimeRequested, this, &MainWindow::OnGameListRemovePlayTimeData); - connect(game_list, &GameList::SetPlayTimeRequested, this, - &MainWindow::OnGameListSetPlayTime); + connect(game_list, &GameList::SetPlayTimeRequested, this, &MainWindow::OnGameListSetPlayTime); connect(game_list, &GameList::DumpRomFSRequested, this, &MainWindow::OnGameListDumpRomFS); connect(game_list, &GameList::VerifyIntegrityRequested, this, &MainWindow::OnGameListVerifyIntegrity); @@ -1581,11 +1584,9 @@ void MainWindow::ConnectWidgetEvents() { connect(game_list, &GameList::OpenPerGameGeneralRequested, this, &MainWindow::OnGameListOpenPerGameProperties); - connect(game_list, &GameList::LinkToRyujinxRequested, this, - &MainWindow::OnLinkToRyujinx); + connect(game_list, &GameList::LinkToRyujinxRequested, this, &MainWindow::OnLinkToRyujinx); - connect(this, &MainWindow::UpdateInstallProgress, this, - &MainWindow::IncrementInstallProgress); + connect(this, &MainWindow::UpdateInstallProgress, this, &MainWindow::IncrementInstallProgress); connect(this, &MainWindow::EmulationStarting, render_window, &GRenderWindow::OnEmulationStarting); @@ -1652,10 +1653,11 @@ void MainWindow::ConnectMenuEvents() { for (size_t i = 0; i < default_game_icon_sizes.size(); i++) { const auto current_size = UISettings::values.game_icon_size.GetValue(); const auto size = default_game_icon_sizes[i].first; - QAction *action = ui->menuGame_Icon_Size->addAction(GetTranslatedGameIconSize(i)); + QAction* action = ui->menuGame_Icon_Size->addAction(GetTranslatedGameIconSize(i)); action->setCheckable(true); - if (current_size == size) action->setChecked(true); + if (current_size == size) + action->setChecked(true); game_size_actions->addAction(action); @@ -1687,35 +1689,38 @@ void MainWindow::ConnectMenuEvents() { connect(multiplayer_state, &MultiplayerState::SaveConfig, this, &MainWindow::OnSaveConfig); // Tools - connect_menu(ui->action_Launch_PhotoViewer, [this]{ + connect_menu(ui->action_Launch_PhotoViewer, [this] { LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::PhotoViewer), std::nullopt); }); - connect_menu(ui->action_Launch_MiiEdit, [this]{ + connect_menu(ui->action_Launch_MiiEdit, [this] { LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::MiiEdit), std::nullopt); }); - connect_menu(ui->action_Launch_Controller, [this]{ + connect_menu(ui->action_Launch_Controller, [this] { LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::Controller), std::nullopt); }); - connect_menu(ui->action_Launch_QLaunch, [this]{ + connect_menu(ui->action_Launch_QLaunch, [this] { LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::QLaunch), std::nullopt); }); // Tools (cabinet) - connect_menu(ui->action_Launch_Cabinet_Nickname_Owner, [this]{ - LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::Cabinet), {Service::NFP::CabinetMode::StartNicknameAndOwnerSettings}); + connect_menu(ui->action_Launch_Cabinet_Nickname_Owner, [this] { + LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::Cabinet), + {Service::NFP::CabinetMode::StartNicknameAndOwnerSettings}); }); - connect_menu(ui->action_Launch_Cabinet_Eraser, [this]{ - LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::Cabinet), {Service::NFP::CabinetMode::StartGameDataEraser}); + connect_menu(ui->action_Launch_Cabinet_Eraser, [this] { + LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::Cabinet), + {Service::NFP::CabinetMode::StartGameDataEraser}); }); - connect_menu(ui->action_Launch_Cabinet_Restorer, [this]{ - LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::Cabinet), {Service::NFP::CabinetMode::StartRestorer}); + connect_menu(ui->action_Launch_Cabinet_Restorer, [this] { + LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::Cabinet), + {Service::NFP::CabinetMode::StartRestorer}); }); - connect_menu(ui->action_Launch_Cabinet_Formatter, [this]{ - LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::Cabinet), {Service::NFP::CabinetMode::StartFormatter}); + connect_menu(ui->action_Launch_Cabinet_Formatter, [this] { + LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::Cabinet), + {Service::NFP::CabinetMode::StartFormatter}); }); connect_menu(ui->action_Desktop, &MainWindow::OnCreateHomeMenuDesktopShortcut); - connect_menu(ui->action_Application_Menu, - &MainWindow::OnCreateHomeMenuApplicationMenuShortcut); + connect_menu(ui->action_Application_Menu, &MainWindow::OnCreateHomeMenuApplicationMenuShortcut); connect_menu(ui->action_Capture_Screenshot, &MainWindow::OnCaptureScreenshot); // TAS @@ -1754,15 +1759,10 @@ void MainWindow::UpdateMenuState() { }; const std::array applet_actions{ - ui->action_Launch_PhotoViewer, - ui->action_Launch_Cabinet_Nickname_Owner, - ui->action_Launch_Cabinet_Eraser, - ui->action_Launch_Cabinet_Restorer, - ui->action_Launch_Cabinet_Formatter, - ui->action_Launch_MiiEdit, - ui->action_Launch_QLaunch, - ui->action_Launch_Controller - }; + ui->action_Launch_PhotoViewer, ui->action_Launch_Cabinet_Nickname_Owner, + ui->action_Launch_Cabinet_Eraser, ui->action_Launch_Cabinet_Restorer, + ui->action_Launch_Cabinet_Formatter, ui->action_Launch_MiiEdit, + ui->action_Launch_QLaunch, ui->action_Launch_Controller}; for (QAction* action : running_actions) { action->setEnabled(emulation_running); @@ -1795,17 +1795,16 @@ void MainWindow::SetupPrepareForSleep() { const auto dbus_logind_service = QStringLiteral("org.freedesktop.login1"); const auto dbus_logind_path = QStringLiteral("/org/freedesktop/login1"); const auto dbus_logind_manager_if = QStringLiteral("org.freedesktop.login1.Manager"); - //const auto dbus_logind_session_if = QStringLiteral("org.freedesktop.login1.Session"); + // const auto dbus_logind_session_if = QStringLiteral("org.freedesktop.login1.Session"); #else const auto dbus_logind_service = QStringLiteral("org.freedesktop.ConsoleKit"); const auto dbus_logind_path = QStringLiteral("/org/freedesktop/ConsoleKit/Manager"); const auto dbus_logind_manager_if = QStringLiteral("org.freedesktop.ConsoleKit.Manager"); - //const auto dbus_logind_session_if = QStringLiteral("org.freedesktop.ConsoleKit.Session"); + // const auto dbus_logind_session_if = QStringLiteral("org.freedesktop.ConsoleKit.Session"); #endif - const bool success = bus.connect( - dbus_logind_service, dbus_logind_path, - dbus_logind_manager_if, QStringLiteral("PrepareForSleep"), - QStringLiteral("b"), this, SLOT(OnPrepareForSleep(bool))); + const bool success = bus.connect(dbus_logind_service, dbus_logind_path, + dbus_logind_manager_if, QStringLiteral("PrepareForSleep"), + QStringLiteral("b"), this, SLOT(OnPrepareForSleep(bool))); if (!success) LOG_WARNING(Frontend, "Couldn't register PrepareForSleep signal"); } else { @@ -1929,19 +1928,19 @@ bool MainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPar /** firmware check */ - if (!QtCommon::Content::CheckGameFirmware(params.program_id, this)) { + if (!QtCommon::Content::CheckGameFirmware(params.program_id)) return false; - } /** Exec */ const Core::SystemResultStatus result{ - QtCommon::system->Load(*render_window, filename.toStdString(), params)}; + QtCommon::system->Load(*render_window, filename.toStdString(), params)}; const auto drd_callout = (UISettings::values.callout_flags.GetValue() & static_cast(CalloutFlag::DRDDeprecation)) == 0; if (result == Core::SystemResultStatus::Success && - QtCommon::system->GetAppLoader().GetFileType() == Loader::FileType::DeconstructedRomDirectory && + QtCommon::system->GetAppLoader().GetFileType() == + Loader::FileType::DeconstructedRomDirectory && drd_callout) { UISettings::values.callout_flags = UISettings::values.callout_flags.GetValue() | static_cast(CalloutFlag::DRDDeprecation); @@ -2048,7 +2047,7 @@ void MainWindow::ConfigureFilesystemProvider(const std::string& filepath) { } void MainWindow::BootGame(const QString& filename, Service::AM::FrontendAppletParameters params, - StartGameType type) { + StartGameType type) { LOG_INFO(Frontend, "Eden starting..."); if (params.program_id == 0 || @@ -2067,7 +2066,8 @@ void MainWindow::BootGame(const QString& filename, Service::AM::FrontendAppletPa ConfigureFilesystemProvider(filename.toStdString()); const auto v_file = Core::GetGameFileFromPath(QtCommon::vfs, filename.toUtf8().constData()); - const auto loader = Loader::GetLoader(*QtCommon::system, v_file, params.program_id, params.program_index); + const auto loader = + Loader::GetLoader(*QtCommon::system, v_file, params.program_id, params.program_index); if (loader != nullptr && loader->ReadProgramId(title_id) == Loader::ResultStatus::Success && type == StartGameType::Normal) { @@ -2086,11 +2086,11 @@ void MainWindow::BootGame(const QString& filename, Service::AM::FrontendAppletPa if (UISettings::values.select_user_on_boot && !user_flag_cmd_line) { const Core::Frontend::ProfileSelectParameters parameters{ - .mode = Service::AM::Frontend::UiMode::UserSelector, - .invalid_uid_list = {}, - .display_options = {}, - .purpose = Service::AM::Frontend::UserSelectionPurpose::General, - }; + .mode = Service::AM::Frontend::UiMode::UserSelector, + .invalid_uid_list = {}, + .display_options = {}, + .purpose = Service::AM::Frontend::UserSelectionPurpose::General, + }; if (SelectAndSetCurrentUser(parameters) == false) { return; } @@ -2247,8 +2247,9 @@ bool MainWindow::OnShutdownBegin() { } void MainWindow::OnShutdownBeginDialog() { - shutdown_dialog = new OverlayDialog(this, *QtCommon::system, QString{}, tr("Closing software..."), - QString{}, QString{}, Qt::AlignHCenter | Qt::AlignVCenter); + shutdown_dialog = + new OverlayDialog(this, *QtCommon::system, QString{}, tr("Closing software..."), QString{}, + QString{}, Qt::AlignHCenter | Qt::AlignVCenter); shutdown_dialog->open(); } @@ -2385,7 +2386,7 @@ void MainWindow::OnGameListLoadFile(QString game_path, u64 program_id) { // TODO(crueter): Common profile selector void MainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target, - const std::string& game_path) { + const std::string& game_path) { std::filesystem::path path; QString open_target; @@ -2415,8 +2416,8 @@ void MainWindow::OnGameListOpenFolder(u64 program_id, GameListOpenTarget target, case GameListOpenTarget::SaveData: { open_target = tr("Save Data"); const auto save_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::SaveDir); - auto vfs_save_dir = - QtCommon::vfs->OpenDirectory(Common::FS::PathToUTF8String(save_dir), FileSys::OpenMode::Read); + auto vfs_save_dir = QtCommon::vfs->OpenDirectory(Common::FS::PathToUTF8String(save_dir), + FileSys::OpenMode::Read); if (has_user_save) { // User save data @@ -2531,7 +2532,8 @@ static bool RomFSRawCopy(size_t total_size, size_t& read_size, QProgressDialog& // TODO(crueter): All this can be transfered to qt_common // Aldoe I need to decide re: message boxes for QML // translations_common? strings_common? qt_strings? who knows -void MainWindow::OnGameListRemoveInstalledEntry(u64 program_id, QtCommon::Game::InstalledEntryType type) { +void MainWindow::OnGameListRemoveInstalledEntry(u64 program_id, + QtCommon::Game::InstalledEntryType type) { const QString entry_question = [type] { switch (type) { case QtCommon::Game::InstalledEntryType::Game: @@ -2571,7 +2573,7 @@ void MainWindow::OnGameListRemoveInstalledEntry(u64 program_id, QtCommon::Game:: } void MainWindow::OnGameListRemoveFile(u64 program_id, QtCommon::Game::GameListRemoveTarget target, - const std::string& game_path) { + const std::string& game_path) { const QString question = [target] { switch (target) { case QtCommon::Game::GameListRemoveTarget::GlShaderCache: @@ -2589,8 +2591,8 @@ void MainWindow::OnGameListRemoveFile(u64 program_id, QtCommon::Game::GameListRe } }(); - if (!MainWindow::question(this, tr("Remove File"), question, - QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) { + if (!MainWindow::question(this, tr("Remove File"), question, QMessageBox::Yes | QMessageBox::No, + QMessageBox::No)) { return; } @@ -2625,7 +2627,6 @@ void MainWindow::OnGameListSetPlayTime(u64 program_id) { } } - void MainWindow::OnGameListRemovePlayTimeData(u64 program_id) { if (QMessageBox::question(this, tr("Remove Play Time Data"), tr("Reset play time?"), QMessageBox::Yes | QMessageBox::No, @@ -2638,15 +2639,15 @@ void MainWindow::OnGameListRemovePlayTimeData(u64 program_id) { } void MainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_path, - DumpRomFSTarget target) { + DumpRomFSTarget target) { const auto failed = [this] { QMessageBox::warning(this, tr("RomFS Extraction Failed!"), tr("There was an error copying the RomFS files or the user " "cancelled the operation.")); }; - const auto loader = - Loader::GetLoader(*QtCommon::system, QtCommon::vfs->OpenFile(game_path, FileSys::OpenMode::Read)); + const auto loader = Loader::GetLoader( + *QtCommon::system, QtCommon::vfs->OpenFile(game_path, FileSys::OpenMode::Read)); if (loader == nullptr) { failed(); return; @@ -2687,7 +2688,8 @@ void MainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_pat const auto path = Common::FS::PathToUTF8String(dump_dir / romfs_dir); - const FileSys::PatchManager pm{title_id, QtCommon::system->GetFileSystemController(), installed}; + const FileSys::PatchManager pm{title_id, QtCommon::system->GetFileSystemController(), + installed}; auto romfs = pm.PatchRomFS(base_nca.get(), base_romfs, type, packed_update_raw, false); const auto out = VfsFilesystemCreateDirectoryWrapper(path, FileSys::OpenMode::ReadWrite); @@ -2763,7 +2765,7 @@ void MainWindow::OnGameListCopyTID(u64 program_id) { } void MainWindow::OnGameListNavigateToGamedbEntry(u64 program_id, - const CompatibilityList& compatibility_list) { + const CompatibilityList& compatibility_list) { const auto it = FindMatchingCompatibilityEntry(compatibility_list, program_id); QString directory; @@ -2771,11 +2773,14 @@ void MainWindow::OnGameListNavigateToGamedbEntry(u64 program_id, directory = it->second.second; } - QDesktopServices::openUrl(QUrl(QStringLiteral("https://www.emuready.com/listings?emulatorIds=43bfc023-ec22-422d-8324-048a8ec9f28f") + directory)); + QDesktopServices::openUrl(QUrl( + QStringLiteral( + "https://www.emuready.com/listings?emulatorIds=43bfc023-ec22-422d-8324-048a8ec9f28f") + + directory)); } void MainWindow::OnGameListCreateShortcut(u64 program_id, const std::string& game_path, - const QtCommon::Game::ShortcutTarget target) { + const QtCommon::Game::ShortcutTarget target) { // Create shortcu std::string arguments = fmt::format("-g \"{:s}\"", game_path); @@ -2847,8 +2852,7 @@ void MainWindow::OnGameListOpenPerGameProperties(const std::string& file) { OpenPerGameConfiguration(title_id, file); } -void MainWindow::OnLinkToRyujinx(const u64& program_id) -{ +void MainWindow::OnLinkToRyujinx(const u64& program_id) { namespace fs = std::filesystem; fs::path ryu_dir; @@ -2863,10 +2867,12 @@ void MainWindow::OnLinkToRyujinx(const u64& program_id) // this function also prompts the user to manually specify a portable location ryu_dir = QtCommon::FS::GetRyujinxSavePath(existing_path, program_id); - if (ryu_dir.empty()) return; + if (ryu_dir.empty()) + return; const std::string user_id = GetProfileIDString(); - if (user_id.empty()) return; + if (user_id.empty()) + return; const std::string hex_program = fmt::format("{:016X}", program_id); @@ -2874,7 +2880,6 @@ void MainWindow::OnLinkToRyujinx(const u64& program_id) FrontendCommon::DataManager::DataDir::Saves, user_id) / hex_program; - // CheckUnlink basically just checks to see if one or both are linked, and prompts the user to // unlink if this is the case. // If it returns false, neither dir is linked so it's fine to continue @@ -3009,8 +3014,8 @@ void MainWindow::OnMenuInstallToNAND() { return false; }; future = QtConcurrent::run([&file, progress_callback] { - return ContentManager::InstallNSP(*QtCommon::system, *QtCommon::vfs, file.toStdString(), - progress_callback); + return ContentManager::InstallNSP(*QtCommon::system, *QtCommon::vfs, + file.toStdString(), progress_callback); }); while (!future.isFinished()) { @@ -3221,9 +3226,8 @@ void MainWindow::OnLoadComplete() { perf_overlay = new PerformanceOverlay(this); perf_overlay->setVisible(ui->action_Show_Performance_Overlay->isChecked()); - connect(perf_overlay, &PerformanceOverlay::closed, perf_overlay, [this]() { - ui->action_Show_Performance_Overlay->setChecked(false); - }); + connect(perf_overlay, &PerformanceOverlay::closed, perf_overlay, + [this]() { ui->action_Show_Performance_Overlay->setChecked(false); }); } void MainWindow::OnExecuteProgram(std::size_t program_index) { @@ -3245,8 +3249,8 @@ void MainWindow::OnSaveConfig() { } void MainWindow::ErrorDisplayDisplayError(QString error_code, QString error_text) { - error_applet = new OverlayDialog(render_window, *QtCommon::system, error_code, error_text, QString{}, - tr("OK"), Qt::AlignLeft | Qt::AlignVCenter); + error_applet = new OverlayDialog(render_window, *QtCommon::system, error_code, error_text, + QString{}, tr("OK"), Qt::AlignLeft | Qt::AlignVCenter); SCOPE_EXIT { error_applet->deleteLater(); error_applet = nullptr; @@ -3267,37 +3271,41 @@ void MainWindow::OnMenuReportCompatibility() { tr("Function Disabled"), tr("Compatibility list reporting is currently disabled. Check back later!")); -// #if defined(ARCHITECTURE_x86_64) && !defined(__APPLE__) -// const auto& caps = Common::GetCPUCaps(); -// const bool has_fma = caps.fma || caps.fma4; -// const auto processor_count = std::thread::hardware_concurrency(); -// const bool has_4threads = processor_count == 0 || processor_count >= 4; -// const bool has_8gb_ram = Common::GetMemInfo().TotalPhysicalMemory >= 8_GiB; -// const bool has_broken_vulkan = UISettings::values.has_broken_vulkan; + // #if defined(ARCHITECTURE_x86_64) && !defined(__APPLE__) + // const auto& caps = Common::GetCPUCaps(); + // const bool has_fma = caps.fma || caps.fma4; + // const auto processor_count = std::thread::hardware_concurrency(); + // const bool has_4threads = processor_count == 0 || processor_count >= 4; + // const bool has_8gb_ram = Common::GetMemInfo().TotalPhysicalMemory >= 8_GiB; + // const bool has_broken_vulkan = UISettings::values.has_broken_vulkan; -// if (!has_fma || !has_4threads || !has_8gb_ram || has_broken_vulkan) { -// QMessageBox::critical(this, tr("Hardware requirements not met"), -// tr("Your system does not meet the recommended hardware requirements. " -// "Compatibility reporting has been disabled.")); -// return; -// } + // if (!has_fma || !has_4threads || !has_8gb_ram || has_broken_vulkan) { + // QMessageBox::critical(this, tr("Hardware requirements not met"), + // tr("Your system does not meet the recommended hardware + // requirements. " + // "Compatibility reporting has been disabled.")); + // return; + // } -// if (!Settings::values.eden_token.GetValue().empty() && -// !Settings::values.eden_username.GetValue().empty()) { -// } else { -// QMessageBox::critical( -// this, tr("Missing yuzu Account"), -// tr("In order to submit a game compatibility test case, you must set up your web token " -// "and " -// "username.

To link your eden account, go to Emulation > Configuration " -// "> " -// "Web.")); -// } -// #else -// QMessageBox::critical(this, tr("Hardware requirements not met"), -// tr("Your system does not meet the recommended hardware requirements. " -// "Compatibility reporting has been disabled.")); -// #endif + // if (!Settings::values.eden_token.GetValue().empty() && + // !Settings::values.eden_username.GetValue().empty()) { + // } else { + // QMessageBox::critical( + // this, tr("Missing yuzu Account"), + // tr("In order to submit a game compatibility test case, you must set up your web + // token " + // "and " + // "username.

To link your eden account, go to Emulation > + // Configuration " + // "> " + // "Web.")); + // } + // #else + // QMessageBox::critical(this, tr("Hardware requirements not met"), + // tr("Your system does not meet the recommended hardware + // requirements. " + // "Compatibility reporting has been disabled.")); + // #endif } void MainWindow::OpenURL(const QUrl& url) { @@ -3432,7 +3440,8 @@ void MainWindow::ToggleWindowMode() { } void MainWindow::ResetWindowSize(u32 width, u32 height) { - const auto aspect_ratio = Layout::EmulationAspectRatio(Settings::values.aspect_ratio.GetValue(), float(height) / width); + const auto aspect_ratio = Layout::EmulationAspectRatio(Settings::values.aspect_ratio.GetValue(), + float(height) / width); if (!ui->action_Single_Window_Mode->isChecked()) { render_window->resize(height / aspect_ratio, height); } else { @@ -3489,7 +3498,8 @@ void MainWindow::CheckIconSize() { for (size_t i = 0; i < default_game_icon_sizes.size(); i++) { const auto current_size = newSize; const auto size = default_game_icon_sizes[i].first; - if (current_size == size) actions.at(i)->setChecked(true); + if (current_size == size) + actions.at(i)->setChecked(true); } // Update this if you add anything before None. @@ -3500,7 +3510,7 @@ void MainWindow::CheckIconSize() { } void MainWindow::ToggleShowGameName() { - auto &setting = UISettings::values.show_game_name; + auto& setting = UISettings::values.show_game_name; const bool newValue = !setting.GetValue(); ui->action_Show_Game_Name->setChecked(newValue); setting.SetValue(newValue); @@ -3649,7 +3659,8 @@ void MainWindow::OnTasStartStop() { } // Disable system buttons to prevent TAS from executing a hotkey - auto* controller = QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); + auto* controller = + QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); controller->ResetSystemButtons(); input_subsystem->GetTas()->StartStop(); @@ -3665,7 +3676,8 @@ void MainWindow::OnTasRecord() { } // Disable system buttons to prevent TAS from recording a hotkey - auto* controller = QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); + auto* controller = + QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); controller->ResetSystemButtons(); const bool is_recording = input_subsystem->GetTas()->Record(); @@ -3691,8 +3703,10 @@ void MainWindow::OnTasReset() { void MainWindow::OnToggleDockedMode() { const bool is_docked = Settings::IsDockedMode(); - auto* player_1 = QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); - auto* handheld = QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld); + auto* player_1 = + QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); + auto* handheld = + QtCommon::system->HIDCore().GetEmulatedController(Core::HID::NpadIdType::Handheld); if (!is_docked && handheld->IsConnected()) { QMessageBox::warning(this, tr("Invalid config detected"), @@ -3773,14 +3787,30 @@ void MainWindow::OnToggleAdaptingFilter() { void MainWindow::OnToggleGraphicsAPI() { auto api = Settings::values.renderer_backend.GetValue(); - if (api != Settings::RendererBackend::Vulkan) { - api = Settings::RendererBackend::Vulkan; - } else { + switch (api) { #ifdef HAS_OPENGL + case Settings::RendererBackend::Vulkan: api = Settings::RendererBackend::OpenGL_GLSL; -#else + break; + case Settings::RendererBackend::OpenGL_GLSL: + api = Settings::RendererBackend::OpenGL_GLSL; + break; + case Settings::RendererBackend::OpenGL_SPIRV: + api = Settings::RendererBackend::OpenGL_GLASM; + break; + case Settings::RendererBackend::OpenGL_GLASM: api = Settings::RendererBackend::Null; + break; +#else + case Settings::RendererBackend::Vulkan: + api = Settings::RendererBackend::Null; + break; #endif + case Settings::RendererBackend::Null: + api = Settings::RendererBackend::Vulkan; + break; + default: + break; } Settings::values.renderer_backend.SetValue(api); renderer_status_button->setChecked(api == Settings::RendererBackend::Vulkan); @@ -3862,8 +3892,8 @@ void MainWindow::OnLoadAmiibo() { // TODO(crueter): does this need to be ported to QML? bool MainWindow::question(QWidget* parent, const QString& title, const QString& text, - QMessageBox::StandardButtons buttons, - QMessageBox::StandardButton defaultButton) { + QMessageBox::StandardButtons buttons, + QMessageBox::StandardButton defaultButton) { QMessageBox* box_dialog = new QMessageBox(parent); box_dialog->setWindowTitle(title); box_dialog->setText(text); @@ -3915,23 +3945,19 @@ void MainWindow::OnOpenRootDataFolder() { QtCommon::Game::OpenRootDataFolder(); } -void MainWindow::OnOpenNANDFolder() -{ +void MainWindow::OnOpenNANDFolder() { QtCommon::Game::OpenNANDFolder(); } -void MainWindow::OnOpenSDMCFolder() -{ +void MainWindow::OnOpenSDMCFolder() { QtCommon::Game::OpenSDMCFolder(); } -void MainWindow::OnOpenModFolder() -{ +void MainWindow::OnOpenModFolder() { QtCommon::Game::OpenModFolder(); } -void MainWindow::OnOpenLogFolder() -{ +void MainWindow::OnOpenLogFolder() { QtCommon::Game::OpenLogFolder(); } @@ -3994,7 +4020,8 @@ void MainWindow::OnInstallFirmwareFromZIP() { if (!qCacheDir.isEmpty()) { InstallFirmware(qCacheDir, true); std::error_code ec; - std::filesystem::remove_all(std::filesystem::temp_directory_path() / "eden" / "firmware", ec); + std::filesystem::remove_all(std::filesystem::temp_directory_path() / "eden" / "firmware", + ec); if (ec) { QMessageBox::warning(this, tr("Firmware cleanup failed"), @@ -4062,13 +4089,15 @@ void MainWindow::OnGameListRefresh() { SetFirmwareVersion(); } -void MainWindow::LaunchFirmwareApplet(u64 raw_program_id, std::optional cabinet_mode) { +void MainWindow::LaunchFirmwareApplet(u64 raw_program_id, + std::optional cabinet_mode) { auto const program_id = Service::AM::AppletProgramId(raw_program_id); auto result = FirmwareManager::VerifyFirmware(*QtCommon::system.get()); using namespace QtCommon::StringLookup; switch (result) { case FirmwareManager::ErrorFirmwareMissing: - QMessageBox::warning(this, tr("No firmware available"), Lookup(FwCheckErrorFirmwareMissing)); + QMessageBox::warning(this, tr("No firmware available"), + Lookup(FwCheckErrorFirmwareMissing)); return; case FirmwareManager::ErrorFirmwareCorrupted: QMessageBox::warning(this, tr("Firmware Corrupted"), Lookup(FwCheckErrorFirmwareCorrupted)); @@ -4077,33 +4106,58 @@ void MainWindow::LaunchFirmwareApplet(u64 raw_program_id, std::optionalGetFileSystemController().GetSystemNANDContents(); - if (auto applet_nca = bis_system->GetEntry(u64(program_id), FileSys::ContentRecordType::Program); applet_nca) { - if (auto const applet_id = [program_id] { - using namespace Service::AM; - switch (program_id) { - case AppletProgramId::OverlayDisplay: return AppletId::OverlayDisplay; - case AppletProgramId::QLaunch: return AppletId::QLaunch; - case AppletProgramId::Starter: return AppletId::Starter; - case AppletProgramId::Auth: return AppletId::Auth; - case AppletProgramId::Cabinet: return AppletId::Cabinet; - case AppletProgramId::Controller: return AppletId::Controller; - case AppletProgramId::DataErase: return AppletId::DataErase; - case AppletProgramId::Error: return AppletId::Error; - case AppletProgramId::NetConnect: return AppletId::NetConnect; - case AppletProgramId::ProfileSelect: return AppletId::ProfileSelect; - case AppletProgramId::SoftwareKeyboard: return AppletId::SoftwareKeyboard; - case AppletProgramId::MiiEdit: return AppletId::MiiEdit; - case AppletProgramId::Web: return AppletId::Web; - case AppletProgramId::Shop: return AppletId::Shop; - case AppletProgramId::PhotoViewer: return AppletId::PhotoViewer; - case AppletProgramId::Settings: return AppletId::Settings; - case AppletProgramId::OfflineWeb: return AppletId::OfflineWeb; - case AppletProgramId::LoginShare: return AppletId::LoginShare; - case AppletProgramId::WebAuth: return AppletId::WebAuth; - case AppletProgramId::MyPage: return AppletId::MyPage; - default: return AppletId::None; - } - }(); applet_id != Service::AM::AppletId::None) { + if (auto applet_nca = + bis_system->GetEntry(u64(program_id), FileSys::ContentRecordType::Program); + applet_nca) { + if (auto const applet_id = + [program_id] { + using namespace Service::AM; + switch (program_id) { + case AppletProgramId::OverlayDisplay: + return AppletId::OverlayDisplay; + case AppletProgramId::QLaunch: + return AppletId::QLaunch; + case AppletProgramId::Starter: + return AppletId::Starter; + case AppletProgramId::Auth: + return AppletId::Auth; + case AppletProgramId::Cabinet: + return AppletId::Cabinet; + case AppletProgramId::Controller: + return AppletId::Controller; + case AppletProgramId::DataErase: + return AppletId::DataErase; + case AppletProgramId::Error: + return AppletId::Error; + case AppletProgramId::NetConnect: + return AppletId::NetConnect; + case AppletProgramId::ProfileSelect: + return AppletId::ProfileSelect; + case AppletProgramId::SoftwareKeyboard: + return AppletId::SoftwareKeyboard; + case AppletProgramId::MiiEdit: + return AppletId::MiiEdit; + case AppletProgramId::Web: + return AppletId::Web; + case AppletProgramId::Shop: + return AppletId::Shop; + case AppletProgramId::PhotoViewer: + return AppletId::PhotoViewer; + case AppletProgramId::Settings: + return AppletId::Settings; + case AppletProgramId::OfflineWeb: + return AppletId::OfflineWeb; + case AppletProgramId::LoginShare: + return AppletId::LoginShare; + case AppletProgramId::WebAuth: + return AppletId::WebAuth; + case AppletProgramId::MyPage: + return AppletId::MyPage; + default: + return AppletId::None; + } + }(); + applet_id != Service::AM::AppletId::None) { QtCommon::system->GetFrontendAppletHolder().SetCurrentAppletId(applet_id); if (cabinet_mode) QtCommon::system->GetFrontendAppletHolder().SetCabinetMode(*cabinet_mode); @@ -4112,10 +4166,12 @@ void MainWindow::LaunchFirmwareApplet(u64 raw_program_id, std::optionalname))); + update_prompt.setText(tr("Download %1?").arg(QString::fromStdString(version->name))); update_prompt.exec(); if (update_prompt.button(QMessageBox::Yes) == update_prompt.clickedButton()) { - auto const full_url = fmt::format("{}/{}/releases/tag/", - std::string{Common::g_build_auto_update_website}, - std::string{Common::g_build_auto_update_repo} - ); + auto const full_url = + fmt::format("{}/{}/releases/tag/", std::string{Common::g_build_auto_update_website}, + std::string{Common::g_build_auto_update_repo}); QDesktopServices::openUrl(QUrl(QString::fromStdString(full_url + version->tag))); } } #endif -void MainWindow::UpdateWindowTitle(std::string_view title_name, std::string_view title_version, std::string_view gpu_vendor) { +void MainWindow::UpdateWindowTitle(std::string_view title_name, std::string_view title_version, + std::string_view gpu_vendor) { static const std::string build_id = std::string{Common::g_build_id}; - static const std::string yuzu_title = fmt::format("{} | {} | {}", - std::string{Common::g_build_name}, - std::string{Common::g_build_version}, - std::string{Common::g_compiler_id} - ); + static const std::string yuzu_title = + fmt::format("{} | {} | {}", std::string{Common::g_build_name}, + std::string{Common::g_build_version}, std::string{Common::g_compiler_id}); const auto override_title = fmt::format(fmt::runtime(std::string(Common::g_title_bar_format_idle)), build_id); @@ -4302,7 +4355,8 @@ void MainWindow::UpdateStatusBar() { } QString fpsText = tr("Game: %1 FPS").arg(std::round(results.average_game_fps), 0, 'f', 0); - if (!m_fpsSuffix.isEmpty()) fpsText = fpsText % QStringLiteral(" (%1)").arg(m_fpsSuffix); + if (!m_fpsSuffix.isEmpty()) + fpsText = fpsText % QStringLiteral(" (%1)").arg(m_fpsSuffix); game_fps_label->setText(fpsText); @@ -4445,7 +4499,9 @@ void MainWindow::OnCheckGraphicsBackend() { if (platformName == QStringLiteral("xcb") || qtPlatform == "xcb") return; - const bool isWayland = platformName.startsWith(QStringLiteral("wayland"), Qt::CaseInsensitive) || qtPlatform.startsWith("wayland"); + const bool isWayland = + platformName.startsWith(QStringLiteral("wayland"), Qt::CaseInsensitive) || + qtPlatform.startsWith("wayland"); if (!isWayland) return; @@ -4455,9 +4511,10 @@ void MainWindow::OnCheckGraphicsBackend() { QMessageBox msgbox(this); msgbox.setWindowTitle(tr("Wayland Detected!")); - msgbox.setText(tr("Wayland is known to have significant performance issues and mysterious bugs.\n" - "It's recommended to use X11 instead.\n\n" - "Would you like to force it for future launches?")); + msgbox.setText( + tr("Wayland is known to have significant performance issues and mysterious bugs.\n" + "It's recommended to use X11 instead.\n\n" + "Would you like to force it for future launches?")); msgbox.setIcon(QMessageBox::Warning); QPushButton* okButton = msgbox.addButton(tr("Use X11"), QMessageBox::AcceptRole); @@ -4478,8 +4535,7 @@ void MainWindow::OnCheckGraphicsBackend() { if (msgbox.clickedButton() == okButton) { UISettings::values.gui_force_x11.SetValue(true); GraphicsBackend::SetForceX11(true); - QMessageBox::information(this, - tr("Restart Required"), + QMessageBox::information(this, tr("Restart Required"), tr("Restart Eden to apply the X11 backend.")); } } @@ -4531,7 +4587,7 @@ void MainWindow::SetFPSSuffix() { } bool MainWindow::SelectRomFSDumpTarget(const FileSys::ContentProvider& installed, u64 program_id, - u64* selected_title_id, u8* selected_content_record_type) { + u64* selected_title_id, u8* selected_content_record_type) { using ContentInfo = std::tuple; boost::container::flat_set available_title_ids; @@ -4810,7 +4866,7 @@ void MainWindow::OnLanguageChanged(const QString& locale) { qApp->removeTranslator(&translator); } - QList actions = game_size_actions->actions(); + QList actions = game_size_actions->actions(); for (size_t i = 0; i < default_game_icon_sizes.size(); i++) { actions.at(i)->setText(GetTranslatedGameIconSize(i)); } diff --git a/src/yuzu/main_window.h b/src/yuzu/main_window.h index bb58191951..e85aadaa3d 100644 --- a/src/yuzu/main_window.h +++ b/src/yuzu/main_window.h @@ -24,15 +24,15 @@ #include "input_common/drivers/tas_input.h" #include "qt_common/config/qt_config.h" #include "qt_common/util/game.h" -#include "yuzu/user_data_migration.h" #include "yuzu/compatibility_list.h" #include "yuzu/hotkeys.h" +#include "yuzu/user_data_migration.h" #ifdef __unix__ #include +#include #include #include -#include #endif #ifdef ENABLE_UPDATE_CHECKER @@ -218,9 +218,10 @@ signals: void WebBrowserClosed(Service::AM::Frontend::WebExitReason exit_reason, std::string last_url); void SigInterrupt(); - void sizeChanged(const QSize &size); - void positionChanged(const QPoint &pos); - void statsUpdated(const Core::PerfStatsResults &results, const VideoCore::ShaderNotify &shaders); + void sizeChanged(const QSize& size); + void positionChanged(const QPoint& pos); + void statsUpdated(const Core::PerfStatsResults& results, + const VideoCore::ShaderNotify& shaders); public slots: void OnLoadComplete(); @@ -317,8 +318,8 @@ private: void RequestGameExit(); void changeEvent(QEvent* event) override; void closeEvent(QCloseEvent* event) override; - void resizeEvent(QResizeEvent *event) override; - void moveEvent(QMoveEvent *event) override; + void resizeEvent(QResizeEvent* event) override; + void moveEvent(QMoveEvent* event) override; std::string CreateTASFramesString( std::array frames) const; @@ -360,8 +361,7 @@ private slots: void OnGameListCopyTID(u64 program_id); void OnGameListNavigateToGamedbEntry(u64 program_id, const CompatibilityList& compatibility_list); - void OnGameListCreateShortcut(u64 program_id, - const std::string& game_path, + void OnGameListCreateShortcut(u64 program_id, const std::string& game_path, const QtCommon::Game::ShortcutTarget target); void OnGameListOpenDirectory(const QString& directory); void OnGameListAddDirectory(); @@ -483,7 +483,7 @@ private: */ bool question(QWidget* parent, const QString& title, const QString& text, QMessageBox::StandardButtons buttons = - QMessageBox::StandardButtons(QMessageBox::Yes | QMessageBox::No), + QMessageBox::StandardButtons(QMessageBox::Yes | QMessageBox::No), QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); std::unique_ptr ui; @@ -504,7 +504,7 @@ private: LoadingScreen* loading_screen = nullptr; QTimer shutdown_timer; OverlayDialog* shutdown_dialog{}; - PerformanceOverlay *perf_overlay = nullptr; + PerformanceOverlay* perf_overlay = nullptr; GameListPlaceholder* game_list_placeholder = nullptr; @@ -551,7 +551,7 @@ private: QString startup_icon_theme; - QActionGroup *game_size_actions; + QActionGroup* game_size_actions; // Debugger panes ControllerDialog* controller_dialog = nullptr; @@ -595,12 +595,9 @@ private: std::filesystem::path GetEdenCommand(); - void CreateShortcut(const std::string& game_path, - const u64 program_id, - const std::string& game_title, - QtCommon::Game::ShortcutTarget target, - std::string arguments, - const bool needs_title); + void CreateShortcut(const std::string& game_path, const u64 program_id, + const std::string& game_title, QtCommon::Game::ShortcutTarget target, + std::string arguments, const bool needs_title); void InstallFirmware(const QString& location, bool recursive = false); diff --git a/src/yuzu/migration_dialog.cpp b/src/yuzu/migration_dialog.cpp index 9cc40841e8..ba6a14b156 100644 --- a/src/yuzu/migration_dialog.cpp +++ b/src/yuzu/migration_dialog.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + #include "migration_dialog.h" #include @@ -6,11 +9,8 @@ #include #include -MigrationDialog::MigrationDialog( - QWidget *parent) - : QDialog(parent) -{ - QVBoxLayout *layout = new QVBoxLayout(this); +MigrationDialog::MigrationDialog(QWidget* parent) : QDialog(parent) { + QVBoxLayout* layout = new QVBoxLayout(this); m_text = new QLabel(this); m_boxes = new QVBoxLayout; @@ -26,23 +26,16 @@ MigrationDialog::~MigrationDialog() { m_buttons->deleteLater(); } -void MigrationDialog::setText( - const QString &text) -{ +void MigrationDialog::setText(const QString& text) { m_text->setText(text); } -void MigrationDialog::addBox( - QWidget *box) -{ +void MigrationDialog::addBox(QWidget* box) { m_boxes->addWidget(box); - } -QAbstractButton *MigrationDialog::addButton( - const QString &text, const bool reject) -{ - QAbstractButton *button = new QPushButton(this); +QAbstractButton* MigrationDialog::addButton(const QString& text, const bool reject) { + QAbstractButton* button = new QPushButton(this); button->setText(text); m_buttons->addWidget(button, 1); @@ -58,7 +51,6 @@ QAbstractButton *MigrationDialog::addButton( return button; } -QAbstractButton *MigrationDialog::clickedButton() const -{ +QAbstractButton* MigrationDialog::clickedButton() const { return m_clickedButton; } diff --git a/src/yuzu/migration_dialog.h b/src/yuzu/migration_dialog.h index 7123fd6b87..a2a2c80358 100644 --- a/src/yuzu/migration_dialog.h +++ b/src/yuzu/migration_dialog.h @@ -1,30 +1,33 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + #ifndef MIGRATION_DIALOG_H #define MIGRATION_DIALOG_H -#include -#include #include +#include #include +#include class MigrationDialog : public QDialog { Q_OBJECT public: - MigrationDialog(QWidget *parent = nullptr); + MigrationDialog(QWidget* parent = nullptr); virtual ~MigrationDialog(); - void setText(const QString &text); - void addBox(QWidget *box); - QAbstractButton *addButton(const QString &text, const bool reject = false); + void setText(const QString& text); + void addBox(QWidget* box); + QAbstractButton* addButton(const QString& text, const bool reject = false); - QAbstractButton *clickedButton() const; + QAbstractButton* clickedButton() const; private: - QLabel *m_text; - QVBoxLayout *m_boxes; - QHBoxLayout *m_buttons; + QLabel* m_text; + QVBoxLayout* m_boxes; + QHBoxLayout* m_buttons; - QAbstractButton *m_clickedButton; + QAbstractButton* m_clickedButton; }; #endif // MIGRATION_DIALOG_H diff --git a/src/yuzu/migration_worker.cpp b/src/yuzu/migration_worker.cpp index 0149db4149..ba5e50e187 100644 --- a/src/yuzu/migration_worker.cpp +++ b/src/yuzu/migration_worker.cpp @@ -1,27 +1,22 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "migration_worker.h" #include "common/fs/symlink.h" +#include "migration_worker.h" +#include #include #include #include -#include #include "common/fs/path_util.h" -MigrationWorker::MigrationWorker(const Emulator selected_emu_, - const bool clear_shader_cache_, +MigrationWorker::MigrationWorker(const Emulator selected_emu_, const bool clear_shader_cache_, const MigrationStrategy strategy_) - : QObject() - , selected_emu(selected_emu_) - , clear_shader_cache(clear_shader_cache_) - , strategy(strategy_) -{} + : QObject(), selected_emu(selected_emu_), clear_shader_cache(clear_shader_cache_), + strategy(strategy_) {} -void MigrationWorker::process() -{ +void MigrationWorker::process() { namespace fs = std::filesystem; constexpr auto copy_options = fs::copy_options::update_existing | fs::copy_options::recursive; @@ -42,7 +37,7 @@ void MigrationWorker::process() try { fs::remove_all(eden_dir); - } catch (fs::filesystem_error &_) { + } catch (fs::filesystem_error& _) { // ignore because linux does stupid crap sometimes } @@ -53,7 +48,7 @@ void MigrationWorker::process() // Windows 11 has random permission nonsense to deal with. try { Common::FS::CreateSymlink(legacy_user_dir, eden_dir); - } catch (const fs::filesystem_error &e) { + } catch (const fs::filesystem_error& e) { emit error(tr("Linking the old directory failed. You may need to re-run with " "administrative privileges on Windows.\nOS gave error: %1") .arg(tr(e.what()))); @@ -74,8 +69,7 @@ void MigrationWorker::process() success_text.append(tr("\n\nNote that your configuration and data will be shared with %1.\n" "If this is not desirable, delete the following files:\n%2\n%3\n%4") - .arg(selected_emu.name(), - QString::fromStdString(eden_dir.string()), + .arg(selected_emu.name(), QString::fromStdString(eden_dir.string()), QString::fromStdString(config_dir.string()), QString::fromStdString(cache_dir.string()))); diff --git a/src/yuzu/migration_worker.h b/src/yuzu/migration_worker.h index 2db05570ea..42abedb9c8 100644 --- a/src/yuzu/migration_worker.h +++ b/src/yuzu/migration_worker.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #ifndef MIGRATION_WORKER_H @@ -8,7 +8,7 @@ #include "common/fs/path_util.h" typedef struct Emulator { - const char *m_name; + const char* m_name; Common::FS::EmuPath e_user_dir; Common::FS::EmuPath e_config_dir; @@ -26,14 +26,20 @@ typedef struct Emulator { return Common::FS::GetLegacyPath(e_cache_dir).string(); } - const QString name() const { return QObject::tr(m_name); + const QString name() const { + return QObject::tr(m_name); } - const QString lower_name() const { return name().toLower(); + const QString lower_name() const { + return name().toLower(); } } Emulator; -#define STRUCT_EMU(name, enumName) Emulator{name, Common::FS::enumName##Dir, Common::FS::enumName##ConfigDir, Common::FS::enumName##CacheDir} +#define STRUCT_EMU(name, enumName) \ + Emulator { \ + name, Common::FS::enumName##Dir, Common::FS::enumName##ConfigDir, \ + Common::FS::enumName##CacheDir \ + } static constexpr std::array legacy_emus = { STRUCT_EMU(QT_TR_NOOP("Citron"), Citron), @@ -42,8 +48,7 @@ static constexpr std::array legacy_emus = { STRUCT_EMU(QT_TR_NOOP("Yuzu"), Yuzu), }; -class MigrationWorker : public QObject -{ +class MigrationWorker : public QObject { Q_OBJECT public: enum class MigrationStrategy { @@ -52,16 +57,15 @@ public: Link, }; - MigrationWorker(const Emulator selected_emu, - const bool clear_shader_cache, + MigrationWorker(const Emulator selected_emu, const bool clear_shader_cache, const MigrationStrategy strategy); public slots: void process(); signals: - void finished(const QString &success_text, const std::string &user_dir); - void error(const QString &error_message); + void finished(const QString& success_text, const std::string& user_dir); + void error(const QString& error_message); private: Emulator selected_emu; diff --git a/src/yuzu/multiplayer/chat_room.cpp b/src/yuzu/multiplayer/chat_room.cpp index a4d343f3a3..e274aaf62d 100644 --- a/src/yuzu/multiplayer/chat_room.cpp +++ b/src/yuzu/multiplayer/chat_room.cpp @@ -17,7 +17,7 @@ #include #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "network/announce_multiplayer_session.h" #include "ui_chat_room.h" #include "yuzu/game/game_list_p.h" diff --git a/src/yuzu/multiplayer/chat_room.h b/src/yuzu/multiplayer/chat_room.h index a94683ef58..44ec8952d1 100644 --- a/src/yuzu/multiplayer/chat_room.h +++ b/src/yuzu/multiplayer/chat_room.h @@ -6,11 +6,11 @@ #pragma once #include -#include #include #include #include #include +#include #include "network/network.h" namespace Ui { diff --git a/src/yuzu/multiplayer/client_room.cpp b/src/yuzu/multiplayer/client_room.cpp index 2d6bcd3bad..391ca56c05 100644 --- a/src/yuzu/multiplayer/client_room.cpp +++ b/src/yuzu/multiplayer/client_room.cpp @@ -11,7 +11,7 @@ #include #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "network/announce_multiplayer_session.h" #include "ui_client_room.h" #include "yuzu/game/game_list_p.h" diff --git a/src/yuzu/multiplayer/direct_connect.cpp b/src/yuzu/multiplayer/direct_connect.cpp index 486ab28213..eea906f16d 100644 --- a/src/yuzu/multiplayer/direct_connect.cpp +++ b/src/yuzu/multiplayer/direct_connect.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project @@ -14,6 +14,7 @@ #include "core/core.h" #include "core/internal_network/network_interface.h" #include "network/network.h" +#include "qt_common/config/uisettings.h" #include "ui_direct_connect.h" #include "yuzu/main_window.h" #include "yuzu/multiplayer/client_room.h" @@ -21,7 +22,6 @@ #include "yuzu/multiplayer/message.h" #include "yuzu/multiplayer/state.h" #include "yuzu/multiplayer/validation.h" -#include "qt_common/config/uisettings.h" enum class ConnectionType : u8 { TraversalServer, IP }; diff --git a/src/yuzu/multiplayer/host_room.cpp b/src/yuzu/multiplayer/host_room.cpp index 3e5e42e442..2a5530e02c 100644 --- a/src/yuzu/multiplayer/host_room.cpp +++ b/src/yuzu/multiplayer/host_room.cpp @@ -13,11 +13,12 @@ #include #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core.h" #include "core/internal_network/network_interface.h" #include "network/announce_multiplayer_session.h" +#include "qt_common/config/uisettings.h" #include "ui_host_room.h" #include "yuzu/game/game_list_p.h" #include "yuzu/main_window.h" @@ -25,7 +26,6 @@ #include "yuzu/multiplayer/message.h" #include "yuzu/multiplayer/state.h" #include "yuzu/multiplayer/validation.h" -#include "qt_common/config/uisettings.h" #ifdef ENABLE_WEB_SERVICE #include "web_service/verify_user_jwt.h" #endif @@ -34,8 +34,7 @@ HostRoomWindow::HostRoomWindow(QWidget* parent, QStandardItemModel* list, std::shared_ptr session, Core::System& system_) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), - ui(std::make_unique()), - announce_multiplayer_session(session), system{system_} { + ui(std::make_unique()), announce_multiplayer_session(session), system{system_} { ui->setupUi(this); // set up validation for all of the fields diff --git a/src/yuzu/multiplayer/lobby.cpp b/src/yuzu/multiplayer/lobby.cpp index f28374f75f..8e9ff6563f 100644 --- a/src/yuzu/multiplayer/lobby.cpp +++ b/src/yuzu/multiplayer/lobby.cpp @@ -7,12 +7,13 @@ #include #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/settings.h" #include "core/core.h" #include "core/hle/service/acc/profile_manager.h" #include "core/internal_network/network_interface.h" #include "network/network.h" +#include "qt_common/config/uisettings.h" #include "ui_lobby.h" #include "yuzu/game/game_list_p.h" #include "yuzu/main_window.h" @@ -22,7 +23,6 @@ #include "yuzu/multiplayer/message.h" #include "yuzu/multiplayer/state.h" #include "yuzu/multiplayer/validation.h" -#include "qt_common/config/uisettings.h" #ifdef ENABLE_WEB_SERVICE #include "web_service/web_backend.h" #endif @@ -30,8 +30,7 @@ Lobby::Lobby(QWidget* parent, QStandardItemModel* list, std::shared_ptr session, Core::System& system_) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint), - ui(std::make_unique()), - announce_multiplayer_session(session), system{system_} { + ui(std::make_unique()), announce_multiplayer_session(session), system{system_} { ui->setupUi(this); // setup the watcher for background connections diff --git a/src/yuzu/multiplayer/state.cpp b/src/yuzu/multiplayer/state.cpp index c344bcb8a3..f682c299c8 100644 --- a/src/yuzu/multiplayer/state.cpp +++ b/src/yuzu/multiplayer/state.cpp @@ -9,8 +9,9 @@ #include #include #include "common/announce_multiplayer_room.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/core.h" +#include "qt_common/config/uisettings.h" #include "yuzu/game/game_list.h" #include "yuzu/multiplayer/client_room.h" #include "yuzu/multiplayer/direct_connect.h" @@ -18,7 +19,6 @@ #include "yuzu/multiplayer/lobby.h" #include "yuzu/multiplayer/message.h" #include "yuzu/multiplayer/state.h" -#include "qt_common/config/uisettings.h" #include "yuzu/util/clickable_label.h" MultiplayerState::MultiplayerState(QWidget* parent, QStandardItemModel* game_list_model_, diff --git a/src/yuzu/render/performance_overlay.h b/src/yuzu/render/performance_overlay.h index 1d7fb46f26..a0325a10a3 100644 --- a/src/yuzu/render/performance_overlay.h +++ b/src/yuzu/render/performance_overlay.h @@ -34,13 +34,13 @@ protected: void mousePressEvent(QMouseEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override; - void closeEvent(QCloseEvent *event) override; + void closeEvent(QCloseEvent* event) override; private: void resetPosition(const QPoint& pos); - void updateStats(const Core::PerfStatsResults &results, const VideoCore::ShaderNotify &shaders); + void updateStats(const Core::PerfStatsResults& results, const VideoCore::ShaderNotify& shaders); - MainWindow *m_mainWindow = nullptr; + MainWindow* m_mainWindow = nullptr; Ui::PerformanceOverlay* ui; // colors @@ -62,11 +62,11 @@ private: QPoint m_drag_start_pos; // fps chart - QLineSeries *m_fpsSeries = nullptr; - QChart *m_fpsChart = nullptr; - QChartView *m_fpsChartView = nullptr; - QValueAxis *m_fpsX = nullptr; - QValueAxis *m_fpsY = nullptr; + QLineSeries* m_fpsSeries = nullptr; + QChart* m_fpsChart = nullptr; + QChartView* m_fpsChartView = nullptr; + QValueAxis* m_fpsX = nullptr; + QValueAxis* m_fpsY = nullptr; signals: void closed(); diff --git a/src/yuzu/ryujinx_dialog.cpp b/src/yuzu/ryujinx_dialog.cpp index 563714f6be..f52f37b297 100644 --- a/src/yuzu/ryujinx_dialog.cpp +++ b/src/yuzu/ryujinx_dialog.cpp @@ -1,20 +1,16 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "qt_common/abstract/frontend.h" -#include "ryujinx_dialog.h" -#include "qt_common/util/fs.h" -#include "ui_ryujinx_dialog.h" #include +#include "qt_common/abstract/frontend.h" +#include "qt_common/util/fs.h" +#include "ryujinx_dialog.h" +#include "ui_ryujinx_dialog.h" -RyujinxDialog::RyujinxDialog(std::filesystem::path eden_path, - std::filesystem::path ryu_path, - QWidget *parent) - : QDialog(parent) - , ui(new Ui::RyujinxDialog) - , m_eden(eden_path.make_preferred()) - , m_ryu(ryu_path.make_preferred()) -{ +RyujinxDialog::RyujinxDialog(std::filesystem::path eden_path, std::filesystem::path ryu_path, + QWidget* parent) + : QDialog(parent), ui(new Ui::RyujinxDialog), m_eden(eden_path.make_preferred()), + m_ryu(ryu_path.make_preferred()) { ui->setupUi(this); connect(ui->eden, &QPushButton::clicked, this, &RyujinxDialog::fromEden); @@ -22,13 +18,11 @@ RyujinxDialog::RyujinxDialog(std::filesystem::path eden_path, connect(ui->cancel, &QPushButton::clicked, this, &RyujinxDialog::reject); } -RyujinxDialog::~RyujinxDialog() -{ +RyujinxDialog::~RyujinxDialog() { delete ui; } -void RyujinxDialog::fromEden() -{ +void RyujinxDialog::fromEden() { accept(); // Workaround: Ryujinx deletes and re-creates its directory structure??? @@ -38,17 +32,17 @@ void RyujinxDialog::fromEden() fs::remove_all(m_ryu); fs::create_directories(m_ryu); fs::copy(m_eden, m_ryu, fs::copy_options::recursive); - } catch (std::exception &e) { - QtCommon::Frontend::Critical(tr("Failed to link save data"), - tr("OS returned error: %1").arg(QString::fromStdString(e.what()))); + } catch (std::exception& e) { + QtCommon::Frontend::Critical( + tr("Failed to link save data"), + tr("OS returned error: %1").arg(QString::fromStdString(e.what()))); } // ?ploo QtCommon::FS::LinkRyujinx(m_ryu, m_eden); } -void RyujinxDialog::fromRyujinx() -{ +void RyujinxDialog::fromRyujinx() { accept(); QtCommon::FS::LinkRyujinx(m_ryu, m_eden); } diff --git a/src/yuzu/ryujinx_dialog.h b/src/yuzu/ryujinx_dialog.h index 63cebe483c..c067499cc1 100644 --- a/src/yuzu/ryujinx_dialog.h +++ b/src/yuzu/ryujinx_dialog.h @@ -1,22 +1,22 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #ifndef RYUJINX_DIALOG_H #define RYUJINX_DIALOG_H -#include #include +#include namespace Ui { class RyujinxDialog; } -class RyujinxDialog : public QDialog -{ +class RyujinxDialog : public QDialog { Q_OBJECT public: - explicit RyujinxDialog(std::filesystem::path eden_path, std::filesystem::path ryu_path, QWidget *parent = nullptr); + explicit RyujinxDialog(std::filesystem::path eden_path, std::filesystem::path ryu_path, + QWidget* parent = nullptr); ~RyujinxDialog(); private slots: @@ -24,7 +24,7 @@ private slots: void fromRyujinx(); private: - Ui::RyujinxDialog *ui; + Ui::RyujinxDialog* ui; std::filesystem::path m_eden; std::filesystem::path m_ryu; }; diff --git a/src/yuzu/set_play_time_dialog.cpp b/src/yuzu/set_play_time_dialog.cpp index c0f1f0be22..38876abd6d 100644 --- a/src/yuzu/set_play_time_dialog.cpp +++ b/src/yuzu/set_play_time_dialog.cpp @@ -1,20 +1,23 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "yuzu/set_play_time_dialog.h" #include "frontend_common/play_time_manager.h" #include "ui_set_play_time_dialog.h" +#include "yuzu/set_play_time_dialog.h" SetPlayTimeDialog::SetPlayTimeDialog(QWidget* parent, u64 current_play_time) : QDialog(parent), ui{std::make_unique()} { ui->setupUi(this); ui->hoursSpinBox->setValue( - QString::fromStdString(PlayTime::PlayTimeManager::GetPlayTimeHours(current_play_time)).toInt()); + QString::fromStdString(PlayTime::PlayTimeManager::GetPlayTimeHours(current_play_time)) + .toInt()); ui->minutesSpinBox->setValue( - QString::fromStdString(PlayTime::PlayTimeManager::GetPlayTimeMinutes(current_play_time)).toInt()); + QString::fromStdString(PlayTime::PlayTimeManager::GetPlayTimeMinutes(current_play_time)) + .toInt()); ui->secondsSpinBox->setValue( - QString::fromStdString(PlayTime::PlayTimeManager::GetPlayTimeSeconds(current_play_time)).toInt()); + QString::fromStdString(PlayTime::PlayTimeManager::GetPlayTimeSeconds(current_play_time)) + .toInt()); connect(ui->hoursSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &SetPlayTimeDialog::OnValueChanged); diff --git a/src/yuzu/set_play_time_dialog.h b/src/yuzu/set_play_time_dialog.h index 75513539e5..a66ceb7ced 100644 --- a/src/yuzu/set_play_time_dialog.h +++ b/src/yuzu/set_play_time_dialog.h @@ -1,10 +1,10 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once -#include #include +#include #include "common/common_types.h" namespace Ui { diff --git a/src/yuzu/startup_checks.cpp b/src/yuzu/startup_checks.cpp index 2e77c7cd06..f54992d19a 100644 --- a/src/yuzu/startup_checks.cpp +++ b/src/yuzu/startup_checks.cpp @@ -1,6 +1,10 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +// Don't move this! put it below and MSVC will get angry! #include "video_core/vulkan_common/vulkan_wrapper.h" #ifdef _WIN32 diff --git a/src/yuzu/user_data_migration.cpp b/src/yuzu/user_data_migration.cpp index bc31c99e30..da8b0847c7 100644 --- a/src/yuzu/user_data_migration.cpp +++ b/src/yuzu/user_data_migration.cpp @@ -1,42 +1,41 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#include "user_data_migration.h" #include #include #include #include #include "common/fs/path_util.h" #include "qt_common/qt_string_lookup.h" +#include "user_data_migration.h" #include "yuzu/migration_dialog.h" // Needs to be included at the end due to https://bugreports.qt.io/browse/QTBUG-73263 +#include #include #include #include #include #include #include -#include -UserDataMigrator::UserDataMigrator(QMainWindow *main_window) -{ +UserDataMigrator::UserDataMigrator(QMainWindow* main_window) { // NOTE: Logging is not initialized yet, do not produce logs here. // Check migration if config directory does not exist - // TODO: ProfileManager messes with us a bit here, and force-creates the /nand/system/save/8000000000000010/su/avators/profiles.dat - // file. Find a way to reorder operations and have it create after this guy runs. + // TODO: ProfileManager messes with us a bit here, and force-creates the + // /nand/system/save/8000000000000010/su/avators/profiles.dat file. Find a way to reorder + // operations and have it create after this guy runs. if (!std::filesystem::is_directory(Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir))) { ShowMigrationPrompt(main_window); } } -void UserDataMigrator::ShowMigrationPrompt(QMainWindow *main_window) -{ +void UserDataMigrator::ShowMigrationPrompt(QMainWindow* main_window) { namespace fs = std::filesystem; using namespace QtCommon::StringLookup; @@ -44,35 +43,36 @@ void UserDataMigrator::ShowMigrationPrompt(QMainWindow *main_window) migration_prompt.setWindowTitle(QObject::tr("Migration")); // mutually exclusive - QButtonGroup *group = new QButtonGroup(&migration_prompt); + QButtonGroup* group = new QButtonGroup(&migration_prompt); // MACRO MADNESS -#define BUTTON(clazz, name, text, tooltip, checkState) \ - clazz *name = new clazz(&migration_prompt); \ - name->setText(text); \ - name->setToolTip(Lookup(tooltip)); \ - name->setChecked(checkState); \ +#define BUTTON(clazz, name, text, tooltip, checkState) \ + clazz* name = new clazz(&migration_prompt); \ + name->setText(text); \ + name->setToolTip(Lookup(tooltip)); \ + name->setChecked(checkState); \ migration_prompt.addBox(name); - BUTTON(QCheckBox, clear_shaders, QObject::tr("Clear Shader Cache"), MigrationTooltipClearShader, true) + BUTTON(QCheckBox, clear_shaders, QObject::tr("Clear Shader Cache"), MigrationTooltipClearShader, + true) u32 id = 0; -#define RADIO(name, text, tooltip, checkState) \ - BUTTON(QRadioButton, name, text, tooltip, checkState) \ +#define RADIO(name, text, tooltip, checkState) \ + BUTTON(QRadioButton, name, text, tooltip, checkState) \ group->addButton(name, ++id); - RADIO(keep_old, QObject::tr("Keep Old Data"), MigrationTooltipKeepOld, true) + RADIO(keep_old, QObject::tr("Keep Old Data"), MigrationTooltipKeepOld, true) RADIO(clear_old, QObject::tr("Clear Old Data"), MigrationTooltipClearOld, false) - RADIO(link_old, QObject::tr("Link Old Directory"), MigrationTooltipLinkOld, false) + RADIO(link_old, QObject::tr("Link Old Directory"), MigrationTooltipLinkOld, false) #undef RADIO #undef BUTTON std::vector found{}; - for (const Emulator &emu : legacy_emus) + for (const Emulator& emu : legacy_emus) if (fs::is_directory(emu.get_user_dir())) found.emplace_back(emu); @@ -86,10 +86,10 @@ void UserDataMigrator::ShowMigrationPrompt(QMainWindow *main_window) QString prompt_text = Lookup(MigrationPromptPrefix); // natural language processing is a nightmare - for (const Emulator &emu : found) { + for (const Emulator& emu : found) { prompt_text = prompt_text % QStringLiteral("\n ") % emu.name(); - QAbstractButton *button = migration_prompt.addButton(emu.name()); + QAbstractButton* button = migration_prompt.addButton(emu.name()); // This is cursed, but it's actually the most efficient way by a mile button->setProperty("emulator", QVariant::fromValue(emu)); @@ -103,26 +103,22 @@ void UserDataMigrator::ShowMigrationPrompt(QMainWindow *main_window) migration_prompt.exec(); - QAbstractButton *button = migration_prompt.clickedButton(); + QAbstractButton* button = migration_prompt.clickedButton(); if (button->text() == QObject::tr("No")) { return ShowMigrationCancelledMessage(main_window); } - MigrationWorker::MigrationStrategy strategy = static_cast( - group->checkedId()); + MigrationWorker::MigrationStrategy strategy = + static_cast(group->checkedId()); selected_emu = button->property("emulator").value(); - MigrateUserData(main_window, - clear_shaders->isChecked(), - strategy); + MigrateUserData(main_window, clear_shaders->isChecked(), strategy); } -void UserDataMigrator::ShowMigrationCancelledMessage(QMainWindow *main_window) -{ - QMessageBox::information(main_window, - QObject::tr("Migration"), +void UserDataMigrator::ShowMigrationCancelledMessage(QMainWindow* main_window) { + QMessageBox::information(main_window, QObject::tr("Migration"), QObject::tr("You can manually re-trigger this prompt by deleting the " "new config directory:\n%1") .arg(QString::fromStdString(Common::FS::GetEdenPathString( @@ -130,33 +126,27 @@ void UserDataMigrator::ShowMigrationCancelledMessage(QMainWindow *main_window) QMessageBox::Ok); } -void UserDataMigrator::MigrateUserData(QMainWindow *main_window, - const bool clear_shader_cache, - const MigrationWorker::MigrationStrategy strategy) -{ +void UserDataMigrator::MigrateUserData(QMainWindow* main_window, const bool clear_shader_cache, + const MigrationWorker::MigrationStrategy strategy) { // Create a dialog to let the user know it's migrating - QProgressDialog *progress = new QProgressDialog(main_window); + QProgressDialog* progress = new QProgressDialog(main_window); progress->setWindowTitle(QObject::tr("Migrating")); progress->setLabelText(QObject::tr("Migrating, this may take a while...")); progress->setRange(0, 0); progress->setCancelButton(nullptr); progress->setWindowModality(Qt::WindowModality::ApplicationModal); - QThread *thread = new QThread(main_window); - MigrationWorker *worker = new MigrationWorker(selected_emu, clear_shader_cache, strategy); + QThread* thread = new QThread(main_window); + MigrationWorker* worker = new MigrationWorker(selected_emu, clear_shader_cache, strategy); worker->moveToThread(thread); thread->connect(thread, &QThread::started, worker, &MigrationWorker::process); - thread->connect(worker, - &MigrationWorker::finished, - progress, - [=, this](const QString &success_text, const std::string &path) { + thread->connect(worker, &MigrationWorker::finished, progress, + [=, this](const QString& success_text, const std::string& path) { progress->close(); - QMessageBox::information(main_window, - QObject::tr("Migration"), - success_text, - QMessageBox::Ok); + QMessageBox::information(main_window, QObject::tr("Migration"), + success_text, QMessageBox::Ok); migrated = true; thread->quit(); diff --git a/src/yuzu/user_data_migration.h b/src/yuzu/user_data_migration.h index 1cfeda3bca..df8057eaa5 100644 --- a/src/yuzu/user_data_migration.h +++ b/src/yuzu/user_data_migration.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // Copyright Citra Emulator Project / Azahar Emulator Project @@ -21,7 +21,6 @@ public: private: void ShowMigrationPrompt(QMainWindow* main_window); void ShowMigrationCancelledMessage(QMainWindow* main_window); - void MigrateUserData(QMainWindow* main_window, - const bool clear_shader_cache, + void MigrateUserData(QMainWindow* main_window, const bool clear_shader_cache, const MigrationWorker::MigrationStrategy strategy); }; diff --git a/src/yuzu/util/util.cpp b/src/yuzu/util/util.cpp index 307f121a49..a3933d9b63 100644 --- a/src/yuzu/util/util.cpp +++ b/src/yuzu/util/util.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2015 Citra Emulator Project @@ -8,7 +8,7 @@ #include #include "applets/qt_profile_select.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "core/frontend/applets/profile_select.h" #include "core/hle/service/acc/profile_manager.h" #include "frontend_common/data_manager.h" @@ -157,11 +157,11 @@ const std::optional GetProfileID() { const auto select_profile = [] { const Core::Frontend::ProfileSelectParameters parameters{ - .mode = Service::AM::Frontend::UiMode::UserSelector, - .invalid_uid_list = {}, - .display_options = {}, - .purpose = Service::AM::Frontend::UserSelectionPurpose::General, - }; + .mode = Service::AM::Frontend::UiMode::UserSelector, + .invalid_uid_list = {}, + .display_options = {}, + .purpose = Service::AM::Frontend::UserSelectionPurpose::General, + }; QtProfileSelectionDialog dialog(*QtCommon::system, QtCommon::rootObject, parameters); dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint); diff --git a/src/yuzu/vk_device_info.cpp b/src/yuzu/vk_device_info.cpp index 45faecb95d..1e8e140d77 100644 --- a/src/yuzu/vk_device_info.cpp +++ b/src/yuzu/vk_device_info.cpp @@ -10,7 +10,7 @@ #include "qt_common/qt_common.h" #include "common/dynamic_library.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "video_core/vulkan_common/vulkan_device.h" #include "video_core/vulkan_common/vulkan_instance.h" #include "video_core/vulkan_common/vulkan_library.h" @@ -62,12 +62,13 @@ void PopulateRecords(std::vector& records, QWindow* window) try { const auto driverID = driver_properties.driverID; - bool has_broken_compute{Vulkan::Device::CheckBrokenCompute( - driverID, properties.properties.driverVersion)}; + bool has_broken_compute{ + Vulkan::Device::CheckBrokenCompute(driverID, properties.properties.driverVersion)}; std::string driver_string = Vulkan::vk::GetDriverName(driver_properties); - if (driver_string.empty()) driver_string = "Unknown"; + if (driver_string.empty()) + driver_string = "Unknown"; name = fmt::format("{} ({})", name, driver_string); @@ -76,4 +77,5 @@ void PopulateRecords(std::vector& records, QWindow* window) try { } catch (const Vulkan::vk::Exception& exception) { LOG_ERROR(Frontend, "Failed to enumerate devices with error: {}", exception.what()); } + } // namespace VkDeviceInfo diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp index 4b56f3794b..c00734216e 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2.cpp @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scm_rev.h" #include "common/settings.h" #include "core/core.h" diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp index 32f365e0d0..94a6a69776 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -13,7 +13,7 @@ #include #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scm_rev.h" #include "common/settings.h" #include "common/string_util.h" diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_null.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_null.cpp index 506137bd8a..4947080313 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2_null.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_null.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scm_rev.h" #include "video_core/renderer_null/renderer_null.h" #include "yuzu_cmd/emu_window/emu_window_sdl2_null.h" diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp index f509652bf6..c54e5b4fda 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ #include -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scm_rev.h" #include "video_core/renderer_vulkan/renderer_vulkan.h" #include "yuzu_cmd/emu_window/emu_window_sdl2_vk.h" diff --git a/src/yuzu_cmd/sdl_config.cpp b/src/yuzu_cmd/sdl_config.cpp index 6e0f254b6b..136043dc9e 100644 --- a/src/yuzu_cmd/sdl_config.cpp +++ b/src/yuzu_cmd/sdl_config.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,7 +8,7 @@ #define SDL_MAIN_HANDLED #include -#include "common/logging/log.h" +#include "common/logging.h" #include "input_common/main.h" #include "sdl_config.h" diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index b292b4886b..8e518d816c 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2014 Citra Emulator Project @@ -12,8 +12,7 @@ #include #include "common/detached_tasks.h" -#include "common/logging/backend.h" -#include "common/logging/log.h" +#include "common/logging.h" #include "common/scm_rev.h" #include "common/settings.h" #include "common/string_util.h" @@ -208,6 +207,7 @@ int main(int argc, char** argv) { std::string nickname{}; std::string password{}; std::string address{}; + std::string input_profile{}; u16 port = Network::DefaultRoomPort; static struct option long_options[] = { @@ -221,12 +221,13 @@ int main(int argc, char** argv) { {"program", optional_argument, 0, 'p'}, {"user", required_argument, 0, 'u'}, {"version", no_argument, 0, 'v'}, + {"input-profile", no_argument, 0, 'i'}, {0, 0, 0, 0}, // clang-format on }; while (optind < argc) { - int arg = getopt_long(argc, argv, "g:fhvp::c:u:d:", long_options, &option_index); + int arg = getopt_long(argc, argv, "g:fhvcip::c:u:d:", long_options, &option_index); if (arg != -1) { switch (char(arg)) { case 'd': @@ -245,6 +246,10 @@ int main(int argc, char** argv) { case 'g': filepath = std::string(optarg); break; + case 'i': { + input_profile = std::string(optarg); + break; + } case 'm': { use_multiplayer = true; const std::string str_arg(optarg); @@ -311,6 +316,11 @@ int main(int argc, char** argv) { Settings::values.program_args = program_args; } + if (!input_profile.empty()) { + auto& players = Settings::values.players.GetValue(); + players[0].profile_name = input_profile; + } + if (selected_user.has_value()) { Settings::values.current_user = std::clamp(*selected_user, 0, 7); } diff --git a/tools/clang-format.sh b/tools/clang-format.sh index 2deb0a3ade..e2857d9723 100755 --- a/tools/clang-format.sh +++ b/tools/clang-format.sh @@ -1,6 +1,7 @@ #! /bin/sh -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -exec find src -iname "*.h" -o -iname "*.cpp" | xargs clang-format -i -style=file:src/.clang-format +# Only clang-formats Qt stuff. :) +find src/qt_common src/yuzu -iname "*.h" -o -iname "*.cpp" | xargs clang-format -i -style=file:src/.clang-format