android: frontend: Track screen layout separately for orientation.
This commit is contained in:
parent
a5c47ddfc9
commit
b29f352ac6
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -119,7 +119,7 @@ void Config::ReadValues() {
|
||||
|
||||
// Layout
|
||||
Settings::values.layout_option = static_cast<Settings::LayoutOption>(sdl2_config->GetInteger(
|
||||
"Layout", "layout_option", static_cast<int>(Settings::LayoutOption::MobilePortrait)));
|
||||
"Layout", "layout_option", static_cast<int>(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 =
|
||||
|
@ -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,
|
||||
|
@ -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_);
|
||||
|
@ -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,
|
||||
|
@ -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<TextureMailbox> mailbox = nullptr;
|
||||
|
||||
|
@ -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() {
|
||||
|
@ -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:
|
||||
// ------------------------
|
||||
|
Loading…
x
Reference in New Issue
Block a user