From 0d17aa10e8c1752c5f2eabde7cdca5e185d5a3ee Mon Sep 17 00:00:00 2001 From: brotherdetjr Date: Sun, 28 Dec 2025 02:15:08 +0000 Subject: [PATCH] implement copy-on-selection functionality --- src/configsys.c | 3 +++ src/tilda.ui | 22 +++++++++++++++++++--- src/tilda_terminal.c | 19 +++++++++++++++++++ src/wizard.c | 8 ++++++++ 4 files changed, 49 insertions(+), 3 deletions(-) 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 - + True False @@ -976,7 +976,7 @@ True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Word Characters: + Select by Word Characters: 1 @@ -995,6 +995,22 @@ 0 + + + Copy on Selection + True + True + False + Automatically copy selected text to clipboard + start + True + + + 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);