vcl/source/window/window.cxx |   45 +++++++++++++++++++++++++++++++------------
 1 file changed, 33 insertions(+), 12 deletions(-)

New commits:
commit ad9ac5cf73808d4e71bb4cf6b8df9c3ded0adbe3
Author: Pranav Kant <pran...@collabora.co.uk>
Date:   Thu Dec 14 12:53:35 2017 +0530

    lokdialog: Unblock custom window mouse key events
    
    In some cases, the mouse event blocks. Eg: when the mouse event is
    responsible for launching a new dialog (cf. Spell dialog -> Options).
    We don't want any kind of blocking behavior whatsoever in LOK. Post all
    custom window mouse events back the main-loop thread and keep the
    current LOK thread free.
    
    Change-Id: I018870fadcb62dbb7b33a7d93f8af3a0000442b5
    (cherry picked from commit 53f8f28c53391ef1cadefaf16c3a9e81e04ac7f5)
    (cherry picked from commit 266beae6cdc352f942a7ea5935f8a8b21d2d1e01)
    Reviewed-on: https://gerrit.libreoffice.org/46438
    Reviewed-by: Jan Holesovsky <ke...@collabora.com>
    Tested-by: Jan Holesovsky <ke...@collabora.com>

diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 95157d665b1f..48ebe460ba04 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -3250,15 +3250,34 @@ VclPtr<vcl::Window> Window::GetParentWithLOKNotifier()
     return pWindow;
 }
 
+struct LOKAsyncEvent
+{
+    VclPtr<vcl::Window> mpWindow;
+    SalEvent mnEvent;
+    MouseEvent maMouseEvent;
+};
+
+static void LOKAsyncEventLink( void* pEvent, void* )
+{
+    LOKAsyncEvent* pLOKEv = static_cast<LOKAsyncEvent*>(pEvent);
+    if (!pLOKEv->mpWindow->IsDisposed())
+    {
+        ImplWindowFrameProc(pLOKEv->mpWindow, pLOKEv->mnEvent, 
&pLOKEv->maMouseEvent);
+    }
+    delete pLOKEv;
+}
+
 void Window::LogicMouseButtonDown(const MouseEvent& rMouseEvent)
 {
     // When we're not doing tiled rendering, then positions must be passed as 
pixels.
     assert(comphelper::LibreOfficeKit::isActive());
 
-    if (ImplIsFloatingWindow())
-        ImplWindowFrameProc(ImplGetBorderWindow(), 
SalEvent::ExternalMouseButtonDown, &rMouseEvent);
-    else
-        ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonDown, 
&rMouseEvent);
+    LOKAsyncEvent* pEv = new LOKAsyncEvent;
+    pEv->mpWindow = ImplIsFloatingWindow() ? ImplGetBorderWindow() : this;
+    pEv->mnEvent = SalEvent::ExternalMouseButtonDown;
+    pEv->maMouseEvent = rMouseEvent;
+    Application::PostUserEvent( Link<void*, void>(pEv, LOKAsyncEventLink) );
+
 }
 
 void Window::LogicMouseButtonUp(const MouseEvent& rMouseEvent)
@@ -3266,10 +3285,11 @@ void Window::LogicMouseButtonUp(const MouseEvent& 
rMouseEvent)
     // When we're not doing tiled rendering, then positions must be passed as 
pixels.
     assert(comphelper::LibreOfficeKit::isActive());
 
-    if (ImplIsFloatingWindow())
-        ImplWindowFrameProc(ImplGetBorderWindow(), 
SalEvent::ExternalMouseButtonUp, &rMouseEvent);
-    else
-        ImplWindowFrameProc(this, SalEvent::ExternalMouseButtonUp, 
&rMouseEvent);
+    LOKAsyncEvent* pEv = new LOKAsyncEvent;
+    pEv->mpWindow = ImplIsFloatingWindow() ? ImplGetBorderWindow() : this;
+    pEv->mnEvent = SalEvent::ExternalMouseButtonUp;
+    pEv->maMouseEvent = rMouseEvent;
+    Application::PostUserEvent( Link<void*, void>(pEv, LOKAsyncEventLink) );
 }
 
 void Window::LogicMouseMove(const MouseEvent& rMouseEvent)
@@ -3277,10 +3297,11 @@ void Window::LogicMouseMove(const MouseEvent& 
rMouseEvent)
     // When we're not doing tiled rendering, then positions must be passed as 
pixels.
     assert(comphelper::LibreOfficeKit::isActive());
 
-    if (ImplIsFloatingWindow())
-        ImplWindowFrameProc(ImplGetBorderWindow(), 
SalEvent::ExternalMouseMove, &rMouseEvent);
-    else
-        ImplWindowFrameProc(this, SalEvent::ExternalMouseMove, &rMouseEvent);
+    LOKAsyncEvent* pEv = new LOKAsyncEvent;
+    pEv->mpWindow = ImplIsFloatingWindow() ? ImplGetBorderWindow() : this;
+    pEv->mnEvent = SalEvent::ExternalMouseMove;
+    pEv->maMouseEvent = rMouseEvent;
+    Application::PostUserEvent( Link<void*, void>(pEv, LOKAsyncEventLink) );
 }
 
 void Window::LOKKeyInput(const KeyEvent& rKeyEvent)
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to