summaryrefslogtreecommitdiff
path: root/app-office/libreoffice/files/libreoffice-4.1.3.2-kde-calchang.patch
diff options
context:
space:
mode:
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.patch74
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
+