diff options
Diffstat (limited to 'app-office/libreoffice/files/libreoffice-4.1.3.2-kde-calchang.patch')
-rw-r--r-- | app-office/libreoffice/files/libreoffice-4.1.3.2-kde-calchang.patch | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/app-office/libreoffice/files/libreoffice-4.1.3.2-kde-calchang.patch b/app-office/libreoffice/files/libreoffice-4.1.3.2-kde-calchang.patch new file mode 100644 index 00000000..8cf3a2b3 --- /dev/null +++ b/app-office/libreoffice/files/libreoffice-4.1.3.2-kde-calchang.patch @@ -0,0 +1,74 @@ +From 95f60222e75486336b6569afa8f34d60b51c94ad Mon Sep 17 00:00:00 2001 +From: Jan-Marek Glogowski <glogow@fbihome.de> +Date: Thu, 21 Nov 2013 12:40:57 +0100 +Subject: [PATCH] fdo#67011: Run Display::Yield through KDEXLib::Yield. + +Drag'n'Drop is handled in a second thread, which tries to "yield +the display" while the main Qt thread probably is already +yielding. Both need the YieldMutex, which freezes the application +until the D'n'D thread times out. + +Trying to yield the display throught the application yield +results in a recursive loop. + +So this catches and breaks the recursion, but just inside the Qt +thread, so other processes can "yield on the display", instead +of simply disabling the Display::Yield. + +Change-Id: Ifba91aa89fe5b0a89cc94820935dc996a065112f +Reviewed-on: https://gerrit.libreoffice.org/6750 +Tested-by: Jan-Marek Glogowski <glogow@fbihome.de> +Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de> +--- + vcl/unx/kde4/KDESalDisplay.cxx | 22 ++++++++++++++++------ + 1 file changed, 16 insertions(+), 6 deletions(-) + +diff --git a/vcl/unx/kde4/KDESalDisplay.cxx b/vcl/unx/kde4/KDESalDisplay.cxx +index 21440fc..ee330e7 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 +-- +1.8.5.1 + |