From a90b0daebef51dfa7ac2a4c5df49133ac4f98613 Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Sat, 20 Aug 2022 20:35:45 -0400 Subject: [PATCH 1/7] Look at version_major.h when for newer ffmpeg libs In ffmpeg 5.1, it seems most (or all) of these libraries use a separate version_major.h, so the logic to check minimum version didn't work without looking at the major version file. --- externals/cmake-modules/FindFFmpeg.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/externals/cmake-modules/FindFFmpeg.cmake b/externals/cmake-modules/FindFFmpeg.cmake index 6cb5960bb0..cac21c614f 100644 --- a/externals/cmake-modules/FindFFmpeg.cmake +++ b/externals/cmake-modules/FindFFmpeg.cmake @@ -116,6 +116,10 @@ function(find_ffmpeg LIBNAME) endforeach() string(TOUPPER ${LIBNAME} LIBNAME_UPPER) file(STRINGS "${FFmpeg_INCLUDE_${LIBNAME}}/lib${LIBNAME}/version.h" _FFmpeg_VERSION_H_CONTENTS REGEX "#define LIB${LIBNAME_UPPER}_VERSION_(MAJOR|MINOR|MICRO) ") + if (EXISTS "${FFmpeg_INCLUDE_${LIBNAME}}/lib${LIBNAME}/version_major.h") + file(STRINGS "${FFmpeg_INCLUDE_${LIBNAME}}/lib${LIBNAME}/version_major.h" _FFmpeg_MAJOR_VERSION_H_CONTENTS REGEX "#define LIB${LIBNAME_UPPER}_VERSION_MAJOR ") + string(APPEND _FFmpeg_VERSION_H_CONTENTS "\n" ${_FFmpeg_MAJOR_VERSION_H_CONTENTS}) + endif() set(_FFmpeg_VERSION_REGEX "([0-9]+)") foreach(v MAJOR MINOR MICRO) if("${_FFmpeg_VERSION_H_CONTENTS}" MATCHES "#define LIB${LIBNAME_UPPER}_VERSION_${v}[\\t ]+${_FFmpeg_VERSION_REGEX}") From c634c263db5b1f7e5cffb7d1beb3ba07960b621b Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Sat, 20 Aug 2022 20:49:59 -0400 Subject: [PATCH 2/7] citra-sdl: use the result of system.RunLoop() If a shutdown was requested by the application, close the SDL window, initiating the normal shutdown procedure. This causes a graceful exit process instead of hanging. --- src/citra/citra.cpp | 14 +++++++++++++- src/citra/emu_window/emu_window_sdl2.cpp | 6 +++++- src/citra/emu_window/emu_window_sdl2.h | 3 +++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp index a9b0b3eca9..9e46fa9d98 100644 --- a/src/citra/citra.cpp +++ b/src/citra/citra.cpp @@ -391,6 +391,8 @@ int main(int argc, char** argv) { return -1; case Core::System::ResultStatus::Success: break; // Expected case + default: + LOG_ERROR(Frontend, "Error while loading ROM: {}", system.GetStatusDetails()); } system.TelemetrySession().AddField(Common::Telemetry::FieldType::App, "Frontend", "SDL"); @@ -437,7 +439,17 @@ int main(int argc, char** argv) { }); while (emu_window->IsOpen()) { - system.RunLoop(); + const auto result = system.RunLoop(); + + switch (result) { + case Core::System::ResultStatus::ShutdownRequested: + emu_window->Close(); + break; + case Core::System::ResultStatus::Success: + break; + default: + LOG_ERROR(Frontend, "Error in main run loop: {}", result, system.GetStatusDetails()); + } } render_thread.join(); diff --git a/src/citra/emu_window/emu_window_sdl2.cpp b/src/citra/emu_window/emu_window_sdl2.cpp index e5a0594c4c..30206486b8 100644 --- a/src/citra/emu_window/emu_window_sdl2.cpp +++ b/src/citra/emu_window/emu_window_sdl2.cpp @@ -104,6 +104,10 @@ bool EmuWindow_SDL2::IsOpen() const { return is_open; } +void EmuWindow_SDL2::Close() { + is_open = false; +} + void EmuWindow_SDL2::OnResize() { int width, height; SDL_GetWindowSize(render_window, &width, &height); @@ -134,7 +138,7 @@ void EmuWindow_SDL2::Fullscreen() { EmuWindow_SDL2::EmuWindow_SDL2(bool fullscreen) { // Initialize the window if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER) < 0) { - LOG_CRITICAL(Frontend, "Failed to initialize SDL2! Exiting..."); + LOG_CRITICAL(Frontend, "Failed to initialize SDL2: {}! Exiting...", SDL_GetError()); exit(1); } diff --git a/src/citra/emu_window/emu_window_sdl2.h b/src/citra/emu_window/emu_window_sdl2.h index 64dec5381d..831837ea67 100644 --- a/src/citra/emu_window/emu_window_sdl2.h +++ b/src/citra/emu_window/emu_window_sdl2.h @@ -46,6 +46,9 @@ public: /// Whether the window is still open, and a close request hasn't yet been sent bool IsOpen() const; + /// Close the window. + void Close(); + /// Creates a new context that is shared with the current context std::unique_ptr CreateSharedContext() const override; From ec7dc8803f195cc4d35545d588a8d57e929c93c0 Mon Sep 17 00:00:00 2001 From: Daisouji <82060898+Daisouji@users.noreply.github.com> Date: Mon, 22 Aug 2022 11:18:55 -0400 Subject: [PATCH 3/7] GUI: Make touchscreen more visible in Midnight theme (#6100) --- dist/qt_themes/qdarkstyle_midnight_blue/style.qss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss b/dist/qt_themes/qdarkstyle_midnight_blue/style.qss index 794f09b962..c200819c55 100644 --- a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss +++ b/dist/qt_themes/qdarkstyle_midnight_blue/style.qss @@ -2158,6 +2158,10 @@ PlotWidget { padding: 0px; } +TouchScreenPreview { + qproperty-dotHighlightColor: #3daee9; + background-color: #0f1922; +} QListWidget#selectorList { background-color: #0f1922; @@ -2168,4 +2172,4 @@ QLineEdit, QTreeView#hotkey_list, QScrollArea#scrollArea QTreeView { background-color: #0f1922; -} \ No newline at end of file +} From 401336c5e789f117411e94e9870a5b687e8bc0eb Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Mon, 22 Aug 2022 18:10:47 -0400 Subject: [PATCH 4/7] Rename Close() -> RequestClose() --- src/citra/citra.cpp | 2 +- src/citra/emu_window/emu_window_sdl2.cpp | 6 +++--- src/citra/emu_window/emu_window_sdl2.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp index 9e46fa9d98..6f8c16e2fd 100644 --- a/src/citra/citra.cpp +++ b/src/citra/citra.cpp @@ -443,7 +443,7 @@ int main(int argc, char** argv) { switch (result) { case Core::System::ResultStatus::ShutdownRequested: - emu_window->Close(); + emu_window->RequestClose(); break; case Core::System::ResultStatus::Success: break; diff --git a/src/citra/emu_window/emu_window_sdl2.cpp b/src/citra/emu_window/emu_window_sdl2.cpp index 30206486b8..08b36bf619 100644 --- a/src/citra/emu_window/emu_window_sdl2.cpp +++ b/src/citra/emu_window/emu_window_sdl2.cpp @@ -104,7 +104,7 @@ bool EmuWindow_SDL2::IsOpen() const { return is_open; } -void EmuWindow_SDL2::Close() { +void EmuWindow_SDL2::RequestClose() { is_open = false; } @@ -260,7 +260,7 @@ void EmuWindow_SDL2::PollEvents() { OnResize(); break; case SDL_WINDOWEVENT_CLOSE: - is_open = false; + RequestClose(); break; } break; @@ -291,7 +291,7 @@ void EmuWindow_SDL2::PollEvents() { OnFingerUp(); break; case SDL_QUIT: - is_open = false; + RequestClose(); break; default: break; diff --git a/src/citra/emu_window/emu_window_sdl2.h b/src/citra/emu_window/emu_window_sdl2.h index 831837ea67..27a0f07875 100644 --- a/src/citra/emu_window/emu_window_sdl2.h +++ b/src/citra/emu_window/emu_window_sdl2.h @@ -47,7 +47,7 @@ public: bool IsOpen() const; /// Close the window. - void Close(); + void RequestClose(); /// Creates a new context that is shared with the current context std::unique_ptr CreateSharedContext() const override; From 24b54a9b010e1183a413c9e24ee683bec8e9249e Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Tue, 23 Aug 2022 08:22:17 -0400 Subject: [PATCH 5/7] Follow convention and break in default case --- src/citra/citra.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp index 6f8c16e2fd..cf3d51869b 100644 --- a/src/citra/citra.cpp +++ b/src/citra/citra.cpp @@ -393,6 +393,7 @@ int main(int argc, char** argv) { break; // Expected case default: LOG_ERROR(Frontend, "Error while loading ROM: {}", system.GetStatusDetails()); + break; } system.TelemetrySession().AddField(Common::Telemetry::FieldType::App, "Frontend", "SDL"); @@ -449,6 +450,7 @@ int main(int argc, char** argv) { break; default: LOG_ERROR(Frontend, "Error in main run loop: {}", result, system.GetStatusDetails()); + break; } } render_thread.join(); From ddc802d2b4023324d3d5d1f896417d800034fef5 Mon Sep 17 00:00:00 2001 From: SachinVin Date: Sat, 13 Aug 2022 21:22:15 +0530 Subject: [PATCH 6/7] android: add canary and nightly flavours + fix git version tags --- .ci/android/build.sh | 7 +++++-- .ci/android/upload.sh | 7 +++++-- src/android/app/build.gradle | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/.ci/android/build.sh b/.ci/android/build.sh index 3c1e2f2405..727f855d33 100755 --- a/.ci/android/build.sh +++ b/.ci/android/build.sh @@ -1,12 +1,15 @@ #!/bin/bash -ex export NDK_CCACHE=$(which ccache) +[ "$GITHUB_REPOSITORY" = "citra-emu/citra-canary" ] && + BUILD_FLAVOR=canary || + BUILD_FLAVOR=nightly ccache -s cd src/android chmod +x ./gradlew -./gradlew bundleRelease -./gradlew assembleRelease +./gradlew assemble${BUILD_FLAVOR}Release +./gradlew bundle${BUILD_FLAVOR}Release ccache -s diff --git a/.ci/android/upload.sh b/.ci/android/upload.sh index 64258dfd52..e395e5b4c0 100755 --- a/.ci/android/upload.sh +++ b/.ci/android/upload.sh @@ -3,8 +3,11 @@ . ./.ci/common/pre-upload.sh REV_NAME="citra-${GITDATE}-${GITREV}" +[ "${GITHUB_REPOSITORY}" = "citra-emu/citra-canary" ] && + BUILD_FLAVOR=canary || + BUILD_FLAVOR=nightly -cp src/android/app/build/outputs/apk/release/app-release.apk \ +cp src/android/app/build/outputs/apk/${BUILD_FLAVOR}/release/app-${BUILD_FLAVOR}-release.apk \ "artifacts/${REV_NAME}.apk" -cp src/android/app/build/outputs/bundle/release/app-release.aab \ +cp src/android/app/build/outputs/bundle/${BUILD_FLAVOR}Release/app-${BUILD_FLAVOR}-release.aab \ "artifacts/${REV_NAME}.aab" diff --git a/src/android/app/build.gradle b/src/android/app/build.gradle index 1e70d8d999..a3ea30ffb2 100644 --- a/src/android/app/build.gradle +++ b/src/android/app/build.gradle @@ -83,6 +83,17 @@ android { } } + flavorDimensions "version" + productFlavors { + canary { + dimension "version" + applicationIdSuffix ".canary" + } + nightly { + dimension "version" + } + } + externalNativeBuild { cmake { version "3.18.1" @@ -140,5 +151,10 @@ def getVersion() { logger.error('Cannot find git, defaulting to dummy version number') } + if (System.getenv("GITHUB_ACTIONS") != null) { + def gitTag = System.getenv("GIT_TAG_NAME") + versionName = gitTag ?: versionName + } + return versionName } From b52ae4388b1208e797f56c1c602f3dc6c7f1adef Mon Sep 17 00:00:00 2001 From: SachinVin Date: Wed, 24 Aug 2022 22:12:21 +0530 Subject: [PATCH 7/7] CI: android: Sign and publish apk --- .ci/android/upload.sh | 10 ++++++++++ .github/workflows/ci.yml | 12 ++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.ci/android/upload.sh b/.ci/android/upload.sh index e395e5b4c0..1b777d0699 100755 --- a/.ci/android/upload.sh +++ b/.ci/android/upload.sh @@ -11,3 +11,13 @@ cp src/android/app/build/outputs/apk/${BUILD_FLAVOR}/release/app-${BUILD_FLAVOR} "artifacts/${REV_NAME}.apk" cp src/android/app/build/outputs/bundle/${BUILD_FLAVOR}Release/app-${BUILD_FLAVOR}-release.aab \ "artifacts/${REV_NAME}.aab" + +if [ ! -z "${ANDROID_KEYSTORE_B64}" ] +then + echo "Signing apk..." + base64 --decode <<< "${ANDROID_KEYSTORE_B64}" > ks.jks + + java -jar $(which apksigner) sign --ks ks.jks \ + --ks-key-alias "${ANDROID_KEY_ALIAS}" \ + --ks-pass env:ANDROID_KEYSTORE_PASS "artifacts/${REV_NAME}.apk" +fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3203e62bfd..c08acff382 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -129,10 +129,14 @@ jobs: - name: Deps run: | sudo apt-get update - sudo apt-get install ccache -y + sudo apt-get install ccache apksigner -y - name: Build run: ./.ci/android/build.sh - - name: Copy artifacts + - name: Copy and sign artifacts + env: + ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }} + ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} + ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }} run: ./.ci/android/upload.sh - name: Upload uses: actions/upload-artifact@v3 @@ -153,7 +157,7 @@ jobs: TRANSIFEX_API_TOKEN: ${{ secrets.TRANSIFEX_API_TOKEN }} release: runs-on: ubuntu-latest - needs: [build, macos] + needs: [build, macos, android] if: ${{ startsWith(github.ref, 'refs/tags/') }} steps: - uses: actions/download-artifact@v3 @@ -174,4 +178,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - asset_paths: '["./**/*.tar.*","./**/*.7z","./**/*.zip"]' + asset_paths: '["./**/*.tar.*","./**/*.7z","./**/*.zip","./**/*.apk","./**/*.aab"]'