Compare commits

...
Sign in to create a new pull request.

7 commits

Author SHA1 Message Date
1551387739
[cmake, frontend] feat: CPMUtil + dependency viewer (#238)
- creates a CPMUtil.cmake module that makes my job 10x easier and removes boilerplate
- also lets us generate dependency names/versions at compiletime, thus letting the frontend display each dependency's versions.

Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: eden-emu/eden#238
2025-08-11 22:27:29 +02:00
3f02d7713f
[qt] Fix title bar for windows being forced to light theme (#236)
Fixed the title bar being forced to light theme and properly handle it the qt6.5 way
See: https://stackoverflow.com/a/78854851

Reviewed-on: eden-emu/eden#236
Reviewed-by: crueter <crueter@eden-emu.dev>
Co-authored-by: Maufeat <sahyno1996@gmail.com>
Co-committed-by: Maufeat <sahyno1996@gmail.com>
2025-08-10 22:14:12 +02:00
bdf5674d7e
[cmake] use CPM.cmake without download (#234)
openSUSE build environment doesn't have internet access. So all downloads must be skipped.

Reviewed-on: eden-emu/eden#234
Co-authored-by: Guo Yunhe <i@guoyunhe.me>
Co-committed-by: Guo Yunhe <i@guoyunhe.me>
2025-08-09 18:47:25 +02:00
6b8408ef50
[android] fix light theming (#230)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: eden-emu/eden#230
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
2025-08-09 01:09:01 +02:00
a3cf780a3a
[dynarmic] fix pch gen (#231)
Signed-off-by: lizzie <lizzie@eden-emu.dev>
Co-authored-by: lizzie <lizzie@eden-emu.dev>
Reviewed-on: eden-emu/eden#231
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
2025-08-09 01:08:55 +02:00
0705ba0b47
[frontend] add revolt links to about (#227)
Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: eden-emu/eden#227
Reviewed-by: Lizzie <lizzie@eden-emu.dev>
2025-08-08 01:56:42 +02:00
982b171f30
[desktop] fix random qt annoyances (#226)
Removes that silly QLayout message and improves consistency thereof for
other QLayouts

Still work to be done but this is all that's needed rn

Signed-off-by: crueter <crueter@eden-emu.dev>

Reviewed-on: eden-emu/eden#226
Reviewed-by: Shinmegumi <shinmegumi@eden-emu.dev>
2025-08-08 01:25:00 +02:00
48 changed files with 2389 additions and 336 deletions

View file

@ -216,14 +216,14 @@ if (YUZU_USE_BUNDLED_VCPKG)
list(APPEND VCPKG_MANIFEST_FEATURES "android") list(APPEND VCPKG_MANIFEST_FEATURES "android")
endif() endif()
include(CPM) include(CPMUtil)
set(CPM_USE_LOCAL_PACKAGES OFF)
CPMAddPackage( AddPackage(
NAME vcpkg
DOWNLOAD_ONLY YES DOWNLOAD_ONLY YES
GIT_REPOSITORY "https://github.com/microsoft/vcpkg.git" URL "https://github.com/microsoft/vcpkg.git"
GIT_TAG "ea2a964f93" GIT_TAG "ea2a964f93"
CUSTOM_CACHE_KEY "ea2a" SHA "ea2a964f93"
) )
include(${vcpkg_SOURCE_DIR}/scripts/buildsystems/vcpkg.cmake) include(${vcpkg_SOURCE_DIR}/scripts/buildsystems/vcpkg.cmake)
@ -277,6 +277,30 @@ function(check_submodules_present)
message(FATAL_ERROR "Git submodule ${module} not found. " message(FATAL_ERROR "Git submodule ${module} not found. "
"Please run: \ngit submodule update --init --recursive") "Please run: \ngit submodule update --init --recursive")
endif() endif()
set(SUBMODULE_DIR "${PROJECT_SOURCE_DIR}/${module}")
execute_process(
COMMAND git rev-parse --short=10 HEAD
WORKING_DIRECTORY ${SUBMODULE_DIR}
OUTPUT_VARIABLE SUBMODULE_SHA
)
# would probably be better to do string parsing, but whatever
execute_process(
COMMAND git remote get-url origin
WORKING_DIRECTORY ${SUBMODULE_DIR}
OUTPUT_VARIABLE SUBMODULE_URL
)
string(REGEX REPLACE "\n|\r" "" SUBMODULE_SHA ${SUBMODULE_SHA})
string(REGEX REPLACE "\n|\r|\\.git" "" SUBMODULE_URL ${SUBMODULE_URL})
get_filename_component(SUBMODULE_NAME ${SUBMODULE_DIR} NAME)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${SUBMODULE_NAME})
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${SUBMODULE_SHA})
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${SUBMODULE_URL})
endforeach() endforeach()
endfunction() endfunction()
@ -453,7 +477,7 @@ if (ENABLE_SDL2)
endif() endif()
if (DEFINED SDL2_VER) if (DEFINED SDL2_VER)
download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" SDL2_PREFIX) download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" SDL2_PREFIX 2.32.8)
endif() endif()
set(SDL2_FOUND YES) set(SDL2_FOUND YES)
@ -584,7 +608,7 @@ endif()
if (WIN32 AND YUZU_CRASH_DUMPS) if (WIN32 AND YUZU_CRASH_DUMPS)
set(BREAKPAD_VER "breakpad-c89f9dd") set(BREAKPAD_VER "breakpad-c89f9dd")
download_bundled_external("breakpad/" ${BREAKPAD_VER} "breakpad-win" BREAKPAD_PREFIX) download_bundled_external("breakpad/" ${BREAKPAD_VER} "breakpad-win" BREAKPAD_PREFIX "c89f9dd")
set(BREAKPAD_CLIENT_INCLUDE_DIR "${BREAKPAD_PREFIX}/include") set(BREAKPAD_CLIENT_INCLUDE_DIR "${BREAKPAD_PREFIX}/include")
set(BREAKPAD_CLIENT_LIBRARY "${BREAKPAD_PREFIX}/lib/libbreakpad_client.lib") set(BREAKPAD_CLIENT_LIBRARY "${BREAKPAD_PREFIX}/lib/libbreakpad_client.lib")
@ -722,7 +746,6 @@ else()
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT yuzu-cmd) set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT yuzu-cmd)
endif() endif()
# Installation instructions # Installation instructions
# ========================= # =========================

File diff suppressed because it is too large Load diff

117
CMakeModules/CPMUtil.cmake Normal file
View file

@ -0,0 +1,117 @@
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
# Created-By: crueter
# Docs will come at a later date, mostly this is to just reduce boilerplate
# and some cmake magic to allow for runtime viewing of dependency versions
cmake_minimum_required(VERSION 3.22)
include(CPM)
function(AddPackage)
cpm_set_policies()
set(oneValueArgs
NAME
VERSION
REPO
SHA
HASH
KEY
URL # Only for custom non-GitHub urls
DOWNLOAD_ONLY
FIND_PACKAGE_ARGUMENTS
SYSTEM_PACKAGE
BUNDLED_PACKAGE
)
set(multiValueArgs OPTIONS PATCHES)
cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
if (NOT DEFINED PKG_ARGS_NAME)
message(FATAL_ERROR "CPMUtil: No package name defined")
endif()
if (NOT DEFINED PKG_ARGS_URL)
if (DEFINED PKG_ARGS_REPO AND DEFINED PKG_ARGS_SHA)
set(PKG_GIT_URL https://github.com/${PKG_ARGS_REPO})
set(PKG_URL "${PKG_GIT_URL}/archive/${PKG_ARGS_SHA}.zip")
else()
message(FATAL_ERROR "CPMUtil: No custom URL and no repository + sha defined")
endif()
else()
set(PKG_URL ${PKG_ARGS_URL})
set(PKG_GIT_URL ${PKG_URL})
endif()
message(STATUS "CPMUtil: Downloading package ${PKG_ARGS_NAME} from ${PKG_URL}")
if (NOT DEFINED PKG_ARGS_KEY)
if (DEFINED PKG_ARGS_SHA)
string(SUBSTRING ${PKG_ARGS_SHA} 0 4 PKG_KEY)
message(STATUS "CPMUtil: No custom key defined, using ${PKG_KEY} from sha")
else()
message(FATAL_ERROR "CPMUtil: No custom key and no commit sha defined")
endif()
else()
set(PKG_KEY ${PKG_ARGS_KEY})
endif()
if (DEFINED PKG_ARGS_HASH)
set(PKG_HASH "SHA512=${PKG_ARGS_HASH}")
endif()
# Default behavior is bundled
if (DEFINED PKG_ARGS_SYSTEM_PACKAGE)
set(CPM_USE_LOCAL_PACKAGES ${PKG_ARGS_SYSTEM_PACKAGE})
elseif (DEFINED PKG_ARGS_BUNDLED_PACKAGE)
if (PKG_ARGS_BUNDLED_PACKAGE)
set(CPM_USE_LOCAL_PACKAGES OFF)
else()
set(CPM_USE_LOCAL_PACKAGES ON)
endif()
else()
set(CPM_USE_LOCAL_PACKAGES OFF)
endif()
CPMAddPackage(
NAME ${PKG_ARGS_NAME}
VERSION ${PKG_ARGS_VERSION}
URL ${PKG_URL}
URL_HASH ${PKG_HASH}
CUSTOM_CACHE_KEY ${PKG_KEY}
DOWNLOAD_ONLY ${PKG_ARGS_DOWNLOAD_ONLY}
FIND_PACKAGE_ARGUMENTS ${PKG_ARGS_FIND_PACKAGE_ARGUMENTS}
OPTIONS ${PKG_ARGS_OPTIONS}
PATCHES ${PKG_ARGS_PATCHES}
${PKG_ARGS_UNPARSED_ARGUMENTS}
)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${PKG_ARGS_NAME})
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${PKG_GIT_URL})
if (${PKG_ARGS_NAME}_ADDED)
if (DEFINED PKG_ARGS_SHA)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${PKG_ARGS_SHA})
elseif(DEFINED PKG_ARGS_VERSION)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${PKG_ARGS_VERSION})
else()
message(WARNING "CPMUtil: Package ${PKG_ARGS_NAME} has no specified sha or version")
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown")
endif()
else()
if (DEFINED CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION)
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "${CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION} (system)")
else()
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown (system)")
endif()
endif()
# pass stuff to parent scope
set(${PKG_ARGS_NAME}_ADDED "${${PKG_ARGS_NAME}_ADDED}" PARENT_SCOPE)
set(${PKG_ARGS_NAME}_SOURCE_DIR "${${PKG_ARGS_NAME}_SOURCE_DIR}" PARENT_SCOPE)
set(${PKG_ARGS_NAME}_BINARY_DIR "${${PKG_ARGS_NAME}_BINARY_DIR}" PARENT_SCOPE)
endfunction()

View file

@ -63,6 +63,4 @@ function(copy_yuzu_Qt6_deps target_dir)
else() else()
# Update for non-MSVC platforms if needed # Update for non-MSVC platforms if needed
endif() endif()
# Fixes dark mode being forced automatically even when light theme is set in app settings.
file(WRITE "${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE}/qt.conf" "[Platforms]\nWindowsArguments = darkmode=0")
endfunction(copy_yuzu_Qt6_deps) endfunction(copy_yuzu_Qt6_deps)

View file

@ -6,7 +6,7 @@
# remote_path: path to the file to download, relative to the remote repository root # remote_path: path to the file to download, relative to the remote repository root
# prefix_var: name of a variable which will be set with the path to the extracted contents # prefix_var: name of a variable which will be set with the path to the extracted contents
set(CURRENT_MODULE_DIR ${CMAKE_CURRENT_LIST_DIR}) set(CURRENT_MODULE_DIR ${CMAKE_CURRENT_LIST_DIR})
function(download_bundled_external remote_path lib_name cpm_key prefix_var) function(download_bundled_external remote_path lib_name cpm_key prefix_var version)
set(package_base_url "https://github.com/eden-emulator/") set(package_base_url "https://github.com/eden-emulator/")
set(package_repo "no_platform") set(package_repo "no_platform")
set(package_extension "no_platform") set(package_extension "no_platform")
@ -29,13 +29,13 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var)
set(package_url "${package_base_url}${package_repo}") set(package_url "${package_base_url}${package_repo}")
set(full_url ${package_url}${remote_path}${lib_name}${package_extension}) set(full_url ${package_url}${remote_path}${lib_name}${package_extension})
set(CPM_USE_LOCAL_PACKAGES OFF) AddPackage(
CPMAddPackage(
NAME ${cpm_key} NAME ${cpm_key}
VERSION ${version}
URL ${full_url} URL ${full_url}
DOWNLOAD_ONLY YES DOWNLOAD_ONLY YES
CUSTOM_CACHE_KEY ${CACHE_KEY} KEY ${CACHE_KEY}
# TODO(crueter): hash
) )
set(${prefix_var} "${${cpm_key}_SOURCE_DIR}" PARENT_SCOPE) set(${prefix_var} "${${cpm_key}_SOURCE_DIR}" PARENT_SCOPE)
@ -46,11 +46,11 @@ function(download_win_archives)
set(FORCE_WIN_ARCHIVES ON) set(FORCE_WIN_ARCHIVES ON)
set(FFmpeg_EXT_NAME "ffmpeg-7.1.1") set(FFmpeg_EXT_NAME "ffmpeg-7.1.1")
download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "") download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "" 7.1.1)
# TODO(crueter): separate handling for arm64 # TODO(crueter): separate handling for arm64
set(SDL2_VER "SDL2-2.32.8") set(SDL2_VER "SDL2-2.32.8")
download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" "") download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" "" 2.32.8)
set(FORCE_WIN_ARCHIVES OFF) set(FORCE_WIN_ARCHIVES OFF)
endfunction() endfunction()

