summaryrefslogtreecommitdiff
path: root/libreofficekit
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-04-03 10:19:16 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2015-04-07 09:18:15 +0200
commitbf11827971d7a1f519ed2aa6901bf3be17931338 (patch)
treefa79d4988f93e12812a1c6162d46876a64128251 /libreofficekit
parent9fb3ace37f2cf954cc75a28e01a19ab5e7ce2d49 (diff)
lokdocview: move callback handling to LOKDocView_Impl
These were the last free functions that passed around a LOKDocView_Impl* manually just because it was not possible to have them in a C++ class when lokdocview was C code. Change-Id: I6229a853336db0e47f7d1ba4687d198e076934a3
Diffstat (limited to 'libreofficekit')
-rw-r--r--libreofficekit/source/gtk/lokdocview.cxx208
1 files changed, 108 insertions, 100 deletions
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index a3232490badf..b71355e1afe2 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -26,7 +26,7 @@
#define G_SOURCE_REMOVE FALSE
#define G_SOURCE_CONTINUE TRUE
#endif
-#ifndef g_info
+#if !GLIB_CHECK_VERSION(2,40,0)
#define g_info(...) g_log(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, __VA_ARGS__)
#endif
@@ -174,6 +174,14 @@ struct LOKDocView_Impl
static std::vector<GdkRectangle> payloadToRectangles(const char* pPayload);
/// Returns the string representation of a LibreOfficeKitCallbackType enumeration element.
static const char* callbackTypeToString(int nType);
+ /// Invoked on the main thread if callbackWorker() requests so.
+ static gboolean callback(gpointer pData);
+ /// Implementation of the callback handler, invoked by callback();
+ gboolean callbackImpl(CallbackData* pCallbackData);
+ /// Our LOK callback, runs on the LO thread.
+ static void callbackWorker(int nType, const char* pPayload, void* pData);
+ /// Implementation of the callback worder handler, invoked by callbackWorker().
+ void callbackWorkerImpl(int nType, const char* pPayload);
};
LOKDocView_Impl::CallbackData::CallbackData(int nType, const std::string& rPayload, LOKDocView* pDocView)
@@ -853,6 +861,104 @@ const char* LOKDocView_Impl::callbackTypeToString(int nType)
return 0;
}
+gboolean LOKDocView_Impl::callback(gpointer pData)
+{
+ LOKDocView_Impl::CallbackData* pCallback = static_cast<LOKDocView_Impl::CallbackData*>(pData);
+ return pCallback->m_pDocView->m_pImpl->callbackImpl(pCallback);
+}
+
+gboolean LOKDocView_Impl::callbackImpl(CallbackData* pCallback)
+{
+ switch (pCallback->m_nType)
+ {
+ case LOK_CALLBACK_INVALIDATE_TILES:
+ {
+ if (pCallback->m_aPayload != "EMPTY")
+ {
+ GdkRectangle aRectangle = LOKDocView_Impl::payloadToRectangle(pCallback->m_aPayload.c_str());
+ renderDocument(&aRectangle);
+ }
+ else
+ renderDocument(0);
+ }
+ break;
+ case LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR:
+ {
+ m_aVisibleCursor = LOKDocView_Impl::payloadToRectangle(pCallback->m_aPayload.c_str());
+ m_bCursorOverlayVisible = true;
+ gtk_widget_queue_draw(GTK_WIDGET(m_pEventBox));
+ }
+ break;
+ case LOK_CALLBACK_TEXT_SELECTION:
+ {
+ m_aTextSelectionRectangles = LOKDocView_Impl::payloadToRectangles(pCallback->m_aPayload.c_str());
+
+ // In case the selection is empty, then we get no LOK_CALLBACK_TEXT_SELECTION_START/END events.
+ if (m_aTextSelectionRectangles.empty())
+ {
+ memset(&m_aTextSelectionStart, 0, sizeof(m_aTextSelectionStart));
+ memset(&m_aHandleStartRect, 0, sizeof(m_aHandleStartRect));
+ memset(&m_aTextSelectionEnd, 0, sizeof(m_aTextSelectionEnd));
+ memset(&m_aHandleEndRect, 0, sizeof(m_aHandleEndRect));
+ }
+ else
+ memset(&m_aHandleMiddleRect, 0, sizeof(m_aHandleMiddleRect));
+ gtk_widget_queue_draw(GTK_WIDGET(m_pEventBox));
+ }
+ break;
+ case LOK_CALLBACK_TEXT_SELECTION_START:
+ {
+ m_aTextSelectionStart = LOKDocView_Impl::payloadToRectangle(pCallback->m_aPayload.c_str());
+ }
+ break;
+ case LOK_CALLBACK_TEXT_SELECTION_END:
+ {
+ m_aTextSelectionEnd = LOKDocView_Impl::payloadToRectangle(pCallback->m_aPayload.c_str());
+ }
+ break;
+ case LOK_CALLBACK_CURSOR_VISIBLE:
+ {
+ m_bCursorVisible = pCallback->m_aPayload == "true";
+ }
+ break;
+ case LOK_CALLBACK_GRAPHIC_SELECTION:
+ {
+ if (pCallback->m_aPayload != "EMPTY")
+ m_aGraphicSelection = LOKDocView_Impl::payloadToRectangle(pCallback->m_aPayload.c_str());
+ else
+ memset(&m_aGraphicSelection, 0, sizeof(m_aGraphicSelection));
+ gtk_widget_queue_draw(GTK_WIDGET(m_pEventBox));
+ }
+ break;
+ case LOK_CALLBACK_HYPERLINK_CLICKED:
+ {
+ GError* pError = NULL;
+ gtk_show_uri(NULL, pCallback->m_aPayload.c_str(), GDK_CURRENT_TIME, &pError);
+ }
+ break;
+ default:
+ g_assert(false);
+ break;
+ }
+ delete pCallback;
+
+ return G_SOURCE_REMOVE;
+}
+
+void LOKDocView_Impl::callbackWorker(int nType, const char* pPayload, void* pData)
+{
+ LOKDocView* pDocView = static_cast<LOKDocView*>(pData);
+ pDocView->m_pImpl->callbackWorkerImpl(nType, pPayload);
+}
+
+void LOKDocView_Impl::callbackWorkerImpl(int nType, const char* pPayload)
+{
+ LOKDocView_Impl::CallbackData* pCallback = new LOKDocView_Impl::CallbackData(nType, pPayload, m_pDocView);
+ g_info("lok_docview_callback_worker: %s, '%s'", LOKDocView_Impl::callbackTypeToString(nType), pPayload);
+#if GTK_CHECK_VERSION(2,12,0)
+ gdk_threads_add_idle(LOKDocView_Impl::callback, pCallback);
+#endif
+}
enum
{
@@ -933,104 +1039,6 @@ SAL_DLLPUBLIC_EXPORT GtkWidget* lok_docview_new( LibreOfficeKit* pOffice )
return GTK_WIDGET( pDocView );
}
-/// Invoked on the main thread if lok_docview_callback_worker() requests so.
-static gboolean lok_docview_callback(gpointer pData)
-{
-#if GLIB_CHECK_VERSION(2,28,0) // we need g_list_free_full()
- LOKDocView_Impl::CallbackData* pCallback = static_cast<LOKDocView_Impl::CallbackData*>(pData);
-
- switch (pCallback->m_nType)
- {
- case LOK_CALLBACK_INVALIDATE_TILES:
- {
- if (pCallback->m_aPayload != "EMPTY")
- {
- GdkRectangle aRectangle = LOKDocView_Impl::payloadToRectangle(pCallback->m_aPayload.c_str());
- pCallback->m_pDocView->m_pImpl->renderDocument(&aRectangle);
- }
- else
- pCallback->m_pDocView->m_pImpl->renderDocument(NULL);
- }
- break;
- case LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR:
- {
- pCallback->m_pDocView->m_pImpl->m_aVisibleCursor = LOKDocView_Impl::payloadToRectangle(pCallback->m_aPayload.c_str());
- pCallback->m_pDocView->m_pImpl->m_bCursorOverlayVisible = true;
- gtk_widget_queue_draw(GTK_WIDGET(pCallback->m_pDocView->m_pImpl->m_pEventBox));
- }
- break;
- case LOK_CALLBACK_TEXT_SELECTION:
- {
- LOKDocView* pDocView = pCallback->m_pDocView;
- pDocView->m_pImpl->m_aTextSelectionRectangles = LOKDocView_Impl::payloadToRectangles(pCallback->m_aPayload.c_str());
-
- // In case the selection is empty, then we get no LOK_CALLBACK_TEXT_SELECTION_START/END events.
- if (pDocView->m_pImpl->m_aTextSelectionRectangles.empty())
- {
- memset(&pDocView->m_pImpl->m_aTextSelectionStart, 0, sizeof(pDocView->m_pImpl->m_aTextSelectionStart));
- memset(&pDocView->m_pImpl->m_aHandleStartRect, 0, sizeof(pDocView->m_pImpl->m_aHandleStartRect));
- memset(&pDocView->m_pImpl->m_aTextSelectionEnd, 0, sizeof(pDocView->m_pImpl->m_aTextSelectionEnd));
- memset(&pDocView->m_pImpl->m_aHandleEndRect, 0, sizeof(pDocView->m_pImpl->m_aHandleEndRect));
- }
- else
- memset(&pDocView->m_pImpl->m_aHandleMiddleRect, 0, sizeof(pDocView->m_pImpl->m_aHandleMiddleRect));
- gtk_widget_queue_draw(GTK_WIDGET(pDocView->m_pImpl->m_pEventBox));
- }
- break;
- case LOK_CALLBACK_TEXT_SELECTION_START:
- {
- pCallback->m_pDocView->m_pImpl->m_aTextSelectionStart = LOKDocView_Impl::payloadToRectangle(pCallback->m_aPayload.c_str());
- }
- break;
- case LOK_CALLBACK_TEXT_SELECTION_END:
- {
- pCallback->m_pDocView->m_pImpl->m_aTextSelectionEnd = LOKDocView_Impl::payloadToRectangle(pCallback->m_aPayload.c_str());
- }
- break;
- case LOK_CALLBACK_CURSOR_VISIBLE:
- {
- pCallback->m_pDocView->m_pImpl->m_bCursorVisible = pCallback->m_aPayload == "true";
- }
- break;
- case LOK_CALLBACK_GRAPHIC_SELECTION:
- {
- if (pCallback->m_aPayload != "EMPTY")
- pCallback->m_pDocView->m_pImpl->m_aGraphicSelection = LOKDocView_Impl::payloadToRectangle(pCallback->m_aPayload.c_str());
- else
- memset(&pCallback->m_pDocView->m_pImpl->m_aGraphicSelection, 0, sizeof(pCallback->m_pDocView->m_pImpl->m_aGraphicSelection));
- gtk_widget_queue_draw(GTK_WIDGET(pCallback->m_pDocView->m_pImpl->m_pEventBox));
- }
- break;
- case LOK_CALLBACK_HYPERLINK_CLICKED:
- {
- GError* pError = NULL;
- gtk_show_uri(NULL, pCallback->m_aPayload.c_str(), GDK_CURRENT_TIME, &pError);
- }
- break;
- default:
- g_assert(false);
- break;
- }
-
- delete pCallback;
-#endif
- return G_SOURCE_REMOVE;
-}
-
-/// Our LOK callback, runs on the LO thread.
-static void lok_docview_callback_worker(int nType, const char* pPayload, void* pData)
-{
- LOKDocView* pDocView = static_cast<LOKDocView*>(pData);
-
- LOKDocView_Impl::CallbackData* pCallback = new LOKDocView_Impl::CallbackData(nType, pPayload, pDocView);
- g_info("lok_docview_callback_worker: %s, '%s'", LOKDocView_Impl::callbackTypeToString(nType), pPayload);
-#if GTK_CHECK_VERSION(2,12,0)
- gdk_threads_add_idle(lok_docview_callback, pCallback);
-#else
- g_idle_add(lok_docview_callback, pDocView);
-#endif
-}
-
SAL_DLLPUBLIC_EXPORT gboolean lok_docview_open_document( LOKDocView* pDocView, char* pPath )
{
if ( pDocView->m_pImpl->m_pDocument )
@@ -1051,7 +1059,7 @@ SAL_DLLPUBLIC_EXPORT gboolean lok_docview_open_document( LOKDocView* pDocView, c
else
{
pDocView->m_pImpl->m_pDocument->pClass->initializeForRendering(pDocView->m_pImpl->m_pDocument);
- pDocView->m_pImpl->m_pDocument->pClass->registerCallback(pDocView->m_pImpl->m_pDocument, &lok_docview_callback_worker, pDocView);
+ pDocView->m_pImpl->m_pDocument->pClass->registerCallback(pDocView->m_pImpl->m_pDocument, &LOKDocView_Impl::callbackWorker, pDocView);
g_timeout_add(600, &LOKDocView_Impl::handleTimeout, pDocView);
pDocView->m_pImpl->renderDocument(0);
}