summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoachim Breitner <mail@joachim-breitner.de>2011-07-20 21:30:38 +0200
committerJoachim Breitner <mail@joachim-breitner.de>2011-07-20 21:30:38 +0200
commit68ea4d259f898112425616bdb3a597a941dd1d4b (patch)
treed5f5f4c18a87a4328904625cfe6542ad2eb20174
parent7785c154472b644770d55337b1edbd0cdbef29ff (diff)
downloadvte-68ea4d259f898112425616bdb3a597a941dd1d4b.tar.gz
Implement text/html target
For now without actually transferring any markup, but we do wrap the data in <pre>, so a possible user of the data will use fixed-width fonts.
-rw-r--r--src/vte-private.h8
-rw-r--r--src/vte.c49
2 files changed, 44 insertions, 13 deletions
diff --git a/src/vte-private.h b/src/vte-private.h
index 2ca635ce..e380c2ad 100644
--- a/src/vte-private.h
+++ b/src/vte-private.h
@@ -118,6 +118,14 @@ typedef enum {
LAST_VTE_SELECTION
} VteSelection;
+/* Used in the GtkClipboard API, to distinguish requests for HTML and TEXT
+ * contents of a clipboard */
+typedef enum {
+ VTE_TARGET_TEXT,
+ VTE_TARGET_HTML,
+ LAST_VTE_TARGET
+} VteSelectionTarget;
+
/* A match regex, with a tag. */
struct vte_match_regex {
gint tag;
diff --git a/src/vte.c b/src/vte.c
index 75ca2b67..9641f041 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -6209,19 +6209,38 @@ vte_terminal_copy_cb(GtkClipboard *clipboard, GtkSelectionData *data,
VteTerminal *terminal;
terminal = owner;
for (sel = 0; sel < LAST_VTE_SELECTION; sel ++) {
- if (clipboard == terminal->pvt->clipboard[sel]) {
- if (terminal->pvt->selection_text[sel] != NULL) {
- _VTE_DEBUG_IF(VTE_DEBUG_SELECTION) {
- int i;
- g_printerr("Setting selection %d (%"G_GSIZE_FORMAT" UTF-8 bytes.)\n",
- sel,
- strlen(terminal->pvt->selection_text[sel]));
- for (i = 0; terminal->pvt->selection_text[sel][i] != '\0'; i++) {
- g_printerr("0x%04x\n",
- terminal->pvt->selection_text[sel][i]);
- }
+ if (clipboard == terminal->pvt->clipboard[sel] && terminal->pvt->selection_text[sel] != NULL) {
+ _VTE_DEBUG_IF(VTE_DEBUG_SELECTION) {
+ int i;
+ g_printerr("Setting selection %d (%"G_GSIZE_FORMAT" UTF-8 bytes.)\n",
+ sel,
+ strlen(terminal->pvt->selection_text[sel]));
+ for (i = 0; terminal->pvt->selection_text[sel][i] != '\0'; i++) {
+ g_printerr("0x%04x\n",
+ terminal->pvt->selection_text[sel][i]);
}
- gtk_selection_data_set_text(data, terminal->pvt->selection_text[sel], -1); }
+ }
+ if (info == VTE_TARGET_TEXT) {
+ gtk_selection_data_set_text(data, terminal->pvt->selection_text[sel], -1);
+ } else {
+ gsize len;
+ gchar *selection, *text;
+
+ g_assert(info == VTE_TARGET_HTML);
+
+ text = g_markup_printf_escaped("<pre>%s</pre>",
+ terminal->pvt->selection_text[sel]);
+ /* Mozilla asks that we start our text/html with the Unicode byte order mark */
+ /* (Comment found in gtkimhtml.c of pidgin fame) */
+ selection = g_convert(text, -1, "UTF-16", "UTF-8", NULL, &len, NULL);
+ g_free(text);
+ gtk_selection_data_set(data,
+ gdk_atom_intern("text/html", FALSE),
+ 16,
+ (const guchar *)selection,
+ len);
+ g_free(selection);
+ }
}
}
}
@@ -6561,7 +6580,11 @@ vte_terminal_copy(VteTerminal *terminal, VteSelection sel)
GtkTargetList *list;
list = gtk_target_list_new (NULL, 0);
- gtk_target_list_add_text_targets (list, 0);
+ gtk_target_list_add_text_targets (list, VTE_TARGET_TEXT);
+ gtk_target_list_add (list,
+ gdk_atom_intern("text/html", FALSE),
+ 0,
+ VTE_TARGET_HTML);
targets = gtk_target_table_new_from_list (list, &n_targets);
gtk_target_list_unref (list);
}