Compare commits

...

20 Commits

Author SHA1 Message Date
OpenSauce04
3e1b86548a cmake: Remove SYSTEM from target_link_libraries 2025-09-16 16:06:12 +01:00
OpenSauce04
246e06d1a4 vk_pipeline_cache: Fix directory creation failure if shaders/vulkan/ is missing 2025-09-13 01:20:32 +01:00
OpenSauce04
a607e3dd22 tools: Added Github cache purge script 2025-09-13 01:20:32 +01:00
OpenSauce04
a65114eabf Updated compatibility list 2025-09-05 22:22:32 +01:00
OpenSauce04
6ac0733002 tools: Updated guidance regarding translation updates 2025-09-05 21:56:32 +01:00
David Griswold
8519e92eae android: Re-fixed game termination bug (#1357)
* EmulationActivity and EmulationFragment clear only their own hooks

* EmulationLifecycleUtil: Rename `remove()` to `removeHook()`

* EmulationLifecycleUtil: Removed unused function `clear()`

* Corrected somewhat incorrect usage of the word "hook"

* Define `onShutdown` and `onPause` hook functions in constructors

* Formatting nitpicks

* Updated license header

* Re-added log messages for attempting to add duplicate hooks

---------

Co-authored-by: OpenSauce04 <opensauce04@gmail.com>
2025-09-05 21:40:05 +01:00
OpenSauce04
7f2ac35870 Revert "Fix android termination bug (#1354)"
This reverts commit 70f9379eefc84b7651e3aababcce33987e073ed0.
2025-09-05 21:40:05 +01:00
OpenSauce04
1e2dd5ea78 SecondaryDisplay.kt: Remove redundant SurfaceTexture, preventing log spam 2025-09-05 21:40:05 +01:00
David Griswold
beba099fed Fix android termination bug (#1354)
* move hook additions to onCreateView

* Updated license header

* Formatting nitpick

* Added prefix to log messages

---------

Co-authored-by: OpenSauce04 <opensauce04@gmail.com>
2025-09-04 22:59:51 +01:00
OpenSauce04
c888c40b3e macos: Set UIDesignRequiresCompatibility to true 2025-09-03 23:02:34 +01:00
OpenSauce04
57995cd89c android: Bump Vulkan Validation Layers to SDK 1.4.313.0 2025-09-03 22:31:26 +01:00
DavidRGriswold
29a77b342b android: Prevent crash when editing a slider option with an out of bounds value
Co-authored-by: OpenSauce04 <opensauce04@gmail.com>
2025-09-03 13:18:43 +01:00
OpenSauce04
3ef5bc0bfe macos: Patch QMetalLayer.setNeedsDisplayInRect at runtime to avoid freezing on recent Qt 2025-09-03 03:16:00 +01:00
OpenSauce04
d94657a44d cmake: On Windows, download MSVC 2022 Qt versions instead of MSVC 2019 2025-09-03 03:16:00 +01:00
OpenSauce04
ee58988897 cmake: Bump downloaded Qt version to 6.9.2
Also bumps aqtinstall to 3.3.0
2025-09-03 03:16:00 +01:00
OpenSauce04
ec7f00c9a4 cmake: Added check for minimum AppleClang version 2025-09-02 14:06:53 +01:00
OpenSauce04
164b9329c7 cmake: Corrected widespread incorrect usage of the SYSTEM property 2025-09-01 00:43:01 +01:00
OpenSauce04
2292f3ab1b Updated translations via Transifex 2025-08-20 13:57:05 +01:00
PabloMK7
3ab6a304cd am: fix save data being deleted on CIA install failure (#1319) 2025-08-20 13:51:06 +01:00
OpenSauce04
2e3d926dd5 Updated language translations via Transifex 2025-08-15 17:47:35 +01:00
27 changed files with 274 additions and 107 deletions

View File

@ -48,6 +48,15 @@ if (APPLE)
else()
# Minimum macOS 13
set(CMAKE_OSX_DEPLOYMENT_TARGET "13.4")
# Catch compiler issue on AppleClang versions below 15.0
# TODO: Remove this check when we drop macOS 13 Ventura
if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND
CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0)
message(FATAL_ERROR "AppleClang 15.0 or later is required due to a compiler bug in earlier versions.\n"
"Current version: ${CMAKE_CXX_COMPILER_VERSION}\n"
"After updating, delete 'CMakeCache.txt' in the build directory.")
endif()
endif()
endif()
@ -299,7 +308,7 @@ find_package(Threads REQUIRED)
if (ENABLE_QT)
if (NOT USE_SYSTEM_QT)
download_qt(6.7.2)
download_qt(6.9.2)
endif()
find_package(Qt6 REQUIRED COMPONENTS Widgets Multimedia Concurrent)

View File

@ -20,9 +20,9 @@ function(determine_qt_parameters target host_out type_out arch_out arch_path_out
set(arch_path "mingw_64")
elseif (MSVC)
if ("arm64" IN_LIST ARCHITECTURE)
set(arch_path "msvc2019_arm64")
set(arch_path "msvc2022_arm64")
elseif ("x86_64" IN_LIST ARCHITECTURE)
set(arch_path "msvc2019_64")
set(arch_path "msvc2022_64")
else()
message(FATAL_ERROR "Unsupported bundled Qt architecture. Enable USE_SYSTEM_QT and provide your own.")
endif()
@ -30,12 +30,13 @@ function(determine_qt_parameters target host_out type_out arch_out arch_path_out
# In case we're cross-compiling, prepare to also fetch the correct host Qt tools.
if (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "AMD64")
set(host_arch_path "msvc2019_64")
set(host_arch_path "msvc2022_64")
elseif (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "ARM64")
# TODO: msvc2019_arm64 doesn't include some of the required tools for some reason,
# TODO: so until it does, just use msvc2019_64 under x86_64 emulation.
# TODO: ^ Is this still true with msvc2022?
# set(host_arch_path "msvc2019_arm64")
set(host_arch_path "msvc2019_64")
set(host_arch_path "msvc2022_64")
endif()
set(host_arch "win64_${host_arch_path}")
else()
@ -105,7 +106,7 @@ function(download_qt_configuration prefix_out target host type arch arch_path ba
if (NOT EXISTS "${prefix}")
message(STATUS "Downloading Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path}")
set(AQT_PREBUILD_BASE_URL "https://github.com/miurahr/aqtinstall/releases/download/v3.1.18")
set(AQT_PREBUILD_BASE_URL "https://github.com/miurahr/aqtinstall/releases/download/v3.3.0")
if (WIN32)
set(aqt_path "${base_path}/aqt.exe")
if (NOT EXISTS "${aqt_path}")

View File

@ -75,6 +75,9 @@
<true/>
<key>NSHighResolutionCapable</key>
<string>True</string>
<key>UIDesignRequiresCompatibility</key>
<true/> <!-- Remove when Qt Liquid Glass issues are fixed upstream:
https://bugreports.qt.io/browse/QTBUG-138942 -->
<key>UIFileSharingEnabled</key>
<true/>
<key>UILaunchStoryboardName</key>

@ -1 +1 @@
Subproject commit 4f39041699412873d0afcec89a9313148a192647
Subproject commit a36decbe43d0e5a570ac3d3ba9a0b226dc832a17

View File

@ -27,7 +27,7 @@
<message>
<location filename="../../src/citra_qt/aboutdialog.ui" line="30"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/icons/default/256x256/azahar.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/icons/default/256x256/azahar.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../src/citra_qt/aboutdialog.ui" line="60"/>
@ -725,7 +725,7 @@ Desitja ignorar l&apos;error i continuar?</translation>
<message>
<location filename="../../src/citra_qt/configuration/configure_debug.ui" line="107"/>
<source>Show log output in console</source>
<translation type="unfinished"/>
<translation>Mostrar l&apos;eixida del registre en la consola</translation>
</message>
<message>
<location filename="../../src/citra_qt/configuration/configure_debug.ui" line="114"/>
@ -2275,7 +2275,7 @@ Desitja ignorar l&apos;error i continuar?</translation>
<message>
<location filename="../../src/citra_qt/configuration/configure_motion_touch.cpp" line="102"/>
<source>&lt;a href=&apos;https://web.archive.org/web/20240301211230/https://citra-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Learn More&lt;/span&gt;&lt;/a&gt;</source>
<translation type="unfinished"/>
<translation>&lt;a href=&apos;https://web.archive.org/web/20240301211230/https://citra-emu.org/wiki/using-a-controller-or-android-phone-for-motion-or-touch-input&apos;&gt;&lt;span style=&quot;text-decoration: underline; color:#039be5;&quot;&gt;Més Informació&lt;/span&gt;&lt;/a&gt;</translation>
</message>
<message>
<location filename="../../src/citra_qt/configuration/configure_motion_touch.cpp" line="209"/>
@ -2494,12 +2494,12 @@ Desitja ignorar l&apos;error i continuar?</translation>
<message>
<location filename="../../src/citra_qt/configuration/configure_storage.ui" line="187"/>
<source>Compress installed CIA content</source>
<translation type="unfinished"/>
<translation>Comprimir el contingut de CIAs instal·lats</translation>
</message>
<message>
<location filename="../../src/citra_qt/configuration/configure_storage.ui" line="190"/>
<source>Compresses the content of CIA files when installed to the emulated SD card. Only affects CIA content which is installed while the setting is enabled.</source>
<translation type="unfinished"/>
<translation>Comprimix el contingut de fitxers CIA quan són instal·lats a la SD emulada. Només afecta contingut CIA instal·lat amb esta opció activada.</translation>
</message>
<message>
<location filename="../../src/citra_qt/configuration/configure_storage.cpp" line="26"/>
@ -4431,7 +4431,7 @@ Vols reinstal·lar els arxius de totes maneres?</translation>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="2250"/>
<source>3DS Installation File (*.cia *.zcia)</source>
<translation type="unfinished"/>
<translation>Fitxers d&apos;Instalació de 3DS (*.cia *.zcia)</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="2250"/>
@ -4510,24 +4510,24 @@ Vols reinstal·lar els arxius de totes maneres?</translation>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3107"/>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3113"/>
<source>Error compressing file</source>
<translation type="unfinished"/>
<translation>Error al comprimir el fitxer</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="2339"/>
<source>File compress operation failed, check log for details.</source>
<translation type="unfinished"/>
<translation>Operació de compressió fallida, mira el registre per a més detalls.</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="2341"/>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3181"/>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3188"/>
<source>Error decompressing file</source>
<translation type="unfinished"/>
<translation>Error de descompressió del fitxer</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="2342"/>
<source>File decompress operation failed, check log for details.</source>
<translation type="unfinished"/>
<translation>Operació de descompressió fallida, mira el registre per a més detalls.</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="2364"/>
@ -4663,62 +4663,62 @@ Per a veure una guia sobre com instal·lar FFmpeg, polsa Ajuda.</translation>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3063"/>
<source>Load 3DS ROM File</source>
<translation type="unfinished"/>
<translation>Carregar ROM de 3DS</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3064"/>
<source>3DS ROM Files (*.cia *cci *3dsx *cxi)</source>
<translation type="unfinished"/>
<translation>Fitxers ROM 3DS (*.cia *cci *3dsx *cxi)</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3108"/>
<source>The selected file is not a compatible 3DS ROM format. Make sure you have chosen the right file, and that it is not encrypted.</source>
<translation type="unfinished"/>
<translation>El fitxer seleccionat no és un ROM de 3DS compatible. Assegura&apos;t que has triat el fitxer correcte i que no estiga xifrat.</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3114"/>
<source>The selected file is already compressed.</source>
<translation type="unfinished"/>
<translation>El fitxer seleccionat ja està comprimit.</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3119"/>
<source>3DS Compressed ROM File (*.%1)</source>
<translation type="unfinished"/>
<translation>Fitxer ROM 3DS comprimit (*.%1)</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3127"/>
<source>Save 3DS Compressed ROM File</source>
<translation type="unfinished"/>
<translation>Desar fitxer 3DS comprimit</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3152"/>
<source>Load 3DS Compressed ROM File</source>
<translation type="unfinished"/>
<translation>Carregar fitxer 3DS comprimit</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3153"/>
<source>3DS Compressed ROM Files (*.zcia *zcci *z3dsx *zcxi)</source>
<translation type="unfinished"/>
<translation>Fitxer ROM 3DS comprimit (*.zcia *zcci *z3dsx *zcxi)</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3182"/>
<source>The selected file is not a compatible compressed 3DS ROM format. Make sure you have chosen the right file.</source>
<translation type="unfinished"/>
<translation>El fitxer seleccionat no és un format de ROM 3DS comprimit compatible. Assegura&apos;t d&apos;haver triat l&apos;arxiu correcte.</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3189"/>
<source>The selected file is already decompressed.</source>
<translation type="unfinished"/>
<translation>El fitxer seleccionat ja està descomprimit.</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3194"/>
<source>3DS ROM File (*.%1)</source>
<translation type="unfinished"/>
<translation>Fitxer ROM 3DS (*.%1)</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3202"/>
<source>Save 3DS ROM File</source>
<translation type="unfinished"/>
<translation>Desar fitxer ROM 3DS</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3227"/>
@ -4818,7 +4818,7 @@ Per a veure una guia sobre com instal·lar FFmpeg, polsa Ajuda.</translation>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3431"/>
<source>Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms)</source>
<translation type="unfinished"/>
<translation>Frame: %1 ms (GPU: [CMD: %2 ms, SWP: %3 ms], IPC: %4 ms, SVC: %5 ms, Rem: %6 ms)</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3440"/>
@ -4839,7 +4839,7 @@ Per a veure una guia sobre com instal·lar FFmpeg, polsa Ajuda.</translation>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3600"/>
<source>%1 is missing. Please &lt;a href=&apos;https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/&apos;&gt;dump your system archives&lt;/a&gt;.&lt;br/&gt;Continuing emulation may result in crashes and bugs.</source>
<translation type="unfinished"/>
<translation>Falta %1 . Per favor,&lt;a href=&apos;https://web.archive.org/web/20240304201103/https://citra-emu.org/wiki/dumping-system-archives-and-the-shared-fonts-from-a-3ds-console/&apos;&gt;bolca els teus arxius de sistema&lt;/a&gt;.&lt;br/&gt;Continuar l&apos;emulació pot resultar en penges i errors.</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3608"/>
@ -4869,7 +4869,7 @@ Per a veure una guia sobre com instal·lar FFmpeg, polsa Ajuda.</translation>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3627"/>
<source>A fatal error occurred. &lt;a href=&apos;https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Check the log&lt;/a&gt; for details.&lt;br/&gt;Continuing emulation may result in crashes and bugs.</source>
<translation type="unfinished"/>
<translation>Error fatal.&lt;a href=&apos;https://web.archive.org/web/20240228001712/https://community.citra-emu.org/t/how-to-upload-the-log-file/296&apos;&gt;Mira el log&lt;/a&gt;per a més detalls.&lt;br/&gt;Continuar l&apos;emulació pot resultar en penges i errors.</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3632"/>
@ -6387,12 +6387,12 @@ Missatge de depuració:</translation>
<message>
<location filename="../../src/citra_qt/main.ui" line="466"/>
<source>Compress ROM File...</source>
<translation type="unfinished"/>
<translation>Comprimir fitxer ROM...</translation>
</message>
<message>
<location filename="../../src/citra_qt/main.ui" line="471"/>
<source>Decompress ROM File...</source>
<translation type="unfinished"/>
<translation>Descomprimir fitxer ROM...</translation>
</message>
<message>
<location filename="../../src/citra_qt/main.ui" line="479"/>

View File

@ -4517,7 +4517,7 @@ Reinstall the files anyway?</source>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="2339"/>
<source>File compress operation failed, check log for details.</source>
<translation>Operación de comprensión fallida, mira el registro para más detalles.</translation>
<translation>Operación de compresión fallida, mira el registro para más detalles.</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="2341"/>
@ -4529,7 +4529,7 @@ Reinstall the files anyway?</source>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="2342"/>
<source>File decompress operation failed, check log for details.</source>
<translation>Operación de descomprensión fallida, mira el registro para más detalles.</translation>
<translation>Operación de descompresión fallida, mira el registro para más detalles.</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="2364"/>

View File

@ -3894,7 +3894,7 @@ Drag points to change position, or double-click table cells to edit values.</sou
<message>
<location filename="../../src/citra_qt/configuration/configure_web.ui" line="26"/>
<source>Show current application in your Discord status</source>
<translation type="unfinished"></translation>
<translation>Показывать текущее приложение в статусе Discord</translation>
</message>
</context>
<context>
@ -4027,7 +4027,7 @@ Drag points to change position, or double-click table cells to edit values.</sou
<location filename="../../src/citra_qt/dumping/dumping_dialog.cpp" line="25"/>
<location filename="../../src/citra_qt/dumping/dumping_dialog.cpp" line="85"/>
<source>Azahar</source>
<translation type="unfinished">Azahar</translation>
<translation>Azahar</translation>
</message>
<message>
<location filename="../../src/citra_qt/dumping/dumping_dialog.cpp" line="25"/>
@ -4170,7 +4170,7 @@ Please check your FFmpeg installation used for compilation.</source>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="1299"/>
<source>GBA Virtual Console is not supported by Azahar.</source>
<translation type="unfinished"></translation>
<translation>Azahar не поддерживает GBA Virtual Console.</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="1304"/>
@ -4315,7 +4315,7 @@ Please check your FFmpeg installation used for compilation.</source>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3682"/>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3775"/>
<source>Azahar</source>
<translation type="unfinished">Azahar</translation>
<translation>Azahar</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="2066"/>
@ -4523,7 +4523,7 @@ Reinstall the files anyway?</source>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3181"/>
<location filename="../../src/citra_qt/citra_qt.cpp" line="3188"/>
<source>Error decompressing file</source>
<translation type="unfinished"></translation>
<translation>Ошибра при разжатии файла</translation>
</message>
<message>
<location filename="../../src/citra_qt/citra_qt.cpp" line="2342"/>
@ -5036,7 +5036,7 @@ Would you like to download it?</source>
<message>
<location filename="../../src/citra_qt/game_list.cpp" line="366"/>
<source>Don&apos;t show again</source>
<translation type="unfinished"></translation>
<translation>Не показывать снова</translation>
</message>
<message>
<location filename="../../src/citra_qt/game_list.cpp" line="564"/>
@ -7383,7 +7383,8 @@ They may have left the room.</source>
<source>Azahar has detected user data for Citra.
</source>
<translation type="unfinished"></translation>
<translation>Azahar обнаружил файлы пользователя Citra.
</translation>
</message>
<message>
<location filename="../../src/citra_qt/user_data_migration.cpp" line="77"/>

View File

@ -1,24 +1,37 @@
# Definitions for all external bundled libraries
# Suppress warnings from external libraries
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
if (MSVC)
add_compile_options(/W0)
else()
add_compile_options(-w)
endif()
function(target_disable_warnings target)
if (MSVC)
target_compile_options(${target} INTERFACE /W0)
else()
target_compile_options(${target} INTERFACE -w)
endif()
endfunction()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/CMakeModules)
include(DownloadExternals)
include(ExternalProject)
# Boost
if (NOT USE_SYSTEM_BOOST)
if (USE_SYSTEM_BOOST)
unset(BOOST_ROOT CACHE)
unset(Boost_INCLUDE_DIR CACHE)
set(Boost_NO_SYSTEM_PATHS OFF CACHE BOOL "" FORCE)
else()
message(STATUS "Including vendored Boost library")
set(BOOST_ROOT "${CMAKE_SOURCE_DIR}/externals/boost" CACHE STRING "")
set(Boost_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/externals/boost" CACHE STRING "")
set(Boost_NO_SYSTEM_PATHS ON CACHE BOOL "")
add_library(boost INTERFACE)
target_include_directories(boost SYSTEM INTERFACE ${Boost_INCLUDE_DIR})
target_include_directories(boost INTERFACE ${Boost_INCLUDE_DIR})
target_disable_warnings(boost)
# Boost::serialization
file(GLOB boost_serialization_SRC "${CMAKE_SOURCE_DIR}/externals/boost/libs/serialization/src/*.cpp")
@ -33,11 +46,7 @@ if (NOT USE_SYSTEM_BOOST)
${CMAKE_SOURCE_DIR}/externals/boost/libs/iostreams/src/mapped_file.cpp
)
target_link_libraries(boost_iostreams PUBLIC boost)
# Add additional boost libs here; remember to ALIAS them in the root CMakeLists!
else()
unset(BOOST_ROOT CACHE)
unset(Boost_INCLUDE_DIR CACHE)
set(Boost_NO_SYSTEM_PATHS OFF CACHE BOOL "" FORCE)
# Add additional boost libs here; remember to ALIAS them in the root CMakeLists!
endif()
# Catch2
@ -73,6 +82,7 @@ endif()
# dds-ktx
add_library(dds-ktx INTERFACE)
target_include_directories(dds-ktx INTERFACE ./dds-ktx)
target_disable_warnings(dds-ktx)
# fmt and Xbyak need to be added before dynarmic
# libfmt
@ -137,7 +147,8 @@ endif()
# MicroProfile
add_library(microprofile INTERFACE)
target_include_directories(microprofile SYSTEM INTERFACE ./microprofile)
target_include_directories(microprofile INTERFACE ./microprofile)
target_disable_warnings(microprofile)
if (ENABLE_MICROPROFILE)
target_compile_definitions(microprofile INTERFACE MICROPROFILE_ENABLED=1)
else()
@ -146,10 +157,11 @@ endif()
# Nihstro
add_library(nihstro-headers INTERFACE)
target_include_directories(nihstro-headers SYSTEM INTERFACE ./nihstro/include)
if (MSVC)
# TODO: For some reason MSVC still applies this warning even with /W0 for externals.
target_compile_options(nihstro-headers INTERFACE /wd4715)
target_include_directories(nihstro-headers INTERFACE ./nihstro/include)
target_disable_warnings(nihstro-headers)
if (NOT MSVC)
# TODO: For some reason MSYS2 still applied this warnin even with -w
target_compile_options(nihstro-headers INTERFACE -Wno-invalid-specialization)
endif()
# Open Source Archives
@ -173,7 +185,8 @@ if (USE_SYSTEM_FFMPEG_HEADERS)
endif()
if (NOT FOUND_FFMPEG_HEADERS)
message(STATUS "Using bundled ffmpeg headers.")
target_include_directories(library-headers SYSTEM INTERFACE ./library-headers/ffmpeg/include)
target_include_directories(library-headers INTERFACE ./library-headers/ffmpeg/include)
target_disable_warnings(library-headers)
endif()
# SoundTouch
@ -294,7 +307,8 @@ if (USE_SYSTEM_JSON)
# Citra uses "#include <json.hpp>" so we have to add this manually
target_include_directories(json-headers SYSTEM INTERFACE "${NLOHMANN_PREFIX}/nlohmann")
else()
target_include_directories(json-headers SYSTEM INTERFACE ./json)
target_include_directories(json-headers INTERFACE ./json)
target_disable_warnings(json-headers)
endif()
# OpenSSL
@ -310,7 +324,8 @@ if (NOT OPENSSL_FOUND)
set(LIBRESSL_SKIP_INSTALL ON CACHE BOOL "")
set(OPENSSLDIR "/etc/ssl/")
add_subdirectory(libressl EXCLUDE_FROM_ALL)
target_include_directories(ssl SYSTEM INTERFACE ./libressl/include)
target_include_directories(ssl INTERFACE ./libressl/include)
target_disable_warnings(ssl)
target_compile_definitions(ssl PRIVATE -DHAVE_INET_NTOP)
get_directory_property(OPENSSL_LIBRARIES
DIRECTORY libressl
@ -327,17 +342,20 @@ if(USE_SYSTEM_CPP_HTTPLIB)
get_target_property(HTTP_LIBS httplib::httplib INTERFACE_LINK_LIBRARIES)
if(HTTP_LIBS)
message(WARNING "Shared cpp-http (${HTTP_LIBS}) not supported. Falling back to bundled...")
target_include_directories(httplib SYSTEM INTERFACE ./httplib)
target_include_directories(httplib INTERFACE ./httplib)
target_disable_warnings(httplib)
else()
if(CppHttp_FOUND)
target_link_libraries(httplib INTERFACE httplib::httplib)
else()
message(STATUS "Cpp-httplib not found or not suitable version! Falling back to bundled...")
target_include_directories(httplib SYSTEM INTERFACE ./httplib)
target_include_directories(httplib INTERFACE ./httplib)
target_disable_warnings(httplib)
endif()
endif()
else()
target_include_directories(httplib SYSTEM INTERFACE ./httplib)
target_include_directories(httplib INTERFACE ./httplib)
target_disable_warnings(httplib)
endif()
target_compile_options(httplib INTERFACE -DCPPHTTPLIB_OPENSSL_SUPPORT)
target_link_libraries(httplib INTERFACE ${OPENSSL_LIBRARIES})
@ -354,7 +372,8 @@ if (ENABLE_WEB_SERVICE)
target_link_libraries(cpp-jwt INTERFACE cpp-jwt::cpp-jwt)
else()
add_library(cpp-jwt INTERFACE)
target_include_directories(cpp-jwt SYSTEM INTERFACE ./cpp-jwt/include)
target_include_directories(cpp-jwt INTERFACE ./cpp-jwt/include)
target_disable_warnings(cpp-jwt)
target_compile_definitions(cpp-jwt INTERFACE CPP_JWT_USE_VENDORED_NLOHMANN_JSON)
endif()
endif()
@ -453,7 +472,8 @@ if (ENABLE_VULKAN)
endif()
else()
add_library(vma INTERFACE)
target_include_directories(vma SYSTEM INTERFACE ./vma/include)
target_include_directories(vma INTERFACE ./vma/include)
target_disable_warnings(vma)
endif()
# vulkan-headers
@ -465,7 +485,8 @@ if (ENABLE_VULKAN)
target_link_libraries(vulkan-headers INTERFACE Vulkan::Headers)
endif()
else()
target_include_directories(vulkan-headers SYSTEM INTERFACE ./vulkan-headers/include)
target_include_directories(vulkan-headers INTERFACE ./vulkan-headers/include)
target_disable_warnings(vulkan-headers)
endif()
# adrenotools

View File

@ -186,7 +186,7 @@ dependencies {
// Download Vulkan Validation Layers from the KhronosGroup GitHub.
val downloadVulkanValidationLayers = tasks.register<Download>("downloadVulkanValidationLayers") {
src("https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/download/vulkan-sdk-1.4.304.1/android-binaries-1.4.304.1.zip")
src("https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/download/vulkan-sdk-1.4.313.0/android-binaries-1.4.313.0.zip")
dest(file("${layout.buildDirectory.get().asFile.path}/tmp/Vulkan-ValidationLayers.zip"))
onlyIfModified(true)
}

View File

@ -60,7 +60,15 @@ class EmulationActivity : AppCompatActivity() {
private lateinit var binding: ActivityEmulationBinding
private lateinit var screenAdjustmentUtil: ScreenAdjustmentUtil
private lateinit var hotkeyUtility: HotkeyUtility
private lateinit var secondaryDisplay: SecondaryDisplay;
private lateinit var secondaryDisplay: SecondaryDisplay
private val onShutdown = Runnable {
if (intent.getBooleanExtra("launched_from_shortcut", false)) {
finishAffinity()
} else {
this.finish()
}
}
private val emulationFragment: EmulationFragment
get() {
@ -77,8 +85,8 @@ class EmulationActivity : AppCompatActivity() {
ThemeUtil.setTheme(this)
settingsViewModel.settings.loadSettings()
super.onCreate(savedInstanceState)
secondaryDisplay = SecondaryDisplay(this);
secondaryDisplay.updateDisplay();
secondaryDisplay = SecondaryDisplay(this)
secondaryDisplay.updateDisplay()
binding = ActivityEmulationBinding.inflate(layoutInflater)
screenAdjustmentUtil = ScreenAdjustmentUtil(this, windowManager, settingsViewModel.settings)
@ -101,13 +109,7 @@ class EmulationActivity : AppCompatActivity() {
windowManager.defaultDisplay.rotation
)
EmulationLifecycleUtil.addShutdownHook(hook = {
if (intent.getBooleanExtra("launched_from_shortcut", false)) {
finishAffinity()
} else {
this.finish()
}
})
EmulationLifecycleUtil.addShutdownHook(onShutdown)
isEmulationRunning = true
instance = this
@ -165,12 +167,12 @@ class EmulationActivity : AppCompatActivity() {
}
override fun onDestroy() {
EmulationLifecycleUtil.clear()
EmulationLifecycleUtil.removeHook(onShutdown)
NativeLibrary.playTimeManagerStop()
isEmulationRunning = false
instance = null
secondaryDisplay.releasePresentation()
secondaryDisplay.releaseVD();
secondaryDisplay.releaseVD()
super.onDestroy()
}

View File

@ -23,15 +23,12 @@ class SecondaryDisplay(val context: Context) {
private val vd: VirtualDisplay
init {
val st = SurfaceTexture(0)
st.setDefaultBufferSize(1920, 1080)
val vdSurface = Surface(st)
vd = displayManager.createVirtualDisplay(
"HiddenDisplay",
1920,
1080,
320,
vdSurface,
null,
DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION
)
}

View File

@ -1,4 +1,4 @@
// Copyright Citra Emulator Project / Lime3DS Emulator Project
// Copyright Citra Emulator Project / Azahar Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
@ -10,7 +10,6 @@ import org.citra.citra_emu.features.settings.model.AbstractSetting
import org.citra.citra_emu.features.settings.model.FloatSetting
import org.citra.citra_emu.features.settings.model.ScaledFloatSetting
import org.citra.citra_emu.utils.Log
import kotlin.math.roundToInt
class SliderSetting(
setting: AbstractSetting?,
@ -27,7 +26,8 @@ class SliderSetting(
val selectedFloat: Float
get() {
val setting = setting ?: return defaultValue!!.toFloat()
return when (setting) {
val ret = when (setting) {
is AbstractIntSetting -> setting.int.toFloat()
is FloatSetting -> setting.float
is ScaledFloatSetting -> setting.float
@ -36,8 +36,8 @@ class SliderSetting(
-1f
}
}
return ret.coerceIn(min.toFloat(), max.toFloat())
}
/**
* Write a value to the backing int. If that int was previously null,
* initializes a new one and returns it, so it can be added to the Hashmap.

View File

@ -101,6 +101,9 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
private val emulationViewModel: EmulationViewModel by activityViewModels()
private val settingsViewModel: SettingsViewModel by viewModels()
private val onPause = Runnable{ togglePause() }
private val onShutdown = Runnable{ emulationState.stop() }
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is EmulationActivity) {
@ -156,8 +159,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
emulationState = EmulationState(game.path)
emulationActivity = requireActivity() as EmulationActivity
screenAdjustmentUtil = ScreenAdjustmentUtil(requireContext(), requireActivity().windowManager, settingsViewModel.settings)
EmulationLifecycleUtil.addShutdownHook(hook = { emulationState.stop() })
EmulationLifecycleUtil.addPauseResumeHook(hook = { togglePause() })
EmulationLifecycleUtil.addPauseResumeHook(onPause)
EmulationLifecycleUtil.addShutdownHook(onShutdown)
}
override fun onCreateView(
@ -507,6 +510,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
super.onDetach()
}
override fun onDestroy() {
EmulationLifecycleUtil.removeHook(onPause)
EmulationLifecycleUtil.removeHook(onShutdown)
super.onDestroy()
}
private fun setupCitraDirectoriesThenStartEmulation() {
val directoryInitializationState = DirectoryInitialization.start()
if (directoryInitializationState ===

View File

@ -1,4 +1,4 @@
// Copyright 2023 Citra Emulator Project
// Copyright Citra Emulator Project / Azahar Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
@ -18,15 +18,27 @@ object EmulationLifecycleUtil {
}
fun addShutdownHook(hook: Runnable) {
if (shutdownHooks.contains(hook)) {
Log.warning("[EmulationLifecycleUtil] Tried to add shutdown hook for function that already existed. Skipping.")
} else {
shutdownHooks.add(hook)
}
}
fun addPauseResumeHook(hook: Runnable) {
if (pauseResumeHooks.contains(hook)) {
Log.warning("[EmulationLifecycleUtil] Tried to add pause resume hook for function that already existed. Skipping.")
} else {
pauseResumeHooks.add(hook)
}
}
fun clear() {
pauseResumeHooks.clear()
shutdownHooks.clear()
fun removeHook(hook: Runnable) {
if (pauseResumeHooks.contains(hook)) {
pauseResumeHooks.remove(hook)
}
if (shutdownHooks.contains(hook)) {
shutdownHooks.remove(hook)
}
}
}

View File

@ -193,6 +193,10 @@
<string name="region_mismatch">Advertiment Regió No Vàlida</string>
<string name="region_mismatch_emulated">La configuració del país no és vàlida per a la regió emulada seleccionada.</string>
<string name="region_mismatch_console">La configuració del país no és vàlida per a la consola vinculada actual.</string>
<string name="storage">Emmagatzematge</string>
<string name="compress_cia_installs">Comprimir el contingut de CIAs instal·lats</string>
<string name="compress_cia_installs_description">Comprimix el contingut de fitxers CIA quan són instal·lats a la SD emulada. Només afecta contingut CIA instal·lat amb esta opció activada.</string>
<!-- Camera settings strings -->
<string name="inner_camera">Càmera interior</string>
<string name="outer_left_camera">Càmera esquerra externa</string>
@ -397,6 +401,10 @@ S\'esperen errors gràfics temporals quan estigue activat.</string>
<string name="emulation_configure_controls">Configurar Controls</string>
<string name="emulation_edit_layout">Editar Estil</string>
<string name="emulation_done">Fet</string>
<string name="emulation_button_sliding">Lliscament de botons</string>
<string name="emulation_button_sliding_disabled">Mantindre el botó pressionat originalment</string>
<string name="emulation_button_sliding_enabled">Mantindre el botó pressionat actualment</string>
<string name="emulation_button_sliding_alternative">Mantindre el botó original i actualment pressionat</string>
<string name="emulation_toggle_controls">Activar Controls</string>
<string name="emulation_control_scale">Ajustar Escala</string>
<string name="emulation_control_scale_global">Escala Global</string>
@ -409,6 +417,8 @@ S\'esperen errors gràfics temporals quan estigue activat.</string>
<string name="emulation_aspect_ratio">Relació d\'Aspecte</string>
<string name="emulation_switch_screen_layout">Estil de Pantalla Apaïsada</string>
<string name="emulation_switch_portrait_layout">Estil de Pantalla de Perfil</string>
<string name="emulation_switch_secondary_layout">Estil de Pantalla Secundària</string>
<string name="emulation_switch_secondary_layout_description">La disposició de la pantalla secundària connectada, amb cable o sense fil (Chromecast, Miracast)</string>
<string name="emulation_screen_layout_largescreen">Pantalla amplia</string>
<string name="emulation_screen_layout_portrait">Vertical</string>
<string name="emulation_screen_layout_single">Pantalla Única</string>
@ -416,6 +426,7 @@ S\'esperen errors gràfics temporals quan estigue activat.</string>
<string name="emulation_screen_layout_hybrid">Pantalles híbrides</string>
<string name="emulation_screen_layout_original">Original</string>
<string name="emulation_portrait_layout_top_full">Per omissió</string>
<string name="emulation_secondary_display_default">Per defecte del sistema (espill)</string>
<string name="emulation_screen_layout_custom">Estil Personalitzat</string>
<string name="emulation_small_screen_position">Posició de Pantalla Xicoteta</string>
<string name="small_screen_position_description">On hauria d\'aparéixer la pantalla xicoteta en relació amb la gran en Proporció de Pantalla Gran?</string>
@ -536,6 +547,10 @@ S\'esperen errors gràfics temporals quan estigue activat.</string>
<string name="create_shortcut">Crear drecera</string>
<string name="shortcut_name_empty">El nom de la drecera no pot estar buit</string>
<string name="shortcut_image_stretch_toggle">Allargar per a ajustar la imatge</string>
<string name="game_context_id">ID:</string>
<string name="game_context_file">Fitxer:</string>
<string name="game_context_type">Tipus:</string>
<!-- Performance Overlay settings -->
<string name="performance_overlay_show">Mostrar informació de rendiment</string>
<string name="performance_overlay_options">Informació de rendiment</string>

View File

@ -194,7 +194,7 @@
<string name="region_mismatch_emulated">La configuración del país no es válida para la región emulada seleccionada.</string>
<string name="region_mismatch_console">La configuración del país no es válida para la consola vinculada actual.</string>
<string name="storage">Almacenamiento</string>
<string name="compress_cia_installs">Comprimir el contenido CIA instalado</string>
<string name="compress_cia_installs">Comprimir el contenido de CIAs instalados</string>
<string name="compress_cia_installs_description">Comprime el contenido de archivos CIA cuando son instalados a la SD emulada. Solo afecta contenido CIA instalado con esta opción activada.</string>
<!-- Camera settings strings -->
@ -402,9 +402,9 @@ Se esperan fallos gráficos temporales cuando ésta esté activado.</string>
<string name="emulation_edit_layout">Editar Estilo</string>
<string name="emulation_done">Hecho</string>
<string name="emulation_button_sliding">Deslizamiento de botones</string>
<string name="emulation_button_sliding_disabled">Mantenga el botón presionado originalmente</string>
<string name="emulation_button_sliding_enabled">Mantenga el botón presionado actualmente</string>
<string name="emulation_button_sliding_alternative">Mantenga el botón original y actualmente presionado</string>
<string name="emulation_button_sliding_disabled">Mantener el botón presionado originalmente</string>
<string name="emulation_button_sliding_enabled">Mantener el botón presionado actualmente</string>
<string name="emulation_button_sliding_alternative">Mantener el botón original y actualmente presionado</string>
<string name="emulation_toggle_controls">Activar Controles</string>
<string name="emulation_control_scale">Ajustar Escala</string>
<string name="emulation_control_scale_global">Escala Global</string>
@ -417,6 +417,8 @@ Se esperan fallos gráficos temporales cuando ésta esté activado.</string>
<string name="emulation_aspect_ratio">Relación de Aspecto</string>
<string name="emulation_switch_screen_layout">Estilo de Pantalla Apaisada</string>
<string name="emulation_switch_portrait_layout">Estilo de Pantalla de Perfil</string>
<string name="emulation_switch_secondary_layout">Estilo de Pantalla Secundaria</string>
<string name="emulation_switch_secondary_layout_description">El estilo de la pantalla secundaria conectada, con cable o inalámbrica (Chromecast, Miracast)</string>
<string name="emulation_screen_layout_largescreen">Pantalla amplia</string>
<string name="emulation_screen_layout_portrait">Retrato</string>
<string name="emulation_screen_layout_single">Pantalla Única</string>
@ -424,6 +426,7 @@ Se esperan fallos gráficos temporales cuando ésta esté activado.</string>
<string name="emulation_screen_layout_hybrid">Pantallas híbridas</string>
<string name="emulation_screen_layout_original">Original</string>
<string name="emulation_portrait_layout_top_full">Por defecto</string>
<string name="emulation_secondary_display_default">Por defecto del sistema (espejo)</string>
<string name="emulation_screen_layout_custom">Estilo personalizado</string>
<string name="emulation_small_screen_position">Posición Pantalla Pequeña</string>
<string name="small_screen_position_description">¿Dónde debería aparecer la pantalla pequeña en relación con la grande en Disposicion de Pantalla Grande?</string>

View File

@ -417,6 +417,7 @@
<string name="emulation_switch_screen_layout">Geometryczny Układ Ekranu</string>
<string name="emulation_switch_portrait_layout">Pionowy Układ Ekranu</string>
<string name="emulation_switch_secondary_layout">Układ ekranu wyświetlacza dodatkowego</string>
<string name="emulation_switch_secondary_layout_description">Układ używany przez podłączony dodatkowy ekran, przewodowy lub bezprzewodowy (Chromecast, Miracast)</string>
<string name="emulation_screen_layout_largescreen">Duży Ekran</string>
<string name="emulation_screen_layout_portrait">Ekran</string>
<string name="emulation_screen_layout_single">Pojedynczy ekran</string>
@ -424,6 +425,7 @@
<string name="emulation_screen_layout_hybrid">Hybrydowy Ekran</string>
<string name="emulation_screen_layout_original">Oryginalny</string>
<string name="emulation_portrait_layout_top_full">Domyślny</string>
<string name="emulation_secondary_display_default">Ustawienia domyślne systemu (mirror)</string>
<string name="emulation_screen_layout_custom">Niestandardowy Układ</string>
<string name="emulation_small_screen_position">Pozycja małego ekranu</string>
<string name="small_screen_position_description">Gdzie powinien być wyświetlany mały ekran względem dużego w układzie dużego ekranu?</string>

View File

@ -60,6 +60,10 @@ if (ENABLE_QT AND UNIX AND NOT APPLE)
target_link_libraries(citra_meta PRIVATE Qt6::DBus gamemode)
endif()
if (ENABLE_QT AND APPLE)
target_link_libraries(citra_meta PRIVATE Qt6::GuiPrivate)
endif()
if (ENABLE_QT AND USE_DISCORD_PRESENCE)
target_link_libraries(citra_meta PRIVATE discord-rpc)
endif()

View File

@ -172,12 +172,12 @@ add_library(citra_qt STATIC EXCLUDE_FROM_ALL
multiplayer/state.h
multiplayer/validation.h
precompiled_headers.h
qt_image_interface.cpp
qt_image_interface.h
uisettings.cpp
uisettings.h
user_data_migration.cpp
user_data_migration.h
qt_image_interface.cpp
qt_image_interface.h
util/clickable_label.cpp
util/clickable_label.h
util/graphics_device_info.cpp
@ -190,6 +190,13 @@ add_library(citra_qt STATIC EXCLUDE_FROM_ALL
util/util.h
)
if (APPLE)
target_sources(citra_qt PUBLIC
qt_swizzle.h
qt_swizzle.mm
)
endif()
file(GLOB COMPAT_LIST
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json)
@ -275,6 +282,10 @@ if (NOT WIN32)
target_include_directories(citra_qt PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS})
endif()
if (APPLE)
target_link_libraries(citra_qt PRIVATE Qt6::GuiPrivate)
endif()
if (UNIX AND NOT APPLE)
target_link_libraries(citra_qt PRIVATE Qt6::DBus gamemode)
endif()

View File

@ -69,6 +69,7 @@
#include "citra_qt/movie/movie_record_dialog.h"
#include "citra_qt/multiplayer/state.h"
#include "citra_qt/qt_image_interface.h"
#include "citra_qt/qt_swizzle.h"
#include "citra_qt/uisettings.h"
#include "common/play_time_manager.h"
#ifdef ENABLE_QT_UPDATE_CHECKER
@ -4112,6 +4113,11 @@ static Qt::HighDpiScaleFactorRoundingPolicy GetHighDpiRoundingPolicy() {
}
void LaunchQtFrontend(int argc, char* argv[]) {
#ifdef __APPLE__
// Ensure that the linker doesn't optimize qt_swizzle.mm out of existence.
QtSwizzle::Dummy();
#endif
Common::DetachedTasks detached_tasks;
#if MICROPROFILE_ENABLED

View File

@ -0,0 +1,9 @@
// Copyright Citra Emulator Project / Azahar Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
namespace QtSwizzle {
void Dummy();
} // namespace QtSwizzle

View File

@ -0,0 +1,48 @@
// Copyright Citra Emulator Project / Azahar Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#import <QtGui/private/qmetallayer_p.h>
#import <objc/runtime.h>
namespace QtSwizzle {
void Dummy() {
// Call this anywhere to make sure that qt_swizzle.mm is linked.
// noop
}
} // namespace QtSwizzle
@implementation QMetalLayer (AzaharPatch)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class targetClass = [self class];
// Get the original and swizzled methods
Method originalMethod =
class_getInstanceMethod(targetClass, @selector(setNeedsDisplayInRect:));
Method swizzledMethod =
class_getInstanceMethod(targetClass, @selector(swizzled_setNeedsDisplayInRect:));
// Swap the implementations
method_exchangeImplementations(originalMethod, swizzledMethod);
});
}
- (void)swizzled_setNeedsDisplayInRect:(CGRect)rect {
constexpr auto tooBig = 1e10; // Arbitrary large number
// Check for problematic huge rectangles
if ((!self.needsDisplay) && (rect.size.width > tooBig || rect.size.height > tooBig ||
rect.origin.x < -tooBig || rect.origin.y < -tooBig)) {
return;
}
// Call the original implementation
[self swizzled_setNeedsDisplayInRect:rect];
}
@end

View File

@ -864,8 +864,10 @@ bool CIAFile::Close() {
if (!complete) {
LOG_ERROR(Service_AM, "CIAFile closed prematurely, aborting install...");
if (!is_additional_content) {
FileUtil::DeleteDirRecursively(
GetTitlePath(media_type, container.GetTitleMetadata().GetTitleID()));
// Only delete the content folder as there may be user save data in the title folder.
const std::string title_content_path =
GetTitlePath(media_type, container.GetTitleMetadata().GetTitleID()) + "content/";
FileUtil::DeleteDirRecursively(title_content_path);
}
return true;
}

View File

@ -556,12 +556,15 @@ bool PipelineCache::EnsureDirectories() const {
};
return create_dir(FileUtil::GetUserPath(FileUtil::UserPath::ShaderDir)) &&
create_dir(GetPipelineCacheDir());
create_dir(GetVulkanDir()) && create_dir(GetPipelineCacheDir());
}
std::string PipelineCache::GetVulkanDir() const {
return FileUtil::GetUserPath(FileUtil::UserPath::ShaderDir) + "vulkan" + DIR_SEP;
}
std::string PipelineCache::GetPipelineCacheDir() const {
return FileUtil::GetUserPath(FileUtil::UserPath::ShaderDir) + "vulkan" + DIR_SEP + "pipeline" +
DIR_SEP;
return GetVulkanDir() + "pipeline" + DIR_SEP;
}
void PipelineCache::SwitchPipelineCache(u64 title_id, const std::atomic_bool& stop_loading,

View File

@ -108,6 +108,9 @@ private:
/// Create pipeline cache directories. Returns true on success.
bool EnsureDirectories() const;
/// Returns the Vulkan shader directory
std::string GetVulkanDir() const;
/// Returns the pipeline cache storage dir
std::string GetPipelineCacheDir() const;

View File

@ -7,7 +7,7 @@ The scripts in this directory assume that your current working directory is the
## Pre-release checklist
- [ ] Update compatibility list
- [ ] Update translations
- [ ] If this is a major release (2123.1 -> major.minor), update translations
### Note:

6
tools/purge-github-cache.sh Executable file
View File

@ -0,0 +1,6 @@
#!/bin/bash -ex
# This script assumes that the Github CLI is installed and that
# the authenticated user has appropriate authorization.
gh cache delete --all