diff options
author | Bill Meier <wmeier@newsguy.com> | 2013-02-28 23:05:09 +0000 |
---|---|---|
committer | Bill Meier <wmeier@newsguy.com> | 2013-02-28 23:05:09 +0000 |
commit | 2115cd7696fc8cdae3af00bab96b52e1c9f47fe0 (patch) | |
tree | 004004eee0661c19bbb7de017c0ec3045bdea3a3 | |
parent | 663e6a6d6b3a3e03677c5fefea3f50e1157c2b7a (diff) |
color_edit_dlg update:
- Significantly simplify & rework code;
- Use GtkColorChooser instead of GtkColorSelection if GTK 3.4 or newer.
- Minor UI cleanup (default buttons & etc)
- Fix crash which occurred in the (existing) GTK3 related code.
- Fix some other relatively minor bugs (including some minor memory leaks);
- Remove some old, commented-out code;
- Use a more consistent naming scheme for certain variables.
svn path=/trunk/; revision=47958
-rw-r--r-- | color_filters.c | 36 | ||||
-rw-r--r-- | color_filters.h | 38 | ||||
-rw-r--r-- | ui/gtk/color_dlg.c | 25 | ||||
-rw-r--r-- | ui/gtk/color_edit_dlg.c | 767 | ||||
-rw-r--r-- | ui/gtk/color_edit_dlg.h | 13 |
5 files changed, 476 insertions, 403 deletions
diff --git a/color_filters.c b/color_filters.c index 4fb1029517..3ee290b7de 100644 --- a/color_filters.c +++ b/color_filters.c @@ -78,15 +78,15 @@ color_filter_new(const gchar *name, /* The name of the filter to create { color_filter_t *colorf; - colorf = (color_filter_t *)g_malloc(sizeof (color_filter_t)); - colorf->filter_name = g_strdup(name); - colorf->filter_text = g_strdup(filter_string); - colorf->bg_color = *bg_color; - colorf->fg_color = *fg_color; - colorf->disabled = disabled; - colorf->c_colorfilter = NULL; - colorf->edit_dialog = NULL; - colorf->selected = FALSE; + colorf = (color_filter_t *)g_malloc(sizeof (color_filter_t)); + colorf->filter_name = g_strdup(name); + colorf->filter_text = g_strdup(filter_string); + colorf->bg_color = *bg_color; + colorf->fg_color = *fg_color; + colorf->disabled = disabled; + colorf->c_colorfilter = NULL; + colorf->color_edit_dlg_info = NULL; + colorf->selected = FALSE; return colorf; } @@ -249,15 +249,15 @@ color_filter_clone(color_filter_t *colorf) { color_filter_t *new_colorf; - new_colorf = (color_filter_t *)g_malloc(sizeof (color_filter_t)); - new_colorf->filter_name = g_strdup(colorf->filter_name); - new_colorf->filter_text = g_strdup(colorf->filter_text); - new_colorf->bg_color = colorf->bg_color; - new_colorf->fg_color = colorf->fg_color; - new_colorf->disabled = colorf->disabled; - new_colorf->c_colorfilter = NULL; - new_colorf->edit_dialog = NULL; - new_colorf->selected = FALSE; + new_colorf = (color_filter_t *)g_malloc(sizeof (color_filter_t)); + new_colorf->filter_name = g_strdup(colorf->filter_name); + new_colorf->filter_text = g_strdup(colorf->filter_text); + new_colorf->bg_color = colorf->bg_color; + new_colorf->fg_color = colorf->fg_color; + new_colorf->disabled = colorf->disabled; + new_colorf->c_colorfilter = NULL; + new_colorf->color_edit_dlg_info = NULL; + new_colorf->selected = FALSE; return new_colorf; } diff --git a/color_filters.h b/color_filters.h index 5ada0fd10d..05a0c09e55 100644 --- a/color_filters.h +++ b/color_filters.h @@ -35,19 +35,18 @@ extern "C" { /* Data for a color filter. */ typedef struct _color_filter { - gchar *filter_name; /* name of the filter */ - gchar *filter_text; /* text of the filter expression */ - color_t bg_color; /* background color for packets that match */ - color_t fg_color; /* foreground color for packets that match */ - gboolean disabled; /* set if the filter is disabled */ - gboolean selected; /* set if the filter is selected in the color dialog box */ - - /* only used inside of color_filters.c */ - dfilter_t *c_colorfilter; /* compiled filter expression */ - - /* only used outside of color_filters.c (beside init) */ - void *edit_dialog; /* if filter is being edited, dialog - * box for it */ + gchar *filter_name; /* name of the filter */ + gchar *filter_text; /* text of the filter expression */ + color_t bg_color; /* background color for packets that match */ + color_t fg_color; /* foreground color for packets that match */ + gboolean disabled; /* set if the filter is disabled */ + gboolean selected; /* set if the filter is selected in the color dialog box */ + + /* only used inside of color_filters.c */ + dfilter_t *c_colorfilter; /* compiled filter expression */ + + /* only used outside of color_filters.c (beside init) */ + void *color_edit_dlg_info; /* if filter is being edited, ptr to req'd info */ } color_filter_t; @@ -199,3 +198,16 @@ void color_filter_list_delete(GSList **cfl); #endif /* __cplusplus */ #endif + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ diff --git a/ui/gtk/color_dlg.c b/ui/gtk/color_dlg.c index c3be90e4a4..cb0f374259 100644 --- a/ui/gtk/color_dlg.c +++ b/ui/gtk/color_dlg.c @@ -667,8 +667,7 @@ destroy_edit_dialog_cb(gpointer filter_arg, gpointer dummy _U_) { color_filter_t *colorf = (color_filter_t *)filter_arg; - if (colorf->edit_dialog != NULL) - window_destroy(colorf->edit_dialog); + color_edit_dlg_destroy(colorf->color_edit_dlg_info); } /* Called when the dialog box is being destroyed; destroy any edit @@ -803,7 +802,7 @@ create_new_color_filter(GtkButton *button, const char *filter) select_row(color_filters, 0); /* open the edit dialog */ - edit_color_filter_dialog(color_filters, TRUE /* is a new filter */); + color_edit_dlg(color_filters, TRUE /* is a new filter */); gtk_widget_grab_focus(color_filters); } @@ -825,7 +824,7 @@ color_edit_cb(GtkButton *button, gpointer user_data _U_) color_filters = (GtkWidget *)g_object_get_data(G_OBJECT(button), COLOR_FILTERS_CL); g_assert(color_dlg_row_selected != -1); - edit_color_filter_dialog(color_filters, FALSE /* is not a new filter */); + color_edit_dlg(color_filters, FALSE /* is not a new filter */); } /* User double-clicked on the coloring rule */ @@ -834,7 +833,7 @@ color_filters_button_cb(GtkWidget *list, GdkEventButton *event, gpointer data _U_) { if (event->type == GDK_2BUTTON_PRESS) { - edit_color_filter_dialog(list, FALSE); + color_edit_dlg(list, FALSE); } return FALSE; @@ -896,8 +895,7 @@ color_delete_single(gint row, GtkWidget *color_filters) color_dlg_num_of_filters--; /* Destroy any "Edit color filter" dialog boxes editing it. */ - if (colorf->edit_dialog != NULL) - window_destroy(colorf->edit_dialog); + color_edit_dlg_destroy(colorf->color_edit_dlg_info); /* Delete the color filter from the list of color filters. */ color_filter_edit_list = g_slist_remove(color_filter_edit_list, colorf); @@ -1061,3 +1059,16 @@ color_cancel_cb(GtkWidget *widget _U_, gpointer user_data _U_) /* Destroy the dialog box. */ window_destroy(colorize_win); } + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 2 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=2 tabstop=8 expandtab: + * :indentSize=2:tabSize=8:noTabs=true: + */ diff --git a/ui/gtk/color_edit_dlg.c b/ui/gtk/color_edit_dlg.c index 9dc2d1c4a1..0e821219c5 100644 --- a/ui/gtk/color_edit_dlg.c +++ b/ui/gtk/color_edit_dlg.c @@ -24,8 +24,6 @@ #include "config.h" -#include <string.h> - #include <gtk/gtk.h> #include <epan/packet.h> @@ -47,106 +45,176 @@ #include "ui/gtk/old-gtk-compat.h" -#define BUTTON_SIZE_X -1 -#define BUTTON_SIZE_Y -1 - -static void edit_color_filter_destroy_cb(GObject *object, gpointer user_data); -static void edit_color_filter_fg_cb(GtkButton *button, gpointer user_data); -static void edit_color_filter_bg_cb(GtkButton *button, gpointer user_data); -/* - static void edit_disabled_cb_cb(GtkButton *button, gpointer user_data); -*/ -static void edit_color_filter_ok_cb(GtkButton *button, gpointer user_data); -static void edit_new_color_filter_cancel_cb(GtkButton *button, gpointer user_data); +/* Essentially: + * + * There are two dialog windows: + * - color_edit_dlg + * + * - color_selection_dlg (Gtk2) aka color_chooser_dlg (gtk 3.4 and newer). + * The color_selection_dlg window can be instantiated (serially or in parallel) + * to select the foreground and/or the background color for the filter. + * The color_selection_dlg windows are 'transient_for' and 'destroyed_with' + * the color_edit_dlg window. + * + * + * The information needed by the various dlg callback functions is passed via + * the callback 'user_data' parameter. + * + * There are two different structs passed via a pointer in 'user_data': + * - (color_edit_dlg_info_t *)user_data + * supplied to the color_edit_dlg Ok and Cancel button "clicked" + * callbacks and to the color_edit_dlg "destroy" callback. + * + * - (color_selection_dlg_info_t *)user_data + * supplied to the color_edit_dlg FG/BG button "clicked" and "destroy" + * callbacks and to the color_selection_dlg "response" and "destroy" callbacks. + * + * Note that there are two separate instances of this struct: + * - "foreground" info associated with the color_edit_dlg Foreground button; + * - "background" info associated with the color_edit_dlg Background button. + */ -static GtkWidget* color_sel_win_new(color_filter_t *colorf, gboolean); -static void color_sel_ok_cb(GtkButton *button, gpointer user_data); -static void color_sel_cancel_cb(GObject *object, gpointer user_data); +static void color_edit_dlg_ok_cb(GtkWidget *w, gpointer user_data); +static void color_edit_dlg_cancel_cb(GtkWidget *w, gpointer user_data); +static void color_edit_dlg_destroy_cb(GObject *object, gpointer user_data); +static void color_edit_dlg_fg_bg_btn_cb(GtkWidget *button, gpointer user_data); +static void color_edit_dlg_fg_bg_btn_destroy_cb(GObject *object, gpointer user_data); +static void color_selection_dlg_response_cb(GtkWidget *color_selection_dlg, gint response, gpointer data); +static void color_selection_dlg_destroy_cb(GObject *object, gpointer user_data); -#define COLOR_FILTERS_CL "color_filters_cl" -#define COLOR_FILTER "color_filter" -#define COLOR_FILTER_NAME_TE "color_filter_name_te" -#define COLOR_FILTER_TEXT_TE "color_filter_text_te" -#define COLOR_SELECTION_FG "color_selection_fg" -#define COLOR_SELECTION_BG "color_selection_bg" -#define COLOR_SELECTION_PARENT "color_selection_parent" +typedef enum { + COLOR_SELECTION_TYPE_FG = 1, + COLOR_SELECTION_TYPE_BG = 2 +} color_selection_type_t; -/* XXX - we don't forbid having more than one "Edit color filter" dialog - open, so these shouldn't be global. */ -static GtkWidget *filt_name_entry; -static GtkWidget *filt_text_entry; -static GtkWidget *disabled_cb; +/* info sent to color_edit_dlg Ok, cancel & destroy callbacks; + * pointed to by colof->color_edit_dlg_info and by user_data for the callbacks + */ +struct _color_edit_dlg_info_t { + GtkWidget *color_edit_dlg; + GtkWidget *color_filters; /* Treeview */ + color_filter_t *colorf; + /* color_edit_dlg widgets */ + GtkWidget *filt_name_entry; + GtkWidget *filt_text_entry; + GtkWidget *disabled_cb; +}; + +/* info sent to color_edit_dlg FG/BG button callbacks and also to color_selection_dlg callbacks; + * pointed by user data for the callbacks + */ +struct _color_selection_dlg_info_t { + GtkWidget *color_selection_dlg; + color_selection_type_t color_selection_type; /* FG/BG */ + color_filter_t *colorf; + color_t *color; /* ptr to FG or BG color struct in colorf */ + gchar *color_selection_type_text; + GtkWidget *filt_name_entry; +}; +typedef struct _color_selection_dlg_info_t color_selection_dlg_info_t; static void filter_expr_cb(GtkWidget *w _U_, gpointer filter_te) { - dfilter_expr_dlg_new(GTK_WIDGET(filter_te)); } -/* Create an "Edit Color Filter" dialog for a given color filter, and +/* Create "colorize filter" button for the "color edit" dialog, add it to hbox and connect callbacka */ +static void +colorize_filter_new(GtkWidget *colorize_hbox, + color_selection_type_t color_selection_type, + gchar *t1, /* "Foreground" */ + gchar *t2, /* "Foreground Color..." */ + gchar *t3, /* "Select foreground color for data display" */ + color_filter_t *colorf, + color_t *color, + GtkWidget *filt_name_entry) +{ + GtkWidget *colorize_filter; + color_selection_dlg_info_t *csdi; + + colorize_filter = gtk_button_new_with_label(t2); + gtk_box_pack_start (GTK_BOX (colorize_hbox), colorize_filter, TRUE, FALSE, 0); + gtk_widget_set_tooltip_text(colorize_filter, t3); + + csdi = g_new(color_selection_dlg_info_t, 1); + csdi->color_selection_dlg = NULL; + csdi->color_selection_type = color_selection_type; + csdi->colorf = colorf; + csdi->color = color; + csdi->color_selection_type_text = t1; + csdi->filt_name_entry = filt_name_entry; + + g_signal_connect(colorize_filter, "clicked", G_CALLBACK(color_edit_dlg_fg_bg_btn_cb), csdi); + g_signal_connect(colorize_filter, "destroy", G_CALLBACK(color_edit_dlg_fg_bg_btn_destroy_cb), csdi); +} + + +/* Create a "color edit dialog" for a given color filter, and associate it with that color filter. */ void -edit_color_filter_dialog(GtkWidget *color_filters, - gboolean is_new_filter) +color_edit_dlg(GtkWidget *color_filters, + gboolean is_new_filter) { - color_filter_t *colorf; - GtkWidget *edit_dialog; - GtkWidget *dialog_vbox; -#if GTK_CHECK_VERSION(3,0,0) - GdkRGBA bg_rgba_color, fg_rgba_color; -#else - GdkColor bg_color, fg_color; -#endif - GtkWidget *filter_fr; - GtkWidget *filter_fr_vbox; - GtkWidget *filter_name_hbox; - GtkWidget *color_filter_name; - GtkWidget *filter_string_hbox; - GtkWidget *add_expression_bt; - GtkWidget *color_filter_text; + color_edit_dlg_info_t *cedi; + color_filter_t *colorf; - GtkWidget *settings_hbox; + GtkWidget *color_edit_dlg; + GtkWidget *dialog_vbox; + GtkWidget *filter_fr; + GtkWidget *filter_fr_vbox; + GtkWidget *filter_name_hbox; + GtkWidget *filt_name_entry; + GtkWidget *filt_text_entry; + GtkWidget *color_filter_name; + GtkWidget *filter_string_hbox; + GtkWidget *add_expression_bt; + GtkWidget *color_filter_text; - GtkWidget *colorize_fr; - GtkWidget *colorize_hbox; - GtkWidget *colorize_filter_fg; - GtkWidget *colorize_filter_bg; + GtkWidget *settings_hbox; - GtkWidget *status_fr; - GtkWidget *status_vbox; + GtkWidget *colorize_fr; + GtkWidget *colorize_hbox; - GtkWidget *bbox; - GtkWidget *edit_color_filter_ok; - GtkWidget *edit_color_filter_cancel; + GtkWidget *status_fr; + GtkWidget *status_vbox; - GtkTreeModel *model; - GtkTreeIter iter; + GtkWidget *disabled_cb; + + GtkWidget *bbox; + GtkWidget *edit_color_filter_ok; + GtkWidget *edit_color_filter_cancel; + + GtkTreeModel *model; + GtkTreeIter iter; model = gtk_tree_view_get_model(GTK_TREE_VIEW(color_filters)); gtk_tree_model_iter_nth_child(model, &iter, NULL, color_dlg_row_selected); gtk_tree_model_get(model, &iter, 5, &colorf, -1); - if (colorf->edit_dialog != NULL) { + if (colorf->color_edit_dlg_info != NULL) { + cedi = colorf->color_edit_dlg_info; + g_assert(cedi->color_edit_dlg != NULL); /* There's already an edit box open for this filter; reactivate it. */ - reactivate_window(colorf->edit_dialog); + reactivate_window(cedi->color_edit_dlg); return; } /* dialog window */ - edit_dialog = dlg_conf_window_new ("Wireshark: Edit Color Filter"); - gtk_window_set_default_size(GTK_WINDOW(edit_dialog), 500, -1); - g_object_set_data(G_OBJECT(edit_dialog), "edit_dialog", edit_dialog); - colorf->edit_dialog = edit_dialog; + color_edit_dlg = dlg_conf_window_new ("Wireshark: Edit Color Filter"); + gtk_window_set_default_size(GTK_WINDOW(color_edit_dlg), 500, -1); + /* XXX: set color_edit_dlg as 'modal' to prevent simultaneously opening + * dialog windows for different filters ? is 'transient for' also needed ? + */ dialog_vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE); gtk_container_set_border_width (GTK_CONTAINER (dialog_vbox), 5); - gtk_container_add (GTK_CONTAINER (edit_dialog), dialog_vbox); + gtk_container_add (GTK_CONTAINER (color_edit_dlg), dialog_vbox); /* Filter frame */ filter_fr = gtk_frame_new("Filter"); @@ -167,16 +235,22 @@ edit_color_filter_dialog(GtkWidget *color_filters, gtk_entry_set_text(GTK_ENTRY(filt_name_entry), colorf->filter_name); #if GTK_CHECK_VERSION(3,0,0) - color_t_to_gdkRGBAcolor(&bg_rgba_color, &colorf->bg_color); - color_t_to_gdkRGBAcolor(&fg_rgba_color, &colorf->fg_color); - gtk_widget_override_background_color(filt_name_entry, GTK_STATE_FLAG_NORMAL, &bg_rgba_color); - gtk_widget_override_color(filt_name_entry, GTK_STATE_FLAG_NORMAL, &fg_rgba_color); + { + GdkRGBA bg_rgba_color, fg_rgba_color; + color_t_to_gdkRGBAcolor(&bg_rgba_color, &colorf->bg_color); + color_t_to_gdkRGBAcolor(&fg_rgba_color, &colorf->fg_color); + gtk_widget_override_background_color(filt_name_entry, GTK_STATE_FLAG_NORMAL, &bg_rgba_color); + gtk_widget_override_color(filt_name_entry, GTK_STATE_FLAG_NORMAL, &fg_rgba_color); + } #else - color_t_to_gdkcolor(&bg_color, &colorf->bg_color); - color_t_to_gdkcolor(&fg_color, &colorf->fg_color); + { + GdkColor bg_color, fg_color; + color_t_to_gdkcolor(&bg_color, &colorf->bg_color); + color_t_to_gdkcolor(&fg_color, &colorf->fg_color); - gtk_widget_modify_base(filt_name_entry, GTK_STATE_NORMAL, &bg_color); - gtk_widget_modify_text(filt_name_entry, GTK_STATE_NORMAL, &fg_color); + gtk_widget_modify_base(filt_name_entry, GTK_STATE_NORMAL, &bg_color); + gtk_widget_modify_text(filt_name_entry, GTK_STATE_NORMAL, &fg_color); + } #endif gtk_box_pack_start (GTK_BOX (filter_name_hbox), filt_name_entry, TRUE, TRUE, 0); gtk_widget_set_tooltip_text(filt_name_entry, "This is the editable name of the filter. (No @ characters allowed.)"); @@ -192,7 +266,7 @@ edit_color_filter_dialog(GtkWidget *color_filters, g_signal_connect(filt_text_entry, "changed", G_CALLBACK(filter_te_syntax_check_cb), NULL); g_object_set_data(G_OBJECT(filter_string_hbox), E_FILT_AUTOCOMP_PTR_KEY, NULL); g_signal_connect(filt_text_entry, "key-press-event", G_CALLBACK (filter_string_te_key_pressed_cb), NULL); - g_signal_connect(edit_dialog, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL); + g_signal_connect(color_edit_dlg, "key-press-event", G_CALLBACK (filter_parent_dlg_key_pressed_cb), NULL); gtk_entry_set_text(GTK_ENTRY(filt_text_entry), colorf->filter_text); gtk_box_pack_start (GTK_BOX (filter_string_hbox), filt_text_entry, TRUE, TRUE, 0); @@ -208,7 +282,7 @@ edit_color_filter_dialog(GtkWidget *color_filters, /* Show the (in)validity of the default filter string */ filter_te_syntax_check_cb(filt_text_entry, NULL); - /* settings-hbox for "choose color frame" and "status frame" */ + /* settings_hbox for "choose color frame" and "status frame" */ settings_hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE); gtk_box_pack_start (GTK_BOX (dialog_vbox), settings_hbox, FALSE, FALSE, 0); @@ -220,13 +294,17 @@ edit_color_filter_dialog(GtkWidget *color_filters, gtk_container_set_border_width (GTK_CONTAINER (colorize_hbox), 5); gtk_container_add(GTK_CONTAINER(colorize_fr), colorize_hbox); - colorize_filter_fg = gtk_button_new_with_label (("Foreground Color...")); - gtk_box_pack_start (GTK_BOX (colorize_hbox), colorize_filter_fg, TRUE, FALSE, 0); - gtk_widget_set_tooltip_text(colorize_filter_fg, "Select foreground color for data display"); + colorize_filter_new(colorize_hbox, + COLOR_SELECTION_TYPE_FG, + "Foreground", "Foreground Color...", "Select foreground color for data display", + colorf, &colorf->fg_color, + filt_name_entry); - colorize_filter_bg = gtk_button_new_with_label (("Background Color...")); - gtk_box_pack_start (GTK_BOX (colorize_hbox), colorize_filter_bg, TRUE, FALSE, 0); - gtk_widget_set_tooltip_text(colorize_filter_bg, "Select background color for data display"); + colorize_filter_new(colorize_hbox, + COLOR_SELECTION_TYPE_BG, + "Background", "Background Color...", "Select background color for data display", + colorf, &colorf->bg_color, + filt_name_entry); /* status frame */ status_fr = gtk_frame_new("Status"); @@ -236,6 +314,7 @@ edit_color_filter_dialog(GtkWidget *color_filters, gtk_container_set_border_width (GTK_CONTAINER (status_vbox), 5); gtk_container_add(GTK_CONTAINER(status_fr), status_vbox); + /** "Disabled" check box */ disabled_cb = gtk_check_button_new_with_label("Disabled"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(disabled_cb), colorf->disabled); gtk_box_pack_start (GTK_BOX (status_vbox), disabled_cb, TRUE, FALSE, 0); @@ -246,172 +325,63 @@ edit_color_filter_dialog(GtkWidget *color_filters, gtk_box_pack_start(GTK_BOX(dialog_vbox), bbox, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (bbox), 0); - edit_color_filter_ok = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK); - gtk_widget_set_tooltip_text(edit_color_filter_ok, "Accept filter color change"); - + /** Cancel **/ edit_color_filter_cancel = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CANCEL); gtk_widget_set_tooltip_text(edit_color_filter_cancel, "Reject filter color change"); + /* escape will select cancel */ + window_set_cancel_button(color_edit_dlg, edit_color_filter_cancel, window_cancel_button_cb); + /** Ok **/ + edit_color_filter_ok = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_OK); + gtk_widget_set_tooltip_text(edit_color_filter_ok, "Accept filter color change"); gtk_widget_grab_default(edit_color_filter_ok); - /* signals and such */ - g_object_set_data(G_OBJECT(edit_dialog), COLOR_FILTER, colorf); - g_signal_connect(edit_dialog, "destroy", G_CALLBACK(edit_color_filter_destroy_cb), NULL); - g_object_set_data(G_OBJECT(colorize_filter_fg), COLOR_FILTER, colorf); - g_signal_connect(colorize_filter_fg, "clicked", G_CALLBACK(edit_color_filter_fg_cb), NULL); - g_object_set_data(G_OBJECT(colorize_filter_bg), COLOR_FILTER, colorf); - g_signal_connect(colorize_filter_bg, "clicked", G_CALLBACK(edit_color_filter_bg_cb), NULL); - g_object_set_data(G_OBJECT(disabled_cb), COLOR_FILTER, colorf); -/* g_signal_connect(disabled_cb, "clicked", G_CALLBACK(edit_disabled_cb_cb), NULL);*/ - g_object_set_data(G_OBJECT(edit_color_filter_ok), COLOR_FILTERS_CL, color_filters); - g_object_set_data(G_OBJECT(edit_color_filter_ok), COLOR_FILTER, colorf); - g_signal_connect(edit_color_filter_ok, "clicked", G_CALLBACK(edit_color_filter_ok_cb), edit_dialog); - - /* set callback to delete new filters if cancel chosen */ - if (is_new_filter) - { - g_object_set_data(G_OBJECT(edit_color_filter_cancel), COLOR_FILTERS_CL, color_filters); - g_signal_connect(edit_color_filter_cancel, "clicked", - G_CALLBACK(edit_new_color_filter_cancel_cb), edit_dialog); - } - /* escape will select cancel */ - window_set_cancel_button(edit_dialog, edit_color_filter_cancel, window_cancel_button_cb); - - g_signal_connect(edit_dialog, "delete_event", G_CALLBACK(window_delete_event_cb), NULL); + cedi = g_new(color_edit_dlg_info_t, 1); + colorf->color_edit_dlg_info = cedi; - gtk_widget_show_all(edit_dialog); - window_present(edit_dialog); -} + cedi->color_filters = color_filters; + cedi->colorf = colorf; + cedi->color_edit_dlg = color_edit_dlg; + cedi->filt_name_entry = filt_name_entry; + cedi->filt_text_entry = filt_text_entry; + cedi->disabled_cb = disabled_cb; -/* Called when the dialog box is being destroyed; destroy any color - selection dialogs opened from this dialog, and null out the pointer - to this dialog. */ -static void -edit_color_filter_destroy_cb(GObject *object, gpointer user_data _U_) -{ - color_filter_t *colorf; - GtkWidget *color_sel; - - colorf = (color_filter_t *)g_object_get_data(G_OBJECT(object), COLOR_FILTER); - colorf->edit_dialog = NULL; - - /* Destroy any color selection dialogs this dialog had open. */ - color_sel = (GtkWidget *)g_object_get_data(G_OBJECT(object), COLOR_SELECTION_FG); - if (color_sel != NULL) - window_destroy(color_sel); - color_sel = (GtkWidget *)g_object_get_data(G_OBJECT(object), COLOR_SELECTION_BG); - if (color_sel != NULL) - window_destroy(color_sel); -} + g_signal_connect(color_edit_dlg, "destroy", G_CALLBACK(color_edit_dlg_destroy_cb), cedi); -/* Pop up a color selection box to choose the foreground color. */ -static void -edit_color_filter_fg_cb(GtkButton *button, gpointer user_data _U_) -{ - color_filter_t *colorf; - GtkWidget *color_selection_fg; + g_signal_connect(edit_color_filter_ok, "clicked", G_CALLBACK(color_edit_dlg_ok_cb), cedi); - colorf = (color_filter_t *)g_object_get_data(G_OBJECT(button), COLOR_FILTER); - /* Do we already have one open for this dialog? */ - color_selection_fg = g_object_get_data(G_OBJECT(colorf->edit_dialog), COLOR_SELECTION_FG); - if (color_selection_fg != NULL) { - /* Yes. Just reactivate it. */ - reactivate_window(color_selection_fg); - } else { - /* No. Create a new color selection box, and associate it with - this dialog. */ - color_selection_fg = color_sel_win_new(colorf, FALSE); - g_object_set_data(G_OBJECT(colorf->edit_dialog), COLOR_SELECTION_FG, color_selection_fg); - g_object_set_data(G_OBJECT(color_selection_fg), COLOR_SELECTION_PARENT, colorf->edit_dialog); + if (is_new_filter) { + g_signal_connect(edit_color_filter_cancel, "clicked", + G_CALLBACK(color_edit_dlg_cancel_cb), cedi); } -} -/* Pop up a color selection box to choose the background color. */ -static void -edit_color_filter_bg_cb (GtkButton *button, - gpointer user_data _U_) -{ - color_filter_t *colorf; - GtkWidget *color_selection_bg; + g_signal_connect(color_edit_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL); - colorf = (color_filter_t *)g_object_get_data(G_OBJECT(button), COLOR_FILTER); - /* Do we already have one open for this dialog? */ - color_selection_bg = g_object_get_data(G_OBJECT(colorf->edit_dialog), COLOR_SELECTION_BG); - if (color_selection_bg != NULL) { - /* Yes. Just reactivate it. */ - reactivate_window(color_selection_bg); - } else { - /* No. Create a new color selection box, and associate it with - this dialog. */ - color_selection_bg = color_sel_win_new(colorf, TRUE); - g_object_set_data(G_OBJECT(colorf->edit_dialog), COLOR_SELECTION_BG, color_selection_bg); - g_object_set_data(G_OBJECT(color_selection_bg), COLOR_SELECTION_PARENT, colorf->edit_dialog); - } + gtk_widget_show_all(color_edit_dlg); + window_present(color_edit_dlg); } -/* Toggle the disabled flag */ -#if 0 -static void -edit_disabled_cb_cb (GtkButton *button, - gpointer user_data _U_) -{ - color_filter_t *colorf; - - colorf = (color_filter_t *)g_object_get_data(G_OBJECT(button), COLOR_FILTER); - colorf->disabled = GTK_TOGGLE_BUTTON (button)->active; - - printf("Colorfilter %s is now %s\n",colorf->filter_name,colorf->disabled?"disabled":"enabled"); -} -#endif /* accept color (and potential content) change */ static void -edit_color_filter_ok_cb (GtkButton *button, - gpointer user_data) +color_edit_dlg_ok_cb(GtkWidget *w _U_, gpointer user_data) { - GtkWidget *dialog; -#if GTK_CHECK_VERSION(3,0,0) - GtkStyleContext *context; - GdkRGBA *new_rgba_bg_color; - GdkRGBA *new_rgba_fg_color; -#else - GtkStyle *style; - GdkColor new_fg_color; - GdkColor new_bg_color; -#endif + color_edit_dlg_info_t *cedi = (color_edit_dlg_info_t *)user_data; + gchar *filter_name; gchar *filter_text; gboolean filter_disabled; color_filter_t *colorf; dfilter_t *compiled_filter; - GtkWidget *color_filters; GtkTreeModel *model; GtkTreeIter iter; gchar fg_str[14], bg_str[14]; - dialog = (GtkWidget *)user_data; -#if GTK_CHECK_VERSION(3,0,0) - context = gtk_widget_get_style_context (filt_name_entry); - gtk_style_context_get (context, GTK_STATE_FLAG_NORMAL, - "background-color", &new_rgba_bg_color, - NULL); - gtk_style_context_get (context, GTK_STATE_FLAG_NORMAL, - "forground-color", &new_rgba_fg_color, - NULL); -/* gdk_rgba_free (rgba_bg_color); */ + filter_name = g_strdup(gtk_entry_get_text(GTK_ENTRY(cedi->filt_name_entry))); + filter_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(cedi->filt_text_entry))); + filter_disabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cedi->disabled_cb)); -#else - - style = gtk_widget_get_style(filt_name_entry); - new_bg_color = style->base[GTK_STATE_NORMAL]; - new_fg_color = style->text[GTK_STATE_NORMAL]; -#endif - - filter_name = g_strdup(gtk_entry_get_text(GTK_ENTRY(filt_name_entry))); - filter_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(filt_text_entry))); - filter_disabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(disabled_cb)); - - if(strchr(filter_name,'@') || strchr(filter_text,'@')){ + if (strchr(filter_name,'@') || strchr(filter_text,'@')) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Filter names and strings must not" " use the '@' character. Filter unchanged."); @@ -420,207 +390,278 @@ edit_color_filter_ok_cb (GtkButton *button, return; } - if(!dfilter_compile(filter_text, &compiled_filter)) { + if (!dfilter_compile(filter_text, &compiled_filter)) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Filter \"%s\" didn't compile correctly.\n" " Please try again. Filter unchanged.\n%s\n", filter_name, dfilter_error_msg); - } else { - color_filters = (GtkWidget *)g_object_get_data(G_OBJECT(button), COLOR_FILTERS_CL); - colorf = (color_filter_t *)g_object_get_data(G_OBJECT(button), COLOR_FILTER); + g_free(filter_name); + g_free(filter_text); + return; + } + + colorf = cedi->colorf; + + g_free(colorf->filter_name); + g_free(colorf->filter_text); - g_free(colorf->filter_name); - colorf->filter_name = filter_name; + colorf->filter_name = filter_name; + colorf->filter_text = filter_text; - g_free(colorf->filter_text); - colorf->filter_text = filter_text; + colorf->disabled = filter_disabled; - colorf->disabled = filter_disabled; #if GTK_CHECK_VERSION(3,0,0) - gdkRGBAcolor_to_color_t(&colorf->fg_color, new_rgba_fg_color); - gdkRGBAcolor_to_color_t(&colorf->bg_color, new_rgba_bg_color); + { /* GTK3 */ + GtkStyleContext *context; + GdkRGBA new_rgba_fg_color; + GdkRGBA new_rgba_bg_color; + + context = gtk_widget_get_style_context (cedi->filt_name_entry); + + gtk_style_context_get_color(context, GTK_STATE_NORMAL, &new_rgba_fg_color); /* aka foreground color */ + gtk_style_context_get_background_color(context, GTK_STATE_NORMAL, &new_rgba_bg_color); + + gdkRGBAcolor_to_color_t(&colorf->fg_color, &new_rgba_fg_color); + gdkRGBAcolor_to_color_t(&colorf->bg_color, &new_rgba_bg_color); + } #else + { /* GTK2 */ + GtkStyle *style; + GdkColor new_fg_color; + GdkColor new_bg_color; + + style = gtk_widget_get_style(cedi->filt_name_entry); + new_bg_color = style->base[GTK_STATE_NORMAL]; + new_fg_color = style->text[GTK_STATE_NORMAL]; + gdkcolor_to_color_t(&colorf->fg_color, &new_fg_color); gdkcolor_to_color_t(&colorf->bg_color, &new_bg_color); -#endif - g_snprintf(fg_str, sizeof(fg_str), "#%04X%04X%04X", - colorf->fg_color.red, colorf->fg_color.green, colorf->fg_color.blue); - g_snprintf(bg_str, sizeof(bg_str), "#%04X%04X%04X", - colorf->bg_color.red, colorf->bg_color.green, colorf->bg_color.blue); - model = gtk_tree_view_get_model(GTK_TREE_VIEW(color_filters)); - gtk_tree_model_iter_nth_child(model, &iter, NULL, color_dlg_row_selected); - gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, filter_name, - 1, filter_text, 2, fg_str, 3, bg_str, - 4, filter_disabled, -1); - if(colorf->c_colorfilter != NULL) - dfilter_free(colorf->c_colorfilter); - colorf->c_colorfilter = compiled_filter; - - /* Destroy the dialog box. */ - window_destroy(dialog); } -#if GTK_CHECK_VERSION(3,0,0) - gdk_rgba_free (new_rgba_fg_color); - gdk_rgba_free (new_rgba_bg_color); #endif + + g_snprintf(fg_str, sizeof(fg_str), "#%04X%04X%04X", + colorf->fg_color.red, colorf->fg_color.green, colorf->fg_color.blue); + g_snprintf(bg_str, sizeof(bg_str), "#%04X%04X%04X", + colorf->bg_color.red, colorf->bg_color.green, colorf->bg_color.blue); + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(cedi->color_filters)); + gtk_tree_model_iter_nth_child(model, &iter, NULL, color_dlg_row_selected); + gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, filter_name, + 1, filter_text, 2, fg_str, 3, bg_str, + 4, filter_disabled, -1); + + if (colorf->c_colorfilter != NULL) { + dfilter_free(colorf->c_colorfilter); + } + colorf->c_colorfilter = compiled_filter; + + /* Destroy the dialog box. */ + window_destroy(cedi->color_edit_dlg); } + /* reject new color filter addition */ static void -edit_new_color_filter_cancel_cb(GtkButton *button, gpointer user_data _U_) +color_edit_dlg_cancel_cb(GtkWidget *w _U_, gpointer user_data) { + color_edit_dlg_info_t *cedi = (color_edit_dlg_info_t *)user_data; + /* Delete the entry. As a side effect this destroys the edit_dialog window. Before the edit dialogue was launched, the color filter list was prepended with a default entry. This is the entry at position 0 that we want to delete now. */ - color_delete_single(0, (GtkWidget*)g_object_get_data(G_OBJECT(button), COLOR_FILTERS_CL)); + color_delete_single(0, cedi->color_filters); /* calls color_edit_dlg_destroy() */ } -static GtkWidget* -color_sel_win_new(color_filter_t *colorf, gboolean is_bg) -{ - gchar *title; - GtkWidget *color_sel_win; - color_t *color; - GdkColor gcolor; - GtkWidget *color_sel_ok; - GtkWidget *color_sel_cancel; - GtkWidget *color_sel_help; - - if (is_bg) { - color = &colorf->bg_color; - title = g_strdup_printf("Wireshark: Choose background color for \"%s\"", - colorf->filter_name); - } else { - color = &colorf->fg_color; - title = g_strdup_printf("Wireshark: Choose foreground color for \"%s\"", - colorf->filter_name); - } - color_sel_win = gtk_color_selection_dialog_new(title); - g_free(title); - g_object_set_data(G_OBJECT(color_sel_win), "color_sel_win", color_sel_win); - gtk_container_set_border_width (GTK_CONTAINER (color_sel_win), 10); - if (color != NULL) { - color_t_to_gdkcolor(&gcolor, color); - gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(color_sel_win))), &gcolor); +void +color_edit_dlg_destroy(color_edit_dlg_info_t *cedi) +{ + if (cedi == NULL) { + return; } + g_assert(cedi->color_edit_dlg != NULL); + window_destroy(cedi->color_edit_dlg); /* invokes color_edit_dlg_destroy_cb */ +} - g_object_get(color_sel_win, "ok-button", &color_sel_ok, NULL); - g_object_set_data(G_OBJECT(color_sel_win), "color_sel_ok", color_sel_ok); - gtk_widget_set_can_default(color_sel_ok, TRUE); - g_object_get(color_sel_win, "cancel-button", &color_sel_cancel, NULL); - g_object_set_data(G_OBJECT(color_sel_win), "color_sel_cancel", color_sel_cancel); - gtk_widget_set_can_default(color_sel_cancel, TRUE); - window_set_cancel_button(color_sel_win, color_sel_cancel, NULL); /* ensure esc does req'd local cxl action. */ - /* esc as handled by the */ - /* gtk_color_selection_dialog widget */ - /* doesn't result in this happening. */ +/* Called when the color_edit_dlg is being destroyed; + * null out the pointer to this dialog. + * Note: any color_selection_dlg windows associated with + * this color_edit_dlg window will automatically be destroyed. + * (this is because the color_selection_dlg windows + * have done 'set_transient_for() & destroy_with_parent() + * ToDo: worry about 'order' + */ +static void +color_edit_dlg_destroy_cb(GObject *object _U_, gpointer user_data) +{ + color_edit_dlg_info_t *cedi = (color_edit_dlg_info_t *)user_data; - g_object_get(color_sel_win, "help-button", &color_sel_help, NULL); - g_object_set_data(G_OBJECT(color_sel_win), "color_sel_help", color_sel_help); - gtk_widget_set_can_default(color_sel_help, TRUE); + g_assert(cedi->color_edit_dlg); - g_signal_connect(color_sel_ok, "clicked", G_CALLBACK(color_sel_ok_cb), color_sel_win); - g_signal_connect(color_sel_cancel, "clicked", G_CALLBACK(color_sel_cancel_cb), color_sel_win); + cedi->colorf->color_edit_dlg_info = NULL; + g_free(cedi); - gtk_widget_show_all(color_sel_win); - return color_sel_win; } + +/* Pop up a color selection (GTK3: color chooser) dialog to choose the foreground or background color. */ static void -color_sel_win_destroy(GtkWidget *sel_win) +color_edit_dlg_fg_bg_btn_cb(GtkWidget *button, gpointer user_data) { - GtkWidget *parent; - GtkWidget *color_selection_fg, *color_selection_bg; + color_selection_dlg_info_t *csdi = (color_selection_dlg_info_t *)user_data; - /* Find the "Edit color filter" dialog box with which this is associated. */ - parent = (GtkWidget *)g_object_get_data(G_OBJECT(sel_win), COLOR_SELECTION_PARENT); + GtkWidget *color_selection_dlg; - /* Find that dialog box's foreground and background color selection - boxes, if any. */ - color_selection_fg = g_object_get_data(G_OBJECT(parent), COLOR_SELECTION_FG); - color_selection_bg = g_object_get_data(G_OBJECT(parent), COLOR_SELECTION_BG); + gchar *title; - if (sel_win == color_selection_fg) { - /* This was its foreground color selection box; it isn't, anymore. */ - g_object_set_data(G_OBJECT(parent), COLOR_SELECTION_FG, NULL); + /* Do we already have one open for this dialog? */ + if (csdi->color_selection_dlg != NULL) { + /* Yes. Just reactivate it. */ + reactivate_window(csdi->color_selection_dlg); + return; } - if (sel_win == color_selection_bg) { - /* This was its background color selection box; it isn't, anymore. */ - g_object_set_data(G_OBJECT(parent), COLOR_SELECTION_BG, NULL); + + title = g_strdup_printf("Wireshark: Choose %s color for \"%s\"", + csdi->color_selection_type_text, + csdi->colorf->filter_name); + +#if GTK_CHECK_VERSION(3,4,0) + { /* GTK >= GTK 3.4: Use GtkColorChooser */ + GdkRGBA rgba_color; + color_selection_dlg = gtk_color_chooser_dialog_new(title, GTK_WINDOW(gtk_widget_get_toplevel(button))); + csdi->color_selection_dlg = color_selection_dlg; + + color_t_to_gdkRGBAcolor(&rgba_color, csdi->color); + gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(color_selection_dlg), &rgba_color); + } +#else + { /* GTK < GTK 3.4: Use GtkColorSelection */ + GdkColor gcolor; + GtkWidget *color_selection; + GtkWidget *color_selection_dlg_help_btn; + + color_selection_dlg = gtk_color_selection_dialog_new(title); + gtk_container_set_border_width (GTK_CONTAINER (color_selection_dlg), 10); + gtk_window_set_transient_for(GTK_WINDOW(color_selection_dlg), GTK_WINDOW(gtk_widget_get_toplevel(button))); + gtk_window_set_destroy_with_parent(GTK_WINDOW(color_selection_dlg), TRUE); + + /* suppress the "help" button (brutally) */ + g_object_get(color_selection_dlg, "help-button", &color_selection_dlg_help_btn, NULL); + gtk_widget_destroy(color_selection_dlg_help_btn); + + color_selection = + gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(color_selection_dlg)); + + color_t_to_gdkcolor(&gcolor, csdi->color); + gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(color_selection), &gcolor); + + csdi->color_selection_dlg = color_selection_dlg; } +#endif /* GTK_CHECK(3,4,0) */ + + g_free(title); - /* Now destroy it. */ - window_destroy(sel_win); + g_signal_connect(G_OBJECT(color_selection_dlg), "response", G_CALLBACK(color_selection_dlg_response_cb), csdi); + g_signal_connect(G_OBJECT(color_selection_dlg), "destroy", G_CALLBACK(color_selection_dlg_destroy_cb), csdi); + + gtk_widget_show_all(color_selection_dlg); } -/* Retrieve selected color */ + +/* here when color_edit_dlg FG/BG button destroyed */ static void -color_sel_ok_cb (GtkButton *button _U_, - gpointer user_data) +color_edit_dlg_fg_bg_btn_destroy_cb(GObject *object _U_, gpointer user_data) { -#if GTK_CHECK_VERSION(3,0,0) - GdkRGBA new_rgba_color; /* Color from color selection dialog */ -#else - GdkColor new_color; /* Color from color selection dialog */ -#endif - GtkWidget *color_dialog; - GtkWidget *parent; - GtkWidget *color_selection_bg; - gboolean is_bg; + color_selection_dlg_info_t *csdi = (color_selection_dlg_info_t *)user_data; - color_dialog = (GtkWidget *)user_data; + g_free(csdi); +} -#if GTK_CHECK_VERSION(3,0,0) - gtk_color_selection_get_current_rgba(GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(color_dialog))), &new_rgba_color); -#else - gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(color_dialog))), &new_color); -#endif -#if 0 - if ( ! get_color(&new_color) ){ - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, - "Could not allocate color. Try again."); - } else { -#endif - /* Find the "Edit color filter" dialog box with which this is - associated. */ - parent = (GtkWidget *)g_object_get_data(G_OBJECT(color_dialog), COLOR_SELECTION_PARENT); - /* Find that dialog box's foreground and background color selection - boxes, if any. */ - color_selection_bg = g_object_get_data(G_OBJECT(parent), COLOR_SELECTION_BG); - is_bg = (color_dialog == color_selection_bg); +static void +color_selection_dlg_response_cb(GtkWidget *color_selection_dlg, gint response, gpointer user_data) +{ + color_selection_dlg_info_t *csdi = (color_selection_dlg_info_t *)user_data; + + if (response != GTK_RESPONSE_OK) { + window_destroy(color_selection_dlg); + return; + } + + /* Handle GTK_RESPONSE_OK */ + +#if GTK_CHECK_VERSION(3,4,0) + { /* GTK >= GTK 3.4: Using GtkColorChooser */ + GdkRGBA new_rgba_color; + + gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(color_selection_dlg), &new_rgba_color); - color_sel_win_destroy(color_dialog); -#if GTK_CHECK_VERSION(3,0,0) /* now apply the change to the fore/background */ - if (is_bg) - gtk_widget_override_background_color(filt_name_entry, GTK_STATE_FLAG_NORMAL, &new_rgba_color); + if (csdi->color_selection_type == COLOR_SELECTION_TYPE_FG) + gtk_widget_override_color(csdi->filt_name_entry, GTK_STATE_FLAG_NORMAL, &new_rgba_color); else - gtk_widget_override_color(filt_name_entry, GTK_STATE_FLAG_NORMAL, &new_rgba_color); + gtk_widget_override_background_color(csdi->filt_name_entry, GTK_STATE_FLAG_NORMAL, &new_rgba_color); + } + +#elif GTK_CHECK_VERSION(3,0,0) + { /* (GTK >= GTK 3.0) && (GTK < GTK 3.4): Using GtkColorSelection (RGBA Color) */ + GtkWidget *color_selection; + GdkRGBA new_rgba_color; + + color_selection = + gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(color_selection_dlg)); + + gtk_color_selection_get_current_rgba(GTK_COLOR_SELECTION(color_selection), &new_rgba_color); + + /* now apply the change to the fore/background */ + if (csdi->color_selection_type == COLOR_SELECTION_TYPE_FG) + gtk_widget_override_color(csdi->filt_name_entry, GTK_STATE_FLAG_NORMAL, &new_rgba_color); + else + gtk_widget_override_background_color(csdi->filt_name_entry, GTK_STATE_FLAG_NORMAL, &new_rgba_color); + } #else + { /* GTK2: Using GtkColorSelection (GDK Color) */ + GtkWidget *color_selection; + GdkColor new_color; + + color_selection = + gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(color_selection_dlg)); + + gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(color_selection), &new_color); + /* now apply the change to the fore/background */ - if (is_bg) - gtk_widget_modify_base(filt_name_entry, GTK_STATE_NORMAL, &new_color); + if (csdi->color_selection_type == COLOR_SELECTION_TYPE_FG) + gtk_widget_modify_text(csdi->filt_name_entry, GTK_STATE_NORMAL, &new_color); else - gtk_widget_modify_text(filt_name_entry, GTK_STATE_NORMAL, &new_color); -#endif -#if 0 + gtk_widget_modify_base(csdi->filt_name_entry, GTK_STATE_NORMAL, &new_color); } -#endif +#endif /* GTK_CHECK_VERSION(3,4,0) */ + + window_destroy(color_selection_dlg); } -/* Don't choose the selected color as the foreground or background - color for the filter. */ + static void -color_sel_cancel_cb (GObject *object _U_, - gpointer user_data) +color_selection_dlg_destroy_cb(GObject *object _U_, gpointer user_data) { - GtkWidget *color_dialog; - color_dialog = (GtkWidget *)user_data; - /* nothing to change here. Just get rid of the dialog box. */ + color_selection_dlg_info_t *csdi = (color_selection_dlg_info_t *)user_data; + + g_assert(csdi->color_selection_dlg); - color_sel_win_destroy(color_dialog); + csdi->color_selection_dlg = NULL; } + +/* + * Editor modelines - http://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 2 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=2 tabstop=8 expandtab: + * :indentSize=2:tabSize=8:noTabs=true: + */ diff --git a/ui/gtk/color_edit_dlg.h b/ui/gtk/color_edit_dlg.h index 16f773dfe3..be5629eb76 100644 --- a/ui/gtk/color_edit_dlg.h +++ b/ui/gtk/color_edit_dlg.h @@ -30,13 +30,22 @@ * @ingroup dialog_group */ +struct _color_edit_dlg_info_t; + +typedef struct _color_edit_dlg_info_t color_edit_dlg_info_t; + /* new color filter edit dialog */ extern void -edit_color_filter_dialog(GtkWidget *color_filters, - gboolean is_new_filter); +color_edit_dlg(GtkWidget *color_filters, + gboolean is_new_filter); +#if 1 /* doesn't really belong here */ /* edit dialog wants to destroy itself */ extern void color_delete_single(gint row, GtkWidget *color_filters); +#endif + +extern void +color_edit_dlg_destroy(color_edit_dlg_info_t *cedi); #endif /* color_edit_dlg.h */ |