summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-06-22 09:06:31 +0200
committerAshod Nakashian <ashod.nakashian@collabora.co.uk>2016-02-07 21:25:30 -0500
commit8274942a3529d278eb2b9ccb5642c78a3ebd8fe1 (patch)
treec3021441b6e5cadc02135c19c70acddba43d6f7f
parent1742d97dae5a0e07d58c7be1d28c0f978c634796 (diff)
gtktiledviewer: do HTML copying if possible
Change-Id: I24e7b18442cb08814a73dd33b368b368039a11e4 (cherry picked from commit f403cecdaedf263f11081c91bed62640362a3a3e)
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx37
1 files changed, 35 insertions, 2 deletions
diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
index 3c4217bcd31f..26259cf316e5 100644
--- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
@@ -125,16 +125,49 @@ static void toggleFindbar(GtkWidget* /*pButton*/, gpointer /*pItem*/)
}
}
+/// Our GtkClipboardGetFunc implementation for HTML.
+static void htmlGetFunc(GtkClipboard* /*pClipboard*/, GtkSelectionData* pSelectionData, guint /*info*/, gpointer pUserData)
+{
+ GdkAtom aAtom(gdk_atom_intern("text/html", false));
+ const gchar* pSelection = static_cast<const gchar*>(pUserData);
+ gtk_selection_data_set(pSelectionData, aAtom, 8, reinterpret_cast<const guchar *>(pSelection), strlen(pSelection));
+}
+
+/// Our GtkClipboardClearFunc implementation for HTML.
+static void htmlClearFunc(GtkClipboard* /*pClipboard*/, gpointer pData)
+{
+ g_free(pData);
+}
+
+/// Same as gtk_clipboard_set_text(), but sets HTML.
+static void clipboardSetHtml(GtkClipboard* pClipboard, const char* pSelection)
+{
+ GtkTargetList* pList = gtk_target_list_new(0, 0);
+ GdkAtom aAtom(gdk_atom_intern("text/html", false));
+ gtk_target_list_add(pList, aAtom, 0, 0);
+ gint nTargets = 0;
+ GtkTargetEntry* pTargets = gtk_target_table_new_from_list(pList, &nTargets);
+
+ gtk_clipboard_set_with_data(pClipboard, pTargets, nTargets, htmlGetFunc, htmlClearFunc, g_strdup(pSelection));
+
+ gtk_target_table_free(pTargets, nTargets);
+ gtk_target_list_unref(pList);
+}
+
/// Handler for the copy button: write clipboard.
static void doCopy(GtkWidget* /*pButton*/, gpointer /*pItem*/)
{
LOKDocView* pLOKDocView = LOK_DOC_VIEW(pDocView);
LibreOfficeKitDocument* pDocument = lok_doc_view_get_document(pLOKDocView);
char* pUsedFormat = 0;
- char* pSelection = pDocument->pClass->getTextSelection(pDocument, "text/plain;charset=utf-8", &pUsedFormat);
+ char* pSelection = pDocument->pClass->getTextSelection(pDocument, "text/html", &pUsedFormat);
GtkClipboard* pClipboard = gtk_clipboard_get_for_display(gtk_widget_get_display(pDocView), GDK_SELECTION_CLIPBOARD);
- gtk_clipboard_set_text(pClipboard, pSelection, -1);
+ std::string aUsedFormat(pUsedFormat);
+ if (aUsedFormat == "text/plain;charset=utf-8")
+ gtk_clipboard_set_text(pClipboard, pSelection, -1);
+ else
+ clipboardSetHtml(pClipboard, pSelection);
free(pSelection);
free(pUsedFormat);