View file

@ -0,0 +1,21 @@
# SPDX-FileCopyrightText: 2025 Eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
get_property(NAMES GLOBAL PROPERTY CPM_PACKAGE_NAMES)
get_property(SHAS GLOBAL PROPERTY CPM_PACKAGE_SHAS)
get_property(URLS GLOBAL PROPERTY CPM_PACKAGE_URLS)
list(LENGTH NAMES DEPS_LENGTH)
list(JOIN NAMES "\",\n\t\"" DEP_NAME_DIRTY)
set(DEP_NAMES "\t\"${DEP_NAME_DIRTY}\"")
list(JOIN SHAS "\",\n\t\"" DEP_SHAS_DIRTY)
set(DEP_SHAS "\t\"${DEP_SHAS_DIRTY}\"")
list(JOIN URLS "\",\n\t\"" DEP_URLS_DIRTY)
set(DEP_URLS "\t\"${DEP_URLS_DIRTY}\"")
configure_file(dep_hashes.h.in dep_hashes.h @ONLY)
target_sources(common PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/dep_hashes.h)
target_include_directories(common PUBLIC ${CMAKE_CURRENT_BINARY_DIR})

View file

@ -5,7 +5,7 @@
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
# cpm # cpm
include(CPM) include(CPMUtil)
# Explicitly declare this option here to propagate to the oaknut CPM call # Explicitly declare this option here to propagate to the oaknut CPM call
option(DYNARMIC_TESTS "Build tests" ${BUILD_TESTING}) option(DYNARMIC_TESTS "Build tests" ${BUILD_TESTING})
@ -29,8 +29,6 @@ endif()
# Xbyak (also used by Dynarmic, so needs to be added first) # Xbyak (also used by Dynarmic, so needs to be added first)
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
set(CPM_USE_LOCAL_PACKAGES OFF)
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS") if ("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS")
# Fix regset.h collisions # Fix regset.h collisions
set(XBYAK_HASH 51f507b0b3) set(XBYAK_HASH 51f507b0b3)
@ -40,22 +38,22 @@ if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
set(XBYAK_SHA512SUM 5824e92159e07fa36a774aedd3b3ef3541d0241371d522cffa4ab3e1f215fa5097b1b77865b47b2481376c704fa079875557ea463ca63d0a7fd6a8a20a589e70) set(XBYAK_SHA512SUM 5824e92159e07fa36a774aedd3b3ef3541d0241371d522cffa4ab3e1f215fa5097b1b77865b47b2481376c704fa079875557ea463ca63d0a7fd6a8a20a589e70)
endif() endif()
CPMAddPackage( AddPackage(
NAME xbyak NAME xbyak
URL "https://github.com/Lizzie841/xbyak/archive/${XBYAK_HASH}.zip" REPO "Lizzie841/xbyak"
URL_HASH SHA512=${XBYAK_SHA512SUM} SHA ${XBYAK_HASH}
CUSTOM_CACHE_KEY ${XBYAK_HASH} HASH ${XBYAK_SHA512SUM}
) )
endif() endif()
# Oaknut (also used by Dynarmic, so needs to be added first) # Oaknut (also used by Dynarmic, so needs to be added first)
if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS) if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS)
CPMAddPackage( AddPackage(
NAME oaknut NAME oaknut
VERSION 2.0.1 VERSION 2.0.1
URL "https://github.com/merryhime/oaknut/archive/94c726ce03.zip" REPO "merryhime/oaknut"
URL_HASH SHA512=d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac SHA 94c726ce03
CUSTOM_CACHE_KEY "94c7" HASH d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac
) )
endif() endif()
@ -69,15 +67,14 @@ add_subdirectory(glad)
# mbedtls # mbedtls
# TODO(crueter): test local mbedtls # TODO(crueter): test local mbedtls
set(CPM_USE_LOCAL_PACKAGES ON) AddPackage(
CPMAddPackage(
NAME mbedtls NAME mbedtls
URL "https://github.com/Mbed-TLS/mbedtls/archive/8c88150ca1.zip" REPO "Mbed-TLS/mbedtls"
URL_HASH SHA512=769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966 SHA "8c88150ca1"
HASH 769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966
PATCHES PATCHES
${CMAKE_SOURCE_DIR}/.patch/mbedtls/0001-cmake-version.patch ${CMAKE_SOURCE_DIR}/.patch/mbedtls/0001-cmake-version.patch
CUSTOM_CACHE_KEY "8c88" SYSTEM_PACKAGE ON
) )
if (mbedtls_ADDED) if (mbedtls_ADDED)
@ -131,11 +128,12 @@ if (YUZU_USE_EXTERNAL_SDL2)
set(SDL_SHA512SUM d95af47f469a312876f8ab361074a1e7b8083db19935a102d9c6e5887ace6008e64475a8c54b00164b40cad86492bb1b2366084efdd0b2555e5fea6d9c5da80e) set(SDL_SHA512SUM d95af47f469a312876f8ab361074a1e7b8083db19935a102d9c6e5887ace6008e64475a8c54b00164b40cad86492bb1b2366084efdd0b2555e5fea6d9c5da80e)
endif() endif()
CPMAddPackage( AddPackage(
NAME SDL2 NAME SDL2
URL "https://github.com/libsdl-org/SDL/archive/${SDL_HASH}.zip" REPO "libsdl-org/SDL"
URL_HASH SHA512=${SDL_SHA512SUM} SHA ${SDL_HASH}
CUSTOM_CACHE_KEY "${YUZU_SYSTEM_PROFILE}" HASH ${SDL_SHA512SUM}
KEY ${YUZU_SYSTEM_PROFILE}
) )
endif() endif()
@ -146,18 +144,17 @@ if (NOT TARGET enet::enet)
add_library(enet::enet ALIAS enet) add_library(enet::enet ALIAS enet)
endif() endif()
# TODO(crueter): Create a common CPMUtil.cmake that does this for me AddPackage(
set(CPM_USE_LOCAL_PACKAGES ON)
CPMAddPackage(
NAME cubeb NAME cubeb
URL "https://github.com/mozilla/cubeb/archive/fa02160712.zip" REPO "mozilla/cubeb"
SHA fa02160712
HASH 82d808356752e4064de48c8fecbe7856715ade1e76b53937116bf07129fc1cc5b3de5e4b408de3cd000187ba8dc32ca4109661cb7e0355a52e54bd81b9be1c61
FIND_PACKAGE_ARGUMENTS "CONFIG" # not sure this works outside of gentoo FIND_PACKAGE_ARGUMENTS "CONFIG" # not sure this works outside of gentoo
OPTIONS OPTIONS
"USE_SANITIZERS OFF" "USE_SANITIZERS OFF"
"BUILD_TESTS OFF" "BUILD_TESTS OFF"
"BUILD_TOOLS OFF" "BUILD_TOOLS OFF"
CUSTOM_CACHE_KEY "fa02" SYSTEM_PACKAGE ON
) )
if (cubeb_ADDED) if (cubeb_ADDED)
@ -184,19 +181,17 @@ endif()
# DiscordRPC # DiscordRPC
if (USE_DISCORD_PRESENCE) if (USE_DISCORD_PRESENCE)
set(CPM_USE_LOCAL_PACKAGES OFF) AddPackage(
CPMAddPackage(
NAME discord-rpc NAME discord-rpc
URL "https://github.com/discord/discord-rpc/archive/963aa9f3e5.zip" REPO "discord/discord-rpc"
URL_HASH SHA512=386e1344e9a666d730f2d335ee3aef1fd05b1039febefd51aa751b705009cc764411397f3ca08dffd46205c72f75b235c870c737b2091a4ed0c3b061f5919bde SHA 963aa9f3e5
HASH 386e1344e9a666d730f2d335ee3aef1fd05b1039febefd51aa751b705009cc764411397f3ca08dffd46205c72f75b235c870c737b2091a4ed0c3b061f5919bde
OPTIONS OPTIONS
"BUILD_EXAMPLES OFF" "BUILD_EXAMPLES OFF"
PATCHES PATCHES
${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0001-cmake-version.patch ${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0001-cmake-version.patch
${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0002-no-clang-format.patch ${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0002-no-clang-format.patch
${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0003-fix-cpp17.patch ${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0003-fix-cpp17.patch
CUSTOM_CACHE_KEY "963a"
) )
target_include_directories(discord-rpc INTERFACE ${discord-rpc_SOURCE_DIR}/include) target_include_directories(discord-rpc INTERFACE ${discord-rpc_SOURCE_DIR}/include)
@ -205,76 +200,68 @@ endif()
# Sirit # Sirit
# TODO(crueter): spirv-tools doesn't work w/ system # TODO(crueter): spirv-tools doesn't work w/ system
set(CPM_USE_LOCAL_PACKAGES OFF) AddPackage(
CPMAddPackage(
NAME SPIRV-Headers NAME SPIRV-Headers
URL "https://github.com/KhronosGroup/SPIRV-Headers/archive/4e209d3d7e.zip" REPO "KhronosGroup/SPIRV-Headers"
URL_HASH SHA512=f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4 SHA 4e209d3d7e
CUSTOM_CACHE_KEY "4e20" HASH f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4
) )
set(CPM_USE_LOCAL_PACKAGES ON) AddPackage(
CPMAddPackage(
NAME sirit NAME sirit
URL "https://github.com/raphaelthegreat/sirit/archive/51fcf9720f.zip" REPO "eden-emulator/sirit"
URL_HASH SHA512=a8f98ea0c51763b89924d836ad482ebdfe9130251cf4e14733ccaacc885ae8cc4c8b03d1dc43e8861609e5f7929c16f935879c1f6bf61866fd75077954774394 SHA db1f1e8ab5
HASH 73eb3a042848c63a10656545797e85f40d142009dfb7827384548a385e1e28e1ac72f42b25924ce530d58275f8638554281e884d72f9c7aaf4ed08690a414b05
OPTIONS OPTIONS
"SIRIT_USE_SYSTEM_SPIRV_HEADERS ON" "SIRIT_USE_SYSTEM_SPIRV_HEADERS ON"
CUSTOM_CACHE_KEY "51fc" SYSTEM_PACKAGE ON
) )
# httplib # httplib
if ((ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER)) if ((ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER))
set(CPM_USE_LOCAL_PACKAGES ${YUZU_USE_SYSTEM_HTTPLIB}) AddPackage(
# TODO(crueter): fix local package (gentoo?)
CPMAddPackage(
NAME httplib NAME httplib
VERSION 0.12 VERSION 0.12
URL "https://github.com/yhirose/cpp-httplib/archive/a609330e4c.zip" REPO "yhirose/cpp-httplib"
URL_HASH SHA512=dd3fd0572f8367d8549e1319fd98368b3e75801a293b0c3ac9b4adb806473a4506a484b3d389dc5bee5acc460cb90af7a20e5df705a1696b56496b30b9ce7ed2 SHA a609330e4c
HASH dd3fd0572f8367d8549e1319fd98368b3e75801a293b0c3ac9b4adb806473a4506a484b3d389dc5bee5acc460cb90af7a20e5df705a1696b56496b30b9ce7ed2
FIND_PACKAGE_ARGUMENTS "MODULE" FIND_PACKAGE_ARGUMENTS "MODULE"
OPTIONS OPTIONS
"HTTPLIB_REQUIRE_OPENSSL ON" "HTTPLIB_REQUIRE_OPENSSL ON"
CUSTOM_CACHE_KEY "a609" SYSTEM_PACKAGE ${YUZU_USE_SYSTEM_HTTPLIB}
) )
endif() endif()
# cpp-jwt # cpp-jwt
if (ENABLE_WEB_SERVICE) if (ENABLE_WEB_SERVICE)
set(CPM_USE_LOCAL_PACKAGES OFF) AddPackage(
CPMAddPackage(
NAME cpp-jwt NAME cpp-jwt
VERSION 1.4 VERSION 1.4
URL "https://github.com/arun11299/cpp-jwt/archive/10ef5735d8.zip" REPO "arun11299/cpp-jwt"
URL_HASH SHA512=ebba3d26b33a3b0aa909f475e099594560edbce10ecd03e76d7fea68549a28713ea606d363808f88a5495b62c54c3cdb7e47aee2d946eceabd36e310479dadb7 SHA 10ef5735d8
HASH ebba3d26b33a3b0aa909f475e099594560edbce10ecd03e76d7fea68549a28713ea606d363808f88a5495b62c54c3cdb7e47aee2d946eceabd36e310479dadb7
FIND_PACKAGE_ARGUMENTS "CONFIG" FIND_PACKAGE_ARGUMENTS "CONFIG"
OPTIONS OPTIONS
"CPP_JWT_BUILD_EXAMPLES OFF" "CPP_JWT_BUILD_EXAMPLES OFF"
"CPP_JWT_BUILD_TESTS OFF" "CPP_JWT_BUILD_TESTS OFF"
"CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF" "CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF"
CUSTOM_CACHE_KEY "10ef"
) )
endif() endif()
# Opus # Opus
set(CPM_USE_LOCAL_PACKAGES ${YUZU_USE_SYSTEM_OPUS}) AddPackage(
CPMAddPackage(
NAME Opus NAME Opus
VERSION 1.3 VERSION 1.3
URL "https://github.com/xiph/opus/archive/5ded705cf4.zip" REPO "xiph/opus"
URL_HASH SHA512=0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203 SHA 5ded705cf4
HASH 0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203
FIND_PACKAGE_ARGUMENTS "MODULE" FIND_PACKAGE_ARGUMENTS "MODULE"
OPTIONS OPTIONS
"OPUS_BUILD_TESTING OFF" "OPUS_BUILD_TESTING OFF"
"OPUS_BUILD_PROGRAMS OFF" "OPUS_BUILD_PROGRAMS OFF"
"OPUS_INSTALL_PKG_CONFIG_MODULE OFF" "OPUS_INSTALL_PKG_CONFIG_MODULE OFF"
"OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF" "OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF"
CUSTOM_CACHE_KEY "5ded" SYSTEM_PACKAGE ${YUZU_USE_SYSTEM_OPUS}
) )
# FFMpeg # FFMpeg
@ -290,31 +277,36 @@ endif()
if (YUZU_USE_EXTERNAL_VULKAN_HEADERS) if (YUZU_USE_EXTERNAL_VULKAN_HEADERS)
set(CPM_USE_LOCAL_PACKAGES OFF) set(CPM_USE_LOCAL_PACKAGES OFF)
else() else()
set(CPM_USE_LOCAL_PACKAGES ON) set(CPM_USE_LOCAL_PACKAGES OFF)
endif() endif()
# TODO(crueter): System vk-headers are too new for externals vk-util # TODO(crueter): Vk1.4 impl
CPMAddPackage( # TODO(crueter): allow sys packages?
AddPackage(
NAME VulkanHeaders NAME VulkanHeaders
VERSION 1.3.274 VERSION 1.3.274
URL "https://github.com/KhronosGroup/Vulkan-Headers/archive/89268a6d17.zip" REPO "KhronosGroup/Vulkan-Headers"
URL_HASH SHA512=3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8 SHA 89268a6d17
CUSTOM_CACHE_KEY "8926" HASH 3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_HEADERS}
) )
# Vulkan-Utility-Libraries # CMake's interface generator sucks
if (YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES) if (VulkanHeaders_ADDED)
set(CPM_USE_LOCAL_PACKAGES OFF) target_include_directories(Vulkan-Headers INTERFACE ${VulkanHeaders_SOURCE_DIR}/include)
else()
set(CPM_USE_LOCAL_PACKAGES ON)
endif() endif()
CPMAddPackage( set(VulkanHeaders_SOURCE_DIR "${VulkanHeaders_SOURCE_DIR}" PARENT_SCOPE)
set(VulkanHeaders_ADDED "${VulkanHeaders_ADDED}" PARENT_SCOPE)
# Vulkan-Utility-Libraries
AddPackage(
NAME VulkanUtilityLibraries NAME VulkanUtilityLibraries
URL "https://github.com/KhronosGroup/Vulkan-Utility-Libraries/archive/df2e358152.zip" REPO "KhronosGroup/Vulkan-Utility-Libraries"
URL_HASH SHA512=3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79 SHA df2e358152
CUSTOM_CACHE_KEY "df2e" HASH 3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES}
) )
set(VulkanUtilityLibraries_SOURCE_DIR "${VulkanUtilityLibraries_SOURCE_DIR}" PARENT_SCOPE) set(VulkanUtilityLibraries_SOURCE_DIR "${VulkanUtilityLibraries_SOURCE_DIR}" PARENT_SCOPE)
@ -322,38 +314,35 @@ set(VulkanUtilityLibraries_ADDED "${VulkanUtilityLibraries_ADDED}" PARENT_SCOPE)
# SPIRV-Tools # SPIRV-Tools
if (YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS) if (YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS)
CPMAddPackage( AddPackage(
NAME SPIRV-Tools NAME SPIRV-Tools
URL "https://github.com/KhronosGroup/SPIRV-Tools/archive/40eb301f32.zip" REPO "KhronosGroup/SPIRV-Tools"
URL_HASH SHA512=58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa SHA 40eb301f32
HASH 58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa
OPTIONS OPTIONS
"SPIRV_SKIP_EXECUTABLES ON" "SPIRV_SKIP_EXECUTABLES ON"
CUSTOM_CACHE_KEY "40eb"
) )
endif() endif()
# Boost headers # Boost headers
set(CPM_USE_LOCAL_PACKAGES OFF) AddPackage(
CPMAddPackage(
NAME boost_headers NAME boost_headers
URL "https://github.com/boostorg/headers/archive/0456900fad.zip" REPO "boostorg/headers"
URL_HASH SHA512=50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3 SHA 0456900fad
CUSTOM_CACHE_KEY "0456" HASH 50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3
) )
# TZDB (Time Zone Database) # TZDB (Time Zone Database)
add_subdirectory(nx_tzdb) add_subdirectory(nx_tzdb)
# VMA # VMA
set(CPM_USE_LOCAL_PACKAGES ON) AddPackage(
CPMAddPackage(
NAME VulkanMemoryAllocator NAME VulkanMemoryAllocator
URL "https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/archive/1076b348ab.zip" REPO "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator"
URL_HASH SHA512=a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772 SHA 1076b348ab
HASH a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772
FIND_PACKAGE_ARGUMENTS "CONFIG" FIND_PACKAGE_ARGUMENTS "CONFIG"
CUSTOM_CACHE_KEY "1076" # SYSTEM_PACKAGE ON
) )
set(VulkanMemoryAllocator_SOURCE_DIR "${VulkanMemoryAllocator_SOURCE_DIR}" PARENT_SCOPE) set(VulkanMemoryAllocator_SOURCE_DIR "${VulkanMemoryAllocator_SOURCE_DIR}" PARENT_SCOPE)
@ -389,15 +378,13 @@ endif()
if (ANDROID) if (ANDROID)
if (ARCHITECTURE_arm64) if (ARCHITECTURE_arm64)
set(CPM_USE_LOCAL_PACKAGES OFF) AddPackage(
CPMAddPackage(
NAME libadrenotools NAME libadrenotools
URL "https://github.com/bylaws/libadrenotools/archive/8fae8ce254.zip" REPO "bylaws/libadrenotools"
URL_HASH SHA512=c74fa855f0edebbf25c9bce40b00966daa2447bfc5e15f0cf1a95f86cbf70fc6b02590707edbde16328a0a2a4fb9a1fc419d2dfc22a4a4150971be91892d4edb SHA 8fae8ce254
HASH c74fa855f0edebbf25c9bce40b00966daa2447bfc5e15f0cf1a95f86cbf70fc6b02590707edbde16328a0a2a4fb9a1fc419d2dfc22a4a4150971be91892d4edb
PATCHES PATCHES
${CMAKE_SOURCE_DIR}/.patch/libadrenotools/0001-linkerns-cpm.patch ${CMAKE_SOURCE_DIR}/.patch/libadrenotools/0001-linkerns-cpm.patch
CUSTOM_CACHE_KEY "8fae"
) )
endif() endif()
endif() endif()
@ -422,13 +409,12 @@ if (YUZU_CRASH_DUMPS AND NOT TARGET libbreakpad_client)
_CRT_NONSTDC_NO_DEPRECATE _CRT_NONSTDC_NO_DEPRECATE
) )
set(CPM_USE_LOCAL_PACKAGES OFF) AddPackage(
CPMAddPackage(
NAME breakpad NAME breakpad
URL "https://github.com/google/breakpad/archive/f80f288803.zip" URL "google/breakpad"
URL_HASH SHA512=4a87ee88cea99bd633d52a5b00135a649f1475e3b65db325a6df9c804ab82b054ad7e62419b35f6e22cc5dfbbb569214041d7ad5d10fab10106e700bb5050e1d SHA f80f288803
HASH 4a87ee88cea99bd633d52a5b00135a649f1475e3b65db325a6df9c804ab82b054ad7e62419b35f6e22cc5dfbbb569214041d7ad5d10fab10106e700bb5050e1d
DOWNLOAD_ONLY YES DOWNLOAD_ONLY YES
CUSTOM_CACHE_KEY "f80f"
) )
# libbreakpad # libbreakpad
@ -528,14 +514,11 @@ endif()
# oboe # oboe
if (ANDROID) if (ANDROID)
set(CPM_USE_LOCAL_PACKAGES ON) AddPackage(
CPMAddPackage(
NAME oboe NAME oboe
URL "https://github.com/google/oboe/archive/2bc873e53c.zip" REPO "google/oboe"
URL_HASH SHA512=02329058a7f9cf7d5039afaae5ab170d9f42f60f4c01e21eaf4f46073886922b057a9ae30eeac040b3ac182f51b9c1bfe9fe1050a2c9f6ce567a1a9a0ec2c768 SHA 2bc873e53c
OPTIONS HASH 02329058a7f9cf7d5039afaae5ab170d9f42f60f4c01e21eaf4f46073886922b057a9ae30eeac040b3ac182f51b9c1bfe9fe1050a2c9f6ce567a1a9a0ec2c768
"SPIRV_SKIP_EXECUTABLES ON"
CUSTOM_CACHE_KEY "2bc8"
) )
add_library(oboe::oboe ALIAS oboe) add_library(oboe::oboe ALIAS oboe)

View file

@ -19,14 +19,11 @@ if (NOT WIN32 AND NOT ANDROID)
message(FATAL_ERROR "Required program `autoconf` not found.") message(FATAL_ERROR "Required program `autoconf` not found.")
endif() endif()
include(CPM) AddPackage(
set(CPM_USE_LOCAL_PACKAGES OFF)
CPMAddPackage(
NAME ffmpeg NAME ffmpeg
URL "https://github.com/FFmpeg/FFmpeg/archive/c2184b65d2.zip" REPO "FFmpeg/FFmpeg"
URL_HASH SHA512=2a89d664119debbb3c006ab1c48d5d7f26e889f4a65ad2e25c8b0503308295123d5a9c5c78bf683aef5ff09acef8c3fc2837f22d3e8c611528b933bf03bcdd97 SHA c2184b65d2
CUSTOM_CACHE_KEY "c218" HASH 2a89d664119debbb3c006ab1c48d5d7f26e889f4a65ad2e25c8b0503308295123d5a9c5c78bf683aef5ff09acef8c3fc2837f22d3e8c611528b933bf03bcdd97
) )
set(FFmpeg_PREFIX ${ffmpeg_SOURCE_DIR}) set(FFmpeg_PREFIX ${ffmpeg_SOURCE_DIR})
@ -243,7 +240,7 @@ elseif(ANDROID)
message(FATAL_ERROR "Unsupported architecture for Android FFmpeg") message(FATAL_ERROR "Unsupported architecture for Android FFmpeg")
endif() endif()
download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH) download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH 7.1.1)
set(FFmpeg_FOUND YES) set(FFmpeg_FOUND YES)
set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE)
set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/lib" CACHE PATH "Path to FFmpeg library directory" FORCE) set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/lib" CACHE PATH "Path to FFmpeg library directory" FORCE)
@ -268,7 +265,7 @@ elseif(WIN32)
# Use yuzu FFmpeg binaries # Use yuzu FFmpeg binaries
set(FFmpeg_EXT_NAME "ffmpeg-7.1.1") set(FFmpeg_EXT_NAME "ffmpeg-7.1.1")
download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH) download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH 7.1.1)
set(FFmpeg_FOUND YES) set(FFmpeg_FOUND YES)
set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE)
set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg library directory" FORCE) set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg library directory" FORCE)

