diff options
author | Jan-Marek Glogowski <glogow@fbihome.de> | 2014-02-27 20:34:00 +0000 |
---|---|---|
committer | Jan-Marek Glogowski <glogow@fbihome.de> | 2014-03-03 10:48:05 +0000 |
commit | 7163d64b90ac4d4259b1d0379cfca348dd30601c (patch) | |
tree | eca83beaf5f358cab84927b28a8b2c9689fda55e /vcl/unx/kde4 | |
parent | e72849cd435cc50a744dcbcfb422f5600dd0cce9 (diff) |
KDE4: evaluate frameWidth in the Qt thread
When opening a document via Java UNO without a running LO instance, one
gets the following Qt error messages:
CE> QObject: Cannot create children for a parent that is in a different thread.
CE> (Parent is Oxygen::WidgetStateEngine(0x8deb878), parent's thread is QThread(0x8d6cf70), current thread is QThread(0xa8fa7fc8)
CE> QObject::installEventFilter(): Cannot filter events for objects in a different thread.
CE> QObject::installEventFilter(): Cannot filter events for objects in a different thread.
CE> QObject::installEventFilter(): Cannot filter events for objects in a different thread.
This happens, because the Java UNO call is processed in the first /
Qt thread while document loading happens in a second thread.
Document loading actually just calls getNativeControlRegion, which
should not involve any drawing. But the KDE4 backend does some style
processing to get the correct frame width (QWidget::ensurePolished(),
which uses GUI based events and need to be processed in the Qt
thread.
Change-Id: I344d5089d958963c48a9a8a84bfa9fe8f092b75a
Diffstat (limited to 'vcl/unx/kde4')
-rw-r--r-- | vcl/unx/kde4/KDESalGraphics.cxx | 21 | ||||
-rw-r--r-- | vcl/unx/kde4/KDESalInstance.cxx | 5 | ||||
-rw-r--r-- | vcl/unx/kde4/KDESalInstance.hxx | 1 | ||||
-rw-r--r-- | vcl/unx/kde4/KDEXLib.cxx | 26 | ||||
-rw-r--r-- | vcl/unx/kde4/KDEXLib.hxx | 5 |
5 files changed, 39 insertions, 19 deletions
diff --git a/vcl/unx/kde4/KDESalGraphics.cxx b/vcl/unx/kde4/KDESalGraphics.cxx index a41b0cd14da7..4fbe79bf24f1 100644 --- a/vcl/unx/kde4/KDESalGraphics.cxx +++ b/vcl/unx/kde4/KDESalGraphics.cxx @@ -31,10 +31,12 @@ #undef Region #include "KDESalGraphics.hxx" +#include "KDESalInstance.hxx" #include <vcl/settings.hxx> #include <vcl/decoview.hxx> #include <rtl/ustrbuf.hxx> +#include <unx/saldata.hxx> using namespace ::rtl; @@ -165,21 +167,6 @@ namespace kapp->style()->drawComplexControl(element, option, &painter); } - int getFrameWidth() - { - static int s_nFrameWidth = -1; - if( s_nFrameWidth < 0 ) - { - // fill in a default - QFrame aFrame( NULL ); - aFrame.setFrameRect( QRect(0, 0, 100, 30) ); - aFrame.setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); - aFrame.ensurePolished(); - s_nFrameWidth = aFrame.frameWidth(); - } - return s_nFrameWidth; - } - void lcl_drawFrame(QStyle::PrimitiveElement element, QImage* image, QStyle::State state) { #if ( QT_VERSION >= QT_VERSION_CHECK( 4, 5, 0 ) ) @@ -554,7 +541,7 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part, vclStateValue2StateFlag(nControlState, value) ); // draw just the border, see http://qa.openoffice.org/issues/show_bug.cgi?id=107945 - int fw = getFrameWidth(); + int fw = static_cast< KDESalInstance* >(GetSalData()->m_pInstance)->getFrameWidth(); clipRegion = new QRegion( QRegion( widgetRect ).subtracted( widgetRect.adjusted( fw, fw, -fw, -fw ))); } else if (type == CTRL_WINDOW_BACKGROUND) @@ -857,7 +844,7 @@ bool KDESalGraphics::getNativeControlRegion( ControlType type, ControlPart part, { if( part == PART_BORDER ) { - int nFrameWidth = getFrameWidth(); + int nFrameWidth = static_cast< KDESalInstance* >(GetSalData()->m_pInstance)->getFrameWidth(); sal_uInt16 nStyle = val.getNumericVal(); if( nStyle & FRAME_DRAW_NODRAW ) { diff --git a/vcl/unx/kde4/KDESalInstance.cxx b/vcl/unx/kde4/KDESalInstance.cxx index 224ac3a0619e..9670172e216e 100644 --- a/vcl/unx/kde4/KDESalInstance.cxx +++ b/vcl/unx/kde4/KDESalInstance.cxx @@ -38,4 +38,9 @@ uno::Reference< ui::dialogs::XFilePicker2 > KDESalInstance::createFilePicker( static_cast<KDEXLib*>( mpXLib )->createFilePicker(xMSF) ); } +int KDESalInstance::getFrameWidth() +{ + return static_cast<KDEXLib*>( mpXLib )->getFrameWidth(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kde4/KDESalInstance.hxx b/vcl/unx/kde4/KDESalInstance.hxx index 3c07f5276190..f73af0d27a3d 100644 --- a/vcl/unx/kde4/KDESalInstance.hxx +++ b/vcl/unx/kde4/KDESalInstance.hxx @@ -36,6 +36,7 @@ class KDESalInstance : public X11SalInstance virtual com::sun::star::uno::Reference< com::sun::star::ui::dialogs::XFilePicker2 > createFilePicker( const com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >& ); + int getFrameWidth(); }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kde4/KDEXLib.cxx b/vcl/unx/kde4/KDEXLib.cxx index 68c9c5289e87..d914caaddf96 100644 --- a/vcl/unx/kde4/KDEXLib.cxx +++ b/vcl/unx/kde4/KDEXLib.cxx @@ -59,7 +59,7 @@ KDEXLib::KDEXLib() : SalXLib(), m_bStartupDone(false), m_pApplication(0), m_pFreeCmdLineArgs(0), m_pAppCmdLineArgs(0), m_nFakeCmdLineArgs( 0 ), eventLoopType( LibreOfficeEventLoop ), - m_bYieldFrozen( false ) + m_bYieldFrozen( false ), m_frameWidth( -1 ) { // the timers created here means they belong to the main thread connect( &timeoutTimer, SIGNAL( timeout()), this, SLOT( timeoutActivated())); @@ -82,6 +82,9 @@ KDEXLib::KDEXLib() : this, SLOT( createFilePicker( const com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >&) ), Qt::BlockingQueuedConnection ); + + connect( this, SIGNAL( getFrameWidthSignal() ), + this, SLOT( getFrameWidth() ), Qt::BlockingQueuedConnection ); } KDEXLib::~KDEXLib() @@ -405,6 +408,27 @@ uno::Reference< ui::dialogs::XFilePicker2 > KDEXLib::createFilePicker( return uno::Reference< ui::dialogs::XFilePicker2 >( new KDE4FilePicker( xMSF, this ) ); } +#define Region QtXRegion +#include <qframe.h> +#undef Region + +int KDEXLib::getFrameWidth() +{ + if( m_frameWidth >= 0 ) + return m_frameWidth; + if( qApp->thread() != QThread::currentThread()) { + SalYieldMutexReleaser aReleaser; + return Q_EMIT getFrameWidthSignal(); + } + + // fill in a default + QFrame aFrame( NULL ); + aFrame.setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); + aFrame.ensurePolished(); + m_frameWidth = aFrame.frameWidth(); + return m_frameWidth; +} + #include "KDEXLib.moc" /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/kde4/KDEXLib.hxx b/vcl/unx/kde4/KDEXLib.hxx index d07b9f6c6d81..dd7f83f7d18e 100644 --- a/vcl/unx/kde4/KDEXLib.hxx +++ b/vcl/unx/kde4/KDEXLib.hxx @@ -53,6 +53,7 @@ class KDEXLib : public QObject, public SalXLib QTimer userEventTimer; enum { LibreOfficeEventLoop, GlibEventLoop, QtUnixEventLoop } eventLoopType; bool m_bYieldFrozen; + int m_frameWidth; private: void setupEventLoop(); @@ -71,6 +72,7 @@ class KDEXLib : public QObject, public SalXLib com::sun::star::uno::Reference< com::sun::star::ui::dialogs::XFilePicker2 > createFilePickerSignal( const com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >& ); + int getFrameWidthSignal(); public: KDEXLib(); @@ -89,9 +91,10 @@ class KDEXLib : public QObject, public SalXLib void doStartup(); public Q_SLOTS: - virtual com::sun::star::uno::Reference< com::sun::star::ui::dialogs::XFilePicker2 > + com::sun::star::uno::Reference< com::sun::star::ui::dialogs::XFilePicker2 > createFilePicker( const com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >& ); + int getFrameWidth(); }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |