diff --git a/CMakeLists.txt b/CMakeLists.txt
index 82d99ca7b..12eae712f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -15,24 +15,35 @@ project(citra LANGUAGES C CXX ASM)
if (APPLE)
enable_language(OBJC)
+ if (IOS)
+ # Enable searching CMAKE_PREFIX_PATH for bundled dependencies.
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
+ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
+ endif()
endif()
option(ENABLE_LTO "Enable link time optimization" OFF)
-option(ENABLE_SDL2 "Enable the SDL2 frontend" ON)
+option(ENABLE_SDL2 "Enable using SDL2" ON)
+CMAKE_DEPENDENT_OPTION(ENABLE_SDL2_FRONTEND "Enable the SDL2 frontend" ON "ENABLE_SDL2;NOT ANDROID AND NOT IOS" OFF)
option(USE_SYSTEM_SDL2 "Use the system SDL2 lib (instead of the bundled one)" OFF)
# Set bundled qt as dependent options.
option(ENABLE_QT "Enable the Qt frontend" ON)
option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF)
+CMAKE_DEPENDENT_OPTION(ENABLE_QT_UPDATER "Enable built-in updater for the Qt frontend" ON "NOT IOS" OFF)
CMAKE_DEPENDENT_OPTION(CITRA_USE_BUNDLED_QT "Download bundled Qt binaries" ON "ENABLE_QT;MSVC OR APPLE" OFF)
+CMAKE_DEPENDENT_OPTION(ENABLE_TESTS "Enable generating tests executable" ON "NOT IOS" OFF)
+CMAKE_DEPENDENT_OPTION(ENABLE_DEDICATED_ROOM "Enable generating dedicated room executable" ON "NOT ANDROID AND NOT IOS" OFF)
+
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
if (MSVC)
set(OPENSSL_DLL_DIR "" CACHE PATH "Location of the Openssl dlls")
endif()
-option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
+CMAKE_DEPENDENT_OPTION(ENABLE_CUBEB "Enables the cubeb audio backend" ON "NOT IOS" OFF)
option(ENABLE_OPENAL "Enables the OpenAL audio backend" ON)
CMAKE_DEPENDENT_OPTION(ENABLE_LIBUSB "Enable libusb for GameCube Adapter support" ON "NOT IOS" OFF)
@@ -205,8 +216,7 @@ find_package(Threads REQUIRED)
if (ENABLE_QT)
if (CITRA_USE_BUNDLED_QT)
- download_qt_external(6.5.0 QT_PREFIX)
- list(APPEND CMAKE_PREFIX_PATH ${QT_PREFIX})
+ download_qt_external(6.5.0)
endif()
find_package(Qt6 REQUIRED COMPONENTS Widgets Multimedia Concurrent)
@@ -290,10 +300,14 @@ if (APPLE)
find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED)
message(STATUS "Using MoltenVK at ${MOLTENVK_LIBRARY}.")
- # Umbrella framework for everything GUI-related
- find_library(COCOA_LIBRARY Cocoa REQUIRED)
+ if (NOT IOS)
+ # Umbrella framework for everything GUI-related
+ find_library(COCOA_LIBRARY Cocoa REQUIRED)
+ endif()
+
find_library(AVFOUNDATION_LIBRARY AVFoundation REQUIRED)
- set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${AVFOUNDATION_LIBRARY} ${MOLTENVK_LIBRARY})
+ find_library(IOSURFACE_LIBRARY IOSurface REQUIRED)
+ set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${AVFOUNDATION_LIBRARY} ${IOSURFACE_LIBRARY} ${MOLTENVK_LIBRARY})
elseif (WIN32)
set(PLATFORM_LIBRARIES winmm ws2_32)
if (MINGW)
diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake
index 99bce5aeb..ec9a524a7 100644
--- a/CMakeModules/DownloadExternals.cmake
+++ b/CMakeModules/DownloadExternals.cmake
@@ -36,10 +36,11 @@ endfunction()
# Params:
# target: Qt dependency to install. Specify a version number to download Qt, or "tools_(name)" for a specific build tool.
# prefix_var: Name of a variable which will be set with the path to the extracted contents.
-function(download_qt_external target prefix_var)
+function(download_qt_external target)
# Determine installation parameters for OS, architecture, and compiler
if (WIN32)
set(host "windows")
+ set(type "desktop")
if (MINGW)
set(arch_path "mingw81")
elseif ((MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1940) AND "x86_64" IN_LIST ARCHITECTURE)
@@ -56,10 +57,19 @@ function(download_qt_external target prefix_var)
set(arch "win64_${arch_path}")
elseif (APPLE)
set(host "mac")
- set(arch "clang_64")
- set(arch_path "macos")
+ if (IOS)
+ set(type "ios")
+ set(arch "ios")
+ set(arch_path "ios")
+ set(host_arch_path "macos")
+ else()
+ set(type "desktop")
+ set(arch "clang_64")
+ set(arch_path "macos")
+ endif()
else()
set(host "linux")
+ set(type "desktop")
set(arch "gcc_64")
set(arch_path "linux")
endif()
@@ -72,7 +82,11 @@ function(download_qt_external target prefix_var)
set(install_args install-tool --outputdir ${base_path} ${host} desktop ${target})
else()
set(prefix "${base_path}/${target}/${arch_path}")
- set(install_args install-qt --outputdir ${base_path} ${host} desktop ${target} ${arch} -m qtmultimedia)
+ if (host_arch_path)
+ set(host_flag "--autodesktop")
+ set(host_prefix "${base_path}/${target}/${host_arch_path}")
+ endif()
+ set(install_args install-qt --outputdir ${base_path} ${host} ${type} ${target} ${arch} ${host_flag} -m qtmultimedia)
endif()
if (NOT EXISTS "${prefix}")
@@ -97,7 +111,15 @@ function(download_qt_external target prefix_var)
endif()
message(STATUS "Using downloaded Qt binaries at ${prefix}")
- set(${prefix_var} "${prefix}" PARENT_SCOPE)
+
+ # Add the Qt prefix path so CMake can locate it.
+ list(APPEND CMAKE_PREFIX_PATH "${prefix}")
+ set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
+
+ if (DEFINED host_prefix)
+ message(STATUS "Using downloaded host Qt binaries at ${host_prefix}")
+ set(QT_HOST_PATH "${host_prefix}" CACHE STRING "")
+ endif()
endfunction()
function(download_moltenvk)
diff --git a/CMakeModules/GenerateBuildInfo.cmake b/CMakeModules/GenerateBuildInfo.cmake
new file mode 100644
index 000000000..4ef472598
--- /dev/null
+++ b/CMakeModules/GenerateBuildInfo.cmake
@@ -0,0 +1,54 @@
+# Gets a UTC timstamp and sets the provided variable to it
+function(get_timestamp _var)
+ string(TIMESTAMP timestamp UTC)
+ set(${_var} "${timestamp}" PARENT_SCOPE)
+endfunction()
+
+list(APPEND CMAKE_MODULE_PATH "${SRC_DIR}/externals/cmake-modules")
+
+# Find the package here with the known path so that the GetGit commands can find it as well
+find_package(Git QUIET PATHS "${GIT_EXECUTABLE}")
+
+# generate git/build information
+include(GetGitRevisionDescription)
+get_git_head_revision(GIT_REF_SPEC GIT_REV)
+string(SUBSTRING "${GIT_REV}" 0 7 GIT_SHORT_REV)
+git_describe(GIT_DESC --always --long --dirty)
+git_branch_name(GIT_BRANCH)
+get_timestamp(BUILD_DATE)
+
+# Generate cpp with Git revision from template
+# Also if this is a CI build, add the build name (ie: Nightly, Canary) to the scm_rev file as well
+set(REPO_NAME "")
+set(BUILD_VERSION "0")
+set(BUILD_FULLNAME "${GIT_SHORT_REV}")
+if (DEFINED ENV{CI})
+ if (DEFINED ENV{GITHUB_ACTIONS})
+ set(BUILD_REPOSITORY $ENV{GITHUB_REPOSITORY})
+ set(BUILD_TAG $ENV{GITHUB_REF_NAME})
+ endif()
+
+ # regex capture the string nightly or canary into CMAKE_MATCH_1
+ string(REGEX MATCH "citra-emu/citra-?(.*)" OUTVAR ${BUILD_REPOSITORY})
+ if ("${CMAKE_MATCH_COUNT}" GREATER 0)
+ # capitalize the first letter of each word in the repo name.
+ string(REPLACE "-" ";" REPO_NAME_LIST ${CMAKE_MATCH_1})
+ foreach(WORD ${REPO_NAME_LIST})
+ string(SUBSTRING ${WORD} 0 1 FIRST_LETTER)
+ string(SUBSTRING ${WORD} 1 -1 REMAINDER)
+ string(TOUPPER ${FIRST_LETTER} FIRST_LETTER)
+ set(REPO_NAME "${REPO_NAME}${FIRST_LETTER}${REMAINDER}")
+ endforeach()
+ string(REGEX MATCH "${CMAKE_MATCH_1}-([0-9]+)" OUTVAR ${BUILD_TAG})
+ if (${CMAKE_MATCH_COUNT} GREATER 0)
+ set(BUILD_VERSION ${CMAKE_MATCH_1})
+ endif()
+ if (BUILD_VERSION)
+ # This leaves a trailing space on the last word, but we actually want that
+ # because of how it's styled in the title bar.
+ set(BUILD_FULLNAME "${REPO_NAME} ${BUILD_VERSION} ")
+ else()
+ set(BUILD_FULLNAME "")
+ endif()
+ endif()
+endif()
diff --git a/CMakeModules/GenerateSCMRev.cmake b/CMakeModules/GenerateSCMRev.cmake
index 2dc409881..f0c8e7da6 100644
--- a/CMakeModules/GenerateSCMRev.cmake
+++ b/CMakeModules/GenerateSCMRev.cmake
@@ -1,55 +1,5 @@
-# Gets a UTC timstamp and sets the provided variable to it
-function(get_timestamp _var)
- string(TIMESTAMP timestamp UTC)
- set(${_var} "${timestamp}" PARENT_SCOPE)
-endfunction()
-
-list(APPEND CMAKE_MODULE_PATH "${SRC_DIR}/externals/cmake-modules")
-
-# Find the package here with the known path so that the GetGit commands can find it as well
-find_package(Git QUIET PATHS "${GIT_EXECUTABLE}")
-
-# generate git/build information
-include(GetGitRevisionDescription)
-get_git_head_revision(GIT_REF_SPEC GIT_REV)
-git_describe(GIT_DESC --always --long --dirty)
-git_branch_name(GIT_BRANCH)
-get_timestamp(BUILD_DATE)
-
-# Generate cpp with Git revision from template
-# Also if this is a CI build, add the build name (ie: Nightly, Canary) to the scm_rev file as well
-set(REPO_NAME "")
-set(BUILD_VERSION "0")
-if (DEFINED ENV{CI})
- if (DEFINED ENV{GITHUB_ACTIONS})
- set(BUILD_REPOSITORY $ENV{GITHUB_REPOSITORY})
- set(BUILD_TAG $ENV{GITHUB_REF_NAME})
- endif()
-
- # regex capture the string nightly or canary into CMAKE_MATCH_1
- string(REGEX MATCH "citra-emu/citra-?(.*)" OUTVAR ${BUILD_REPOSITORY})
- if ("${CMAKE_MATCH_COUNT}" GREATER 0)
- # capitalize the first letter of each word in the repo name.
- string(REPLACE "-" ";" REPO_NAME_LIST ${CMAKE_MATCH_1})
- foreach(WORD ${REPO_NAME_LIST})
- string(SUBSTRING ${WORD} 0 1 FIRST_LETTER)
- string(SUBSTRING ${WORD} 1 -1 REMAINDER)
- string(TOUPPER ${FIRST_LETTER} FIRST_LETTER)
- set(REPO_NAME "${REPO_NAME}${FIRST_LETTER}${REMAINDER}")
- endforeach()
- string(REGEX MATCH "${CMAKE_MATCH_1}-([0-9]+)" OUTVAR ${BUILD_TAG})
- if (${CMAKE_MATCH_COUNT} GREATER 0)
- set(BUILD_VERSION ${CMAKE_MATCH_1})
- endif()
- if (BUILD_VERSION)
- # This leaves a trailing space on the last word, but we actually want that
- # because of how it's styled in the title bar.
- set(BUILD_FULLNAME "${REPO_NAME} ${BUILD_VERSION} ")
- else()
- set(BUILD_FULLNAME "")
- endif()
- endif()
-endif()
+list(APPEND CMAKE_MODULE_PATH "${SRC_DIR}/CMakeModules")
+include(GenerateBuildInfo)
# The variable SRC_DIR must be passed into the script (since it uses the current build directory for all values of CMAKE_*_DIR)
set(VIDEO_CORE "${SRC_DIR}/src/video_core")
diff --git a/src/citra_qt/Info.plist b/dist/apple/Info.plist.in
similarity index 65%
rename from src/citra_qt/Info.plist
rename to dist/apple/Info.plist.in
index 5ab69f3d0..7eb580925 100644
--- a/src/citra_qt/Info.plist
+++ b/dist/apple/Info.plist.in
@@ -2,45 +2,49 @@
- CFBundleDevelopmentRegion
- English
- CFBundleExecutable
- ${EXECUTABLE_NAME}
- CFBundleGetInfoString
-
- CFBundleIconFile
- citra.icns
- CFBundleIdentifier
- com.citra-emu.citra
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleLongVersionString
-
+
CFBundleName
- Citra
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
-
- CFBundleSignature
- ????
+ ${MACOSX_BUNDLE_BUNDLE_NAME}
+ CFBundleIdentifier
+ ${MACOSX_BUNDLE_GUI_IDENTIFIER}
CFBundleVersion
-
- CSResourcesFileMapped
-
- LSRequiresCarbon
-
+ ${MACOSX_BUNDLE_BUNDLE_VERSION}
+ CFBundleShortVersionString
+ ${MACOSX_BUNDLE_SHORT_VERSION_STRING}
+ CFBundleLongVersionString
+ ${MACOSX_BUNDLE_LONG_VERSION_STRING}
+ CFBundleExecutable
+ ${MACOSX_BUNDLE_EXECUTABLE_NAME}
+ CFBundleIconFile
+ ${MACOSX_BUNDLE_ICON_FILE}
+ CFBundleGetInfoString
+ ${MACOSX_BUNDLE_INFO_STRING}
NSHumanReadableCopyright
-
- NSPrincipalClass
- NSApplication
- NSHighResolutionCapable
- True
+ ${MACOSX_BUNDLE_COPYRIGHT}
+
+ LSApplicationCategoryType
+ public.app-category.games
NSCameraUsageDescription
This app requires camera access to emulate the 3DS's cameras.
NSMicrophoneUsageDescription
This app requires microphone access to emulate the 3DS's microphone.
- LSApplicationCategoryType
- public.app-category.games
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundlePackageType
+ APPL
+ CFBundleDevelopmentRegion
+ English
+ CFBundleSignature
+ ????
+ CSResourcesFileMapped
+
+ LSSupportsOpeningDocumentsInPlace
+
+ NSHighResolutionCapable
+ True
+ UIFileSharingEnabled
+
+ UILaunchStoryboardName
+ LaunchScreen
diff --git a/dist/apple/LaunchScreen.storyboard b/dist/apple/LaunchScreen.storyboard
new file mode 100644
index 000000000..56829a36f
--- /dev/null
+++ b/dist/apple/LaunchScreen.storyboard
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dist/citra.icns b/dist/apple/citra.icns
similarity index 100%
rename from dist/citra.icns
rename to dist/apple/citra.icns
diff --git a/dist/apple/launch_logo.png b/dist/apple/launch_logo.png
new file mode 100644
index 000000000..5217a1c27
Binary files /dev/null and b/dist/apple/launch_logo.png differ
diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt
index 90ba2f568..e744dac8c 100644
--- a/externals/CMakeLists.txt
+++ b/externals/CMakeLists.txt
@@ -148,6 +148,7 @@ target_include_directories(enet INTERFACE ./enet/include)
# Cubeb
if (ENABLE_CUBEB)
set(BUILD_TESTS OFF CACHE BOOL "")
+ set(BUILD_TOOLS OFF CACHE BOOL "")
add_subdirectory(cubeb EXCLUDE_FROM_ALL)
endif()
diff --git a/externals/libressl b/externals/libressl
index 8929f818f..dcf9a84ab 160000
--- a/externals/libressl
+++ b/externals/libressl
@@ -1 +1 @@
-Subproject commit 8929f818fd748fd31a34fec7c04558399e13014a
+Subproject commit dcf9a84aba598f827f65d946d31c3c93af62790a
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 9f976eedf..f05f35ff0 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -143,9 +143,12 @@ add_subdirectory(video_core)
add_subdirectory(audio_core)
add_subdirectory(network)
add_subdirectory(input_common)
-add_subdirectory(tests)
-if (ENABLE_SDL2)
+if (ENABLE_TESTS)
+ add_subdirectory(tests)
+endif()
+
+if (ENABLE_SDL2 AND ENABLE_SDL2_FRONTEND)
add_subdirectory(citra)
endif()
@@ -153,11 +156,13 @@ if (ENABLE_QT)
add_subdirectory(citra_qt)
endif()
+if (ENABLE_DEDICATED_ROOM)
+ add_subdirectory(dedicated_room)
+endif()
+
if (ANDROID)
add_subdirectory(android/app/src/main/jni)
target_include_directories(citra-android PRIVATE android/app/src/main)
-else()
- add_subdirectory(dedicated_room)
endif()
if (ENABLE_WEB_SERVICE)
diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt
index eebcca567..18802c957 100644
--- a/src/citra_qt/CMakeLists.txt
+++ b/src/citra_qt/CMakeLists.txt
@@ -8,7 +8,6 @@ if (POLICY CMP0071)
endif()
add_executable(citra-qt
- Info.plist
aboutdialog.cpp
aboutdialog.h
aboutdialog.ui
@@ -169,9 +168,6 @@ add_executable(citra-qt
uisettings.h
qt_image_interface.cpp
qt_image_interface.h
- updater/updater.cpp
- updater/updater.h
- updater/updater_p.h
util/clickable_label.cpp
util/clickable_label.h
util/sequence_dialog/sequence_dialog.cpp
@@ -202,6 +198,15 @@ file(GLOB COMPAT_LIST
file(GLOB_RECURSE ICONS ${PROJECT_SOURCE_DIR}/dist/icons/*)
file(GLOB_RECURSE THEMES ${PROJECT_SOURCE_DIR}/dist/qt_themes/*)
+if (ENABLE_QT_UPDATER)
+ target_sources(citra-qt PRIVATE
+ updater/updater.cpp
+ updater/updater.h
+ updater/updater_p.h
+ )
+ target_compile_definitions(citra-qt PUBLIC ENABLE_QT_UPDATER)
+endif()
+
if (ENABLE_QT_TRANSLATION)
set(CITRA_QT_LANGUAGES "${PROJECT_SOURCE_DIR}/dist/languages" CACHE PATH "Path to the translation bundle for the Qt frontend")
option(GENERATE_QT_TRANSLATION "Generate en.ts as the translation source file" OFF)
@@ -248,17 +253,43 @@ target_sources(citra-qt
)
if (APPLE)
- set(MACOSX_ICON "../../dist/citra.icns")
- set_source_files_properties(${MACOSX_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+ set(DIST_DIR "../../dist/apple")
+ set(APPLE_RESOURCES
+ "${DIST_DIR}/citra.icns"
+ "${DIST_DIR}/LaunchScreen.storyboard"
+ "${DIST_DIR}/launch_logo.png"
+ )
+
target_sources(citra-qt PRIVATE
- ${MACOSX_ICON}
+ ${APPLE_RESOURCES}
macos_authorization.h
macos_authorization.mm
)
+
+ # Define app bundle metadata.
+ include(GenerateBuildInfo)
set_target_properties(citra-qt PROPERTIES
MACOSX_BUNDLE TRUE
- MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist
+ MACOSX_BUNDLE_INFO_PLIST "${DIST_DIR}/Info.plist.in"
+ MACOSX_BUNDLE_BUNDLE_NAME "Citra"
+ MACOSX_BUNDLE_GUI_IDENTIFIER "com.citra-emu.citra"
+ MACOSX_BUNDLE_BUNDLE_VERSION "${BUILD_VERSION}"
+ MACOSX_BUNDLE_SHORT_VERSION_STRING "${BUILD_FULLNAME}"
+ MACOSX_BUNDLE_LONG_VERSION_STRING "${BUILD_FULLNAME}"
+ MACOSX_BUNDLE_ICON_FILE "citra.icns"
+ RESOURCE "${APPLE_RESOURCES}"
)
+
+ if (IOS)
+ set_target_properties(citra-qt PROPERTIES
+ # Have Xcode copy and sign MoltenVK into app bundle.
+ XCODE_EMBED_FRAMEWORKS "${MOLTENVK_LIBRARY}"
+ XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY YES
+ XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks"
+ # Support iPhone and iPad.
+ XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2"
+ )
+ endif()
elseif(WIN32)
# compile as a win32 gui application instead of a console application
target_link_libraries(citra-qt PRIVATE Qt6::EntryPointImplementation)
diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index e99bfa42a..e4f1e671b 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -364,7 +364,7 @@ static Frontend::WindowSystemType GetWindowSystemType() {
return Frontend::WindowSystemType::X11;
else if (platform_name == QStringLiteral("wayland"))
return Frontend::WindowSystemType::Wayland;
- else if (platform_name == QStringLiteral("cocoa"))
+ else if (platform_name == QStringLiteral("cocoa") || platform_name == QStringLiteral("ios"))
return Frontend::WindowSystemType::MacOS;
LOG_CRITICAL(Frontend, "Unknown Qt platform!");
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index c9d26ebc3..5b218c6d4 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -223,7 +223,12 @@ GMainWindow::GMainWindow(Core::System& system_)
InitializeRecentFileMenuActions();
InitializeSaveStateMenuActions();
InitializeHotkeys();
+#if ENABLE_QT_UPDATER
ShowUpdaterWidgets();
+#else
+ ui->action_Check_For_Updates->setVisible(false);
+ ui->action_Open_Maintenance_Tool->setVisible(false);
+#endif
SetDefaultUIGeometry();
RestoreUIState();
@@ -268,9 +273,11 @@ GMainWindow::GMainWindow(Core::System& system_)
connect(&mouse_hide_timer, &QTimer::timeout, this, &GMainWindow::HideMouseCursor);
connect(ui->menubar, &QMenuBar::hovered, this, &GMainWindow::OnMouseActivity);
+#if ENABLE_QT_UPDATER
if (UISettings::values.check_for_update_on_start) {
CheckForUpdates();
}
+#endif
QStringList args = QApplication::arguments();
if (args.length() >= 2) {
@@ -322,9 +329,11 @@ void GMainWindow::InitializeWidgets() {
ui->action_Show_Room);
multiplayer_state->setVisible(false);
+#if ENABLE_QT_UPDATER
// Setup updater
updater = new Updater(this);
UISettings::values.updater_found = updater->HasUpdater();
+#endif
UpdateBootHomeMenuState();
@@ -655,13 +664,6 @@ void GMainWindow::InitializeHotkeys() {
});
}
-void GMainWindow::ShowUpdaterWidgets() {
- ui->action_Check_For_Updates->setVisible(UISettings::values.updater_found);
- ui->action_Open_Maintenance_Tool->setVisible(UISettings::values.updater_found);
-
- connect(updater, &Updater::CheckUpdatesDone, this, &GMainWindow::OnUpdateFound);
-}
-
void GMainWindow::SetDefaultUIGeometry() {
// geometry: 55% of the window contents are in the upper screen half, 45% in the lower half
const QRect screenRect = screen()->geometry();
@@ -851,8 +853,11 @@ void GMainWindow::ConnectMenuEvents() {
QDesktopServices::openUrl(QUrl(QStringLiteral("https://citra-emu.org/wiki/faq/")));
});
connect_menu(ui->action_About, &GMainWindow::OnMenuAboutCitra);
+
+#if ENABLE_QT_UPDATER
connect_menu(ui->action_Check_For_Updates, &GMainWindow::OnCheckForUpdates);
connect_menu(ui->action_Open_Maintenance_Tool, &GMainWindow::OnOpenUpdater);
+#endif
}
void GMainWindow::UpdateMenuState() {
@@ -904,6 +909,7 @@ void GMainWindow::OnDisplayTitleBars(bool show) {
}
}
+#if ENABLE_QT_UPDATER
void GMainWindow::OnCheckForUpdates() {
explicit_update_check = true;
CheckForUpdates();
@@ -970,6 +976,14 @@ void GMainWindow::OnOpenUpdater() {
updater->LaunchUI();
}
+void GMainWindow::ShowUpdaterWidgets() {
+ ui->action_Check_For_Updates->setVisible(UISettings::values.updater_found);
+ ui->action_Open_Maintenance_Tool->setVisible(UISettings::values.updater_found);
+
+ connect(updater, &Updater::CheckUpdatesDone, this, &GMainWindow::OnUpdateFound);
+}
+#endif
+
#if defined(__unix__) && !defined(__APPLE__)
static std::optional HoldWakeLockLinux(u32 window_id = 0) {
if (!QDBusConnection::sessionBus().isConnected()) {
@@ -1327,9 +1341,11 @@ void GMainWindow::ShutdownGame() {
emulation_running = false;
+#if ENABLE_QT_UDPATER
if (defer_update_prompt) {
ShowUpdatePrompt();
}
+#endif
game_title.clear();
UpdateWindowTitle();
diff --git a/src/citra_qt/main.h b/src/citra_qt/main.h
index ddc242543..03b9f54a7 100644
--- a/src/citra_qt/main.h
+++ b/src/citra_qt/main.h
@@ -46,7 +46,9 @@ class QProgressBar;
class QPushButton;
class QSlider;
class RegistersWidget;
+#if ENABLE_QT_UPDATER
class Updater;
+#endif
class WaitTreeWidget;
namespace Camera {
@@ -146,12 +148,15 @@ private:
void ShutdownGame();
void ShowTelemetryCallout();
+ void SetDiscordEnabled(bool state);
+ void LoadAmiibo(const QString& filename);
+
+#if ENABLE_QT_UPDATER
void ShowUpdaterWidgets();
void ShowUpdatePrompt();
void ShowNoUpdatePrompt();
void CheckForUpdates();
- void SetDiscordEnabled(bool state);
- void LoadAmiibo(const QString& filename);
+#endif
/**
* Stores the filename in the recently loaded files list.
@@ -244,9 +249,13 @@ private slots:
void OnCoreError(Core::System::ResultStatus, std::string);
/// Called whenever a user selects Help->About Citra
void OnMenuAboutCitra();
+
+#if ENABLE_QT_UPDATER
void OnUpdateFound(bool found, bool error);
void OnCheckForUpdates();
void OnOpenUpdater();
+#endif
+
void OnLanguageChanged(const QString& locale);
void OnMouseActivity();
@@ -326,7 +335,9 @@ private:
IPCRecorderWidget* ipcRecorderWidget;
LLEServiceModulesWidget* lleServiceModulesWidget;
WaitTreeWidget* waitTreeWidget;
+#if ENABLE_QT_UPDATER
Updater* updater;
+#endif
bool explicit_update_check = false;
bool defer_update_prompt = false;
diff --git a/src/common/common_paths.h b/src/common/common_paths.h
index 6fe585fad..da9c04f2f 100644
--- a/src/common/common_paths.h
+++ b/src/common/common_paths.h
@@ -21,7 +21,12 @@
#ifdef _WIN32
#define EMU_DATA_DIR "Citra"
#elif defined(__APPLE__)
-#define MACOS_EMU_DATA_DIR "Library" DIR_SEP "Application Support" DIR_SEP "Citra"
+#include
+#if TARGET_OS_IPHONE
+#define APPLE_EMU_DATA_DIR "Documents" DIR_SEP "Citra"
+#else
+#define APPLE_EMU_DATA_DIR "Library" DIR_SEP "Application Support" DIR_SEP "Citra"
+#endif
// For compatibility with XDG paths.
#define EMU_DATA_DIR "citra-emu"
#else
diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp
index da4bcd6e0..af88a5e7b 100644
--- a/src/common/file_util.cpp
+++ b/src/common/file_util.cpp
@@ -786,7 +786,7 @@ void SetUserPath(const std::string& path) {
// paths.
if (!FileUtil::Exists(data_dir) && !FileUtil::Exists(config_dir) &&
!FileUtil::Exists(cache_dir)) {
- data_dir = GetHomeDirectory() + DIR_SEP MACOS_EMU_DATA_DIR DIR_SEP;
+ data_dir = GetHomeDirectory() + DIR_SEP APPLE_EMU_DATA_DIR DIR_SEP;
config_dir = data_dir + CONFIG_DIR DIR_SEP;
cache_dir = data_dir + CACHE_DIR DIR_SEP;
}