From 429cb4f3519c3ed70936d54b6f91268b46290a86 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 20 Jan 2024 20:24:28 +1000 Subject: [PATCH] Qt: Allow toggling fullscreen when VM is paused --- src/core/host.cpp | 5 +++++ src/duckstation-qt/displaywidget.cpp | 22 +++++++++++++++------- src/util/imgui_manager.cpp | 5 +++++ src/util/imgui_manager.h | 3 +++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/core/host.cpp b/src/core/host.cpp index 00b01cecc..b8801abe6 100644 --- a/src/core/host.cpp +++ b/src/core/host.cpp @@ -322,7 +322,12 @@ void Host::ResizeDisplayWindow(s32 width, s32 height, float scale) if (System::IsValid()) { if (System::IsPaused()) + { + // Hackity hack, on some systems, presenting a single frame isn't enough to actually get it + // displayed. Two seems to be good enough. Maybe something to do with direct scanout. System::InvalidateDisplay(); + System::InvalidateDisplay(); + } System::HostDisplayResized(); } diff --git a/src/duckstation-qt/displaywidget.cpp b/src/duckstation-qt/displaywidget.cpp index 8fee7f9df..1f9f8074f 100644 --- a/src/duckstation-qt/displaywidget.cpp +++ b/src/duckstation-qt/displaywidget.cpp @@ -1,14 +1,19 @@ -// SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin +// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) #include "displaywidget.h" -#include "common/assert.h" -#include "common/bitutils.h" -#include "common/log.h" #include "mainwindow.h" #include "qthost.h" #include "qtutils.h" + +#include "core/fullscreen_ui.h" + #include "util/imgui_manager.h" + +#include "common/assert.h" +#include "common/bitutils.h" +#include "common/log.h" + #include #include #include @@ -311,9 +316,12 @@ bool DisplayWidget::event(QEvent* event) // don't toggle fullscreen when we're bound.. that wouldn't end well. if (event->type() == QEvent::MouseButtonDblClick && - static_cast(event)->button() == Qt::LeftButton && - !InputManager::HasAnyBindingsForKey(InputManager::MakePointerButtonKey(0, 0)) && QtHost::IsSystemValid() && - !QtHost::IsSystemPaused() && Host::GetBoolSettingValue("Main", "DoubleClickTogglesFullscreen", true)) + static_cast(event)->button() == Qt::LeftButton && QtHost::IsSystemValid() && + !FullscreenUI::HasActiveWindow() && + ((!QtHost::IsSystemPaused() && + !InputManager::HasAnyBindingsForKey(InputManager::MakePointerButtonKey(0, 0))) || + (QtHost::IsSystemPaused() && !ImGuiManager::WantsMouseInput())) && + Host::GetBoolSettingValue("Main", "DoubleClickTogglesFullscreen", true)) { g_emu_thread->toggleFullscreen(); } diff --git a/src/util/imgui_manager.cpp b/src/util/imgui_manager.cpp index 8ec46fb6a..16846b1ed 100644 --- a/src/util/imgui_manager.cpp +++ b/src/util/imgui_manager.cpp @@ -892,6 +892,11 @@ bool ImGuiManager::WantsTextInput() return s_imgui_wants_keyboard.load(std::memory_order_acquire); } +bool ImGuiManager::WantsMouseInput() +{ + return s_imgui_wants_mouse.load(std::memory_order_acquire); +} + void ImGuiManager::AddTextInput(std::string str) { if (!ImGui::GetCurrentContext()) diff --git a/src/util/imgui_manager.h b/src/util/imgui_manager.h index ce47d1cf5..a20f6383a 100644 --- a/src/util/imgui_manager.h +++ b/src/util/imgui_manager.h @@ -69,6 +69,9 @@ ImFont* GetLargeFont(); /// Returns true if imgui wants to intercept text input. bool WantsTextInput(); +/// Returns true if imgui wants to intercept mouse input. +bool WantsMouseInput(); + /// Called on the UI or CPU thread in response to a key press. String is UTF-8. void AddTextInput(std::string str);