Merge pull request #5069 from vitor-k/min-window2

Update minimum window size based on current layout
This commit is contained in:
James Rowe 2020-02-08 12:46:20 -07:00 committed by GitHub
commit 17e9522921
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 58 additions and 3 deletions

View file

@ -389,6 +389,7 @@ void GRenderWindow::InitRenderTarget() {
core_context = CreateSharedContext(); core_context = CreateSharedContext();
resize(Core::kScreenTopWidth, Core::kScreenTopHeight + Core::kScreenBottomHeight); resize(Core::kScreenTopWidth, Core::kScreenTopHeight + Core::kScreenBottomHeight);
OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size); OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size);
OnFramebufferSizeChanged();
BackupGeometry(); BackupGeometry();
} }

View file

@ -4,6 +4,7 @@
#include <cmath> #include <cmath>
#include <mutex> #include <mutex>
#include "core/3ds.h"
#include "core/frontend/emu_window.h" #include "core/frontend/emu_window.h"
#include "core/frontend/input.h" #include "core/frontend/input.h"
#include "core/settings.h" #include "core/settings.h"
@ -45,7 +46,8 @@ private:
EmuWindow::EmuWindow() { EmuWindow::EmuWindow() {
// TODO: Find a better place to set this. // 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; active_config = config;
touch_state = std::make_shared<TouchState>(); touch_state = std::make_shared<TouchState>();
Input::RegisterFactory<Input::TouchDevice>("emu_window", touch_state); Input::RegisterFactory<Input::TouchDevice>("emu_window", touch_state);
@ -145,10 +147,16 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) {
void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) { void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height) {
Layout::FramebufferLayout layout; Layout::FramebufferLayout layout;
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) { if (Settings::values.custom_layout == true) {
layout = Layout::CustomFrameLayout(width, height); layout = Layout::CustomFrameLayout(width, height);
} else { } 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: case Settings::LayoutOption::SingleScreen:
layout = Layout::SingleFrameLayout(width, height, Settings::values.swap_screen, layout = Layout::SingleFrameLayout(width, height, Settings::values.swap_screen,
Settings::values.upright_screen); Settings::values.upright_screen);
@ -167,8 +175,16 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height)
Settings::values.upright_screen); Settings::values.upright_screen);
break; break;
} }
UpdateMinimumWindowSize(min_size);
} }
NotifyFramebufferLayoutChanged(layout); NotifyFramebufferLayoutChanged(layout);
} }
void EmuWindow::UpdateMinimumWindowSize(std::pair<unsigned, unsigned> min_size) {
WindowConfig new_config = config;
new_config.min_client_area_size = min_size;
SetConfig(new_config);
ProcessConfigurationChanges();
}
} // namespace Frontend } // namespace Frontend

View file

@ -180,7 +180,7 @@ protected:
if (config.min_client_area_size != active_config.min_client_area_size) { if (config.min_client_area_size != active_config.min_client_area_size) {
OnMinimalClientAreaChangeRequest(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;
} }
} }
@ -215,6 +215,8 @@ private:
* Clip the provided coordinates to be inside the touchscreen area. * Clip the provided coordinates to be inside the touchscreen area.
*/ */
std::tuple<unsigned, unsigned> ClipToTouchScreen(unsigned new_x, unsigned new_y) const; std::tuple<unsigned, unsigned> ClipToTouchScreen(unsigned new_x, unsigned new_y) const;
void UpdateMinimumWindowSize(std::pair<unsigned, unsigned> min_size);
}; };
} // namespace Frontend } // namespace Frontend

View file

@ -363,4 +363,36 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale) {
return layout; return layout;
} }
std::pair<unsigned, unsigned> 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 } // namespace Layout

View file

@ -5,6 +5,7 @@
#pragma once #pragma once
#include "common/math_util.h" #include "common/math_util.h"
#include "core/settings.h"
namespace Layout { namespace Layout {
@ -80,4 +81,7 @@ FramebufferLayout CustomFrameLayout(u32 width, u32 height);
*/ */
FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale); FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale);
std::pair<unsigned, unsigned> GetMinimumSizeFromLayout(Settings::LayoutOption layout,
bool upright_screen);
} // namespace Layout } // namespace Layout