diff options
author | Jan-Marek Glogowski <glogow@fbihome.de> | 2022-05-24 11:34:59 +0200 |
---|---|---|
committer | Jan-Marek Glogowski <glogow@fbihome.de> | 2022-05-25 13:53:46 +0200 |
commit | 4366e0605214260e55a937173b0c2e02225dc843 (patch) | |
tree | 4065db3b5f7b13bf796027cf04b49ed08141318b | |
parent | ff2b4bff61d2e1679bb525d754c960c48b81c495 (diff) |
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
-rw-r--r-- | vcl/inc/qt5/QtObject.hxx | 25 | ||||
-rw-r--r-- | vcl/qt5/QtObject.cxx | 65 |
2 files changed, 57 insertions, 33 deletions
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: */ |