From ec211bccdcfb5bfabd03f6bcff8df02bb5eab266 Mon Sep 17 00:00:00 2001 From: Wynn Wolf Arbor Date: Sat, 28 Mar 2020 15:16:31 +0100 Subject: Add Copy to HTML feature This commit adds a "Copy to HTML" entry to the context menu. It is active when VTE registers an active selection. Lines copied like this will be put into the clipboard as formatted HTML, retaining nearly all styling information. For this, vte_copy now takes a boolean argument - whether or not to format the lines copied as HTML. As two menu items now access vte_copy directly, and there is no clean way of passing arguments to signal handlers through terminal.ui, signals for both menu items are now connected in the Vala code instead. --- terminal.ui | 13 +++++++++++-- terminal.vala | 16 ++++++++++------ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/terminal.ui b/terminal.ui index 4ba9555..4618d40 100644 --- a/terminal.ui +++ b/terminal.ui @@ -232,16 +232,25 @@ True False - + gtk-copy True False True True - + + + Copy as _HTML + True + False + Copy the selection as HTML + True + False + + gtk-paste diff --git a/terminal.vala b/terminal.vala index 5f4f4e0..c7a2c81 100644 --- a/terminal.vala +++ b/terminal.vala @@ -26,7 +26,8 @@ class Terminal : Gtk.Overlay { [GtkChild] Gtk.Menu standard_context_menu; [GtkChild] Gtk.Menu url_context_menu; [GtkChild] Gtk.Menu hyperlink_context_menu; - [GtkChild] Gtk.MenuItem copy_item; + [GtkChild] Gtk.MenuItem copy_item_text; + [GtkChild] Gtk.MenuItem copy_item_html; [GtkChild] Gtk.Revealer search_revealer; [GtkChild] Gtk.ScrolledWindow scrolled_window; [GtkChild] Gtk.SearchEntry search_entry; @@ -53,6 +54,9 @@ class Terminal : Gtk.Overlay { clipboard = Gtk.Clipboard.get_default(window.get_display()); + copy_item_text.activate.connect(() => vte_copy()); + copy_item_html.activate.connect(() => vte_copy(true)); + try { var regex = new Vte.Regex.for_match(URL_REGEX, URL_REGEX.length, PCRE2_CASELESS | PCRE2_MULTILINE); vte.match_add_regex(regex, 0); @@ -300,10 +304,9 @@ class Terminal : Gtk.Overlay { adjust_font_scale(vte.get_font_scale() / FONT_SCALE_FACTOR); } - [GtkCallback] - void vte_copy() { + void vte_copy(bool html = false) { if (vte.get_has_selection()) { - vte.copy_clipboard_format(TEXT); + vte.copy_clipboard_format(html ? Vte.Format.HTML : Vte.Format.TEXT); } } @@ -323,7 +326,8 @@ class Terminal : Gtk.Overlay { } else if (hyperlink_match != null) { hyperlink_context_menu.popup_at_pointer(event); } else { - copy_item.set_sensitive(vte.get_has_selection()); + copy_item_text.set_sensitive(vte.get_has_selection()); + copy_item_html.set_sensitive(vte.get_has_selection()); standard_context_menu.popup_at_pointer(event); } return true; @@ -351,7 +355,7 @@ class Terminal : Gtk.Overlay { [GtkCallback] bool vte_key_press(Gdk.EventKey event) { if (match_key(event, CONTROL_MASK | SHIFT_MASK, Gdk.Key.C)) { - vte_copy(); + vte_copy(false); return true; } -- cgit v1.2.3-2-gb3c3