View file

@ -232,3 +232,5 @@ if (ANDROID)
add_subdirectory(android/app/src/main/jni) add_subdirectory(android/app/src/main/jni)
target_include_directories(yuzu-android PRIVATE android/app/src/main) target_include_directories(yuzu-android PRIVATE android/app/src/main)
endif() endif()
include(GenerateDepHashes)

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2025 Eden Emulator Project // SPDX-FileCopyrightText: 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
@ -91,7 +94,8 @@ class AboutFragment : Fragment() {
} }
} }
binding.buttonDiscord.setOnClickListener { openLink(getString(R.string.support_link)) } binding.buttonDiscord.setOnClickListener { openLink(getString(R.string.discord_link)) }
binding.buttonRevolt.setOnClickListener { openLink(getString(R.string.revolt_link)) }
binding.buttonWebsite.setOnClickListener { openLink(getString(R.string.website_link)) } binding.buttonWebsite.setOnClickListener { openLink(getString(R.string.website_link)) }
binding.buttonGithub.setOnClickListener { openLink(getString(R.string.github_link)) } binding.buttonGithub.setOnClickListener { openLink(getString(R.string.github_link)) }

View file

@ -3,6 +3,7 @@
package org.yuzu.yuzu_emu.ui package org.yuzu.yuzu_emu.ui
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
@ -94,6 +95,7 @@ class GamesFragment : Fragment() {
return binding.root return binding.root
} }
@SuppressLint("NotifyDataSetChanged")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
homeViewModel.setStatusBarShadeVisibility(true) homeViewModel.setStatusBarShadeVisibility(true)

