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.weghorn@posteo.de>
Tested-by: Jenkins
(cherry picked from commit 4366e0605214260e55a937173b0c2e02225dc843)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134903
Reviewed-by: Ilmari Lauhakangas <ilmari.lauhakangas@libreoffice.org>
diff --git a/vcl/inc/qt5/QtObject.hxx b/vcl/inc/qt5/QtObject.hxx
index 328946e..bc5a8e5 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 569586a..fbdc8e9 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: */