diff --git a/src/citra_qt/configuration/configure_enhancements.cpp b/src/citra_qt/configuration/configure_enhancements.cpp
index 90dfbf44d..58790f53f 100644
--- a/src/citra_qt/configuration/configure_enhancements.cpp
+++ b/src/citra_qt/configuration/configure_enhancements.cpp
@@ -82,6 +82,14 @@ void ConfigureEnhancements::SetConfiguration() {
ui->toggle_swap_screen->setChecked(Settings::values.swap_screen.GetValue());
ui->toggle_upright_screen->setChecked(Settings::values.upright_screen.GetValue());
ui->large_screen_proportion->setValue(Settings::values.large_screen_proportion.GetValue());
+ ui->custom_top_left->setValue(Settings::values.custom_top_left.GetValue());
+ ui->custom_top_top->setValue(Settings::values.custom_top_top.GetValue());
+ ui->custom_top_right->setValue(Settings::values.custom_top_right.GetValue());
+ ui->custom_top_bottom->setValue(Settings::values.custom_top_bottom.GetValue());
+ ui->custom_bottom_left->setValue(Settings::values.custom_bottom_left.GetValue());
+ ui->custom_bottom_top->setValue(Settings::values.custom_bottom_top.GetValue());
+ ui->custom_bottom_right->setValue(Settings::values.custom_bottom_right.GetValue());
+ ui->custom_bottom_bottom->setValue(Settings::values.custom_bottom_bottom.GetValue());
ui->toggle_dump_textures->setChecked(Settings::values.dump_textures.GetValue());
ui->toggle_custom_textures->setChecked(Settings::values.custom_textures.GetValue());
ui->toggle_preload_textures->setChecked(Settings::values.preload_textures.GetValue());
@@ -147,6 +155,15 @@ void ConfigureEnhancements::ApplyConfiguration() {
}
Settings::values.large_screen_proportion = ui->large_screen_proportion->value();
+ Settings::values.custom_top_left = ui->custom_top_left->value();
+ Settings::values.custom_top_top = ui->custom_top_top->value();
+ Settings::values.custom_top_right = ui->custom_top_right->value();
+ Settings::values.custom_top_bottom = ui->custom_top_bottom->value();
+ Settings::values.custom_bottom_left = ui->custom_bottom_left->value();
+ Settings::values.custom_bottom_top = ui->custom_bottom_top->value();
+ Settings::values.custom_bottom_right = ui->custom_bottom_right->value();
+ Settings::values.custom_bottom_bottom = ui->custom_bottom_bottom->value();
+
ConfigurationShared::ApplyPerGameSetting(&Settings::values.filter_mode,
ui->toggle_linear_filter, linear_filter);
ConfigurationShared::ApplyPerGameSetting(&Settings::values.texture_filter,
diff --git a/src/citra_qt/configuration/configure_enhancements.ui b/src/citra_qt/configuration/configure_enhancements.ui
index 6f644d835..bbfca444a 100644
--- a/src/citra_qt/configuration/configure_enhancements.ui
+++ b/src/citra_qt/configuration/configure_enhancements.ui
@@ -1,544 +1,742 @@
- ConfigureEnhancements
-
-
-
- 0
- 0
- 440
- 748
-
-
-
-
- 0
- 0
-
-
-
- Form
-
-
- -
-
-
- Renderer
-
-
-
-
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- Internal Resolution
-
-
-
- -
-
-
-
-
- Auto (Window Size)
-
-
- -
-
- Native (400x240)
-
-
- -
-
- 2x Native (800x480)
-
-
- -
-
- 3x Native (1200x720)
-
-
- -
-
- 4x Native (1600x960)
-
-
- -
-
- 5x Native (2000x1200)
-
-
- -
-
- 6x Native (2400x1440)
-
-
- -
-
- 7x Native (2800x1680)
-
-
- -
-
- 8x Native (3200x1920)
-
-
- -
-
- 9x Native (3600x2160)
-
-
- -
-
- 10x Native (4000x2400)
-
-
-
-
-
-
-
- -
-
-
- Enable Linear Filtering
-
-
-
- -
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- Post-Processing Shader
-
-
-
- -
-
-
-
-
-
- -
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- Texture Filter
-
-
-
- -
-
-
-
-
- None
-
-
- -
-
- Anime4K
-
-
- -
-
- Bicubic
-
-
- -
-
- Nearest Neighbor
-
-
- -
-
- ScaleForce
-
-
- -
-
- xBRZ
-
-
-
-
-
-
-
-
-
-
- -
-
-
- Stereoscopy
-
-
-
-
-
-
-
-
-
- Stereoscopic 3D Mode
-
-
-
- -
-
-
-
-
- Off
-
-
- -
-
- Side by Side
-
-
- -
-
- Anaglyph
-
-
- -
-
- Interlaced
-
-
- -
-
- Reverse Interlaced
-
-
-
-
-
-
- -
-
-
-
-
-
- Depth
-
-
-
- -
-
-
- %
-
-
- 0
-
-
- 100
-
-
- 0
-
-
-
-
-
- -
-
-
-
-
-
- Eye to Render in Monoscopic Mode
-
-
-
- -
-
-
-
-
- Left Eye (default)
-
-
- -
-
- Right Eye
-
-
-
-
-
-
-
-
-
- -
-
-
- Layout
-
-
-
-
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- Screen Layout:
-
-
-
- -
-
-
-
-
- Default
-
-
- -
-
- Single Screen
-
-
- -
-
- Large Screen
-
-
- -
-
- Side by Side
-
-
- -
-
- Separate Windows
-
-
-
-
-
-
-
- -
-
-
- Swap Screens
-
-
-
- -
-
-
- Rotate Screens Upright
-
-
-
- -
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- Large Screen Proportion:
-
-
-
- -
-
-
- 1.000000000000000
-
-
- 16.000000000000000
-
-
- 4.000000000000000
-
-
-
-
-
-
- -
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- Background Color:
-
-
-
- -
-
-
-
- 40
- 16777215
-
-
-
-
-
-
-
-
-
-
- -
-
-
- Utility
-
-
-
-
-
-
- <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html>
-
-
- Use Custom Textures
-
-
-
- -
-
-
- <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html>
-
-
- Dump Textures
-
-
-
- -
-
-
- <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the game requires them.</p></body></html>
-
-
- Preload Custom Textures
-
-
-
- -
-
-
- <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html>
-
-
- Async Custom Texture Loading
-
-
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 165
-
-
-
-
-
-
-
- resolution_factor_combobox
- toggle_linear_filter
- shader_combobox
- texture_filter_combobox
- render_3d_combobox
- factor_3d
- mono_rendering_eye
- layout_combobox
- toggle_swap_screen
- toggle_upright_screen
- large_screen_proportion
- bg_button
- toggle_custom_textures
- toggle_dump_textures
- toggle_preload_textures
-
-
-
+ ConfigureEnhancements
+
+
+
+ 0
+ 0
+ 440
+ 748
+
+
+
+
+ 0
+ 0
+
+
+
+ Form
+
+
+ -
+
+
+
+ 0
+ 480
+
+
+
+ QFrame::NoFrame
+
+
+ 1
+
+
+ true
+
+
+
+
+ 0
+ 0
+ 422
+ 932
+
+
+
+
-
+
+
+ Renderer
+
+
+
-
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Internal Resolution
+
+
+
+ -
+
+
-
+
+ Auto (Window Size)
+
+
+ -
+
+ Native (400x240)
+
+
+ -
+
+ 2x Native (800x480)
+
+
+ -
+
+ 3x Native (1200x720)
+
+
+ -
+
+ 4x Native (1600x960)
+
+
+ -
+
+ 5x Native (2000x1200)
+
+
+ -
+
+ 6x Native (2400x1440)
+
+
+ -
+
+ 7x Native (2800x1680)
+
+
+ -
+
+ 8x Native (3200x1920)
+
+
+ -
+
+ 9x Native (3600x2160)
+
+
+ -
+
+ 10x Native (4000x2400)
+
+
+
+
+
+
+
+ -
+
+
+ Enable Linear Filtering
+
+
+
+ -
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Post-Processing Shader
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Texture Filter
+
+
+
+ -
+
+
-
+
+ None
+
+
+ -
+
+ Anime4K
+
+
+ -
+
+ Bicubic
+
+
+ -
+
+ Nearest Neighbor
+
+
+ -
+
+ ScaleForce
+
+
+ -
+
+ xBRZ
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ Stereoscopy
+
+
+
-
+
+
-
+
+
+ Stereoscopic 3D Mode
+
+
+
+ -
+
+
-
+
+ Off
+
+
+ -
+
+ Side by Side
+
+
+ -
+
+ Anaglyph
+
+
+ -
+
+ Interlaced
+
+
+ -
+
+ Reverse Interlaced
+
+
+
+
+
+
+ -
+
+
-
+
+
+ Depth
+
+
+
+ -
+
+
+ %
+
+
+ 0
+
+
+ 100
+
+
+ 0
+
+
+
+
+
+ -
+
+
-
+
+
+ Eye to Render in Monoscopic Mode
+
+
+
+ -
+
+
-
+
+ Left Eye (default)
+
+
+ -
+
+ Right Eye
+
+
+
+
+
+
+
+
+
+ -
+
+
+ Layout
+
+
+
-
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Screen Layout:
+
+
+
+ -
+
+
-
+
+ Default
+
+
+ -
+
+ Single Screen
+
+
+ -
+
+ Large Screen
+
+
+ -
+
+ Side by Side
+
+
+ -
+
+ Separate Windows
+
+
+ -
+
+ Custom Layout
+
+
+
+
+
+
+
+ -
+
+
+ Swap Screens
+
+
+
+ -
+
+
+ Rotate Screens Upright
+
+
+
+ -
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Large Screen Proportion:
+
+
+
+ -
+
+
+ 1.000000000000000
+
+
+ 16.000000000000000
+
+
+ 4.000000000000000
+
+
+
+
+
+
+ -
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Background Color:
+
+
+
+ -
+
+
+
+ 40
+ 16777215
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Custom Layout
+
+
+
-
+
+
+ Top Screen
+
+
+
-
+
+
+ Left
+
+
+
+ -
+
+
+ QAbstractSpinBox::NoButtons
+
+
+ 2147483647
+
+
+
+ -
+
+
+ Top
+
+
+
+ -
+
+
+ QAbstractSpinBox::NoButtons
+
+
+ 2147483647
+
+
+
+ -
+
+
+ Right
+
+
+
+ -
+
+
+ QAbstractSpinBox::NoButtons
+
+
+ 2147483647
+
+
+
+ -
+
+
+ Bottom
+
+
+
+ -
+
+
+ QAbstractSpinBox::NoButtons
+
+
+ 2147483647
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Bottom Screen
+
+
+
-
+
+
+ Left
+
+
+
+ -
+
+
+ QAbstractSpinBox::NoButtons
+
+
+ 2147483647
+
+
+
+ -
+
+
+ Top
+
+
+
+ -
+
+
+ QAbstractSpinBox::NoButtons
+
+
+ 2147483647
+
+
+
+ -
+
+
+ Right
+
+
+
+ -
+
+
+ QAbstractSpinBox::NoButtons
+
+
+ 2147483647
+
+
+
+ -
+
+
+ Bottom
+
+
+
+ -
+
+
+ QAbstractSpinBox::NoButtons
+
+
+ 2147483647
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ Utility
+
+
+
-
+
+
+ <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html>
+
+
+ Use Custom Textures
+
+
+
+ -
+
+
+ <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html>
+
+
+ Dump Textures
+
+
+
+ -
+
+
+ <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the game requires them.</p></body></html>
+
+
+ Preload Custom Textures
+
+
+
+ -
+
+
+ <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html>
+
+
+ Async Custom Texture Loading
+
+
+
+
+
+
+
+
+
+
+
+
+
+ resolution_factor_combobox
+ toggle_linear_filter
+ shader_combobox
+ texture_filter_combobox
+ render_3d_combobox
+ factor_3d
+ mono_rendering_eye
+ layout_combobox
+ toggle_swap_screen
+ toggle_upright_screen
+ large_screen_proportion
+ bg_button
+ toggle_custom_textures
+ toggle_dump_textures
+ toggle_preload_textures
+
+
+
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index 6a99129c6..074d7ce93 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -375,6 +375,7 @@ void GMainWindow::InitializeWidgets() {
actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Large_Screen);
actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Side_by_Side);
actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Separate_Windows);
+ actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Custom_Layout);
}
void GMainWindow::InitializeDebugWidgets() {
@@ -795,6 +796,7 @@ void GMainWindow::ConnectMenuEvents() {
connect_menu(ui->action_Screen_Layout_Large_Screen, &GMainWindow::ChangeScreenLayout);
connect_menu(ui->action_Screen_Layout_Side_by_Side, &GMainWindow::ChangeScreenLayout);
connect_menu(ui->action_Screen_Layout_Separate_Windows, &GMainWindow::ChangeScreenLayout);
+ connect_menu(ui->action_Screen_Layout_Custom_Layout, &GMainWindow::ChangeScreenLayout);
connect_menu(ui->action_Screen_Layout_Swap_Screens, &GMainWindow::OnSwapScreens);
connect_menu(ui->action_Screen_Layout_Upright_Screens, &GMainWindow::OnRotateScreens);
@@ -1887,6 +1889,8 @@ void GMainWindow::ChangeScreenLayout() {
new_layout = Settings::LayoutOption::SideScreen;
} else if (ui->action_Screen_Layout_Separate_Windows->isChecked()) {
new_layout = Settings::LayoutOption::SeparateWindows;
+ } else if (ui->action_Screen_Layout_Custom_Layout->isChecked()) {
+ new_layout = Settings::LayoutOption::CustomLayout;
}
Settings::values.layout_option = new_layout;
@@ -1906,6 +1910,8 @@ void GMainWindow::ToggleScreenLayout() {
case Settings::LayoutOption::SideScreen:
return Settings::LayoutOption::SeparateWindows;
case Settings::LayoutOption::SeparateWindows:
+ return Settings::LayoutOption::CustomLayout;
+ case Settings::LayoutOption::CustomLayout:
return Settings::LayoutOption::Default;
default:
LOG_ERROR(Frontend, "Unknown layout option {}",
@@ -2655,6 +2661,8 @@ void GMainWindow::SyncMenuUISettings() {
Settings::LayoutOption::SideScreen);
ui->action_Screen_Layout_Separate_Windows->setChecked(
Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows);
+ ui->action_Screen_Layout_Custom_Layout->setChecked(Settings::values.layout_option.GetValue() ==
+ Settings::LayoutOption::CustomLayout);
ui->action_Screen_Layout_Swap_Screens->setChecked(Settings::values.swap_screen.GetValue());
ui->action_Screen_Layout_Upright_Screens->setChecked(
Settings::values.upright_screen.GetValue());
diff --git a/src/citra_qt/main.ui b/src/citra_qt/main.ui
index 345139568..dba9ba868 100644
--- a/src/citra_qt/main.ui
+++ b/src/citra_qt/main.ui
@@ -136,6 +136,7 @@
+
@@ -520,6 +521,14 @@
Separate Windows
+
+
+ true
+
+
+ Custom Layout
+
+
true
diff --git a/src/common/settings.h b/src/common/settings.h
index 0d980406f..873ef3359 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -35,6 +35,7 @@ enum class LayoutOption : u32 {
#ifndef ANDROID
SeparateWindows,
#endif
+ CustomLayout,
// Similiar to default, but better for mobile devices in portrait mode. Top screen in clamped to
// the top of the frame, and the bottom screen is enlarged to match the top screen.
MobilePortrait,
diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp
index f70a5fc60..364e42729 100644
--- a/src/core/frontend/emu_window.cpp
+++ b/src/core/frontend/emu_window.cpp
@@ -217,6 +217,10 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height,
layout = Layout::MobileLandscapeFrameLayout(
width, height, Settings::values.swap_screen.GetValue(), 2.25f, false);
break;
+ case Settings::LayoutOption::CustomLayout:
+ layout =
+ Layout::CustomFrameLayout(width, height, Settings::values.swap_screen.GetValue());
+ break;
case Settings::LayoutOption::Default:
default:
layout =
diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp
index 36a7c5de0..c34197fcf 100644
--- a/src/core/frontend/framebuffer_layout.cpp
+++ b/src/core/frontend/framebuffer_layout.cpp
@@ -487,6 +487,13 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale, bool is_secondar
layout = MobileLandscapeFrameLayout(
width, height, Settings::values.swap_screen.GetValue(), 2.25f, false);
break;
+ case Settings::LayoutOption::CustomLayout:
+ layout = CustomFrameLayout(std::max(Settings::values.custom_top_right.GetValue(),
+ Settings::values.custom_bottom_right.GetValue()),
+ std::max(Settings::values.custom_top_bottom.GetValue(),
+ Settings::values.custom_bottom_bottom.GetValue()),
+ Settings::values.swap_screen.GetValue());
+ break;
case Settings::LayoutOption::Default:
default:
if (Settings::values.upright_screen.GetValue()) {