Blob Blame History Raw
From 9ca320506308555b6b7fc7bbb3f82d76cdbf9a82 Mon Sep 17 00:00:00 2001
From: Pranav Kant <pranavk@gnome.org>
Date: Sun, 26 Jul 2015 22:23:46 +0530
Subject: [PATCH 082/398] lokdocview: Move postMouseEvent in separate LOK
 thread

Change-Id: I9d1a08db2a91a596d3039a2388c22e6ea76dc2b1
(cherry picked from commit de9224bf9686550e63876eb5ac1241b27c01bc25)
---
 libreofficekit/source/gtk/lokdocview.cxx | 52 ++++++++++++++++++++++++++++++--
 libreofficekit/source/gtk/tilebuffer.hxx | 11 ++++++-
 2 files changed, 59 insertions(+), 4 deletions(-)

diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index 6bee2f513ae9..d23ac1af2fc1 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -958,7 +958,16 @@ lok_doc_view_signal_button(GtkWidget* pWidget, GdkEventButton* pEvent)
         if ((pEvent->time - priv->m_nLastButtonPressTime) < 250)
             nCount++;
         priv->m_nLastButtonPressTime = pEvent->time;
-        priv->m_pDocument->pClass->postMouseEvent(priv->m_pDocument, LOK_MOUSEEVENT_MOUSEBUTTONDOWN, pixelToTwip(pEvent->x, priv->m_fZoom), pixelToTwip(pEvent->y, priv->m_fZoom), nCount);
+        GTask* task = g_task_new(pDocView, NULL, NULL, NULL);
+        LOEvent* pLOEvent = new LOEvent(LOK_POST_MOUSE_EVENT);
+        pLOEvent->m_nPostMouseEventType = LOK_MOUSEEVENT_MOUSEBUTTONDOWN;
+        pLOEvent->m_nPostMouseEventX = pixelToTwip(pEvent->x, priv->m_fZoom);
+        pLOEvent->m_nPostMouseEventY = pixelToTwip(pEvent->y, priv->m_fZoom);
+        pLOEvent->m_nPostMouseEventCount = nCount;
+        g_task_set_task_data(task, pLOEvent, g_free);
+
+        g_thread_pool_push(lokThreadPool, g_object_ref(task), NULL);
+        g_object_unref(task);
         break;
     }
     case GDK_BUTTON_RELEASE:
@@ -967,7 +976,16 @@ lok_doc_view_signal_button(GtkWidget* pWidget, GdkEventButton* pEvent)
         if ((pEvent->time - priv->m_nLastButtonReleaseTime) < 250)
             nCount++;
         priv->m_nLastButtonReleaseTime = pEvent->time;
-        priv->m_pDocument->pClass->postMouseEvent(priv->m_pDocument, LOK_MOUSEEVENT_MOUSEBUTTONUP, pixelToTwip(pEvent->x, priv->m_fZoom), pixelToTwip(pEvent->y, priv->m_fZoom), nCount);
+        GTask* task = g_task_new(pDocView, NULL, NULL, NULL);
+        LOEvent* pLOEvent = new LOEvent(LOK_POST_MOUSE_EVENT);
+        pLOEvent->m_nPostMouseEventType = LOK_MOUSEEVENT_MOUSEBUTTONUP;
+        pLOEvent->m_nPostMouseEventX = pixelToTwip(pEvent->x, priv->m_fZoom);
+        pLOEvent->m_nPostMouseEventY = pixelToTwip(pEvent->y, priv->m_fZoom);
+        pLOEvent->m_nPostMouseEventCount = nCount;
+        g_task_set_task_data(task, pLOEvent, g_free);
+
+        g_thread_pool_push(lokThreadPool, g_object_ref(task), NULL);
+        g_object_unref(task);
         break;
     }
     default:
@@ -1050,12 +1068,37 @@ lok_doc_view_signal_motion (GtkWidget* pWidget, GdkEventMotion* pEvent)
     }
 
     // Otherwise a mouse move, as on the desktop.
-    priv->m_pDocument->pClass->postMouseEvent(priv->m_pDocument, LOK_MOUSEEVENT_MOUSEMOVE, pixelToTwip(pEvent->x, priv->m_fZoom), pixelToTwip(pEvent->y, priv->m_fZoom), 1);
+
+    GTask* task = g_task_new(pDocView, NULL, NULL, NULL);
+    LOEvent* pLOEvent = new LOEvent(LOK_POST_MOUSE_EVENT);
+    pLOEvent->m_nPostMouseEventType = LOK_MOUSEEVENT_MOUSEMOVE;
+    pLOEvent->m_nPostMouseEventX = pixelToTwip(pEvent->x, priv->m_fZoom);
+    pLOEvent->m_nPostMouseEventY = pixelToTwip(pEvent->y, priv->m_fZoom);
+    pLOEvent->m_nPostMouseEventCount = 1;
+    g_task_set_task_data(task, pLOEvent, g_free);
+
+    g_thread_pool_push(lokThreadPool, g_object_ref(task), NULL);
+    g_object_unref(task);
 
     return FALSE;
 }
 
 static void
+postMouseEventInThread(gpointer data)
+{
+    GTask* task = G_TASK(data);
+    LOKDocView* pDocView = LOK_DOC_VIEW(g_task_get_source_object(task));
+    LOKDocViewPrivate *priv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private (pDocView));
+    LOEvent* pLOEvent = static_cast<LOEvent*>(g_task_get_task_data(task));
+
+    priv->m_pDocument->pClass->postMouseEvent(priv->m_pDocument,
+                                              pLOEvent->m_nPostMouseEventType,
+                                              pLOEvent->m_nPostMouseEventX,
+                                              pLOEvent->m_nPostMouseEventY,
+                                              pLOEvent->m_nPostMouseEventCount);
+}
+
+static void
 openDocumentInThread (gpointer data)
 {
     GTask* task = G_TASK(data);
@@ -1236,6 +1279,9 @@ lokThreadFunc(gpointer data, gpointer /*user_data*/)
     case LOK_PAINT_TILE:
         paintTileInThread(task);
         break;
+    case LOK_POST_MOUSE_EVENT:
+        postMouseEventInThread(task);
+        break;
     }
 
     g_object_unref(task);
diff --git a/libreofficekit/source/gtk/tilebuffer.hxx b/libreofficekit/source/gtk/tilebuffer.hxx
index 6e57d2fe8bd5..aa496aaf3e8f 100644
--- a/libreofficekit/source/gtk/tilebuffer.hxx
+++ b/libreofficekit/source/gtk/tilebuffer.hxx
@@ -138,7 +138,8 @@ enum
     LOK_SET_PARTMODE,
     LOK_SET_PART,
     LOK_POST_KEY,
-    LOK_PAINT_TILE
+    LOK_PAINT_TILE,
+    LOK_POST_MOUSE_EVENT
 };
 
 /**
@@ -187,6 +188,14 @@ struct LOEvent
     float m_fPaintTileZoom;
     ///@}
 
+    /// @name postMouseEvent parameters
+    ///@{
+    int m_nPostMouseEventType;
+    int m_nPostMouseEventX;
+    int m_nPostMouseEventY;
+    int m_nPostMouseEventCount;
+    ///@}
+
     /// Constructor to instantiate an object of type `type`.
     LOEvent(int type)
         : m_nType(type) {}
-- 
2.12.0