View file

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<!-- Scaling isn't perfect but I spent like 10 minutes trying to calculate this and I'm tired -->
<group
android:scaleX="2.987"
android:scaleY="2.987"
android:translateX="-107.15"
android:translateY="-109.35">
<path
android:pathData="M42.7,71.38C42.7,60.74 42.7,53.76 42.7,44.7L35.91,36.62H57.87C60.48,36.62 62.77,37.09 64.72,38.03C66.68,38.97 68.2,40.32 69.29,42.08C70.37,43.85 70.92,45.97 70.92,48.43C70.92,50.92 70.36,53.02 69.24,54.73C68.13,56.44 66.56,57.73 64.55,58.6C62.55,59.47 60.21,59.91 57.53,59.91H48.47V52.57H55.61C56.73,52.57 57.69,52.44 58.47,52.17C59.28,51.88 59.89,51.44 60.31,50.83C60.75,50.21 60.96,49.42 60.96,48.43C60.96,47.44 60.75,46.63 60.31,46C59.89,45.37 59.28,44.91 58.47,44.61C57.69,44.31 56.73,44.15 55.61,44.15H52.24V71.38H42.7ZM63.3,55.43L72.09,71.38H61.72L53.14,55.43H63.3Z"
android:fillColor="#FF005C"/>
</group></vector>

View file

@ -219,6 +219,17 @@
app:iconSize="24dp" app:iconSize="24dp"
app:iconPadding="0dp" /> app:iconPadding="0dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button_revolt"
style="@style/EdenButton.Secondary"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_marginEnd="12dp"
app:icon="@drawable/ic_revolt"
app:iconGravity="textStart"
app:iconSize="24dp"
app:iconPadding="0dp" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/button_website" android:id="@+id/button_website"
style="@style/EdenButton.Secondary" style="@style/EdenButton.Secondary"

View file

@ -66,7 +66,7 @@
android:orientation="vertical"> android:orientation="vertical">
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
style="@style/SynthwaveText.Header" style="@style/TextAppearance.Material3.TitleMedium"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAlignment="viewStart" android:textAlignment="viewStart"
@ -101,7 +101,7 @@
android:orientation="vertical"> android:orientation="vertical">
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
style="@style/SynthwaveText.Header" style="@style/TextAppearance.Material3.TitleMedium"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAlignment="viewStart" android:textAlignment="viewStart"
@ -213,6 +213,18 @@
app:iconGravity="textStart" app:iconGravity="textStart"
app:iconPadding="0dp" /> app:iconPadding="0dp" />
<com.google.android.material.button.MaterialButton
style="@style/EdenButton.Secondary"
android:id="@+id/button_revolt"
android:layout_width="0dp"
android:layout_height="56dp"
android:layout_weight="1"
android:layout_marginEnd="8dp"
app:icon="@drawable/ic_revolt"
app:iconSize="24dp"
app:iconGravity="textStart"
app:iconPadding="0dp" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
style="@style/EdenButton.Secondary" style="@style/EdenButton.Secondary"
android:id="@+id/button_website" android:id="@+id/button_website"

View file

@ -226,6 +226,64 @@
<color name="yuzu_inversePrimary_gray">#B7B7B7</color> <color name="yuzu_inversePrimary_gray">#B7B7B7</color>
<color name="yuzu_surfaceTint_gray">#B7B7B7</color> <color name="yuzu_surfaceTint_gray">#B7B7B7</color>
<!-- Eden Theme Colors -->
<!-- Synthwave/Vaporwave Primary Colors -->
<color name="eden_primary">#FF0080</color> <!-- Neon magenta -->
<color name="eden_primary_variant">#E6006B</color> <!-- Darker magenta -->
<color name="eden_secondary">#00FFFF</color> <!-- Electric cyan -->
<color name="eden_secondary_variant">#00E6E6</color> <!-- Darker cyan -->
<!-- Background Colors - Deep space black -->
<color name="eden_background">#000000</color> <!-- Pure black background -->
<color name="eden_surface">#0D0D0D</color> <!-- Card surface -->
<color name="eden_surface_variant">#1A1A1A</color> <!-- Elevated surface -->
<!-- Text Colors - High contrast for readability -->
<color name="eden_on_background">#FFFFFF</color> <!-- Pure white text -->
<color name="eden_on_surface">#FFFFFF</color> <!-- Pure white text -->
<color name="eden_on_primary">#FFFFFF</color> <!-- White on neon -->
<color name="eden_on_secondary">#000000</color> <!-- Black on cyan -->
<!-- Synthwave Status Colors -->
<color name="eden_error">#FF0040</color> <!-- Neon red -->
<color name="eden_success">#00FF80</color> <!-- Neon green -->
<color name="eden_warning">#FFFF00</color> <!-- Neon yellow -->
<color name="eden_info">#0080FF</color> <!-- Electric blue -->
<!-- Synthwave Accent Colors -->
<color name="eden_accent_purple">#9D00FF</color> <!-- Electric purple -->
<color name="eden_accent_blue">#0080FF</color> <!-- Electric blue -->
<color name="eden_accent_orange">#FF8000</color> <!-- Neon orange -->
<!-- Neon Glow Effects -->
<color name="eden_glow_pink">#80FF0080</color> <!-- Magenta glow -->
<color name="eden_glow_cyan">#8060D1F6</color> <!-- Cyan glow -->
<color name="eden_glow_orange">#80FF8000</color> <!-- Orange glow -->
<!-- Neon Border Colors -->
<color name="eden_border">#7c757f</color> <!-- Subtle border -->
<color name="eden_border_light">#948b98</color> <!-- Lighter border -->
<color name="eden_border_gradient_start">#FF0080</color> <!-- Neon magenta -->
<color name="eden_border_gradient_end">#60D1F6</color> <!-- Electric cyan -->
<!-- Overlay Colors -->
<color name="eden_overlay">#CC000000</color>
<!-- Neon Button Colors -->
<color name="eden_button_primary_bg">#FF0080</color> <!-- Neon magenta -->
<color name="eden_button_secondary_bg">#00000000</color> <!-- Transparent -->
<color name="eden_button_secondary_border">#00FFFF</color> <!-- Electric cyan -->
<!-- Synthwave Card Colors -->
<color name="eden_card_background">#0D0D0D</color> <!-- Almost black -->
<color name="eden_card_background_elevated">#1A1A1A</color> <!-- Elevated black -->
<!-- Transparent versions for gradients -->
<color name="eden_transparent">#00000000</color>
<color name="eden_primary_transparent">#05FF0080</color>
<color name="eden_secondary_transparent">#0500FFFF</color>
<!-- Common Colors Across All Themes --> <!-- Common Colors Across All Themes -->
<color name="yuzu_transparent_black">#80000000</color> <color name="yuzu_transparent_black">#80000000</color>
<color name="yuzu_outlineVariant">#C6C5D0</color> <color name="yuzu_outlineVariant">#C6C5D0</color>

View file

@ -1,84 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Synthwave/Vaporwave Primary Colors -->
<color name="eden_primary">#FF0080</color> <!-- Neon magenta -->
<color name="eden_primary_variant">#E6006B</color> <!-- Darker magenta -->
<color name="eden_secondary">#00FFFF</color> <!-- Electric cyan -->
<color name="eden_secondary_variant">#00E6E6</color> <!-- Darker cyan -->
<!-- Background Colors - Deep space black -->
<color name="eden_background">#000000</color> <!-- Pure black background -->
<color name="eden_surface">#0D0D0D</color> <!-- Card surface -->
<color name="eden_surface_variant">#1A1A1A</color> <!-- Elevated surface -->
<!-- Text Colors - High contrast for readability -->
<color name="eden_on_background">#FFFFFF</color> <!-- Pure white text -->
<color name="eden_on_surface">#FFFFFF</color> <!-- Pure white text -->
<color name="eden_on_primary">#FFFFFF</color> <!-- White on neon -->
<color name="eden_on_secondary">#000000</color> <!-- Black on cyan -->
<!-- Synthwave Accent Colors -->
<color name="eden_accent_pink">#FF0080</color> <!-- Neon magenta -->
<color name="eden_accent_purple">#9D00FF</color> <!-- Electric purple -->
<color name="eden_accent_blue">#0080FF</color> <!-- Electric blue -->
<color name="eden_accent_orange">#FF8000</color> <!-- Neon orange -->
<!-- Synthwave Gradient Colors -->
<color name="eden_gradient_start">#FF0080</color> <!-- Neon magenta -->
<color name="eden_gradient_middle">#9D00FF</color> <!-- Electric purple -->
<color name="eden_gradient_end">#00FFFF</color> <!-- Electric cyan -->
<!-- Neon Glow Effects -->
<color name="eden_glow_pink">#80FF0080</color> <!-- Magenta glow -->
<color name="eden_glow_cyan">#8000FFFF</color> <!-- Cyan glow -->
<color name="eden_glow_purple">#809D00FF</color> <!-- Purple glow -->
<color name="eden_glow_orange">#80FF8000</color> <!-- Orange glow -->
<!-- Neon Border Colors -->
<color name="eden_border">#7c757f</color> <!-- Subtle border -->
<color name="eden_border_light">#948b98</color> <!-- Lighter border -->
<color name="eden_border_gradient_start">#FF0080</color> <!-- Neon magenta -->
<color name="eden_border_gradient_end">#00FFFF</color> <!-- Electric cyan -->
<!-- Retro Grid Pattern -->
<color name="eden_grid_line">#1A1A1A</color> <!-- Grid lines -->
<color name="eden_grid_line_accent">#FF0080</color> <!-- Neon grid lines -->
<color name="eden_grid_line_cyan">#00FFFF</color> <!-- Cyan grid lines -->
<!-- Synthwave Status Colors -->
<color name="eden_error">#FF0040</color> <!-- Neon red -->
<color name="eden_success">#00FF80</color> <!-- Neon green -->
<color name="eden_warning">#FFFF00</color> <!-- Neon yellow -->
<color name="eden_info">#0080FF</color> <!-- Electric blue -->
<!-- Overlay Colors -->
<color name="eden_overlay_dark">#CC000000</color>
<color name="eden_overlay_medium">#80000000</color>
<color name="eden_overlay_light">#33000000</color>
<!-- Neon Button Colors -->
<color name="eden_button_primary_bg">#FF0080</color> <!-- Neon magenta -->
<color name="eden_button_secondary_bg">#00000000</color> <!-- Transparent -->
<color name="eden_button_secondary_border">#00FFFF</color> <!-- Electric cyan -->
<!-- Synthwave Card Colors -->
<color name="eden_card_background">#0D0D0D</color> <!-- Almost black -->
<color name="eden_card_background_elevated">#1A1A1A</color> <!-- Elevated black -->
<!-- Retro Navigation Colors -->
<color name="eden_nav_background">#000000</color> <!-- Pure black -->
<color name="eden_nav_selected">#FF0080</color> <!-- Neon magenta -->
<color name="eden_nav_unselected">#666666</color> <!-- Gray -->
<!-- Transparent versions for gradients -->
<color name="eden_transparent">#00000000</color>
<color name="eden_primary_transparent">#05FF0080</color>
<color name="eden_secondary_transparent">#0500FFFF</color>
<!-- Additional Synthwave Colors -->
<color name="eden_scan_line">#33FF0080</color> <!-- Scan line effect -->
<color name="eden_hologram">#1A00FFFF</color> <!-- Holographic effect -->
<color name="eden_neon_outline">#FFFF0080</color> <!-- Neon outline -->
</resources>

View file

