summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vcl/unx/kde4/KDESalDisplay.cxx22
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