Kaydet (Commit) 7163d64b authored tarafından Jan-Marek Glogowski's avatar Jan-Marek Glogowski

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
üst e72849cd
...@@ -31,10 +31,12 @@ ...@@ -31,10 +31,12 @@
#undef Region #undef Region
#include "KDESalGraphics.hxx" #include "KDESalGraphics.hxx"
#include "KDESalInstance.hxx"
#include <vcl/settings.hxx> #include <vcl/settings.hxx>
#include <vcl/decoview.hxx> #include <vcl/decoview.hxx>
#include <rtl/ustrbuf.hxx> #include <rtl/ustrbuf.hxx>
#include <unx/saldata.hxx>
using namespace ::rtl; using namespace ::rtl;
...@@ -165,21 +167,6 @@ namespace ...@@ -165,21 +167,6 @@ namespace
kapp->style()->drawComplexControl(element, option, &painter); 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) void lcl_drawFrame(QStyle::PrimitiveElement element, QImage* image, QStyle::State state)
{ {
#if ( QT_VERSION >= QT_VERSION_CHECK( 4, 5, 0 ) ) #if ( QT_VERSION >= QT_VERSION_CHECK( 4, 5, 0 ) )
...@@ -554,7 +541,7 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part, ...@@ -554,7 +541,7 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
vclStateValue2StateFlag(nControlState, value) ); vclStateValue2StateFlag(nControlState, value) );
// draw just the border, see http://qa.openoffice.org/issues/show_bug.cgi?id=107945 // 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 ))); clipRegion = new QRegion( QRegion( widgetRect ).subtracted( widgetRect.adjusted( fw, fw, -fw, -fw )));
} }
else if (type == CTRL_WINDOW_BACKGROUND) else if (type == CTRL_WINDOW_BACKGROUND)
...@@ -857,7 +844,7 @@ bool KDESalGraphics::getNativeControlRegion( ControlType type, ControlPart part, ...@@ -857,7 +844,7 @@ bool KDESalGraphics::getNativeControlRegion( ControlType type, ControlPart part,
{ {
if( part == PART_BORDER ) if( part == PART_BORDER )
{ {
int nFrameWidth = getFrameWidth(); int nFrameWidth = static_cast< KDESalInstance* >(GetSalData()->m_pInstance)->getFrameWidth();
sal_uInt16 nStyle = val.getNumericVal(); sal_uInt16 nStyle = val.getNumericVal();
if( nStyle & FRAME_DRAW_NODRAW ) if( nStyle & FRAME_DRAW_NODRAW )
{ {
......
...@@ -38,4 +38,9 @@ uno::Reference< ui::dialogs::XFilePicker2 > KDESalInstance::createFilePicker( ...@@ -38,4 +38,9 @@ uno::Reference< ui::dialogs::XFilePicker2 > KDESalInstance::createFilePicker(
static_cast<KDEXLib*>( mpXLib )->createFilePicker(xMSF) ); static_cast<KDEXLib*>( mpXLib )->createFilePicker(xMSF) );
} }
int KDESalInstance::getFrameWidth()
{
return static_cast<KDEXLib*>( mpXLib )->getFrameWidth();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -36,6 +36,7 @@ class KDESalInstance : public X11SalInstance ...@@ -36,6 +36,7 @@ class KDESalInstance : public X11SalInstance
virtual com::sun::star::uno::Reference< com::sun::star::ui::dialogs::XFilePicker2 > virtual com::sun::star::uno::Reference< com::sun::star::ui::dialogs::XFilePicker2 >
createFilePicker( const com::sun::star::uno::Reference< createFilePicker( const com::sun::star::uno::Reference<
com::sun::star::uno::XComponentContext >& ); com::sun::star::uno::XComponentContext >& );
int getFrameWidth();
}; };
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -59,7 +59,7 @@ KDEXLib::KDEXLib() : ...@@ -59,7 +59,7 @@ KDEXLib::KDEXLib() :
SalXLib(), m_bStartupDone(false), m_pApplication(0), SalXLib(), m_bStartupDone(false), m_pApplication(0),
m_pFreeCmdLineArgs(0), m_pAppCmdLineArgs(0), m_nFakeCmdLineArgs( 0 ), m_pFreeCmdLineArgs(0), m_pAppCmdLineArgs(0), m_nFakeCmdLineArgs( 0 ),
eventLoopType( LibreOfficeEventLoop ), eventLoopType( LibreOfficeEventLoop ),
m_bYieldFrozen( false ) m_bYieldFrozen( false ), m_frameWidth( -1 )
{ {
// the timers created here means they belong to the main thread // the timers created here means they belong to the main thread
connect( &timeoutTimer, SIGNAL( timeout()), this, SLOT( timeoutActivated())); connect( &timeoutTimer, SIGNAL( timeout()), this, SLOT( timeoutActivated()));
...@@ -82,6 +82,9 @@ KDEXLib::KDEXLib() : ...@@ -82,6 +82,9 @@ KDEXLib::KDEXLib() :
this, SLOT( createFilePicker( const com::sun::star::uno::Reference< this, SLOT( createFilePicker( const com::sun::star::uno::Reference<
com::sun::star::uno::XComponentContext >&) ), com::sun::star::uno::XComponentContext >&) ),
Qt::BlockingQueuedConnection ); Qt::BlockingQueuedConnection );
connect( this, SIGNAL( getFrameWidthSignal() ),
this, SLOT( getFrameWidth() ), Qt::BlockingQueuedConnection );
} }
KDEXLib::~KDEXLib() KDEXLib::~KDEXLib()
...@@ -405,6 +408,27 @@ uno::Reference< ui::dialogs::XFilePicker2 > KDEXLib::createFilePicker( ...@@ -405,6 +408,27 @@ uno::Reference< ui::dialogs::XFilePicker2 > KDEXLib::createFilePicker(
return uno::Reference< ui::dialogs::XFilePicker2 >( new KDE4FilePicker( xMSF, this ) ); 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" #include "KDEXLib.moc"
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -53,6 +53,7 @@ class KDEXLib : public QObject, public SalXLib ...@@ -53,6 +53,7 @@ class KDEXLib : public QObject, public SalXLib
QTimer userEventTimer; QTimer userEventTimer;
enum { LibreOfficeEventLoop, GlibEventLoop, QtUnixEventLoop } eventLoopType; enum { LibreOfficeEventLoop, GlibEventLoop, QtUnixEventLoop } eventLoopType;
bool m_bYieldFrozen; bool m_bYieldFrozen;
int m_frameWidth;
private: private:
void setupEventLoop(); void setupEventLoop();
...@@ -71,6 +72,7 @@ class KDEXLib : public QObject, public SalXLib ...@@ -71,6 +72,7 @@ class KDEXLib : public QObject, public SalXLib
com::sun::star::uno::Reference< com::sun::star::ui::dialogs::XFilePicker2 > com::sun::star::uno::Reference< com::sun::star::ui::dialogs::XFilePicker2 >
createFilePickerSignal( const com::sun::star::uno::Reference< createFilePickerSignal( const com::sun::star::uno::Reference<
com::sun::star::uno::XComponentContext >& ); com::sun::star::uno::XComponentContext >& );
int getFrameWidthSignal();
public: public:
KDEXLib(); KDEXLib();
...@@ -89,9 +91,10 @@ class KDEXLib : public QObject, public SalXLib ...@@ -89,9 +91,10 @@ class KDEXLib : public QObject, public SalXLib
void doStartup(); void doStartup();
public Q_SLOTS: 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< createFilePicker( const com::sun::star::uno::Reference<
com::sun::star::uno::XComponentContext >& ); com::sun::star::uno::XComponentContext >& );
int getFrameWidth();
}; };
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment