diff --git a/terminal/terminal-preferences-dialog.c b/terminal/terminal-preferences-dialog.c index e2081b00..2cdca172 100644 --- a/terminal/terminal-preferences-dialog.c +++ b/terminal/terminal-preferences-dialog.c @@ -277,6 +277,7 @@ error: BIND_PROPERTIES ("custom-command", "text"); BIND_PROPERTIES ("default-working-dir", "text"); BIND_PROPERTIES ("word-chars", "text"); + BIND_PROPERTIES ("bell-cmd", "text"); BIND_PROPERTIES ("scrolling-lines", "value"); BIND_PROPERTIES ("tab-activity-timeout", "value"); BIND_PROPERTIES ("background-darkness", "value"); diff --git a/terminal/terminal-preferences.c b/terminal/terminal-preferences.c index 9c25447f..35f17271 100644 --- a/terminal/terminal-preferences.c +++ b/terminal/terminal-preferences.c @@ -123,6 +123,7 @@ enum PROP_TITLE_INITIAL, PROP_TITLE_MODE, PROP_WORD_CHARS, + PROP_BELL_CMD, PROP_TAB_ACTIVITY_COLOR, PROP_TAB_ACTIVITY_TIMEOUT, PROP_TEXT_BLINK_MODE, @@ -1163,6 +1164,16 @@ terminal_preferences_class_init (TerminalPreferencesClass *klass) "-A-Za-z0-9,./?%&#:_=+@~", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + /** + * TerminalPreferences:bell-cmd: + **/ + preferences_props[PROP_BELL_CMD] = + g_param_spec_string ("bell-cmd", + NULL, + "BellCmd", + "", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + /** * TerminalPreferences:text-blink-mode: **/ diff --git a/terminal/terminal-preferences.glade b/terminal/terminal-preferences.glade index 9ba3ea3c..b60e28b6 100644 --- a/terminal/terminal-preferences.glade +++ b/terminal/terminal-preferences.glade @@ -3713,6 +3713,75 @@ when double clicking: 3 + + + True + False + 0 + none + + + True + False + 12 + + + True + False + 6 + 6 + + + True + False + start + Execute shell command +upon receiving _bell: + True + bell-cmd + + + False + True + 0 + + + + + True + True + center + + False + False + + + True + True + 1 + + + + + + + + + True + False + Bell Command + + + + + + + + False + True + 4 + + 5 diff --git a/terminal/terminal-screen.c b/terminal/terminal-screen.c index da88239c..aaaec7a5 100644 --- a/terminal/terminal-screen.c +++ b/terminal/terminal-screen.c @@ -132,6 +132,7 @@ static void terminal_screen_update_scrolling_on_keystroke (TerminalScreen static void terminal_screen_update_text_blink_mode (TerminalScreen *screen); static void terminal_screen_update_title (TerminalScreen *screen); static void terminal_screen_update_word_chars (TerminalScreen *screen); +static void terminal_screen_update_bell_cmd (TerminalScreen *screen); static void terminal_screen_vte_child_exited (VteTerminal *terminal, gint status, TerminalScreen *screen); @@ -185,6 +186,7 @@ struct _TerminalScreen gchar *working_directory; gchar **custom_command; + gchar *bell_cmd; gchar *custom_title; gchar *initial_title; @@ -345,6 +347,7 @@ terminal_screen_init (TerminalScreen *screen) terminal_screen_update_scrolling_on_keystroke (screen); terminal_screen_update_text_blink_mode (screen); terminal_screen_update_word_chars (screen); + terminal_screen_update_bell_cmd (screen); terminal_screen_update_background (screen); terminal_screen_update_colors (screen); @@ -629,6 +632,8 @@ terminal_screen_preferences_changed (TerminalPreferences *preferences, terminal_screen_update_title (screen); else if (strcmp ("word-chars", name) == 0) terminal_screen_update_word_chars (screen); + else if (strcmp ("bell-cmd", name) == 0) + terminal_screen_update_bell_cmd (screen); else if (strcmp ("misc-tab-position", name) == 0) terminal_screen_update_label_orientation (screen); } @@ -1324,6 +1329,34 @@ terminal_screen_update_word_chars (TerminalScreen *screen) +static void +terminal_screen_update_bell_cmd (TerminalScreen *screen) +{ + gchar *bell_cmd; + + terminal_return_if_fail (TERMINAL_IS_SCREEN (screen)); + terminal_return_if_fail (TERMINAL_IS_PREFERENCES (screen->preferences)); + terminal_return_if_fail (VTE_IS_TERMINAL (screen->terminal)); + + /* free existing bell_cmd if it exists */ + if (G_UNLIKELY (screen->bell_cmd != NULL)) + { + g_free (screen->bell_cmd); + screen->bell_cmd = NULL; + } + + /* set new bell_cmd */ + g_object_get (G_OBJECT (screen->preferences), "bell-cmd", &bell_cmd, NULL); + if (G_LIKELY (bell_cmd != NULL)) + { + if (strlen (bell_cmd) > 0) + screen->bell_cmd = g_strdup (bell_cmd); + g_free (bell_cmd); + } +} + + + static void relaunch_bar_response (GtkInfoBar *info_bar, gint response_id, @@ -1688,13 +1721,20 @@ terminal_screen_urgent_bell (TerminalWidget *widget, TerminalScreen *screen) { gboolean enabled; + int rc; terminal_return_if_fail (TERMINAL_IS_SCREEN (screen)); g_object_get (G_OBJECT (screen->preferences), "misc-bell-urgent", &enabled, NULL); - if (enabled) - gtk_window_set_urgency_hint (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (screen))), TRUE); + if (!enabled) + return; + + gtk_window_set_urgency_hint (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (screen))), TRUE); + + if (screen->bell_cmd != NULL) + rc = system(screen->bell_cmd); + (void)rc; }