From 64737afdbc7ef324cbe63ea713fb5a911108ed19 Mon Sep 17 00:00:00 2001 From: Vitor Kiguchi Date: Sat, 4 Jan 2020 08:59:09 -0300 Subject: [PATCH 1/7] Change min_client_area_size based on layout --- src/citra_qt/bootmanager.cpp | 1 + src/core/frontend/emu_window.cpp | 15 +++++++++++++++ src/core/frontend/emu_window.h | 7 +++++++ 3 files changed, 23 insertions(+) diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp index f28fcdf10..e32aac670 100644 --- a/src/citra_qt/bootmanager.cpp +++ b/src/citra_qt/bootmanager.cpp @@ -374,6 +374,7 @@ void GRenderWindow::InitRenderTarget() { core_context = CreateSharedContext(); resize(Core::kScreenTopWidth, Core::kScreenTopHeight + Core::kScreenBottomHeight); OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size); + OnFramebufferSizeChanged(); BackupGeometry(); } diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index 23c33f627..d35255117 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -145,6 +145,7 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) { void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) { Layout::FramebufferLayout layout; + unsigned int min_width, min_height; if (Settings::values.custom_layout == true) { layout = Layout::CustomFrameLayout(width, height); } else { @@ -152,21 +153,35 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) case Settings::LayoutOption::SingleScreen: layout = Layout::SingleFrameLayout(width, height, Settings::values.swap_screen, Settings::values.upright_screen); + min_width = Settings::values.swap_screen ? 320u : 400u; + min_height = 240u; break; case Settings::LayoutOption::LargeScreen: layout = Layout::LargeFrameLayout(width, height, Settings::values.swap_screen, Settings::values.upright_screen); + min_width = Settings::values.swap_screen ? 420u : 480u; + min_height = 240u; break; case Settings::LayoutOption::SideScreen: layout = Layout::SideFrameLayout(width, height, Settings::values.swap_screen, Settings::values.upright_screen); + min_width = 720u; + min_height = 240u; break; case Settings::LayoutOption::Default: default: layout = Layout::DefaultFrameLayout(width, height, Settings::values.swap_screen, Settings::values.upright_screen); + min_width = 400u; + min_height = 480u; break; } + if(Settings::values.upright_screen){ + UpdateMinimumWindowSize(min_height, min_width); + } + else{ + UpdateMinimumWindowSize(min_width, min_height); + } } NotifyFramebufferLayoutChanged(layout); } diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h index df6203842..ce6913c63 100644 --- a/src/core/frontend/emu_window.h +++ b/src/core/frontend/emu_window.h @@ -215,6 +215,13 @@ private: * Clip the provided coordinates to be inside the touchscreen area. */ std::tuple ClipToTouchScreen(unsigned new_x, unsigned new_y) const; + + void UpdateMinimumWindowSize(unsigned int min_width, unsigned int min_height){ + WindowConfig new_config = config; + new_config.min_client_area_size = std::make_pair(min_width, min_height); + SetConfig(new_config); + ProcessConfigurationChanges(); + } }; } // namespace Frontend From 6e1a873e57a126bbff62f0383953715dc56b383e Mon Sep 17 00:00:00 2001 From: Vitor Kiguchi Date: Sat, 18 Jan 2020 18:57:13 -0300 Subject: [PATCH 2/7] use the defined constants instead of magic numbers for screen dimensions --- src/core/frontend/emu_window.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index d35255117..641512891 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -4,6 +4,7 @@ #include #include +#include "core/3ds.h" #include "core/frontend/emu_window.h" #include "core/frontend/input.h" #include "core/settings.h" @@ -45,7 +46,7 @@ private: EmuWindow::EmuWindow() { // TODO: Find a better place to set this. - config.min_client_area_size = std::make_pair(400u, 480u); + config.min_client_area_size = std::make_pair(Core::kScreenTopWidth, Core::kScreenTopHeight + Core::kScreenBottomHeight); active_config = config; touch_state = std::make_shared(); Input::RegisterFactory("emu_window", touch_state); @@ -153,27 +154,27 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) case Settings::LayoutOption::SingleScreen: layout = Layout::SingleFrameLayout(width, height, Settings::values.swap_screen, Settings::values.upright_screen); - min_width = Settings::values.swap_screen ? 320u : 400u; - min_height = 240u; + min_width = Settings::values.swap_screen ? Core::kScreenBottomWidth : Core::kScreenTopWidth; + min_height = Core::kScreenBottomHeight; break; case Settings::LayoutOption::LargeScreen: layout = Layout::LargeFrameLayout(width, height, Settings::values.swap_screen, Settings::values.upright_screen); - min_width = Settings::values.swap_screen ? 420u : 480u; - min_height = 240u; + min_width = Settings::values.swap_screen ? Core::kScreenTopWidth/4 + Core::kScreenBottomWidth : Core::kScreenTopWidth + Core::kScreenBottomWidth/4; + min_height = Core::kScreenBottomHeight; break; case Settings::LayoutOption::SideScreen: layout = Layout::SideFrameLayout(width, height, Settings::values.swap_screen, Settings::values.upright_screen); - min_width = 720u; - min_height = 240u; + min_width = Core::kScreenTopWidth + Core::kScreenBottomWidth; + min_height = Core::kScreenBottomHeight; break; case Settings::LayoutOption::Default: default: layout = Layout::DefaultFrameLayout(width, height, Settings::values.swap_screen, Settings::values.upright_screen); - min_width = 400u; - min_height = 480u; + min_width = Core::kScreenTopWidth; + min_height = Core::kScreenTopHeight + Core::kScreenBottomHeight; break; } if(Settings::values.upright_screen){ From 5d0353c3917aebd34b1d81a2f0fd67c1220672ea Mon Sep 17 00:00:00 2001 From: Vitor Kiguchi Date: Mon, 20 Jan 2020 22:15:24 -0300 Subject: [PATCH 3/7] correct ProcessConfigurationChanges --- src/core/frontend/emu_window.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h index ce6913c63..65dac68c9 100644 --- a/src/core/frontend/emu_window.h +++ b/src/core/frontend/emu_window.h @@ -180,7 +180,7 @@ protected: if (config.min_client_area_size != active_config.min_client_area_size) { OnMinimalClientAreaChangeRequest(config.min_client_area_size); - config.min_client_area_size = active_config.min_client_area_size; + active_config.min_client_area_size = config.min_client_area_size; } } From 718f04af6dc0a22769fb643a1b68b3494ba2bb93 Mon Sep 17 00:00:00 2001 From: Vitor Kiguchi Date: Tue, 21 Jan 2020 13:32:51 -0300 Subject: [PATCH 4/7] Correctly treat cases when current size is smaller than the minimum defined by the layout --- src/core/frontend/emu_window.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index 641512891..cfc13c2df 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -152,29 +152,29 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) } else { switch (Settings::values.layout_option) { case Settings::LayoutOption::SingleScreen: - layout = Layout::SingleFrameLayout(width, height, Settings::values.swap_screen, - Settings::values.upright_screen); min_width = Settings::values.swap_screen ? Core::kScreenBottomWidth : Core::kScreenTopWidth; min_height = Core::kScreenBottomHeight; + layout = Layout::SingleFrameLayout(std::max(width, min_width), std::max(height, min_height), Settings::values.swap_screen, + Settings::values.upright_screen); break; case Settings::LayoutOption::LargeScreen: - layout = Layout::LargeFrameLayout(width, height, Settings::values.swap_screen, - Settings::values.upright_screen); min_width = Settings::values.swap_screen ? Core::kScreenTopWidth/4 + Core::kScreenBottomWidth : Core::kScreenTopWidth + Core::kScreenBottomWidth/4; min_height = Core::kScreenBottomHeight; + layout = Layout::LargeFrameLayout(std::max(width, min_width), std::max(height, min_height), Settings::values.swap_screen, + Settings::values.upright_screen); break; case Settings::LayoutOption::SideScreen: - layout = Layout::SideFrameLayout(width, height, Settings::values.swap_screen, - Settings::values.upright_screen); min_width = Core::kScreenTopWidth + Core::kScreenBottomWidth; min_height = Core::kScreenBottomHeight; + layout = Layout::SideFrameLayout(std::max(width, min_width), std::max(height, min_height), Settings::values.swap_screen, + Settings::values.upright_screen); break; case Settings::LayoutOption::Default: default: - layout = Layout::DefaultFrameLayout(width, height, Settings::values.swap_screen, - Settings::values.upright_screen); min_width = Core::kScreenTopWidth; min_height = Core::kScreenTopHeight + Core::kScreenBottomHeight; + layout = Layout::DefaultFrameLayout(std::max(width, min_width), std::max(height, min_height), Settings::values.swap_screen, + Settings::values.upright_screen); break; } if(Settings::values.upright_screen){ From 0dcb886ef23ce0bf0a12b8de4581625413491cdb Mon Sep 17 00:00:00 2001 From: Vitor Kiguchi Date: Tue, 21 Jan 2020 14:24:16 -0300 Subject: [PATCH 5/7] clang format --- src/core/frontend/emu_window.cpp | 35 +++++++++++++++++++------------- src/core/frontend/emu_window.h | 2 +- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index cfc13c2df..724a58a29 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -46,7 +46,8 @@ private: EmuWindow::EmuWindow() { // TODO: Find a better place to set this. - config.min_client_area_size = std::make_pair(Core::kScreenTopWidth, Core::kScreenTopHeight + Core::kScreenBottomHeight); + config.min_client_area_size = + std::make_pair(Core::kScreenTopWidth, Core::kScreenTopHeight + Core::kScreenBottomHeight); active_config = config; touch_state = std::make_shared(); Input::RegisterFactory("emu_window", touch_state); @@ -152,35 +153,41 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) } else { switch (Settings::values.layout_option) { case Settings::LayoutOption::SingleScreen: - min_width = Settings::values.swap_screen ? Core::kScreenBottomWidth : Core::kScreenTopWidth; + min_width = + Settings::values.swap_screen ? Core::kScreenBottomWidth : Core::kScreenTopWidth; min_height = Core::kScreenBottomHeight; - layout = Layout::SingleFrameLayout(std::max(width, min_width), std::max(height, min_height), Settings::values.swap_screen, - Settings::values.upright_screen); + layout = Layout::SingleFrameLayout( + std::max(width, min_width), std::max(height, min_height), + Settings::values.swap_screen, Settings::values.upright_screen); break; case Settings::LayoutOption::LargeScreen: - min_width = Settings::values.swap_screen ? Core::kScreenTopWidth/4 + Core::kScreenBottomWidth : Core::kScreenTopWidth + Core::kScreenBottomWidth/4; + min_width = Settings::values.swap_screen + ? Core::kScreenTopWidth / 4 + Core::kScreenBottomWidth + : Core::kScreenTopWidth + Core::kScreenBottomWidth / 4; min_height = Core::kScreenBottomHeight; - layout = Layout::LargeFrameLayout(std::max(width, min_width), std::max(height, min_height), Settings::values.swap_screen, - Settings::values.upright_screen); + layout = Layout::LargeFrameLayout( + std::max(width, min_width), std::max(height, min_height), + Settings::values.swap_screen, Settings::values.upright_screen); break; case Settings::LayoutOption::SideScreen: min_width = Core::kScreenTopWidth + Core::kScreenBottomWidth; min_height = Core::kScreenBottomHeight; - layout = Layout::SideFrameLayout(std::max(width, min_width), std::max(height, min_height), Settings::values.swap_screen, - Settings::values.upright_screen); + layout = Layout::SideFrameLayout( + std::max(width, min_width), std::max(height, min_height), + Settings::values.swap_screen, Settings::values.upright_screen); break; case Settings::LayoutOption::Default: default: min_width = Core::kScreenTopWidth; min_height = Core::kScreenTopHeight + Core::kScreenBottomHeight; - layout = Layout::DefaultFrameLayout(std::max(width, min_width), std::max(height, min_height), Settings::values.swap_screen, - Settings::values.upright_screen); + layout = Layout::DefaultFrameLayout( + std::max(width, min_width), std::max(height, min_height), + Settings::values.swap_screen, Settings::values.upright_screen); break; } - if(Settings::values.upright_screen){ + if (Settings::values.upright_screen) { UpdateMinimumWindowSize(min_height, min_width); - } - else{ + } else { UpdateMinimumWindowSize(min_width, min_height); } } diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h index 65dac68c9..640c33bc2 100644 --- a/src/core/frontend/emu_window.h +++ b/src/core/frontend/emu_window.h @@ -216,7 +216,7 @@ private: */ std::tuple ClipToTouchScreen(unsigned new_x, unsigned new_y) const; - void UpdateMinimumWindowSize(unsigned int min_width, unsigned int min_height){ + void UpdateMinimumWindowSize(unsigned int min_width, unsigned int min_height) { WindowConfig new_config = config; new_config.min_client_area_size = std::make_pair(min_width, min_height); SetConfig(new_config); From 157f82141d8e12cdd1f13eadba738cba6b1a64e9 Mon Sep 17 00:00:00 2001 From: Vitor Kiguchi Date: Tue, 21 Jan 2020 18:44:04 -0300 Subject: [PATCH 6/7] Make a separate function for getting minimum size based on layout --- src/core/frontend/emu_window.cpp | 46 +++++++++--------------- src/core/frontend/emu_window.h | 4 +-- src/core/frontend/framebuffer_layout.cpp | 32 +++++++++++++++++ src/core/frontend/framebuffer_layout.h | 4 +++ 4 files changed, 54 insertions(+), 32 deletions(-) diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index 724a58a29..10f13f184 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -147,49 +147,35 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) { void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) { Layout::FramebufferLayout layout; - unsigned int min_width, min_height; + Settings::LayoutOption layout_option = Settings::values.layout_option; + std::pair min_size = + Layout::GetMinimumSizeFromLayout(layout_option, Settings::values.upright_screen); + if (Settings::values.custom_layout == true) { layout = Layout::CustomFrameLayout(width, height); } else { - switch (Settings::values.layout_option) { + width = std::max(width, min_size.first); + height = std::max(height, min_size.second); + switch (layout_option) { case Settings::LayoutOption::SingleScreen: - min_width = - Settings::values.swap_screen ? Core::kScreenBottomWidth : Core::kScreenTopWidth; - min_height = Core::kScreenBottomHeight; - layout = Layout::SingleFrameLayout( - std::max(width, min_width), std::max(height, min_height), - Settings::values.swap_screen, Settings::values.upright_screen); + layout = Layout::SingleFrameLayout(width, height, Settings::values.swap_screen, + Settings::values.upright_screen); break; case Settings::LayoutOption::LargeScreen: - min_width = Settings::values.swap_screen - ? Core::kScreenTopWidth / 4 + Core::kScreenBottomWidth - : Core::kScreenTopWidth + Core::kScreenBottomWidth / 4; - min_height = Core::kScreenBottomHeight; - layout = Layout::LargeFrameLayout( - std::max(width, min_width), std::max(height, min_height), - Settings::values.swap_screen, Settings::values.upright_screen); + layout = Layout::LargeFrameLayout(width, height, Settings::values.swap_screen, + Settings::values.upright_screen); break; case Settings::LayoutOption::SideScreen: - min_width = Core::kScreenTopWidth + Core::kScreenBottomWidth; - min_height = Core::kScreenBottomHeight; - layout = Layout::SideFrameLayout( - std::max(width, min_width), std::max(height, min_height), - Settings::values.swap_screen, Settings::values.upright_screen); + layout = Layout::SideFrameLayout(width, height, Settings::values.swap_screen, + Settings::values.upright_screen); break; case Settings::LayoutOption::Default: default: - min_width = Core::kScreenTopWidth; - min_height = Core::kScreenTopHeight + Core::kScreenBottomHeight; - layout = Layout::DefaultFrameLayout( - std::max(width, min_width), std::max(height, min_height), - Settings::values.swap_screen, Settings::values.upright_screen); + layout = Layout::DefaultFrameLayout(width, height, Settings::values.swap_screen, + Settings::values.upright_screen); break; } - if (Settings::values.upright_screen) { - UpdateMinimumWindowSize(min_height, min_width); - } else { - UpdateMinimumWindowSize(min_width, min_height); - } + UpdateMinimumWindowSize(min_size); } NotifyFramebufferLayoutChanged(layout); } diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h index 640c33bc2..680bc7587 100644 --- a/src/core/frontend/emu_window.h +++ b/src/core/frontend/emu_window.h @@ -216,9 +216,9 @@ private: */ std::tuple ClipToTouchScreen(unsigned new_x, unsigned new_y) const; - void UpdateMinimumWindowSize(unsigned int min_width, unsigned int min_height) { + void UpdateMinimumWindowSize(std::pair min_size) { WindowConfig new_config = config; - new_config.min_client_area_size = std::make_pair(min_width, min_height); + new_config.min_client_area_size = min_size; SetConfig(new_config); ProcessConfigurationChanges(); } diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index cb7993271..71dce24be 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -363,4 +363,36 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale) { return layout; } +std::pair GetMinimumSizeFromLayout(Settings::LayoutOption layout, + bool upright_screen) { + unsigned min_width, min_height; + + switch (layout) { + case Settings::LayoutOption::SingleScreen: + min_width = Settings::values.swap_screen ? Core::kScreenBottomWidth : Core::kScreenTopWidth; + min_height = Core::kScreenBottomHeight; + break; + case Settings::LayoutOption::LargeScreen: + min_width = Settings::values.swap_screen + ? Core::kScreenTopWidth / 4 + Core::kScreenBottomWidth + : Core::kScreenTopWidth + Core::kScreenBottomWidth / 4; + min_height = Core::kScreenBottomHeight; + break; + case Settings::LayoutOption::SideScreen: + min_width = Core::kScreenTopWidth + Core::kScreenBottomWidth; + min_height = Core::kScreenBottomHeight; + break; + case Settings::LayoutOption::Default: + default: + min_width = Core::kScreenTopWidth; + min_height = Core::kScreenTopHeight + Core::kScreenBottomHeight; + break; + } + if (upright_screen) { + return std::make_pair(min_height, min_width); + } else { + return std::make_pair(min_width, min_height); + } +} + } // namespace Layout diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h index 5feb16f64..ad3ff2724 100644 --- a/src/core/frontend/framebuffer_layout.h +++ b/src/core/frontend/framebuffer_layout.h @@ -5,6 +5,7 @@ #pragma once #include "common/math_util.h" +#include "core/settings.h" namespace Layout { @@ -80,4 +81,7 @@ FramebufferLayout CustomFrameLayout(u32 width, u32 height); */ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale); +std::pair GetMinimumSizeFromLayout(Settings::LayoutOption layout, + bool upright_screen); + } // namespace Layout From b713fe332997f019b1e4fa2c56cac8dea58d136e Mon Sep 17 00:00:00 2001 From: Vitor Kiguchi Date: Wed, 22 Jan 2020 12:51:04 -0300 Subject: [PATCH 7/7] Address review comments --- src/core/frontend/emu_window.cpp | 11 +++++++++-- src/core/frontend/emu_window.h | 7 +------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index 10f13f184..44502858d 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -147,8 +147,8 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) { void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) { Layout::FramebufferLayout layout; - Settings::LayoutOption layout_option = Settings::values.layout_option; - std::pair min_size = + const auto layout_option = Settings::values.layout_option; + const auto min_size = Layout::GetMinimumSizeFromLayout(layout_option, Settings::values.upright_screen); if (Settings::values.custom_layout == true) { @@ -180,4 +180,11 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) NotifyFramebufferLayoutChanged(layout); } +void EmuWindow::UpdateMinimumWindowSize(std::pair min_size) { + WindowConfig new_config = config; + new_config.min_client_area_size = min_size; + SetConfig(new_config); + ProcessConfigurationChanges(); +} + } // namespace Frontend diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h index 680bc7587..efaa25d9f 100644 --- a/src/core/frontend/emu_window.h +++ b/src/core/frontend/emu_window.h @@ -216,12 +216,7 @@ private: */ std::tuple ClipToTouchScreen(unsigned new_x, unsigned new_y) const; - void UpdateMinimumWindowSize(std::pair min_size) { - WindowConfig new_config = config; - new_config.min_client_area_size = min_size; - SetConfig(new_config); - ProcessConfigurationChanges(); - } + void UpdateMinimumWindowSize(std::pair min_size); }; } // namespace Frontend