@ -440,9 +440,10 @@
<string name="user_data_import_success">User data imported successfully</string> <string name="user_data_import_success">User data imported successfully</string>
<string name="user_data_export_cancelled">Export cancelled</string> <string name="user_data_export_cancelled">Export cancelled</string>
<string name="user_data_import_failed_description">Make sure the user data folders are at the root of the zip folder and contain a config file at config/config.ini and try again.</string> <string name="user_data_import_failed_description">Make sure the user data folders are at the root of the zip folder and contain a config file at config/config.ini and try again.</string>
<string name="support_link">https://discord.gg/edenemu</string> <string name="discord_link" translatable="false">https://discord.gg/kXAmGCXBGD</string>
<string name="website_link">https://eden-emulator.github.io</string> <string name="revolt_link" translatable="false">https://rvlt.gg/qKgFEAbH</string>
<string name="github_link">https://git.eden-emu.dev/eden-emu</string> <string name="website_link" translatable="false">https://eden-emu.dev</string>
<string name="github_link" translatable="false">https://git.eden-emu.dev/eden-emu</string>
<!-- General settings strings --> <!-- General settings strings -->
<string name="frame_limit_enable">Limit speed</string> <string name="frame_limit_enable">Limit speed</string>

View file

@ -64,7 +64,7 @@
<item name="android:windowLightStatusBar">false</item> <item name="android:windowLightStatusBar">false</item>
<item name="android:windowLightNavigationBar">false</item> <item name="android:windowLightNavigationBar">false</item>
<!-- Other theme attributes --> <!-- Other theme attributes -->
<item name="android:shadowColor">@color/eden_overlay_dark</item> <item name="android:shadowColor">@color/eden_overlay</item>
<item name="sliderStyle">@style/EdenSlider</item> <item name="sliderStyle">@style/EdenSlider</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:enforceStatusBarContrast">false</item> <item name="android:enforceStatusBarContrast">false</item>

View file

@ -221,6 +221,64 @@
<color name="yuzu_inversePrimary_gray">#BDBDBD</color> <color name="yuzu_inversePrimary_gray">#BDBDBD</color>
<color name="yuzu_surfaceTint_gray">#9E9E9E</color> <color name="yuzu_surfaceTint_gray">#9E9E9E</color>
<!-- Eden Theme Colors -->
<!-- Synthwave/Vaporwave Primary Colors -->
<color name="eden_primary">#FF0080</color> <!-- Neon magenta -->
<color name="eden_primary_variant">#E6006B</color> <!-- Darker magenta -->
<color name="eden_secondary">#60D1F6</color> <!-- Electric cyan -->
<color name="eden_secondary_variant">#00E6E6</color> <!-- Darker cyan -->
<!-- Background Colors - White -->
<color name="eden_background">#FFFFFF</color> <!-- Pure black background -->
<color name="eden_surface">#FFFFFF</color> <!-- Card surface -->
<color name="eden_surface_variant">#D3D3D3</color> <!-- Elevated surface -->
<!-- Text Colors - High contrast for readability -->
<color name="eden_on_background">#000000</color> <!-- Pure black text -->
<color name="eden_on_surface">#000000</color> <!-- Pure black text -->
<color name="eden_on_primary">#FFFFFF</color> <!-- White on neon -->
<color name="eden_on_secondary">#C0C0C0</color> <!-- Milky White on cyan -->
<!-- Synthwave Accent Colors -->
<color name="eden_accent_purple">#9D00FF</color> <!-- Electric purple -->
<color name="eden_accent_blue">#0080FF</color> <!-- Electric blue -->
<color name="eden_accent_orange">#FF8000</color> <!-- Neon orange -->
<!-- Neon Glow Effects -->
<color name="eden_glow_pink">#80FF0080</color> <!-- Magenta glow -->
<color name="eden_glow_cyan">#8060D1F6</color> <!-- Cyan glow -->
<color name="eden_glow_orange">#80FF8000</color> <!-- Orange glow -->
<!-- Neon Border Colors -->
<color name="eden_border">#7c757f</color> <!-- Subtle border -->
<color name="eden_border_light">#948b98</color> <!-- Lighter border -->
<color name="eden_border_gradient_start">#FF0080</color> <!-- Neon magenta -->
<color name="eden_border_gradient_end">#60D1F6</color> <!-- Electric cyan -->
<!-- Synthwave Status Colors -->
<color name="eden_error">#FF0040</color> <!-- Neon red -->
<color name="eden_success">#00FF80</color> <!-- Neon green -->
<color name="eden_warning">#FFFF00</color> <!-- Neon yellow -->
<color name="eden_info">#0080FF</color> <!-- Electric blue -->
<!-- Overlay Colors -->
<color name="eden_overlay">#CCFFFFFF</color>
<!-- Neon Button Colors -->
<color name="eden_button_primary_bg">#FF0080</color> <!-- Neon magenta -->
<color name="eden_button_secondary_bg">#00000000</color> <!-- Transparent -->
<color name="eden_button_secondary_border">#60D1F6</color> <!-- Electric cyan -->
<!-- Synthwave Card Colors -->
<color name="eden_card_background">#F0F0F0</color> <!-- Almost white -->
<color name="eden_card_background_elevated">#D8D8D8</color> <!-- Elevated white -->
<!-- Transparent versions for gradients -->
<color name="eden_transparent">#00000000</color>
<color name="eden_primary_transparent">#05FF0080</color>
<color name="eden_secondary_transparent">#0500FFFF</color>
<!-- Common Colors Across All Themes --> <!-- Common Colors Across All Themes -->
<color name="yuzu_outlineVariant">#C6C5D0</color> <color name="yuzu_outlineVariant">#C6C5D0</color>
<color name="yuzu_error">#BA1A1A</color> <color name="yuzu_error">#BA1A1A</color>
@ -230,7 +288,8 @@
<color name="yuzu_shadow">#000000</color> <color name="yuzu_shadow">#000000</color>
<color name="yuzu_scrim">#000000</color> <color name="yuzu_scrim">#000000</color>
<color name="yuzu_transparent_black">#80000000</color> <color name="yuzu_transparent_black">#80000000</color>
<!-- Values used in dark mode but here are jsut white / black values-->
<!-- Values used in dark mode but here are just white / black values-->
<color name="yuzu_onPrimary_blue">#FFFFFF</color> <color name="yuzu_onPrimary_blue">#FFFFFF</color>
<color name="yuzu_onSecondary_blue">#FFFFFF</color> <color name="yuzu_onSecondary_blue">#FFFFFF</color>
<color name="yuzu_onTertiary_blue">#FFFFFF</color> <color name="yuzu_onTertiary_blue">#FFFFFF</color>

View file

@ -159,7 +159,8 @@ add_library(
wall_clock.cpp wall_clock.cpp
wall_clock.h wall_clock.h
zstd_compression.cpp zstd_compression.cpp
zstd_compression.h) zstd_compression.h
)
if(YUZU_ENABLE_PORTABLE) if(YUZU_ENABLE_PORTABLE)
add_compile_definitions(YUZU_ENABLE_PORTABLE) add_compile_definitions(YUZU_ENABLE_PORTABLE)

View file

