diff options
-rw-r--r-- | vcl/unx/kde4/KDESalDisplay.cxx | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/vcl/unx/kde4/KDESalDisplay.cxx b/vcl/unx/kde4/KDESalDisplay.cxx index 21440fc4d7d4..ee330e735625 100644 --- a/vcl/unx/kde4/KDESalDisplay.cxx +++ b/vcl/unx/kde4/KDESalDisplay.cxx @@ -25,6 +25,8 @@ #include <assert.h> #include <unx/saldata.hxx> +#include <qthread.h> + SalKDEDisplay* SalKDEDisplay::selfptr = NULL; SalKDEDisplay::SalKDEDisplay( Display* pDisp ) @@ -48,18 +50,26 @@ SalKDEDisplay::~SalKDEDisplay() void SalKDEDisplay::Yield() { - if( DispatchInternalEvent() ) + // We yield the display throught the main Qt thread. + // Actually this Yield may call the Display::Yield, which results in an + // unlimited cycle. + static bool break_cyclic_yield_recursion = false; + bool is_qt_gui_thread = ( qApp->thread() == QThread::currentThread() ); + + if( DispatchInternalEvent() || break_cyclic_yield_recursion ) return; + if( is_qt_gui_thread ) + break_cyclic_yield_recursion = true; + DBG_ASSERT( static_cast<SalYieldMutex*>(GetSalData()->m_pInstance->GetYieldMutex())->GetThreadId() == osl::Thread::getCurrentIdentifier(), "will crash soon since solar mutex not locked in SalKDEDisplay::Yield" ); - XEvent event; - XNextEvent( pDisp_, &event ); - if( checkDirectInputEvent( &event )) - return; - qApp->x11ProcessEvent( &event ); + static_cast<KDEXLib*>(GetXLib())->Yield( true, false ); + + if( is_qt_gui_thread ) + break_cyclic_yield_recursion = false; } // HACK: When using Qt event loop, input methods (japanese, etc.) will get broken because |