vcl/inc/qt5/QtObject.hxx |   25 ++++++++++--------
 vcl/qt5/QtObject.cxx     |   65 ++++++++++++++++++++++++++++++-----------------
 2 files changed, 57 insertions(+), 33 deletions(-)

New commits:
commit 70e497f786dad6bda3aa593c07c778b06381c0e4
Author:     Jan-Marek Glogowski <glo...@fbihome.de>
AuthorDate: Tue May 24 11:34:59 2022 +0200
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Wed May 25 16:25:34 2022 +0200

    tdf#148864 Qt switch QtObjectWindow to QWidget
    
    ... and therefore rename it to QtObjectWidget
    
    Replacement of the QWidget with QWindow originally happened in
    commit 56b19f9a814ae5a39ed760ee542d715493cd0bf3 ("tdf#121247,
    tdf#121266 KDE5: Add basic support for OpenGL"), but that
    unfortunately has a very sparce commit message with no reason
    for this change. Then the code was further complicated in commit
    25edbded9946801effd117b9c46de0f8b4bc5632 ("tdf#125517 Qt5
    implement a minimal Qt5ObjectWindow") and a few follow up fixes
    to restore input and focus handling.
    
    But appearingly all this QWindow handling isn't necessary and just
    returning to a QWidget based class fixes the problems with the
    video overlay (AKA QWidget::winId()) and video playback for good.
    
    The OpenGL Impress transition (Fade) mentioned in the original
    tdf#121266 bug still works.
    
    This also adds the previously missing SolarMutexGuard to all the
    overridden QtObjectWidget functions, which call the SalObject's
    Callback function. I accidently triggered a DBG_TESTSOLARMUTEX
    crashing Impress while debugging this.
    
    Change-Id: Ia22cabfd4f3585dc7fa3f9f18a913c5bd1987dd8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134864
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>
    Tested-by: Jenkins
    (cherry picked from commit 4366e0605214260e55a937173b0c2e02225dc843)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134903
    Reviewed-by: Ilmari Lauhakangas <ilmari.lauhakan...@libreoffice.org>

diff --git a/vcl/inc/qt5/QtObject.hxx b/vcl/inc/qt5/QtObject.hxx
index 328946e4388e..bc5a8e584b8f 100644
--- a/vcl/inc/qt5/QtObject.hxx
+++ b/vcl/inc/qt5/QtObject.hxx
@@ -24,10 +24,11 @@
 
 #include <QtCore/QObject>
 #include <QtGui/QRegion>
-#include <QtGui/QWindow>
+#include <QtWidgets/QWidget>
 
 class QtFrame;
-class QWidget;
+class QtObjectWidget;
+class QWindow;
 
 class QtObject final : public QObject, public SalObject
 {
@@ -35,17 +36,18 @@ class QtObject final : public QObject, public SalObject
 
     SystemEnvData m_aSystemData;
     QtFrame* m_pParent;
-    QWidget* m_pQWidget; // main widget, container
-    QWindow* m_pQWindow; // contained window, used for opengl rendering
+    QtObjectWidget* m_pQWidget;
     QRegion m_pRegion;
+    bool m_bForwardKey;
 
 public:
     QtObject(QtFrame* pParent, bool bShow);
     ~QtObject() override;
 
     QtFrame* frame() const { return m_pParent; }
-    QWidget* widget() const { return m_pQWidget; }
-    QWindow* windowHandle() const { return m_pQWindow; }
+    inline QWidget* widget() const;
+    QWindow* windowHandle() const;
+    bool forwardKey() const { return m_bForwardKey; }
 
     virtual void ResetClipRegion() override;
     virtual void BeginSetClipRegion(sal_uInt32 nRects) override;
@@ -60,22 +62,25 @@ public:
     virtual void SetForwardKey(bool bEnable) override;
 
     virtual const SystemEnvData* GetSystemData() const override { return 
&m_aSystemData; }
+
+    virtual void Reparent(SalFrame* pFrame) override;
 };
 
-class QtObjectWindow final : public QWindow
+class QtObjectWidget final : public QWidget
 {
     QtObject& m_rParent;
 
-    bool event(QEvent*) override;
     void focusInEvent(QFocusEvent*) override;
     void focusOutEvent(QFocusEvent*) override;
     void mousePressEvent(QMouseEvent*) override;
     void mouseReleaseEvent(QMouseEvent*) override;
-    // keyPressEvent(QKeyEvent*) is handled via event(QEvent*); see comment in 
QtWidget::event
+    void keyPressEvent(QKeyEvent*) override;
     void keyReleaseEvent(QKeyEvent*) override;
 
 public:
-    explicit QtObjectWindow(QtObject& rParent);
+    explicit QtObjectWidget(QtObject& rParent);
 };
 
+QWidget* QtObject::widget() const { return m_pQWidget; }
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/QtObject.cxx b/vcl/qt5/QtObject.cxx
index 569586a0dc98..fbdc8e9b625e 100644
--- a/vcl/qt5/QtObject.cxx
+++ b/vcl/qt5/QtObject.cxx
@@ -24,20 +24,18 @@
 #include <QtWidget.hxx>
 
 #include <QtGui/QGuiApplication>
+#include <QtGui/QKeyEvent>
+#include <QtGui/QMouseEvent>
 
 QtObject::QtObject(QtFrame* pParent, bool bShow)
     : m_pParent(pParent)
     , m_pQWidget(nullptr)
-    , m_pQWindow(nullptr)
+    , m_bForwardKey(false)
 {
     if (!m_pParent || !pParent->GetQWidget())
         return;
 
-    m_pQWindow = new QtObjectWindow(*this);
-    m_pQWidget = QWidget::createWindowContainer(m_pQWindow, 
pParent->GetQWidget());
-    m_pQWidget->setAttribute(Qt::WA_NoSystemBackground);
-    connect(m_pQWidget, &QObject::destroyed, this, [this]() { m_pQWidget = 
nullptr; });
-
+    m_pQWidget = new QtObjectWidget(*this);
     if (bShow)
         m_pQWidget->show();
 
@@ -53,6 +51,11 @@ QtObject::~QtObject()
     }
 }
 
+QWindow* QtObject::windowHandle() const
+{
+    return m_pQWidget ? m_pQWidget->windowHandle() : nullptr;
+}
+
 void QtObject::ResetClipRegion()
 {
     if (m_pQWidget)
@@ -90,47 +93,63 @@ void QtObject::Show(bool bVisible)
         m_pQWidget->setVisible(bVisible);
 }
 
-void QtObject::SetForwardKey(bool /*bEnable*/) {}
+void QtObject::SetForwardKey(bool bEnable) { m_bForwardKey = bEnable; }
 
-QtObjectWindow::QtObjectWindow(QtObject& rParent)
-    : m_rParent(rParent)
+void QtObject::Reparent(SalFrame* pFrame)
+{
+    QtFrame* pNewParent = static_cast<QtFrame*>(pFrame);
+    if (m_pParent == pNewParent)
+        return;
+    m_pParent = pNewParent;
+    m_pQWidget->setParent(m_pParent->GetQWidget());
+}
+
+QtObjectWidget::QtObjectWidget(QtObject& rParent)
+    : QWidget(rParent.frame()->GetQWidget())
+    , m_rParent(rParent)
 {
     assert(m_rParent.frame() && m_rParent.frame()->GetQWidget());
+    setAttribute(Qt::WA_NoSystemBackground);
+    setAttribute(Qt::WA_OpaquePaintEvent);
 }
 
-void QtObjectWindow::focusInEvent(QFocusEvent* pEvent)
+void QtObjectWidget::focusInEvent(QFocusEvent*)
 {
+    SolarMutexGuard aGuard;
     m_rParent.CallCallback(SalObjEvent::GetFocus);
-    QWindow::focusInEvent(pEvent);
 }
 
-void QtObjectWindow::focusOutEvent(QFocusEvent* pEvent)
+void QtObjectWidget::focusOutEvent(QFocusEvent*)
 {
+    SolarMutexGuard aGuard;
     m_rParent.CallCallback(SalObjEvent::LoseFocus);
-    QWindow::focusOutEvent(pEvent);
 }
 
-void QtObjectWindow::mousePressEvent(QMouseEvent* pEvent)
+void QtObjectWidget::mousePressEvent(QMouseEvent* pEvent)
 {
+    SolarMutexGuard aGuard;
     m_rParent.CallCallback(SalObjEvent::ToTop);
-    QtWidget::handleMousePressEvent(*m_rParent.frame(), pEvent);
+
+    if (m_rParent.forwardKey())
+        pEvent->ignore();
 }
 
-void QtObjectWindow::mouseReleaseEvent(QMouseEvent* pEvent)
+void QtObjectWidget::mouseReleaseEvent(QMouseEvent* pEvent)
 {
-    QtWidget::handleMouseReleaseEvent(*m_rParent.frame(), pEvent);
+    if (m_rParent.forwardKey())
+        pEvent->ignore();
 }
 
-bool QtObjectWindow::event(QEvent* pEvent)
+void QtObjectWidget::keyReleaseEvent(QKeyEvent* pEvent)
 {
-    return QtWidget::handleEvent(*m_rParent.frame(), *m_rParent.widget(), 
pEvent)
-           || QWindow::event(pEvent);
+    if (m_rParent.forwardKey())
+        pEvent->ignore();
 }
 
-void QtObjectWindow::keyReleaseEvent(QKeyEvent* pEvent)
+void QtObjectWidget::keyPressEvent(QKeyEvent* pEvent)
 {
-    if (!QtWidget::handleKeyReleaseEvent(*m_rParent.frame(), 
*m_rParent.widget(), pEvent))
-        QWindow::keyReleaseEvent(pEvent);
+    if (m_rParent.forwardKey())
+        pEvent->ignore();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to