Index: terminal/terminal-screen.c =================================================================== --- terminal/terminal-screen.c (revision 26874) +++ terminal/terminal-screen.c (working copy) @@ -56,6 +56,7 @@ PROP_0, PROP_CUSTOM_TITLE, PROP_TITLE, + PROP_ACTIVITY, }; enum @@ -107,6 +108,8 @@ TerminalScreen *screen); static void terminal_screen_vte_window_title_changed (VteTerminal *terminal, TerminalScreen *screen); +static void terminal_screen_vte_window_contents_changed (VteTerminal *terminal, + TerminalScreen *screen); static gboolean terminal_screen_timer_background (gpointer user_data); static void terminal_screen_timer_background_destroy (gpointer user_data); @@ -138,6 +141,9 @@ guint background_timer_id; guint launch_idle_id; + + gboolean activity; + guint reset_activity_cb; }; @@ -188,6 +194,17 @@ G_PARAM_READABLE)); /** + * TerminalScreen:activity: + **/ + g_object_class_install_property (gobject_class, + PROP_ACTIVITY, + g_param_spec_boolean ("activity", + "activity", + "activity", + FALSE, + G_PARAM_READWRITE)); + + /** * TerminalScreen::get-context-menu **/ screen_signals[GET_CONTEXT_MENU] = @@ -227,6 +244,7 @@ "signal::context-menu", G_CALLBACK (terminal_screen_vte_get_context_menu), screen, "signal::selection-changed", G_CALLBACK (terminal_screen_vte_selection_changed), screen, "signal::window-title-changed", G_CALLBACK (terminal_screen_vte_window_title_changed), screen, + "signal::contents-changed", G_CALLBACK (terminal_screen_vte_window_contents_changed), screen, "swapped-signal::size-allocate", G_CALLBACK (terminal_screen_timer_background), screen, "swapped-signal::style-set", G_CALLBACK (terminal_screen_update_colors), screen, NULL); @@ -340,6 +358,10 @@ g_value_take_string (value, terminal_screen_get_title (screen)); break; + case PROP_ACTIVITY: + g_value_set_boolean (value, screen->activity); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -362,6 +384,10 @@ terminal_screen_set_custom_title (screen, g_value_get_string (value)); break; + case PROP_ACTIVITY: + screen->activity = g_value_get_boolean (value); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -843,8 +869,30 @@ g_object_notify (G_OBJECT (screen), "title"); } +static gboolean reset_activity(TerminalScreen *screen) +{ + screen->activity = FALSE; + screen->reset_activity_cb = 0; + g_object_notify (G_OBJECT (screen), "activity"); + return FALSE; +} +static void +terminal_screen_vte_window_contents_changed (VteTerminal *terminal, + TerminalScreen *screen) +{ + _terminal_return_if_fail (VTE_IS_TERMINAL (terminal)); + _terminal_return_if_fail (TERMINAL_IS_SCREEN (screen)); + screen->activity = TRUE; + g_object_notify (G_OBJECT (screen), "activity"); + if (screen->reset_activity_cb != 0) { + g_source_remove(screen->reset_activity_cb); + } + screen->reset_activity_cb = g_timeout_add_seconds (2, + (GSourceFunc)reset_activity, screen); +} + static gboolean terminal_screen_timer_background (gpointer user_data) { @@ -1232,8 +1280,6 @@ return title; } - - /** * terminal_screen_get_working_directory: * @screen : A #TerminalScreen. Index: terminal/terminal-tab-header.c =================================================================== --- terminal/terminal-tab-header.c (revision 26874) +++ terminal/terminal-tab-header.c (working copy) @@ -35,6 +35,7 @@ PROP_0, PROP_TAB_POS, PROP_TITLE, + PROP_ACTIVITY, }; enum @@ -122,6 +123,17 @@ G_PARAM_READWRITE)); /** + * TerminalTabHeader:activity: + **/ + g_object_class_install_property (gobject_class, + PROP_ACTIVITY, + g_param_spec_boolean ("activity", + "activity", + "activity", + FALSE, + G_PARAM_READWRITE)); + + /** * TerminalTabHeader::close-tab: **/ header_signals[CLOSE_TAB] = @@ -237,6 +249,10 @@ g_object_get_property (G_OBJECT (header->label), "label", value); break; + case PROP_ACTIVITY: + g_object_get_property (G_OBJECT (header), "activity", value); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -254,7 +270,10 @@ TerminalTabHeader *header = TERMINAL_TAB_HEADER (object); GtkPositionType position; const gchar *title; - + gboolean act = FALSE; + static GdkColor act_color = { 0x00, 0xafff, 0x0000, 0x0000}; + + switch (prop_id) { case PROP_TAB_POS: @@ -285,6 +304,12 @@ gtk_label_set_text (GTK_LABEL (header->label), title); break; + case PROP_ACTIVITY: + act = g_value_get_boolean(value); + /* strangely, inactive tab are in state ACTIVE */ + gtk_widget_modify_fg(header->label, GTK_STATE_ACTIVE, act ? &act_color:NULL); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; Index: terminal/terminal-window.c =================================================================== --- terminal/terminal-window.c (revision 26874) +++ terminal/terminal-window.c (working copy) @@ -1225,8 +1225,6 @@ } } - - static void terminal_window_action_new_tab (GtkAction *action, TerminalWindow *window) @@ -1697,6 +1695,7 @@ header = terminal_tab_header_new (); exo_binding_new (G_OBJECT (screen), "title", G_OBJECT (header), "title"); + exo_binding_new (G_OBJECT (screen), "activity", G_OBJECT (header), "activity"); g_signal_connect_swapped (G_OBJECT (header), "close-tab", G_CALLBACK (gtk_widget_destroy), screen); g_object_set_data_full (G_OBJECT (header), I_("terminal-window-screen"), g_object_ref (G_OBJECT (screen)), (GDestroyNotify) g_object_unref); g_object_set_data_full (G_OBJECT (screen), I_("terminal-tab-header"), g_object_ref (G_OBJECT (header)), (GDestroyNotify) g_object_unref);