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
+
+
+
+ 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;
}