mirror of https://github.com/PCSX2/pcsx2.git
ImGuiManager: Defer scale updates
Fixes OSD spinbox closing on click, and popups closing on window resize.
This commit is contained in:
parent
e6303cef9e
commit
d3c97bedb9
|
@ -701,7 +701,7 @@ void GSUpdateConfig(const Pcsx2Config::GSOptions& new_config)
|
||||||
|
|
||||||
// Handle OSD scale changes by pushing a window resize through.
|
// Handle OSD scale changes by pushing a window resize through.
|
||||||
if (new_config.OsdScale != old_config.OsdScale)
|
if (new_config.OsdScale != old_config.OsdScale)
|
||||||
ImGuiManager::WindowResized();
|
ImGuiManager::RequestScaleUpdate();
|
||||||
|
|
||||||
// Options which need a full teardown/recreate.
|
// Options which need a full teardown/recreate.
|
||||||
if (!GSConfig.RestartOptionsAreEqual(old_config))
|
if (!GSConfig.RestartOptionsAreEqual(old_config))
|
||||||
|
|
|
@ -47,6 +47,7 @@ namespace ImGuiManager
|
||||||
std::pair<float, float> pos;
|
std::pair<float, float> pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void UpdateScale();
|
||||||
static void SetStyle();
|
static void SetStyle();
|
||||||
static void SetKeyMap();
|
static void SetKeyMap();
|
||||||
static bool LoadFontData();
|
static bool LoadFontData();
|
||||||
|
@ -96,6 +97,7 @@ static constexpr float OSD_FADE_OUT_TIME = 0.4f;
|
||||||
|
|
||||||
// need to keep track of this, so we can reinitialize on renderer switch
|
// need to keep track of this, so we can reinitialize on renderer switch
|
||||||
static bool s_fullscreen_ui_was_initialized = false;
|
static bool s_fullscreen_ui_was_initialized = false;
|
||||||
|
static bool s_scale_changed = false;
|
||||||
|
|
||||||
static std::array<ImGuiManager::SoftwareCursor, InputManager::MAX_SOFTWARE_CURSORS> s_software_cursors = {};
|
static std::array<ImGuiManager::SoftwareCursor, InputManager::MAX_SOFTWARE_CURSORS> s_software_cursors = {};
|
||||||
|
|
||||||
|
@ -134,6 +136,7 @@ bool ImGuiManager::Initialize()
|
||||||
}
|
}
|
||||||
|
|
||||||
s_global_scale = std::max(0.5f, g_gs_device->GetWindowScale() * (GSConfig.OsdScale / 100.0f));
|
s_global_scale = std::max(0.5f, g_gs_device->GetWindowScale() * (GSConfig.OsdScale / 100.0f));
|
||||||
|
s_scale_changed = false;
|
||||||
|
|
||||||
ImGui::CreateContext();
|
ImGui::CreateContext();
|
||||||
|
|
||||||
|
@ -225,11 +228,13 @@ void ImGuiManager::WindowResized()
|
||||||
s_window_height = static_cast<float>(new_height);
|
s_window_height = static_cast<float>(new_height);
|
||||||
ImGui::GetIO().DisplaySize = ImVec2(s_window_width, s_window_height);
|
ImGui::GetIO().DisplaySize = ImVec2(s_window_width, s_window_height);
|
||||||
|
|
||||||
UpdateScale();
|
// Scale might have changed as a result of window resize.
|
||||||
|
RequestScaleUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
// restart imgui frame on the new window size to pick it up, otherwise we draw to the old size
|
void ImGuiManager::RequestScaleUpdate()
|
||||||
ImGui::EndFrame();
|
{
|
||||||
NewFrame();
|
s_scale_changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGuiManager::UpdateScale()
|
void ImGuiManager::UpdateScale()
|
||||||
|
@ -240,9 +245,6 @@ void ImGuiManager::UpdateScale()
|
||||||
if ((!HasFullscreenFonts() || !ImGuiFullscreen::UpdateLayoutScale()) && scale == s_global_scale)
|
if ((!HasFullscreenFonts() || !ImGuiFullscreen::UpdateLayoutScale()) && scale == s_global_scale)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// This is assumed to be called mid-frame.
|
|
||||||
ImGui::EndFrame();
|
|
||||||
|
|
||||||
s_global_scale = scale;
|
s_global_scale = scale;
|
||||||
SetStyle();
|
SetStyle();
|
||||||
|
|
||||||
|
@ -251,8 +253,6 @@ void ImGuiManager::UpdateScale()
|
||||||
|
|
||||||
if (!g_gs_device->UpdateImGuiFontTexture())
|
if (!g_gs_device->UpdateImGuiFontTexture())
|
||||||
pxFailRel("Failed to recreate font texture after scale+resize");
|
pxFailRel("Failed to recreate font texture after scale+resize");
|
||||||
|
|
||||||
NewFrame();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGuiManager::NewFrame()
|
void ImGuiManager::NewFrame()
|
||||||
|
@ -260,6 +260,12 @@ void ImGuiManager::NewFrame()
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
io.DeltaTime = s_last_render_time.GetTimeSecondsAndReset();
|
io.DeltaTime = s_last_render_time.GetTimeSecondsAndReset();
|
||||||
|
|
||||||
|
if (s_scale_changed)
|
||||||
|
{
|
||||||
|
s_scale_changed = false;
|
||||||
|
UpdateScale();
|
||||||
|
}
|
||||||
|
|
||||||
ImGui::NewFrame();
|
ImGui::NewFrame();
|
||||||
|
|
||||||
// Disable nav input on the implicit (Debug##Default) window. Otherwise we end up requesting keyboard
|
// Disable nav input on the implicit (Debug##Default) window. Otherwise we end up requesting keyboard
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace ImGuiManager
|
||||||
void WindowResized();
|
void WindowResized();
|
||||||
|
|
||||||
/// Updates scaling of the on-screen elements.
|
/// Updates scaling of the on-screen elements.
|
||||||
void UpdateScale();
|
void RequestScaleUpdate();
|
||||||
|
|
||||||
/// Call at the beginning of the frame to set up ImGui state.
|
/// Call at the beginning of the frame to set up ImGui state.
|
||||||
void NewFrame();
|
void NewFrame();
|
||||||
|
|
Loading…
Reference in New Issue