@ -391,14 +391,14 @@ void ProfileManager::ParseUserSaveFile() {
if (!save.IsOpen()) { if (!save.IsOpen()) {
LOG_WARNING(Service_ACC, "Failed to load profile data from save data... Generating new " LOG_WARNING(Service_ACC, "Failed to load profile data from save data... Generating new "
"user 'yuzu' with random UUID."); "user 'eden' with random UUID.");
return; return;
} }
ProfileDataRaw data; ProfileDataRaw data;
if (!save.ReadObject(data)) { if (!save.ReadObject(data)) {
LOG_WARNING(Service_ACC, "profiles.dat is smaller than expected... Generating new user " LOG_WARNING(Service_ACC, "profiles.dat is smaller than expected... Generating new user "
"'yuzu' with random UUID."); "'eden' with random UUID.");
return; return;
} }

20
src/dep_hashes.h.in Normal file
View file

@ -0,0 +1,20 @@
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
namespace Common {
static const constexpr std::array<const char *, @DEPS_LENGTH@> dep_names = {
@DEP_NAMES@
};
static const constexpr std::array<const char *, @DEPS_LENGTH@> dep_hashes = {
@DEP_SHAS@
};
static const constexpr std::array<const char *, @DEPS_LENGTH@> dep_urls = {
@DEP_URLS@
};
} // namespace Common

View file

@ -1,4 +1,4 @@
include(CPM) include(CPMUtil)
# Always build externals as static libraries, even when dynarmic is built as shared # Always build externals as static libraries, even when dynarmic is built as shared
if (BUILD_SHARED_LIBS) if (BUILD_SHARED_LIBS)
@ -22,12 +22,12 @@ set(BUILD_TESTING OFF)
if ("riscv" IN_LIST ARCHITECTURE) if ("riscv" IN_LIST ARCHITECTURE)
add_subdirectory(biscuit) add_subdirectory(biscuit)
CPMAddPackage( AddPackage(
NAME biscuit NAME biscuit
VERSION 0.9.1 VERSION 0.9.1
URL "https://github.com/lioncash/biscuit/archive/76b0be8dae.zip" REPO "lioncash/biscuit"
URL_HASH SHA512=47d55ed02d032d6cf3dc107c6c0a9aea686d5f25aefb81d1af91db027b6815bd5add1755505e19d76625feeb17aa2db6cd1668fe0dad2e6a411519bde6ca4489 SHA 76b0be8dae
CUSTOM_CACHE_KEY "76b0" HASH 47d55ed02d032d6cf3dc107c6c0a9aea686d5f25aefb81d1af91db027b6815bd5add1755505e19d76625feeb17aa2db6cd1668fe0dad2e6a411519bde6ca4489
) )
endif() endif()
@ -49,14 +49,14 @@ if (NOT TARGET fmt::fmt)
endif() endif()
# mcl # mcl
CPMAddPackage( AddPackage(
NAME mcl NAME mcl
VERSION 0.1.12 VERSION 0.1.12
URL "https://github.com/azahar-emu/mcl/archive/7b08d83418.zip" REPO "azahar-emu/mcl"
URL_HASH SHA512=f943bac39c1879986decad7a442ff4288eaeca4a2907684c7914e115a55ecc43c2782ded85c0835763fe04e40d5c82220ce864423e489e648e408a84f54dc4f3 SHA 7b08d83418
HASH f943bac39c1879986decad7a442ff4288eaeca4a2907684c7914e115a55ecc43c2782ded85c0835763fe04e40d5c82220ce864423e489e648e408a84f54dc4f3
OPTIONS OPTIONS
"MCL_INSTALL OFF" "MCL_INSTALL OFF"
CUSTOM_CACHE_KEY "7b08"
) )
# oaknut # oaknut
@ -71,14 +71,14 @@ CPMAddPackage(
# unordered_dense # unordered_dense
CPMAddPackage( AddPackage(
NAME unordered_dense NAME unordered_dense
URL "https://github.com/Lizzie841/unordered_dense/archive/e59d30b7b1.zip" REPO "Lizzie841/unordered_dense"
URL_HASH SHA512=71eff7bd9ba4b9226967bacd56a8ff000946f8813167cb5664bb01e96fb79e4e220684d824fe9c59c4d1cc98c606f13aff05b7940a1ed8ab3c95d6974ee34fa0 SHA e59d30b7b1
HASH 71eff7bd9ba4b9226967bacd56a8ff000946f8813167cb5664bb01e96fb79e4e220684d824fe9c59c4d1cc98c606f13aff05b7940a1ed8ab3c95d6974ee34fa0
FIND_PACKAGE_ARGUMENTS "CONFIG" FIND_PACKAGE_ARGUMENTS "CONFIG"
OPTIONS OPTIONS
"UNORDERED_DENSE_INSTALL OFF" "UNORDERED_DENSE_INSTALL OFF"
CUSTOM_CACHE_KEY "e59d"
) )
# xbyak # xbyak
@ -93,24 +93,24 @@ CPMAddPackage(
# zydis # zydis
if ("x86_64" IN_LIST ARCHITECTURE) if ("x86_64" IN_LIST ARCHITECTURE)
CPMAddPackage( AddPackage(
NAME Zycore NAME Zycore
URL "https://github.com/zyantific/zycore-c/archive/75a36c45ae.zip" REPO "zyantific/zycore-c"
URL_HASH SHA512=15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924 SHA 75a36c45ae
CUSTOM_CACHE_KEY "75a3" HASH 15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924
) )
CPMAddPackage( AddPackage(
NAME Zydis NAME Zydis
VERSION 4 VERSION 4
URL "https://github.com/zyantific/zydis/archive/c2d2bab025.zip" REPO "zyantific/zydis"
URL_HASH SHA512=7b48f213ff7aab2926f8c9c65195959143bebbfb2b9a25051ffd8b8b0f1baf1670d9739781de674577d955925f91ac89376e16b476a03828c84e2fd765d45020 SHA c2d2bab025
HASH 7b48f213ff7aab2926f8c9c65195959143bebbfb2b9a25051ffd8b8b0f1baf1670d9739781de674577d955925f91ac89376e16b476a03828c84e2fd765d45020
OPTIONS OPTIONS
"ZYDIS_BUILD_TOOLS OFF" "ZYDIS_BUILD_TOOLS OFF"
"ZYDIS_BUILD_EXAMPLES OFF" "ZYDIS_BUILD_EXAMPLES OFF"
"ZYDIS_BUILD_DOXYGEN OFF" "ZYDIS_BUILD_DOXYGEN OFF"
"ZYAN_ZYCORE_PATH ${Zycore_SOURCE_DIR}" "ZYAN_ZYCORE_PATH ${Zycore_SOURCE_DIR}"
"CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON" "CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON"
CUSTOM_CACHE_KEY "c2d2"
) )
endif() endif()

View file

@ -14,19 +14,34 @@ template<typename... Ts>
assert_terminate_impl(expr_str, msg, fmt::make_format_args(args...)); assert_terminate_impl(expr_str, msg, fmt::make_format_args(args...));
} }
// Temporary until MCL is fully removed
#ifndef ASSERT_MSG
#define ASSERT_MSG(_a_, ...) \ #define ASSERT_MSG(_a_, ...) \
([&]() { \ ([&]() { \
if (!(_a_)) [[unlikely]] { \ if (!(_a_)) [[unlikely]] { \
assert_terminate(#_a_, __VA_ARGS__); \ assert_terminate(#_a_, __VA_ARGS__); \
} \ } \
}()) }())
#endif
#ifndef ASSERT
#define ASSERT(_a_) ASSERT_MSG(_a_, "") #define ASSERT(_a_) ASSERT_MSG(_a_, "")
#endif
#ifndef UNREACHABLE
#define UNREACHABLE() ASSERT_MSG(false, "unreachable") #define UNREACHABLE() ASSERT_MSG(false, "unreachable")
#endif
#ifdef _DEBUG #ifdef _DEBUG
#ifndef DEBUG_ASSERT
#define DEBUG_ASSERT(_a_) ASSERT(_a_) #define DEBUG_ASSERT(_a_) ASSERT(_a_)
#endif
#ifndef DEBUG_ASSERT_MSG
#define DEBUG_ASSERT_MSG(_a_, ...) ASSERT_MSG(_a_, __VA_ARGS__) #define DEBUG_ASSERT_MSG(_a_, ...) ASSERT_MSG(_a_, __VA_ARGS__)
#endif
#else // not debug #else // not debug
#ifndef DEBUG_ASSERT
#define DEBUG_ASSERT(_a_) #define DEBUG_ASSERT(_a_)
#endif
#ifndef DEBUG_ASSERT_MSG
#define DEBUG_ASSERT_MSG(_a_, _desc_, ...) #define DEBUG_ASSERT_MSG(_a_, _desc_, ...)
#endif #endif
#endif

View file

@ -23,13 +23,13 @@ namespace Core {
static constexpr std::chrono::seconds announce_time_interval(15); static constexpr std::chrono::seconds announce_time_interval(15);
AnnounceMultiplayerSession::AnnounceMultiplayerSession() { AnnounceMultiplayerSession::AnnounceMultiplayerSession() {
//#ifdef ENABLE_WEB_SERVICE #ifdef ENABLE_WEB_SERVICE
backend = std::make_unique<WebService::RoomJson>(Settings::values.web_api_url.GetValue(), backend = std::make_unique<WebService::RoomJson>(Settings::values.web_api_url.GetValue(),
Settings::values.eden_username.GetValue(), Settings::values.eden_username.GetValue(),
Settings::values.eden_token.GetValue()); Settings::values.eden_token.GetValue());
//#else #else
// backend = std::make_unique<AnnounceMultiplayerRoom::NullBackend>(); backend = std::make_unique<AnnounceMultiplayerRoom::NullBackend>();
//#endif #endif
} }
WebService::WebResult AnnounceMultiplayerSession::Register() { WebService::WebResult AnnounceMultiplayerSession::Register() {
@ -156,11 +156,11 @@ bool AnnounceMultiplayerSession::IsRunning() const {
void AnnounceMultiplayerSession::UpdateCredentials() { void AnnounceMultiplayerSession::UpdateCredentials() {
ASSERT_MSG(!IsRunning(), "Credentials can only be updated when session is not running"); ASSERT_MSG(!IsRunning(), "Credentials can only be updated when session is not running");
//#ifdef ENABLE_WEB_SERVICE #ifdef ENABLE_WEB_SERVICE
backend = std::make_unique<WebService::RoomJson>(Settings::values.web_api_url.GetValue(), backend = std::make_unique<WebService::RoomJson>(Settings::values.web_api_url.GetValue(),
Settings::values.eden_username.GetValue(), Settings::values.eden_username.GetValue(),
Settings::values.eden_token.GetValue()); Settings::values.eden_token.GetValue());
//#endif #endif
} }
} // namespace Core } // namespace Core

View file

@ -70,7 +70,7 @@ Id GetMaxThreadId(EmitContext& ctx, Id thread_id, Id clamp, Id segmentation_mask
Id SelectValue(EmitContext& ctx, Id in_range, Id value, Id src_thread_id) { Id SelectValue(EmitContext& ctx, Id in_range, Id value, Id src_thread_id) {
return ctx.OpSelect( return ctx.OpSelect(
ctx.U32[1], in_range, ctx.U32[1], in_range,
ctx.OpGroupNonUniformShuffleXor(ctx.U32[1], SubgroupScope(ctx), value, src_thread_id), value); ctx.OpGroupNonUniformShuffle(ctx.U32[1], SubgroupScope(ctx), value, src_thread_id), value);
} }
Id AddPartitionBase(EmitContext& ctx, Id thread_id) { Id AddPartitionBase(EmitContext& ctx, Id thread_id) {

View file

@ -337,6 +337,10 @@ if (VulkanUtilityLibraries_ADDED)
target_include_directories(video_core PUBLIC ${VulkanUtilityLibraries_SOURCE_DIR}/include) target_include_directories(video_core PUBLIC ${VulkanUtilityLibraries_SOURCE_DIR}/include)
endif() endif()
if (VulkanHeaders_ADDED)
target_include_directories(video_core PUBLIC ${VulkanHeaders_SOURCE_DIR}/include)
endif()
target_link_libraries(video_core PRIVATE sirit Vulkan::Headers) target_link_libraries(video_core PRIVATE sirit Vulkan::Headers)
if (ENABLE_NSIGHT_AFTERMATH) if (ENABLE_NSIGHT_AFTERMATH)

View file

@ -974,7 +974,6 @@ bool Device::GetSuitability(bool requires_swapchain) {
// Configure properties. // Configure properties.
VkPhysicalDeviceVulkan12Features features_1_2{}; VkPhysicalDeviceVulkan12Features features_1_2{};
VkPhysicalDeviceVulkan13Features features_1_3{}; VkPhysicalDeviceVulkan13Features features_1_3{};
VkPhysicalDeviceVulkan14Features features_1_4{};
// Configure properties. // Configure properties.
properties.properties = physical.GetProperties(); properties.properties = physical.GetProperties();
@ -1053,13 +1052,10 @@ bool Device::GetSuitability(bool requires_swapchain) {
if (instance_version >= VK_API_VERSION_1_2) { if (instance_version >= VK_API_VERSION_1_2) {
features_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES; features_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
features_1_3.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES; features_1_3.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
features_1_4.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES;
features_1_2.pNext = &features_1_3; features_1_2.pNext = &features_1_3;
features_1_3.pNext = &features_1_4;
*next = &features_1_2; *next = &features_1_2;
// next = &features_1_4.pNext;
} }
// Test all features we know about. If the feature is not available in core at our // Test all features we know about. If the feature is not available in core at our

View file

@ -238,6 +238,10 @@ add_executable(yuzu
migration_dialog.h migration_dialog.cpp migration_dialog.h migration_dialog.cpp
migration_worker.h migration_worker.h
migration_worker.cpp migration_worker.cpp
deps_dialog.cpp
deps_dialog.h
deps_dialog.ui
) )
set_target_properties(yuzu PROPERTIES OUTPUT_NAME "eden") set_target_properties(yuzu PROPERTIES OUTPUT_NAME "eden")

View file

@ -11,7 +11,7 @@
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>About eden</string> <string>About Eden</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item> <item>

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@ -52,7 +55,7 @@ QtProfileSelectionDialog::QtProfileSelectionDialog(
Core::System& system, QWidget* parent, Core::System& system, QWidget* parent,
const Core::Frontend::ProfileSelectParameters& parameters) const Core::Frontend::ProfileSelectParameters& parameters)
: QDialog(parent), profile_manager{system.GetProfileManager()} { : QDialog(parent), profile_manager{system.GetProfileManager()} {
outer_layout = new QVBoxLayout; outer_layout = new QVBoxLayout(this);
instruction_label = new QLabel(); instruction_label = new QLabel();
@ -66,7 +69,7 @@ QtProfileSelectionDialog::QtProfileSelectionDialog(
outer_layout->addWidget(scroll_area); outer_layout->addWidget(scroll_area);
outer_layout->addWidget(buttons); outer_layout->addWidget(buttons);
layout = new QVBoxLayout; layout = new QVBoxLayout(scroll_area);
tree_view = new QTreeView; tree_view = new QTreeView;
item_model = new QStandardItemModel(tree_view); item_model = new QStandardItemModel(tree_view);
tree_view->setModel(item_model); tree_view->setModel(item_model);
@ -94,8 +97,6 @@ QtProfileSelectionDialog::QtProfileSelectionDialog(
layout->setSpacing(0); layout->setSpacing(0);
layout->addWidget(tree_view); layout->addWidget(tree_view);
scroll_area->setLayout(layout);
connect(tree_view, &QTreeView::clicked, this, &QtProfileSelectionDialog::SelectUser); connect(tree_view, &QTreeView::clicked, this, &QtProfileSelectionDialog::SelectUser);
connect(tree_view, &QTreeView::doubleClicked, this, &QtProfileSelectionDialog::accept); connect(tree_view, &QTreeView::doubleClicked, this, &QtProfileSelectionDialog::accept);
connect(controller_navigation, &ControllerNavigation::TriggerKeyboardEvent, connect(controller_navigation, &ControllerNavigation::TriggerKeyboardEvent,
@ -124,7 +125,6 @@ QtProfileSelectionDialog::QtProfileSelectionDialog(
for (const auto& item : list_items) for (const auto& item : list_items)
item_model->appendRow(item); item_model->appendRow(item);
setLayout(outer_layout);
SetWindowTitle(parameters); SetWindowTitle(parameters);
SetDialogPurpose(parameters); SetDialogPurpose(parameters);
resize(550, 400); resize(550, 400);

View file

@ -287,7 +287,6 @@ GRenderWindow::GRenderWindow(GMainWindow* parent, EmuThread* emu_thread_,
setAttribute(Qt::WA_AcceptTouchEvents); setAttribute(Qt::WA_AcceptTouchEvents);
auto* layout = new QHBoxLayout(this); auto* layout = new QHBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0);
setLayout(layout);
input_subsystem->Initialize(); input_subsystem->Initialize();
this->setMouseTracking(true); this->setMouseTracking(true);

View file

@ -17,7 +17,7 @@
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>eden Configuration</string> <string>Eden Configuration</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-FileCopyrightText: 2016 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@ -98,8 +101,8 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,
}; };
for (std::size_t i = 0; i < player_tabs.size(); ++i) { for (std::size_t i = 0; i < player_tabs.size(); ++i) {
player_tabs[i]->setLayout(new QHBoxLayout(player_tabs[i])); QHBoxLayout *tab_layout = new QHBoxLayout(player_tabs[i]);
player_tabs[i]->layout()->addWidget(player_controllers[i]); tab_layout->addWidget(player_controllers[i]);
connect(player_controllers[i], &ConfigureInputPlayer::Connected, [this, i](bool checked) { connect(player_controllers[i], &ConfigureInputPlayer::Connected, [this, i](bool checked) {
// Ensures that connecting a controller changes the number of players // Ensures that connecting a controller changes the number of players
if (connected_controller_checkboxes[i]->isChecked() != checked) { if (connected_controller_checkboxes[i]->isChecked() != checked) {
@ -138,8 +141,9 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,
[this](bool is_handheld) { UpdateDockedState(is_handheld); }); [this](bool is_handheld) { UpdateDockedState(is_handheld); });
advanced = new ConfigureInputAdvanced(hid_core, this); advanced = new ConfigureInputAdvanced(hid_core, this);
ui->tabAdvanced->setLayout(new QHBoxLayout(ui->tabAdvanced));
ui->tabAdvanced->layout()->addWidget(advanced); QHBoxLayout* advancedLayout = new QHBoxLayout(ui->tabAdvanced);
advancedLayout->addWidget(advanced);
connect(advanced, &ConfigureInputAdvanced::CallDebugControllerDialog, connect(advanced, &ConfigureInputAdvanced::CallDebugControllerDialog,
[this, input_subsystem, &hid_core, is_powered_on] { [this, input_subsystem, &hid_core, is_powered_on] {

View file

@ -1,10 +1,12 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-FileCopyrightText: 2016 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <algorithm> #include <algorithm>
#include <memory> #include <memory>
#include <utility> #include <utility>
#include <QGridLayout>
#include <QInputDialog> #include <QInputDialog>
#include <QMenu> #include <QMenu>
#include <QMessageBox> #include <QMessageBox>
@ -13,7 +15,6 @@
#include "common/assert.h" #include "common/assert.h"
#include "common/param_package.h" #include "common/param_package.h"
#include "configuration/qt_config.h" #include "configuration/qt_config.h"
#include "frontend_common/config.h"
#include "hid_core/frontend/emulated_controller.h" #include "hid_core/frontend/emulated_controller.h"
#include "hid_core/hid_core.h" #include "hid_core/hid_core.h"
#include "hid_core/hid_types.h" #include "hid_core/hid_types.h"

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2018 Citra Emulator Project // SPDX-FileCopyrightText: 2018 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@ -19,7 +22,7 @@
CalibrationConfigurationDialog::CalibrationConfigurationDialog(QWidget* parent, CalibrationConfigurationDialog::CalibrationConfigurationDialog(QWidget* parent,
const std::string& host, u16 port) const std::string& host, u16 port)
: QDialog(parent) { : QDialog(parent) {
layout = new QVBoxLayout; layout = new QVBoxLayout(this);
status_label = new QLabel(tr("Communicating with the server...")); status_label = new QLabel(tr("Communicating with the server..."));
cancel_button = new QPushButton(tr("Cancel")); cancel_button = new QPushButton(tr("Cancel"));
connect(cancel_button, &QPushButton::clicked, this, [this] { connect(cancel_button, &QPushButton::clicked, this, [this] {
@ -30,7 +33,6 @@ CalibrationConfigurationDialog::CalibrationConfigurationDialog(QWidget* parent,
}); });
layout->addWidget(status_label); layout->addWidget(status_label);
layout->addWidget(cancel_button); layout->addWidget(cancel_button);
setLayout(layout);
using namespace InputCommon::CemuhookUDP; using namespace InputCommon::CemuhookUDP;
job = std::make_unique<CalibrationConfigurationJob>( job = std::make_unique<CalibrationConfigurationJob>(

View file

@ -418,7 +418,7 @@ bool ConfigureProfileManager::LoadAvatarData() {
ConfigureProfileManagerAvatarDialog::ConfigureProfileManagerAvatarDialog(QWidget* parent) ConfigureProfileManagerAvatarDialog::ConfigureProfileManagerAvatarDialog(QWidget* parent)
: QDialog{parent}, avatar_list{new QListWidget(this)}, bg_color_button{new QPushButton(this)} { : QDialog{parent}, avatar_list{new QListWidget(this)}, bg_color_button{new QPushButton(this)} {
auto* main_layout = new QVBoxLayout(this); auto* main_layout = new QVBoxLayout(this);
auto* button_layout = new QHBoxLayout(this); auto* button_layout = new QHBoxLayout();
auto* select_button = new QPushButton(tr("Select"), this); auto* select_button = new QPushButton(tr("Select"), this);
auto* cancel_button = new QPushButton(tr("Cancel"), this); auto* cancel_button = new QPushButton(tr("Cancel"), this);
auto* bg_color_label = new QLabel(tr("Background Color"), this); auto* bg_color_label = new QLabel(tr("Background Color"), this);
@ -442,7 +442,6 @@ ConfigureProfileManagerAvatarDialog::ConfigureProfileManagerAvatarDialog(QWidget
button_layout->addWidget(select_button); button_layout->addWidget(select_button);
button_layout->addWidget(cancel_button); button_layout->addWidget(cancel_button);
this->setLayout(main_layout);
this->setWindowTitle(tr("Select Firmware Avatar")); this->setWindowTitle(tr("Select Firmware Avatar"));
main_layout->addWidget(avatar_list); main_layout->addWidget(avatar_list);
main_layout->addLayout(button_layout); main_layout->addLayout(button_layout);
@ -654,4 +653,4 @@ std::vector<uint8_t> ConfigureProfileManager::DecompressYaz0(const FileSys::Virt
} }
return output; return output;
} }

View file

@ -12,6 +12,7 @@
#include <QDialog> #include <QDialog>
#include <QList> #include <QList>
#include <QWidget> #include <QWidget>
#include "core/file_sys/vfs/vfs_types.h"
namespace Common { namespace Common {
struct UUID; struct UUID;

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2015 Citra Emulator Project // SPDX-FileCopyrightText: 2015 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@ -28,7 +31,6 @@ ControllerDialog::ControllerDialog(Core::HID::HIDCore& hid_core_,
QLayout* layout = new QVBoxLayout(this); QLayout* layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(widget); layout->addWidget(widget);
setLayout(layout);
// Configure focus so that widget is focusable and the dialog automatically forwards focus to // Configure focus so that widget is focusable and the dialog automatically forwards focus to
// it. // it.

121
src/yuzu/deps_dialog.cpp Normal file
View file

@ -0,0 +1,121 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#include "yuzu/deps_dialog.h"
#include <QAbstractTextDocumentLayout>
#include <QDesktopServices>
#include <QIcon>
#include <QPainter>
#include <QTableWidget>
#include <QTextEdit>
#include "dep_hashes.h"
#include "ui_deps_dialog.h"
#include <fmt/ranges.h>
DepsDialog::DepsDialog(QWidget* parent)
: QDialog(parent)
, ui{std::make_unique<Ui::DepsDialog>()}
{
ui->setupUi(this);
constexpr size_t rows = Common::dep_hashes.size();
ui->tableDeps->setRowCount(rows);
QStringList labels;
labels << tr("Dependency") << tr("Version");
ui->tableDeps->setHorizontalHeaderLabels(labels);
ui->tableDeps->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeMode::Stretch);
ui->tableDeps->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeMode::Fixed);
ui->tableDeps->horizontalHeader()->setMinimumSectionSize(200);
for (size_t i = 0; i < rows; ++i) {
const std::string name = Common::dep_names.at(i);
const std::string sha = Common::dep_hashes.at(i);
const std::string url = Common::dep_urls.at(i);
std::string dependency = fmt::format("<a href=\"{}\">{}</a>", url, name);
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);
}
ui->tableDeps->setItemDelegateForColumn(0, new LinkItemDelegate(this));
}
DepsDialog::~DepsDialog() = default;
LinkItemDelegate::LinkItemDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{}
void LinkItemDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
auto options = option;
initStyleOption(&options, index);
QTextDocument doc;
QString html = index.data(Qt::DisplayRole).toString();
doc.setHtml(html);
options.text.clear();
painter->save();
painter->translate(options.rect.topLeft());
doc.drawContents(painter, QRectF(0, 0, options.rect.width(), options.rect.height()));
painter->restore();
}
QSize LinkItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItem options = option;
initStyleOption(&options, index);
QTextDocument doc;
doc.setHtml(options.text);
doc.setTextWidth(options.rect.width());
return QSize(doc.idealWidth(), doc.size().height());
}
bool LinkItemDelegate::editorEvent(QEvent *event,
QAbstractItemModel *model,
const QStyleOptionViewItem &option,
const QModelIndex &index)
{
if (event->type() == QEvent::MouseButtonRelease) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
if (mouseEvent->button() == Qt::LeftButton) {
QString html = index.data(Qt::DisplayRole).toString();
QTextDocument doc;
doc.setHtml(html);
doc.setTextWidth(option.rect.width());
// this is kinda silly but it werks
QAbstractTextDocumentLayout *layout = doc.documentLayout();
QPoint pos = mouseEvent->pos() - option.rect.topLeft();
int charPos = layout->hitTest(pos, Qt::ExactHit);
if (charPos >= 0) {
QTextCursor cursor(&doc);
cursor.setPosition(charPos);
QTextCharFormat format = cursor.charFormat();
if (format.isAnchor()) {
QString href = format.anchorHref();
if (!href.isEmpty()) {
QDesktopServices::openUrl(QUrl(href));
return true;
}
}
}
}
}
return QStyledItemDelegate::editorEvent(event, model, option, index);
}

41
src/yuzu/deps_dialog.h Normal file
View file

@ -0,0 +1,41 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QDialog>
#include <QStyledItemDelegate>
#include <QTableView>
#include <memory>
namespace Ui { class DepsDialog; }
class DepsDialog : public QDialog
{
Q_OBJECT
public:
explicit DepsDialog(QWidget *parent);
~DepsDialog() override;
private:
std::unique_ptr<Ui::DepsDialog> ui;
};
class LinkItemDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
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;
};

166
src/yuzu/deps_dialog.ui Normal file
View file

@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DepsDialog</class>
<widget class="QDialog" name="DepsDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>701</width>
<height>500</height>
</rect>
</property>
<property name="windowTitle">
<string>Eden Dependencies</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="labelLogo">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>200</width>
<height>200</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="../../dist/qt_themes/default/default.qrc">:/icons/default/256x256/eden.png</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="labelEden">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:28pt;&quot;&gt;Eden Dependencies&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelInfo">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The projects that make Eden possible&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QTableWidget" name="tableDeps">
<property name="editTriggers">
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SelectionMode::NoSelection</enum>
</property>
<property name="columnCount">
<number>2</number>
</property>
<attribute name="horizontalHeaderShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<column/>
<column/>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../../dist/qt_themes/default/default.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>DepsDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>20</x>
<y>20</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>DepsDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>20</x>
<y>20</y>
</hint>
<hint type="destinationlabel">
<x>20</x>
<y>20</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View file

@ -2,7 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
# cpm # cpm
include(CPM) include(CPMUtil)
# Disable tests/tools in all externals supporting the standard option name # Disable tests/tools in all externals supporting the standard option name
set(BUILD_TESTING OFF) set(BUILD_TESTING OFF)
@ -14,11 +14,11 @@ set(BUILD_SHARED_LIBS OFF)
set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON) set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON)
# QuaZip # QuaZip
set(CPM_USE_LOCAL_PACKAGES ON) AddPackage(
CPMAddPackage(
NAME QuaZip-Qt6 NAME QuaZip-Qt6
VERSION 1.3 VERSION 1.3
URL "https://github.com/crueter/quazip-qt6/archive/f838774d63.zip" REPO "crueter/quazip-qt6"
CUSTOM_CACHE_KEY "f838" SHA f838774d63
HASH 9f629a438699801244a106c8df6d5f8f8d19e80df54f530a89403a10c8c4e37a6e95606bbdd307f23636961e8ce34eb37a2186d589a1f227ac9c8e2c678e326e
SYSTEM_PACKAGE ON
) )

View file

@ -96,6 +96,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include <QStandardPaths> #include <QStandardPaths>
#include <QStatusBar> #include <QStatusBar>
#include <QString> #include <QString>
#include <QStyleHints>
#include <QSysInfo> #include <QSysInfo>
#include <QUrl> #include <QUrl>
#include <QtConcurrent/QtConcurrent> #include <QtConcurrent/QtConcurrent>
@ -159,6 +160,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include "yuzu/debugger/console.h" #include "yuzu/debugger/console.h"
#include "yuzu/debugger/controller.h" #include "yuzu/debugger/controller.h"
#include "yuzu/debugger/wait_tree.h" #include "yuzu/debugger/wait_tree.h"
#include "yuzu/deps_dialog.h"
#include "yuzu/discord.h" #include "yuzu/discord.h"
#include "yuzu/game_list.h" #include "yuzu/game_list.h"
#include "yuzu/game_list_p.h" #include "yuzu/game_list_p.h"
@ -172,6 +174,91 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#include "yuzu/util/clickable_label.h" #include "yuzu/util/clickable_label.h"
#include "yuzu/vk_device_info.h" #include "yuzu/vk_device_info.h"
#ifdef _WIN32
#include <QPlatformSurfaceEvent>
#include <dwmapi.h>
#include <windows.h>
#pragma comment(lib, "Dwmapi.lib")
static inline void ApplyWindowsTitleBarDarkMode(HWND hwnd, bool enabled) {
if (!hwnd)
return;
BOOL val = enabled ? TRUE : FALSE;
// 20 = Win11/21H2+
if (SUCCEEDED(DwmSetWindowAttribute(hwnd, 20, &val, sizeof(val))))
return;
// 19 = pre-21H2
DwmSetWindowAttribute(hwnd, 19, &val, sizeof(val));
}
static inline void ApplyDarkToTopLevel(QWidget* w, bool on) {
if (!w || !w->isWindow())
return;
ApplyWindowsTitleBarDarkMode(reinterpret_cast<HWND>(w->winId()), on);
}
namespace {
struct TitlebarFilter final : QObject {
bool dark;
explicit TitlebarFilter(bool is_dark) : QObject(qApp), dark(is_dark) {}
void setDark(bool is_dark) {
dark = is_dark;
}
void onFocusChanged(QWidget*, QWidget* now) {
if (now)
ApplyDarkToTopLevel(now->window(), dark);
}
bool eventFilter(QObject* obj, QEvent* ev) override {
if (auto* w = qobject_cast<QWidget*>(obj)) {
switch (ev->type()) {
case QEvent::WinIdChange:
case QEvent::Show:
case QEvent::ShowToParent:
case QEvent::Polish:
case QEvent::WindowStateChange:
case QEvent::ZOrderChange:
ApplyDarkToTopLevel(w, dark);
break;
default:
break;
}
}
return QObject::eventFilter(obj, ev);
}
};
static TitlebarFilter* g_filter = nullptr;
static QMetaObject::Connection g_focusConn;
} // namespace
static void ApplyGlobalDarkTitlebar(bool is_dark) {
if (!g_filter) {
g_filter = new TitlebarFilter(is_dark);
qApp->installEventFilter(g_filter);
g_focusConn = QObject::connect(qApp, &QApplication::focusChanged, g_filter,
&TitlebarFilter::onFocusChanged);
} else {
g_filter->setDark(is_dark);
}
for (QWidget* w : QApplication::topLevelWidgets())
ApplyDarkToTopLevel(w, is_dark);
}
static void RemoveTitlebarFilter() {
if (!g_filter)
return;
qApp->removeEventFilter(g_filter);
QObject::disconnect(g_focusConn);
g_filter->deleteLater();
g_filter = nullptr;
}
#endif
#ifdef YUZU_CRASH_DUMPS #ifdef YUZU_CRASH_DUMPS
#include "yuzu/breakpad.h" #include "yuzu/breakpad.h"
#endif #endif
@ -299,16 +386,16 @@ static void OverrideWindowsFont() {
} }
#endif #endif
bool GMainWindow::CheckDarkMode() { inline static bool isDarkMode() {
#ifdef __unix__ #if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
const QPalette test_palette(qApp->palette()); const auto scheme = QGuiApplication::styleHints()->colorScheme();
const QColor text_color = test_palette.color(QPalette::Active, QPalette::Text); return scheme == Qt::ColorScheme::Dark;
const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window);
return (text_color.value() > window_color.value());
#else #else
// TODO: Windows const QPalette defaultPalette;
return false; const auto text = defaultPalette.color(QPalette::WindowText);
#endif // __unix__ const auto window = defaultPalette.color(QPalette::Window);
return text.lightness() > window.lightness();
#endif // QT_VERSION
} }
GMainWindow::GMainWindow(bool has_broken_vulkan) GMainWindow::GMainWindow(bool has_broken_vulkan)
@ -358,7 +445,6 @@ GMainWindow::GMainWindow(bool has_broken_vulkan)
statusBar()->hide(); statusBar()->hide();
// Check dark mode before a theme is loaded // Check dark mode before a theme is loaded
os_dark_mode = CheckDarkMode();
startup_icon_theme = QIcon::themeName(); startup_icon_theme = QIcon::themeName();
// fallback can only be set once, colorful theme icons are okay on both light/dark // fallback can only be set once, colorful theme icons are okay on both light/dark
QIcon::setFallbackThemeName(QStringLiteral("colorful")); QIcon::setFallbackThemeName(QStringLiteral("colorful"));
@ -1678,11 +1764,13 @@ void GMainWindow::ConnectMenuEvents() {
connect_menu(ui->action_Log_Folder, &GMainWindow::OnOpenLogFolder); connect_menu(ui->action_Log_Folder, &GMainWindow::OnOpenLogFolder);
connect_menu(ui->action_Discord, &GMainWindow::OnOpenDiscord); connect_menu(ui->action_Discord, &GMainWindow::OnOpenDiscord);
connect_menu(ui->action_Revolt, &GMainWindow::OnOpenRevolt);
connect_menu(ui->action_Verify_installed_contents, &GMainWindow::OnVerifyInstalledContents); connect_menu(ui->action_Verify_installed_contents, &GMainWindow::OnVerifyInstalledContents);
connect_menu(ui->action_Firmware_From_Folder, &GMainWindow::OnInstallFirmware); connect_menu(ui->action_Firmware_From_Folder, &GMainWindow::OnInstallFirmware);
connect_menu(ui->action_Firmware_From_ZIP, &GMainWindow::OnInstallFirmwareFromZIP); connect_menu(ui->action_Firmware_From_ZIP, &GMainWindow::OnInstallFirmwareFromZIP);
connect_menu(ui->action_Install_Keys, &GMainWindow::OnInstallDecryptionKeys); connect_menu(ui->action_Install_Keys, &GMainWindow::OnInstallDecryptionKeys);
connect_menu(ui->action_About, &GMainWindow::OnAbout); connect_menu(ui->action_About, &GMainWindow::OnAbout);
connect_menu(ui->action_Eden_Dependencies, &GMainWindow::OnEdenDependencies);
} }
void GMainWindow::UpdateMenuState() { void GMainWindow::UpdateMenuState() {
@ -2002,7 +2090,7 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa
tr("Error while loading ROM! %1", "%1 signifies a numeric error code.") tr("Error while loading ROM! %1", "%1 signifies a numeric error code.")
.arg(QString::fromStdString(error_code)); .arg(QString::fromStdString(error_code));
const auto description = const auto description =
tr("%1<br>Please redump your files or ask on Discord for help.", tr("%1<br>Please redump your files or ask on Discord/Revolt for help.",
"%1 signifies an error string.") "%1 signifies an error string.")
.arg(QString::fromStdString( .arg(QString::fromStdString(
GetResultStatusString(static_cast<Loader::ResultStatus>(error_id)))); GetResultStatusString(static_cast<Loader::ResultStatus>(error_id))));
@ -3656,7 +3744,11 @@ void GMainWindow::OnOpenFAQ() {
} }
void GMainWindow::OnOpenDiscord() { void GMainWindow::OnOpenDiscord() {
OpenURL(QUrl(QStringLiteral("https://discord.gg/kXAmGCXBGD"))); OpenURL(QUrl(QStringLiteral("https://discord.gg/HstXbPch7X")));
}
void GMainWindow::OnOpenRevolt() {
OpenURL(QUrl(QStringLiteral("https://rvlt.gg/qKgFEAbH")));
} }
void GMainWindow::ToggleFullscreen() { void GMainWindow::ToggleFullscreen() {
@ -4492,6 +4584,11 @@ void GMainWindow::OnAbout() {
aboutDialog.exec(); aboutDialog.exec();
} }
void GMainWindow::OnEdenDependencies() {
DepsDialog depsDialog(this);
depsDialog.exec();
}
void GMainWindow::OnToggleFilterBar() { void GMainWindow::OnToggleFilterBar() {
game_list->SetFilterVisible(ui->action_Show_Filter_Bar->isChecked()); game_list->SetFilterVisible(ui->action_Show_Filter_Bar->isChecked());
if (ui->action_Show_Filter_Bar->isChecked()) { if (ui->action_Show_Filter_Bar->isChecked()) {
@ -5378,15 +5475,11 @@ void GMainWindow::UpdateUITheme() {
current_theme = default_theme; current_theme = default_theme;
} }
#ifdef _WIN32
QIcon::setThemeName(current_theme);
AdjustLinkColor();
#else
if (current_theme == QStringLiteral("default") || current_theme == QStringLiteral("colorful")) { if (current_theme == QStringLiteral("default") || current_theme == QStringLiteral("colorful")) {
QIcon::setThemeName(current_theme == QStringLiteral("colorful") ? current_theme QIcon::setThemeName(current_theme == QStringLiteral("colorful") ? current_theme
: startup_icon_theme); : startup_icon_theme);
QIcon::setThemeSearchPaths(QStringList(default_theme_paths)); QIcon::setThemeSearchPaths(QStringList(default_theme_paths));
if (CheckDarkMode()) { if (isDarkMode()) {
current_theme = QStringLiteral("default_dark"); current_theme = QStringLiteral("default_dark");
} }
} else { } else {
@ -5394,7 +5487,7 @@ void GMainWindow::UpdateUITheme() {
QIcon::setThemeSearchPaths(QStringList(QStringLiteral(":/icons"))); QIcon::setThemeSearchPaths(QStringList(QStringLiteral(":/icons")));
AdjustLinkColor(); AdjustLinkColor();
} }
#endif
if (current_theme != default_theme) { if (current_theme != default_theme) {
QString theme_uri{QStringLiteral(":%1/style.qss").arg(current_theme)}; QString theme_uri{QStringLiteral(":%1/style.qss").arg(current_theme)};
QFile f(theme_uri); QFile f(theme_uri);
@ -5417,6 +5510,11 @@ void GMainWindow::UpdateUITheme() {
qApp->setStyleSheet({}); qApp->setStyleSheet({});
setStyleSheet({}); setStyleSheet({});
} }
#ifdef _WIN32
RemoveTitlebarFilter();
ApplyGlobalDarkTitlebar(UISettings::IsDarkTheme());
#endif
} }
void GMainWindow::LoadTranslation() { void GMainWindow::LoadTranslation() {

View file

@ -346,6 +346,8 @@ private slots:
void OnOpenQuickstartGuide(); void OnOpenQuickstartGuide();
void OnOpenFAQ(); void OnOpenFAQ();
void OnOpenDiscord(); void OnOpenDiscord();
void OnOpenRevolt();
/// Called whenever a user selects a game in the game list widget. /// Called whenever a user selects a game in the game list widget.
void OnGameListLoadFile(QString game_path, u64 program_id); void OnGameListLoadFile(QString game_path, u64 program_id);
void OnGameListOpenFolder(u64 program_id, GameListOpenTarget target, void OnGameListOpenFolder(u64 program_id, GameListOpenTarget target,
@ -395,6 +397,7 @@ private slots:
void OnInstallFirmwareFromZIP(); void OnInstallFirmwareFromZIP();
void OnInstallDecryptionKeys(); void OnInstallDecryptionKeys();
void OnAbout(); void OnAbout();
void OnEdenDependencies();
void OnToggleFilterBar(); void OnToggleFilterBar();
void OnToggleStatusBar(); void OnToggleStatusBar();
void OnGameListRefresh(); void OnGameListRefresh();
@ -464,7 +467,6 @@ private:
void OpenURL(const QUrl& url); void OpenURL(const QUrl& url);
void LoadTranslation(); void LoadTranslation();
void OpenPerGameConfiguration(u64 title_id, const std::string& file_name); void OpenPerGameConfiguration(u64 title_id, const std::string& file_name);
bool CheckDarkMode();
bool CheckFirmwarePresence(); bool CheckFirmwarePresence();
void SetFirmwareVersion(); void SetFirmwareVersion();
void ConfigureFilesystemProvider(const std::string& filepath); void ConfigureFilesystemProvider(const std::string& filepath);
@ -555,7 +557,6 @@ private:
QTimer update_input_timer; QTimer update_input_timer;
QString startup_icon_theme; QString startup_icon_theme;
bool os_dark_mode = false;
// FS // FS
std::shared_ptr<FileSys::VfsFilesystem> vfs; std::shared_ptr<FileSys::VfsFilesystem> vfs;

View file

@ -214,7 +214,10 @@
<addaction name="action_Open_FAQ"/> <addaction name="action_Open_FAQ"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="action_Discord"/> <addaction name="action_Discord"/>
<addaction name="action_Revolt"/>
<addaction name="separator"/>
<addaction name="action_About"/> <addaction name="action_About"/>
<addaction name="action_Eden_Dependencies"/>
</widget> </widget>
<addaction name="menu_File"/> <addaction name="menu_File"/>
<addaction name="menu_Emulation"/> <addaction name="menu_Emulation"/>
@ -559,6 +562,25 @@
<string>From ZIP</string> <string>From ZIP</string>
</property> </property>
</action> </action>
<action name="action_Revolt">
<property name="text">
<string>&amp;Revolt</string>
</property>
<property name="toolTip">
<string>Revolt</string>
</property>
<property name="statusTip">
<string/>
</property>
<property name="whatsThis">
<string/>
</property>
</action>
<action name="action_Eden_Dependencies">
<property name="text">
<string>&amp;Eden Dependencies</string>
</property>
</action>
</widget> </widget>
<resources> <resources>
<include location="yuzu.qrc"/> <include location="yuzu.qrc"/>

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@ -21,13 +24,11 @@ void LimitableInputDialog::CreateUI() {
text_label_invalid = new QLabel(this); text_label_invalid = new QLabel(this);
buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
auto* const layout = new QVBoxLayout; auto* const layout = new QVBoxLayout(this);
layout->addWidget(text_label); layout->addWidget(text_label);
layout->addWidget(text_entry); layout->addWidget(text_entry);
layout->addWidget(text_label_invalid); layout->addWidget(text_label_invalid);
layout->addWidget(buttons); layout->addWidget(buttons);
setLayout(layout);
} }
void LimitableInputDialog::ConnectEvents() { void LimitableInputDialog::ConnectEvents() {

View file

@ -1,7 +1,4 @@
#!/bin/sh #!/bin/sh
for i in $@; do SUM=`wget -q https://github.com/$1/archive/$2.zip -O - | sha512sum`
SUM=`wget -q $i -O - | sha512sum` echo "$SUM" | cut -d " " -f1
echo "$i"
echo "URL_HASH SHA512=$SUM" | cut -d " " -f1-2
done