summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2022-05-24 11:34:59 +0200
committerJan-Marek Glogowski <glogow@fbihome.de>2022-05-25 13:53:46 +0200
commit4366e0605214260e55a937173b0c2e02225dc843 (patch)
tree4065db3b5f7b13bf796027cf04b49ed08141318b
parentff2b4bff61d2e1679bb525d754c960c48b81c495 (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.hxx25
-rw-r--r--vcl/qt5/QtObject.cxx65
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: */