diff --git a/src/android/app/src/main/java/org/citra/citra_android/NativeLibrary.java b/src/android/app/src/main/java/org/citra/citra_android/NativeLibrary.java index a6b56447e..a6f9ee3b3 100644 --- a/src/android/app/src/main/java/org/citra/citra_android/NativeLibrary.java +++ b/src/android/app/src/main/java/org/citra/citra_android/NativeLibrary.java @@ -278,12 +278,17 @@ public final class NativeLibrary { /** * Switches the screen layout. */ - public static native void SwitchScreenLayout(); + public static native void SwitchScreenLayout(boolean is_portrait_mode); + + /** + * Notifies the core emulation that the orientation has changed. + */ + public static native void NotifyOrientationChange(boolean is_portrait_mode); /** * Swaps the top and bottom screens. */ - public static native void SwapScreens(); + public static native void SwapScreens(boolean is_portrait_mode); public static boolean displayAlertMsg(final String caption, final String text, final boolean yesNo) { diff --git a/src/android/app/src/main/java/org/citra/citra_android/activities/EmulationActivity.java b/src/android/app/src/main/java/org/citra/citra_android/activities/EmulationActivity.java index 7ef66e835..0811aa459 100644 --- a/src/android/app/src/main/java/org/citra/citra_android/activities/EmulationActivity.java +++ b/src/android/app/src/main/java/org/citra/citra_android/activities/EmulationActivity.java @@ -3,6 +3,7 @@ package org.citra.citra_android.activities; import android.app.AlertDialog; import android.content.Intent; import android.content.SharedPreferences; +import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; @@ -366,12 +367,12 @@ public final class EmulationActivity extends AppCompatActivity { // Switch the layout of the screens case MENU_ACTION_SWITCH_SCREEN_LAYOUT: - NativeLibrary.SwitchScreenLayout(); + NativeLibrary.SwitchScreenLayout(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT); return; // Swap the top and bottom screen locations case MENU_ACTION_SWAP_SCREENS: - NativeLibrary.SwapScreens(); + NativeLibrary.SwapScreens(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT); return; // Reset overlay placement diff --git a/src/android/app/src/main/java/org/citra/citra_android/overlay/InputOverlay.java b/src/android/app/src/main/java/org/citra/citra_android/overlay/InputOverlay.java index 554abd596..375b11ddd 100644 --- a/src/android/app/src/main/java/org/citra/citra_android/overlay/InputOverlay.java +++ b/src/android/app/src/main/java/org/citra/citra_android/overlay/InputOverlay.java @@ -343,6 +343,8 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener { for (InputOverlayDrawableJoystick joystick : overlayJoysticks) { joystick.draw(canvas); } + + NativeLibrary.NotifyOrientationChange(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT); } @Override diff --git a/src/android/app/src/main/jni/config.cpp b/src/android/app/src/main/jni/config.cpp index 9cf8a70cb..f4c6b8e03 100644 --- a/src/android/app/src/main/jni/config.cpp +++ b/src/android/app/src/main/jni/config.cpp @@ -119,7 +119,7 @@ void Config::ReadValues() { // Layout Settings::values.layout_option = static_cast(sdl2_config->GetInteger( - "Layout", "layout_option", static_cast(Settings::LayoutOption::MobilePortrait))); + "Layout", "layout_option", static_cast(Settings::LayoutOption::MobileLandscape))); Settings::values.swap_screen = sdl2_config->GetBoolean("Layout", "swap_screen", false); Settings::values.custom_layout = sdl2_config->GetBoolean("Layout", "custom_layout", false); Settings::values.custom_top_left = diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 774491236..aefc0b322 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -192,7 +192,8 @@ void Java_org_citra_citra_1android_NativeLibrary_CacheClassesAndMethods(JNIEnv* "(Ljava/lang/String;Ljava/lang/String;Z)Z"); } -void Java_org_citra_citra_1android_NativeLibrary_SwitchScreenLayout(JNIEnv* env, jobject obj) { +void Java_org_citra_citra_1android_NativeLibrary_SwitchScreenLayout(JNIEnv* env, jobject obj, + jboolean is_portrait_mode) { if (Settings::values.layout_option == Settings::LayoutOption::MobilePortrait) { Settings::values.layout_option = Settings::LayoutOption::MobileLandscape; } else if (Settings::values.layout_option == Settings::LayoutOption::MobileLandscape) { @@ -204,12 +205,18 @@ void Java_org_citra_citra_1android_NativeLibrary_SwitchScreenLayout(JNIEnv* env, } else { Settings::values.layout_option = Settings::LayoutOption::MobilePortrait; } - VideoCore::g_renderer->UpdateCurrentFramebufferLayout(); + VideoCore::g_renderer->UpdateCurrentFramebufferLayout(is_portrait_mode); } -void Java_org_citra_citra_1android_NativeLibrary_SwapScreens(JNIEnv* env, jobject obj) { +void Java_org_citra_citra_1android_NativeLibrary_NotifyOrientationChange( + JNIEnv* env, jobject obj, jboolean is_portrait_mode) { + VideoCore::g_renderer->UpdateCurrentFramebufferLayout(is_portrait_mode); +} + +void Java_org_citra_citra_1android_NativeLibrary_SwapScreens(JNIEnv* env, jobject obj, + jboolean is_portrait_mode) { Settings::values.swap_screen = !Settings::values.swap_screen; - VideoCore::g_renderer->UpdateCurrentFramebufferLayout(); + VideoCore::g_renderer->UpdateCurrentFramebufferLayout(is_portrait_mode); } void Java_org_citra_citra_1android_NativeLibrary_SetUserDirectory(JNIEnv* env, jobject obj, diff --git a/src/android/app/src/main/jni/native.h b/src/android/app/src/main/jni/native.h index 7bc99d834..1cd72eba8 100644 --- a/src/android/app/src/main/jni/native.h +++ b/src/android/app/src/main/jni/native.h @@ -139,11 +139,14 @@ JNIEXPORT void JNICALL Java_org_citra_citra_1android_NativeLibrary_WriteProfileR JNIEXPORT void JNICALL Java_org_citra_citra_1android_NativeLibrary_CacheClassesAndMethods(JNIEnv* env, jobject obj); -JNIEXPORT void JNICALL Java_org_citra_citra_1android_NativeLibrary_SwitchScreenLayout(JNIEnv* env, - jobject obj); +JNIEXPORT void JNICALL Java_org_citra_citra_1android_NativeLibrary_SwitchScreenLayout( + JNIEnv* env, jobject obj, jboolean is_portrait_mode); -JNIEXPORT void JNICALL Java_org_citra_citra_1android_NativeLibrary_SwapScreens(JNIEnv* env, - jobject obj); +JNIEXPORT void JNICALL Java_org_citra_citra_1android_NativeLibrary_NotifyOrientationChange( + JNIEnv* env, jobject obj, jboolean is_portrait_mode); + +JNIEXPORT void JNICALL Java_org_citra_citra_1android_NativeLibrary_SwapScreens( + JNIEnv* env, jobject obj, jboolean is_portrait_mode); JNIEXPORT void JNICALL Java_org_citra_citra_1android_NativeLibrary_Run__Ljava_lang_String_2( JNIEnv* env, jclass type, jstring path_); diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index 2a954c554..73909b09c 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -145,7 +145,8 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) { TouchPressed(framebuffer_x, framebuffer_y); } -void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) { +void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height, + bool is_portrait_mode) { Layout::FramebufferLayout layout; const auto layout_option = Settings::values.layout_option; const auto min_size = @@ -156,6 +157,12 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) } else { width = std::max(width, min_size.first); height = std::max(height, min_size.second); + + // If in portrait mode, only the MobilePortrait option really makes sense + const Settings::LayoutOption layout_option = is_portrait_mode + ? Settings::LayoutOption::MobilePortrait + : Settings::values.layout_option; + switch (layout_option) { case Settings::LayoutOption::SingleScreen: layout = Layout::SingleFrameLayout(width, height, Settings::values.swap_screen, diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h index efaa25d9f..65ee25bc9 100644 --- a/src/core/frontend/emu_window.h +++ b/src/core/frontend/emu_window.h @@ -159,7 +159,8 @@ public: * Convenience method to update the current frame layout * Read from the current settings to determine which layout to use. */ - void UpdateCurrentFramebufferLayout(unsigned width, unsigned height); + void UpdateCurrentFramebufferLayout(unsigned width, unsigned height, + bool is_portrait_mode = {}); std::unique_ptr mailbox = nullptr; diff --git a/src/video_core/renderer_base.cpp b/src/video_core/renderer_base.cpp index 48a3601c2..353550dee 100644 --- a/src/video_core/renderer_base.cpp +++ b/src/video_core/renderer_base.cpp @@ -11,9 +11,9 @@ RendererBase::RendererBase(Frontend::EmuWindow& window) : render_window{window} {} RendererBase::~RendererBase() = default; -void RendererBase::UpdateCurrentFramebufferLayout() { +void RendererBase::UpdateCurrentFramebufferLayout(bool is_portrait_mode) { const Layout::FramebufferLayout& layout = render_window.GetFramebufferLayout(); - render_window.UpdateCurrentFramebufferLayout(layout.width, layout.height); + render_window.UpdateCurrentFramebufferLayout(layout.width, layout.height, is_portrait_mode); } void RendererBase::RefreshRasterizerSetting() { diff --git a/src/video_core/renderer_base.h b/src/video_core/renderer_base.h index ba49d3f28..9322742cf 100644 --- a/src/video_core/renderer_base.h +++ b/src/video_core/renderer_base.h @@ -38,7 +38,7 @@ public: virtual void CleanupVideoDumping() = 0; /// Updates the framebuffer layout of the contained render window handle. - void UpdateCurrentFramebufferLayout(); + void UpdateCurrentFramebufferLayout(bool is_portrait_mode = {}); // Getter/setter functions: // ------------------------