summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--color_filters.c36
-rw-r--r--color_filters.h38
-rw-r--r--ui/gtk/color_dlg.c25
-rw-r--r--ui/gtk/color_edit_dlg.c767
-rw-r--r--ui/gtk/color_edit_dlg.h13
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 */