From 9ca320506308555b6b7fc7bbb3f82d76cdbf9a82 Mon Sep 17 00:00:00 2001 From: Pranav Kant 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(lok_doc_view_get_instance_private (pDocView)); + LOEvent* pLOEvent = static_cast(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