From f646439624766ec994d341102dc73b2b16d7fca2 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 21 Jun 2021 11:28:53 +0400 Subject: [PATCH] Fix full screen OpenGL native child window. --- ui/gl/gl_window.cpp | 14 +++++++++++++- ui/platform/win/ui_window_win.cpp | 14 ++++++++++---- ui/platform/win/ui_window_win.h | 3 ++- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/ui/gl/gl_window.cpp b/ui/gl/gl_window.cpp index 497aba1..ed06f93 100644 --- a/ui/gl/gl_window.cpp +++ b/ui/gl/gl_window.cpp @@ -11,6 +11,8 @@ #include "base/platform/base_platform_info.h" #include "base/debug_log.h" +#include + namespace Ui::GL { namespace { @@ -95,9 +97,19 @@ std::unique_ptr Window::createNativeBodyWrap() { raw->setParent(nativeParent); raw->show(); raw->update(); + _window->sizeValue( ) | rpl::start_with_next([=](QSize size) { - raw->setGeometry(QRect(QPoint(), size)); + auto geometry = QRect(QPoint(), size); + if constexpr (::Platform::IsWindows()) { + if (const auto screen = _window->screen()) { + if (screen->size() == size) { + // Fix flicker in FullScreen OpenGL window on Windows. + geometry = geometry.marginsAdded({ 0, 0, 0, 1 }); + } + } + } + raw->setGeometry(geometry); }, raw->lifetime()); return result; diff --git a/ui/platform/win/ui_window_win.cpp b/ui/platform/win/ui_window_win.cpp index 70b8399..bde97e8 100644 --- a/ui/platform/win/ui_window_win.cpp +++ b/ui/platform/win/ui_window_win.cpp @@ -585,12 +585,18 @@ not_null WindowHelper::GetNativeFilter() { return GlobalFilter; } -HWND GetWindowHandle(not_null widget) { - widget->window()->createWinId(); +HWND GetWindowHandle(not_null widget) { + const auto toplevel = widget->window(); + toplevel->createWinId(); + return GetWindowHandle(toplevel->windowHandle()); +} + +HWND GetWindowHandle(not_null window) { + if (!window->winId()) { + window->create(); + } - const auto window = widget->window()->windowHandle(); const auto native = QGuiApplication::platformNativeInterface(); - Assert(window != nullptr); Assert(native != nullptr); return static_cast(native->nativeResourceForWindow( diff --git a/ui/platform/win/ui_window_win.h b/ui/platform/win/ui_window_win.h index c74eb0b..23bcc49 100644 --- a/ui/platform/win/ui_window_win.h +++ b/ui/platform/win/ui_window_win.h @@ -58,7 +58,8 @@ private: }; -[[nodiscard]] HWND GetWindowHandle(not_null widget); +[[nodiscard]] HWND GetWindowHandle(not_null widget); +[[nodiscard]] HWND GetWindowHandle(not_null window); } // namespace Platform } // namespace Ui