From cd4e9d378cc98f590f814332900ec33863ffb98c Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 22 Nov 2023 12:17:32 +0400 Subject: [PATCH] Allow to use ForceFullRepaintSync on Linux. --- ui/platform/linux/ui_utility_linux.h | 3 --- ui/platform/mac/ui_utility_mac.h | 3 --- ui/platform/ui_platform_utility.h | 1 - ui/platform/win/ui_utility_win.cpp | 12 ------------ ui/ui_utility.cpp | 12 ++++++++++++ ui/ui_utility.h | 1 + ui/widgets/popup_menu.cpp | 4 +++- 7 files changed, 16 insertions(+), 20 deletions(-) diff --git a/ui/platform/linux/ui_utility_linux.h b/ui/platform/linux/ui_utility_linux.h index bdde615..605fecb 100644 --- a/ui/platform/linux/ui_utility_linux.h +++ b/ui/platform/linux/ui_utility_linux.h @@ -23,9 +23,6 @@ inline void DeInitOnTopPanel(not_null panel) { inline void ReInitOnTopPanel(not_null panel) { } -inline void UpdateOverlayed(not_null widget) { -} - inline void ShowOverAll(not_null widget, bool canFocus) { } diff --git a/ui/platform/mac/ui_utility_mac.h b/ui/platform/mac/ui_utility_mac.h index 339cb0a..4d37327 100644 --- a/ui/platform/mac/ui_utility_mac.h +++ b/ui/platform/mac/ui_utility_mac.h @@ -17,9 +17,6 @@ inline bool TranslucentWindowsSupported() { return true; } -inline void UpdateOverlayed(not_null widget) { -} - inline void ClearTransientParent(not_null widget) { } diff --git a/ui/platform/ui_platform_utility.h b/ui/platform/ui_platform_utility.h index 227c064..a54076d 100644 --- a/ui/platform/ui_platform_utility.h +++ b/ui/platform/ui_platform_utility.h @@ -24,7 +24,6 @@ void InitOnTopPanel(not_null panel); void DeInitOnTopPanel(not_null panel); void ReInitOnTopPanel(not_null panel); -void UpdateOverlayed(not_null widget); void ShowOverAll(not_null widget, bool canFocus = true); void IgnoreAllActivation(not_null widget); void ClearTransientParent(not_null widget); diff --git a/ui/platform/win/ui_utility_win.cpp b/ui/platform/win/ui_utility_win.cpp index 6c320a6..c1abcaf 100644 --- a/ui/platform/win/ui_utility_win.cpp +++ b/ui/platform/win/ui_utility_win.cpp @@ -24,18 +24,6 @@ bool IsApplicationActive() { return QApplication::activeWindow() != nullptr; } -void UpdateOverlayed(not_null widget) { - const auto wm = widget->testAttribute(Qt::WA_Mapped); - const auto wv = widget->testAttribute(Qt::WA_WState_Visible); - if (!wm) widget->setAttribute(Qt::WA_Mapped, true); - if (!wv) widget->setAttribute(Qt::WA_WState_Visible, true); - widget->update(); - QEvent e(QEvent::UpdateRequest); - QGuiApplication::sendEvent(widget, &e); - if (!wm) widget->setAttribute(Qt::WA_Mapped, false); - if (!wv) widget->setAttribute(Qt::WA_WState_Visible, false); -} - void IgnoreAllActivation(not_null widget) { widget->createWinId(); diff --git a/ui/ui_utility.cpp b/ui/ui_utility.cpp index 2a5de32..ded550d 100644 --- a/ui/ui_utility.cpp +++ b/ui/ui_utility.cpp @@ -154,6 +154,18 @@ void ForceFullRepaint(not_null widget) { refresher->show(); } +void ForceFullRepaintSync(not_null widget) { + const auto wm = widget->testAttribute(Qt::WA_Mapped); + const auto wv = widget->testAttribute(Qt::WA_WState_Visible); + if (!wm) widget->setAttribute(Qt::WA_Mapped, true); + if (!wv) widget->setAttribute(Qt::WA_WState_Visible, true); + ForceFullRepaint(widget); + QEvent e(QEvent::UpdateRequest); + QGuiApplication::sendEvent(widget, &e); + if (!wm) widget->setAttribute(Qt::WA_Mapped, false); + if (!wv) widget->setAttribute(Qt::WA_WState_Visible, false); +} + void PostponeCall(FnMut &&callable) { Integration::Instance().postponeCall(std::move(callable)); } diff --git a/ui/ui_utility.h b/ui/ui_utility.h index 3242ed5..4913831 100644 --- a/ui/ui_utility.h +++ b/ui/ui_utility.h @@ -140,6 +140,7 @@ void RenderWidget( = QWidget::DrawChildren | QWidget::IgnoreMask); void ForceFullRepaint(not_null widget); +void ForceFullRepaintSync(not_null widget); void PostponeCall(FnMut &&callable); diff --git a/ui/widgets/popup_menu.cpp b/ui/widgets/popup_menu.cpp index 7e8ba2b..0bd4e4d 100644 --- a/ui/widgets/popup_menu.cpp +++ b/ui/widgets/popup_menu.cpp @@ -1065,7 +1065,9 @@ void PopupMenu::showPrepared(TriggeredSource source) { startShowAnimation(); - Platform::UpdateOverlayed(this); + if (::Platform::IsWindows()) { + ForceFullRepaintSync(this); + } show(); Platform::ShowOverAll(this); raise();