diff --cc terminal/terminal-screen.c index 4442bca,37e50a6..0000000 --- a/terminal/terminal-screen.c +++ b/terminal/terminal-screen.c @@@ -2294,12 -2315,28 +2294,38 @@@ terminal_screen_search_find_previous (T vte_terminal_search_find_previous (VTE_TERMINAL (screen->terminal)); } + + +void +terminal_screen_set_input_enabled (TerminalScreen *screen, + gboolean enabled) +{ + terminal_return_if_fail (TERMINAL_IS_SCREEN (screen)); + vte_terminal_set_input_enabled (VTE_TERMINAL (screen->terminal), enabled); +} ++ + void + terminal_screen_set_tab_color (TerminalScreen *screen) + { + char *markup; + GtkLabel *label = GTK_LABEL (screen->tab_label); + const char *format = "\%s"; + GHashTable *color_list; + GHashTableIter iter; + gpointer key, value; + + g_object_get (G_OBJECT (screen->preferences), "tab-colors-list", &color_list, NULL); + if (!color_list) + return; + + g_hash_table_iter_init (&iter, color_list); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + if (strstr (gtk_label_get_text(label), key) != NULL) { + markup = g_markup_printf_escaped (format, value, gtk_label_get_text (label)); + gtk_label_set_markup (label, markup); + g_free (markup); + break; + } + } + } diff --git a/terminal/terminal-preferences.c b/terminal/terminal-preferences.c index 0b49b5e..9bbbaa4 100644 --- a/terminal/terminal-preferences.c +++ b/terminal/terminal-preferences.c @@ -107,6 +107,7 @@ enum PROP_WORD_CHARS, PROP_TAB_ACTIVITY_COLOR, PROP_TAB_ACTIVITY_TIMEOUT, + PROP_TAB_COLORS_LIST, N_PROPERTIES, }; @@ -237,7 +238,12 @@ transform_string_to_enum (const GValue *src, g_value_set_enum (dst, genum_value->value); } - +static void +transform_hashtable_to_string (const GValue *src, + GValue *dst) +{ + //TODO +} G_DEFINE_TYPE (TerminalPreferences, terminal_preferences, G_TYPE_OBJECT) @@ -283,6 +289,8 @@ terminal_preferences_class_init (TerminalPreferencesClass *klass) g_value_register_transform_func (G_TYPE_STRING, TERMINAL_TYPE_ERASE_BINDING, transform_string_to_enum); if (!g_value_type_transformable (G_TYPE_STRING, TERMINAL_TYPE_CURSOR_SHAPE)) g_value_register_transform_func (G_TYPE_STRING, TERMINAL_TYPE_CURSOR_SHAPE, transform_string_to_enum); +// if (!g_value_type_transformable (G_TYPE_HASH_TABLE, G_TYPE_STRING)) +// g_value_register_transform_func (G_TYPE_HASH_TABLE, G_TYPE_STRING, transform_hashtable_to_string); /** * TerminalPreferences:background-mode: @@ -961,6 +969,16 @@ terminal_preferences_class_init (TerminalPreferencesClass *klass) "-A-Za-z0-9,./?%&#:_=+@~", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + /** + * TerminalPreferences:title-mode: + **/ + preferences_props[PROP_TAB_COLORS_LIST] = + g_param_spec_boxed ("tab-colors-list", + "TabColorsList", + "TabColorsList", + G_TYPE_HASH_TABLE, + G_PARAM_READWRITE); + /* install all properties */ g_object_class_install_properties (gobject_class, N_PROPERTIES, preferences_props); } diff --git a/terminal/terminal-screen.h b/terminal/terminal-screen.h index 1351b5a..cf95ff3 100644 --- a/terminal/terminal-screen.h +++ b/terminal/terminal-screen.h @@ -108,6 +108,7 @@ void terminal_screen_search_find_next (TerminalScreen *scree void terminal_screen_search_find_previous (TerminalScreen *screen); void terminal_screen_update_font (TerminalScreen *screen); +void terminal_screen_set_tab_color (TerminalScreen *screen); void terminal_screen_set_input_enabled (TerminalScreen *screen, gboolean enabled); diff --git a/terminal/terminal-window-ui.xml b/terminal/terminal-window-ui.xml index 9e50e82..62c9d50 100644 --- a/terminal/terminal-window-ui.xml +++ b/terminal/terminal-window-ui.xml @@ -40,6 +40,7 @@ + @@ -91,6 +92,7 @@ + diff --git a/terminal/terminal-window.c b/terminal/terminal-window.c index 213f5ba..195936d 100644 --- a/terminal/terminal-window.c +++ b/terminal/terminal-window.c @@ -212,8 +212,10 @@ static void terminal_window_switch_tab (GtkNotebook static void terminal_window_move_tab (GtkNotebook *notebook, gboolean move_left); static void terminal_window_tab_info_free (TerminalWindowTabInfo *tab_info); - - +static void terminal_window_action_set_tab_color (GtkAction *action, + TerminalWindow *window); +static void terminal_window_action_set_tab_color_response (GtkWidget *button, + TerminalWindow *window); static guint window_signals[LAST_SIGNAL]; static gchar *window_notebook_group = PACKAGE_NAME; @@ -243,6 +245,7 @@ static const GtkActionEntry action_entries[] = { "zoom-reset", "zoom-original", N_ ("_Normal Size"), "0", N_ ("Zoom to default size"), G_CALLBACK (terminal_window_action_zoom_reset), }, { "terminal-menu", NULL, N_ ("_Terminal"), NULL, NULL, NULL, }, { "set-title", NULL, N_ ("_Set Title..."), "s", NULL, G_CALLBACK (terminal_window_action_set_title), }, + { "set-tab-color", NULL, N_ ("Set Tab _Color..."), "c", NULL, G_CALLBACK (terminal_window_action_set_tab_color), }, { "search", "edit-find", N_ ("_Find..."), "f", N_ ("Search terminal contents"), G_CALLBACK (terminal_window_action_search), }, { "search-next", NULL, N_ ("Find Ne_xt"), NULL, NULL, G_CALLBACK (terminal_window_action_search_next), }, { "search-prev", NULL, N_ ("Find Pre_vious"), NULL, NULL, G_CALLBACK (terminal_window_action_search_prev), }, @@ -1017,7 +1020,6 @@ terminal_window_notebook_button_press_event (GtkNotebook *notebook, terminal_return_val_if_fail (TERMINAL_IS_WINDOW (window), FALSE); terminal_return_val_if_fail (GTK_IS_NOTEBOOK (notebook), FALSE); - gdk_window_get_position (event->window, &x, &y); x += event->x; y += event->y; @@ -1315,6 +1317,7 @@ terminal_window_notify_title (TerminalScreen *screen, if (screen == window->active) { title = terminal_screen_get_title (window->active); + terminal_screen_set_tab_color (screen); gtk_window_set_title (GTK_WINDOW (window), title); g_free (title); } @@ -1853,7 +1856,6 @@ terminal_window_action_set_title (GtkAction *action, } - static void terminal_window_action_search_response (GtkWidget *dialog, gint response_id, @@ -2295,3 +2297,109 @@ terminal_window_get_restart_command (TerminalWindow *window) return g_slist_reverse (result); } + +static void +terminal_window_action_set_tab_color (GtkAction *action, + TerminalWindow *window) +{ + GtkWidget *tab; + GtkWidget *popover; + GtkWidget *box; + GtkWidget *label; + GtkWidget *entry; + GtkWidget *color_button; + GdkRGBA color = {255, .0, .0, 1}; + GtkWidget *button; + GtkWidget *save; + + terminal_return_if_fail (window->active != NULL); + + tab = gtk_notebook_get_tab_label (GTK_NOTEBOOK(window->notebook), GTK_WIDGET(window->active)); + popover = gtk_popover_new (tab); + gtk_popover_set_position (GTK_POPOVER (popover), GTK_POS_BOTTOM); + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 22); + label = gtk_label_new_with_mnemonic (_("_Substring")); + gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0); + + entry = gtk_entry_new (); + gtk_entry_set_text (GTK_ENTRY(entry), terminal_screen_get_title (window->active)); + gtk_box_pack_start (GTK_BOX (box), entry, TRUE, TRUE, 0); + gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry); + /*TODO: submit on enter */ + + color_button = gtk_color_button_new (); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER(color_button), &color); + gtk_box_pack_start (GTK_BOX (box), color_button, TRUE, TRUE, 0); + + save = gtk_check_button_new_with_label (_("Save")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(save), TRUE); + gtk_box_pack_start (GTK_BOX (box), save, TRUE, TRUE, 0); + + button = gtk_button_new_with_label (_("Apply")); + gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (terminal_window_action_set_tab_color_response), window); + g_object_set_data (G_OBJECT (button), "pattern", entry); + g_object_set_data (G_OBJECT (button), "color", color_button); + g_object_set_data (G_OBJECT (button), "permanent", save); + g_object_set_data (G_OBJECT (button), "popover", popover); + + gtk_widget_show_all (box); + gtk_container_add (GTK_CONTAINER (popover), box); + gtk_container_set_border_width (GTK_CONTAINER (popover), 6); + gtk_widget_set_visible (popover, TRUE); +} + +static void +terminal_window_action_set_tab_color_response (GtkWidget *button, + TerminalWindow *window) +{ + TerminalScreen *screen; + GtkWidget *patternWidget; + GtkWidget *colorWidget; + GtkWidget *permanentWidget; + GtkWidget *popover; + GdkRGBA color; + GHashTable *color_list; + gchar *color_str; + gchar *pattern; + gint npages, n; + + g_object_get (G_OBJECT (window->preferences), "tab-colors-list", &color_list, NULL); + if (!color_list) + color_list = g_hash_table_new (g_str_hash, g_str_equal); + + patternWidget = g_object_get_data (G_OBJECT (button), "pattern"); + colorWidget = g_object_get_data (G_OBJECT (button), "color"); + permanentWidget = g_object_get_data (G_OBJECT (button), "permanent"); + popover = g_object_get_data (G_OBJECT (button), "popover"); + + pattern = g_strdup (gtk_entry_get_text (GTK_ENTRY(patternWidget))); + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER(colorWidget), &color); + + color_str = g_strdup_printf ("#%02x%02x%02x", + (guint) (color.red * 255), + (guint) (color.green * 255), + (guint) (color.blue * 255)); + +/* TODO + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(permanentWidget))) + g_warning ("need to save %s for pattern %s", color_str, pattern); +*/ + g_hash_table_insert (color_list, pattern, color_str); + g_object_set (G_OBJECT (window->preferences), "tab-colors-list", color_list, NULL); + + /* walk the tabs */ + npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook)); + for (n = 0; n < npages; n++) + { + screen = TERMINAL_SCREEN (gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), n)); + terminal_screen_set_tab_color (screen); + } + + + gtk_widget_hide (popover); + gtk_widget_destroy (popover); +}