From ae6c15298860c0df2c863a6b3f87157d24755897 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 12 Feb 2019 19:55:07 +0300 Subject: [PATCH] Version 1.5.15: Fix macOS media viewer overlay. Regression was introduced in c1a0dad2b7. --- .../media/view/media_view_overlay_widget.cpp | 23 ++++++++++++++++++- .../media/view/media_view_overlay_widget.h | 2 ++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index cfe514c14..1e717760f 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -3107,7 +3107,9 @@ void OverlayWidget::touchEvent(QTouchEvent *e) { } bool OverlayWidget::eventHook(QEvent *e) { - if (e->type() == QEvent::TouchBegin || e->type() == QEvent::TouchUpdate || e->type() == QEvent::TouchEnd || e->type() == QEvent::TouchCancel) { + if (e->type() == QEvent::UpdateRequest) { + _wasRepainted = true; + } else if (e->type() == QEvent::TouchBegin || e->type() == QEvent::TouchUpdate || e->type() == QEvent::TouchEnd || e->type() == QEvent::TouchCancel) { QTouchEvent *ev = static_cast(e); if (ev->device()->type() == QTouchDevice::TouchScreen) { if (ev->type() != QEvent::TouchBegin || ev->touchPoints().isEmpty() || !childAt(mapFromGlobal(ev->touchPoints().cbegin()->screenPos().toPoint()))) { @@ -3175,6 +3177,25 @@ void OverlayWidget::setVisibleHook(bool visible) { a_cOpacity = anim::value(1, 1); _groupThumbs = nullptr; _groupThumbsRect = QRect(); +#if defined Q_OS_MAC && !defined MAC_OS_OLD + // QOpenGLWidget can't properly destroy a child widget if + // it is hidden exactly after that, so it must be repainted + // before it is hidden without the child widget. + if (!isHidden() && _clipController) { + _clipController.destroy(); + _wasRepainted = false; + repaint(); + if (!_wasRepainted) { + // Qt has some optimization to prevent too frequent repaints. + // If the previous repaint was less than 1/60 second it silently + // converts repaint() call to an update() call. But we have to + // repaint right now, before hide(), with _clipController destroyed. + auto event = QEvent(QEvent::UpdateRequest); + QApplication::sendEvent(this, &event); + } + } +#endif // Q_OS_MAC && !MAC_OS_OLD + } OverlayParent::setVisibleHook(visible); if (visible) { diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index de960b818..fa14a0da3 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -417,6 +417,8 @@ private: object_ptr _themeApply = { nullptr }; object_ptr _themeCancel = { nullptr }; + bool _wasRepainted = false; + }; } // namespace View