diff --git a/src/configsys.c b/src/configsys.c
index 2cb9aa81..7add4613 100644
--- a/src/configsys.c
+++ b/src/configsys.c
@@ -189,6 +189,9 @@ static cfg_opt_t config_opts[] = {
CFG_BOOL("match_email_addresses", TRUE, CFGF_NONE),
CFG_BOOL("match_numbers", TRUE, CFGF_NONE),
+ /* Whether to automatically copy selected text to clipboard */
+ CFG_BOOL("copy_on_selection", FALSE, CFGF_NONE),
+
/* if set to TRUE, tilda will fall back to open
* URIs with the 'web_browser' option. */
CFG_BOOL("use_custom_web_browser", FALSE, CFGF_NONE),
diff --git a/src/tilda.ui b/src/tilda.ui
index 8b23e544..6cfce700 100644
--- a/src/tilda.ui
+++ b/src/tilda.ui
@@ -959,7 +959,7 @@
GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
0
-
+
@@ -995,6 +995,22 @@
0
+
+
+
+ 0
+ 1
+ 2
+
+
@@ -1002,7 +1018,7 @@
True
False
GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
- <b>Select by Word</b>
+ <b>Selection</b>
True
diff --git a/src/tilda_terminal.c b/src/tilda_terminal.c
index ed6a30cc..51d1c07c 100644
--- a/src/tilda_terminal.c
+++ b/src/tilda_terminal.c
@@ -53,6 +53,7 @@ static void maximize_window_cb (GtkWidget *widget, gpointer data);
static void restore_window_cb (GtkWidget *widget, gpointer data);
static void refresh_window_cb (GtkWidget *widget, gpointer data);
static void move_window_cb (GtkWidget *widget, guint x, guint y, gpointer data);
+static void selection_changed_cb (VteTerminal *terminal, gpointer data);
static gchar *get_default_command (void);
gchar *get_working_directory (tilda_term *terminal);
@@ -218,6 +219,8 @@ struct tilda_term_ *tilda_term_init (struct tilda_window_ *tw, gint index)
G_CALLBACK(refresh_window_cb), tw->window);
g_signal_connect (G_OBJECT(term->vte_term), "move-window",
G_CALLBACK(move_window_cb), tw->window);
+ g_signal_connect (G_OBJECT(term->vte_term), "selection-changed",
+ G_CALLBACK(selection_changed_cb), term);
TildaMatchRegistry * registry = tilda_match_registry_new ();
term->registry = registry;
@@ -906,6 +909,22 @@ static void handle_left_button_click (GtkWidget * window,
}
}
+static void selection_changed_cb (VteTerminal *terminal, gpointer data)
+{
+ DEBUG_FUNCTION ("selection_changed_cb");
+ DEBUG_ASSERT (terminal != NULL);
+
+ /* Only proceed if copy_on_selection is enabled */
+ if (!config_getbool("copy_on_selection")) {
+ return;
+ }
+
+ /* Only copy if there is an actual selection (not when selection is cleared) */
+ if (vte_terminal_get_has_selection(terminal)) {
+ vte_terminal_copy_clipboard_format(terminal, VTE_FORMAT_TEXT);
+ }
+}
+
gchar * tilda_terminal_get_full_title (tilda_term *tt)
{
DEBUG_FUNCTION ("tilda_terminal_get_title");
diff --git a/src/wizard.c b/src/wizard.c
index 90b1bb45..bee4bf0e 100644
--- a/src/wizard.c
+++ b/src/wizard.c
@@ -1674,6 +1674,12 @@ static void check_scroll_on_keystroke_toggled_cb (GtkWidget *w, tilda_window *tw
}
}
+static void check_copy_on_selection_toggled_cb (GtkWidget *w, tilda_window *tw)
+{
+ const gboolean status = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(w));
+ config_setbool ("copy_on_selection", status);
+}
+
static void combo_backspace_binding_changed_cb (GtkWidget *w, tilda_window *tw)
{
const gint status = gtk_combo_box_get_active (GTK_COMBO_BOX(w));
@@ -1986,6 +1992,7 @@ static void initialize_scrollback_settings(void) {
CHECK_BUTTON ("check_scroll_on_output", "scroll_on_output");
CHECK_BUTTON ("check_scroll_on_keystroke", "scroll_on_key");
+ CHECK_BUTTON ("check_copy_on_selection", "copy_on_selection");
}
static void initialize_set_as_desktop_checkbox (void) {
@@ -2109,6 +2116,7 @@ static void connect_wizard_signals (TildaWizard *wizard)
CONNECT_SIGNAL ("check_infinite_scrollback", "toggled", check_infinite_scrollback_toggled_cb, tw);
CONNECT_SIGNAL ("check_scroll_on_output","toggled",check_scroll_on_output_toggled_cb, tw);
CONNECT_SIGNAL ("check_scroll_on_keystroke","toggled",check_scroll_on_keystroke_toggled_cb, tw);
+ CONNECT_SIGNAL ("check_copy_on_selection","toggled",check_copy_on_selection_toggled_cb, tw);
/* Compatibility Tab */
CONNECT_SIGNAL ("combo_backspace_binding","changed",combo_backspace_binding_changed_cb, tw);