Ethereal-dev: Re: [Ethereal-dev] Color Filters - rollback on Cancel - given up
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Richard Urwin <richard@xxxxxxxxxxxxxxx>
Date: Wed, 22 Sep 2004 22:29:23 +0100
On Tuesday 21 Sep 2004 7:45 pm, Ulf Lamping wrote: > Richard Urwin wrote: > >I was modifying the color filters dialog so that changes made and > > then cancelled would not affect the packet display. > > > >I have given up. I need to get more understanding of the GTK > > structures, and this requires time, effort and interest that I > > don't have. > > > >If anyone wants to continue where I left off, and has understanding > > of GTK, then I can supply the diffs as far as I've got. It should > > be fairly straightforward. > > You can send me the diffs, but I cannot promise to finish your work > (not much time) ... > > Regards, ULFL Sorry, Ulf, I seem to have deleted the base release that I patched. I think this correct, but there is one bit that I think may need merging. It would be best to do it all by hand, I think. -- Richard Urwin
diff -u /home/richard/Documents/Downloads/ethereal-0.10.3/gtk/color_dlg.c ethereal/gtk/color_dlg.c
--- /home/richard/Documents/Downloads/ethereal-0.10.3/gtk/color_dlg.c 2004-03-18 04:05:34.000000000 +0000
+++ ethereal/gtk/color_dlg.c 2004-09-18 16:05:32.000000000 +0100
@@ -1,7 +1,7 @@
/* color_dlg.c
* Definitions for dialog boxes for color filters
*
- * $Id: color_dlg.c,v 1.44 2004/03/13 15:15:23 ulfl Exp $
+ * $Id: color_dlg.c,v 1.51 2004/05/31 13:35:49 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@xxxxxxxxxxxx>
@@ -46,6 +46,8 @@
#include "compat_macros.h"
#include "filter_prefs.h"
#include "file_dlg.h"
+#include "gtkglobals.h"
+#include "prefs.h"
static GtkWidget* colorize_dialog_new(char *filter);
static void add_filter_to_list(gpointer filter_arg, gpointer list_arg);
@@ -83,7 +85,6 @@
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_color_filter_ok_cb(GtkButton *button, gpointer user_data);
-static void edit_color_filter_cancel_cb(GtkObject *object, gpointer user_data);
static GtkWidget* color_sel_win_new(color_filter_t *colorf, gboolean);
static void color_sel_ok_cb(GtkButton *button, gpointer user_data);
@@ -153,7 +154,7 @@
{
int count = 0;
- g_slist_foreach(filter_list, count_this_mark, &count);
+ g_slist_foreach(temp_filter_list, count_this_mark, &count);
return count;
}
@@ -206,7 +207,7 @@
#endif
gchar *titles[] = { "Name", "String" };
-
+ init_temp_color_filters(); /* copy the color filters into a temp list */
row_selected = -1; /* no row selected */
tooltips = gtk_tooltips_new ();
@@ -363,7 +364,7 @@
#endif
num_of_filters = 0;
- g_slist_foreach(filter_list, add_filter_to_list, color_filters);
+ g_slist_foreach(temp_filter_list, add_filter_to_list, color_filters);
#if GTK_MAJOR_VERSION < 2
gtk_clist_set_selection_mode (GTK_CLIST (color_filters),GTK_SELECTION_EXTENDED);
@@ -583,8 +585,8 @@
#endif
- filter_list = g_slist_remove(filter_list, colorf);
- filter_list = g_slist_insert(filter_list, colorf, filter_number + amount);
+ temp_filter_list = g_slist_remove(temp_filter_list, colorf);
+ temp_filter_list = g_slist_insert(temp_filter_list, colorf, filter_number + amount);
}
/* Move the selected filters up in the list */
@@ -752,7 +754,7 @@
data.count = 0;
data.color_filters = color_filters;
- g_slist_foreach(filter_list, clear_mark, NULL);
+ g_slist_foreach(temp_filter_list, clear_mark, NULL);
gtk_tree_selection_selected_foreach(sel,remember_this_row, &data);
if (data.count > 0)
@@ -841,7 +843,7 @@
gpointer user_data _U_)
{
/* Destroy any edit dialogs we have open. */
- g_slist_foreach(filter_list, destroy_edit_dialog_cb, NULL);
+ g_slist_foreach(temp_filter_list, destroy_edit_dialog_cb, NULL);
colorize_win = NULL;
}
@@ -1122,11 +1131,17 @@
static void
color_ok_cb(GtkButton *button _U_, gpointer user_data _U_)
{
+ /* copy temp list of filters back into global list */
+ apply_all_color_filters();
+
+ /* destroy temp color filter list */
+ remove_temp_color_filters();
+
/* colorize list */
colorize_packets(&cfile);
/* Destroy the dialog box. */
window_destroy(colorize_win);
}
/* Exit dialog without colorizing packets with the new list.
@@ -1134,14 +1149,20 @@
static void
color_cancel_cb(GtkWidget *widget _U_, gpointer user_data _U_)
{
+ /* destroy temp color filter list */
+ remove_temp_color_filters();
+
/* Destroy the dialog box. */
window_destroy(colorize_win);
}
/* Apply new list of color filters to the capture. */
static void
color_apply_cb(GtkButton *button _U_, gpointer user_data _U_)
{
+ /* copy temp list of filters back into real list */
+ apply_all_color_filters();
+
colorize_packets(&cfile);
}
@@ -1580,7 +1587,6 @@
GTK_WIDGET_SET_FLAGS (color_sel_help, GTK_CAN_DEFAULT);
- SIGNAL_CONNECT(color_sel_win, "destroy", color_sel_cancel_cb, color_sel_win);
SIGNAL_CONNECT(color_sel_ok, "clicked", color_sel_ok_cb, color_sel_win);
SIGNAL_CONNECT(color_sel_cancel, "clicked", color_sel_cancel_cb, color_sel_win);
diff -u /home/richard/Documents/Downloads/ethereal-0.10.3/gtk/color_filters.c ethereal/gtk/color_filters.c
--- /home/richard/Documents/Downloads/ethereal-0.10.3/gtk/color_filters.c 2004-03-18 04:05:34.000000000 +0000
+++ ethereal/gtk/color_filters.c 2004-09-18 16:05:27.000000000 +0100
@@ -1,7 +1,7 @@
/* color_filters.c
* Routines for color filters
*
- * $Id: color_filters.c,v 1.8 2004/03/14 23:55:53 deniel Exp $
+ * $Id: color_filters.c,v 1.10 2004/04/16 19:36:36 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@xxxxxxxxxxxx>
@@ -43,12 +43,18 @@
#include "file.h"
#include <epan/dfilter/dfilter.h>
#include "simple_dialog.h"
static gboolean read_filters(void);
static gboolean read_global_filters(void);
+/* There can be only one color dialog, so there is no need to generalize to
+* support multiple temp lists. In fact only the new_color_filter() function
+* can be called for either list. So we will duplicate that function. If multiple
+* temp lists are ever needed we can modify the temp version of that function to
+* take a handle parameter. */
+
GSList *filter_list = NULL;
+GSList *temp_filter_list = NULL;
GSList *removed_filter_list = NULL;
/* Remove the specified filter from the list of existing color filters,
@@ -59,7 +65,19 @@
void remove_color_filter(color_filter_t *colorf)
{
/* Remove colorf from the list of color filters */
- filter_list = g_slist_remove(filter_list, colorf);
+ temp_filter_list = g_slist_remove(temp_filter_list, colorf);
+ /* Add colorf to the list of removed color filters */
+ removed_filter_list = g_slist_prepend(removed_filter_list, colorf);
+}
+
+/* Remove the specified filter as an iterator
+* Since it's an iterator, we don't actually remove it, just add it to the
+* removed list. The calling code will then free the entire list,
+* so we can use this function for filters on either list. */
+static void
+remove_color_filter_it(gpointer filter_arg, gpointer unused _U_)
+{
+ color_filter_t *colorf = filter_arg;
/* Add colorf to the list of removed color filters */
removed_filter_list = g_slist_prepend(removed_filter_list, colorf);
}
@@ -97,6 +115,55 @@
removed_filter_list = NULL;
}
+/* copy the specified filter from temp list to global list as an iterator*/
+/* should be called from a foreach on the temp list */
+static void
+apply_color_filter_it(gpointer filter_arg, gpointer unused _U_)
+{
+ color_filter_t *colorf = filter_arg;
+ filter_list = g_slist_append(filter_list, colorf);
+}
+
+/* copy all filters from temp list to global list */
+void
+apply_all_color_filters(void)
+{
+ g_slist_foreach(filter_list, remove_color_filter_it, NULL);
+ g_slist_free(filter_list);
+ filter_list = NULL;
+ g_slist_foreach(temp_filter_list, apply_color_filter_it, NULL);
+}
+
+/* remove all color filters in the temp list */
+void
+remove_temp_color_filters(void)
+{
+ if (temp_filter_list != NULL)
+ {
+ g_slist_foreach(temp_filter_list, remove_color_filter_it, NULL);
+ g_slist_free(temp_filter_list);
+ temp_filter_list = NULL;
+ }
+}
+
+/* copy the specified filter from global list to temp list as an iterator*/
+/* should be called from a foreach on the temp list */
+static void
+copy_color_filter_it(gpointer filter_arg, gpointer unused _U_)
+{
+ color_filter_t *colorf = filter_arg;
+ temp_filter_list = g_slist_append(temp_filter_list, colorf);
+}
+
+/* initialize temp list as a copy of the global list */
+void
+init_temp_color_filters(void)
+{
+ remove_temp_color_filters();
+ g_slist_foreach(filter_list, copy_color_filter_it, NULL);
+}
+
+
/* Initialize the filter structures (reading from file) for general running, including app startup */
void
colfilter_init(void)
@@ -107,22 +174,50 @@
WARNING: CHECK THIS OUT BY HAND - I DON'T TRUST THE CHANGE IN PARAMETERS
}
/* Create a new filter */
-color_filter_t *
-new_color_filter(gchar *name, /* The name of the filter to create */
- gchar *filter_string) /* The string representing the filter */
+static color_filter_t *
+make_new_color_filter(gchar *name, /* The name of the filter to create */
+ gchar *filter_string, /* The string representing the filter */
+ GdkColor *bg_color, /* The background color */
+ GdkColor *fg_color) /* The foreground color */
{
color_filter_t *colorf;
- GtkStyle *style;
colorf = g_malloc(sizeof (color_filter_t));
colorf->filter_name = g_strdup(name);
colorf->filter_text = g_strdup(filter_string);
- style = gtk_widget_get_style(packet_list);
- gdkcolor_to_color_t(&colorf->bg_color, &style->base[GTK_STATE_NORMAL]);
- gdkcolor_to_color_t(&colorf->fg_color, &style->text[GTK_STATE_NORMAL]);
+ gdkcolor_to_color_t(&colorf->bg_color, bg_color);
+ gdkcolor_to_color_t(&colorf->fg_color, fg_color);
colorf->c_colorfilter = NULL;
colorf->edit_dialog = NULL;
colorf->marked = FALSE;
+
+ return colorf;
+}
+
+/* Create a new filter in the temp list */
+color_filter_t *
+new_temp_color_filter(gchar *name, /* The name of the filter to create */
+ gchar *filter_string, /* The string representing the filter */
+ GdkColor *bg_color, /* The background color */
+ GdkColor *fg_color) /* The foreground color */
+{
+ color_filter_t *colorf;
+
+ colorf = make_new_color_filter(name, filter_string, bg_color, fg_color);
+ filter_list = g_slist_append(temp_filter_list, colorf);
+ return colorf;
+}
+
+/* Create a new filter in the global list */
+color_filter_t *
+new_color_filter(gchar *name, /* The name of the filter to create */
+ gchar *filter_string, /* The string representing the filter */
+ GdkColor *bg_color, /* The background color */
+ GdkColor *fg_color) /* The foreground color */
+{
+ color_filter_t *colorf;
+
+ colorf = make_new_color_filter(name, filter_string, bg_color, fg_color);
filter_list = g_slist_append(filter_list, colorf);
return colorf;
}
diff -u /home/richard/Documents/Downloads/ethereal-0.10.3/gtk/color_filters.h ethereal/gtk/color_filters.h
--- /home/richard/Documents/Downloads/ethereal-0.10.3/gtk/color_filters.h 2004-03-18 04:05:34.000000000 +0000
+++ ethereal/gtk/color_filters.h 2004-09-18 16:05:38.000000000 +0100
@@ -1,7 +1,7 @@
/* color_filters.h
* Definitions for color filters
*
- * $Id: color_filters.h,v 1.5 2004/03/14 23:55:53 deniel Exp $
+ * $Id: color_filters.h,v 1.6 2004/04/16 19:36:36 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@xxxxxxxxxxxx>
@@ -32,8 +32,15 @@
gboolean write_filters(void);
gboolean revert_filters(void);
-color_filter_t *new_color_filter(gchar *name, gchar *filter_string);
+color_filter_t *new_color_filter(gchar *name, gchar *filter_string,
+ GdkColor *bg_color, GdkColor *fg_color);
+color_filter_t *new_temp_color_filter(gchar *name, gchar *filter_string,
+ GdkColor *bg_color, GdkColor *fg_color);
void remove_color_filter(color_filter_t *colorf);
+void apply_all_color_filters(void);
+void copy_all_color_filters(void);
+void init_temp_color_filters(void);
+
gboolean read_other_filters(gchar *path, gpointer arg);
gboolean write_other_filters(gchar *path, gboolean only_marked);
--- /home/richard/Documents/Downloads/ethereal-0.10.3/color.h 2004-01-11 20:54:07.000000000 +0000
+++ ethereal/color.h 2004-06-05 19:13:49.000000000 +0100
@@ -58,6 +58,7 @@
/* List of all color filters. */
extern GSList *filter_list;
+extern GSList *temp_filter_list;
extern GSList *removed_filter_list;
void
- References:
- [Ethereal-dev] Color Filters - rollback on Cancel - given up
- From: Richard Urwin
- Re: [Ethereal-dev] Color Filters - rollback on Cancel - given up
- From: Ulf Lamping
- [Ethereal-dev] Color Filters - rollback on Cancel - given up
- Prev by Date: RE: [Ethereal-dev] m3ua message decoder
- Next by Date: Re: [Ethereal-dev] m3ua message decoder
- Previous by thread: Re: [Ethereal-dev] Color Filters - rollback on Cancel - given up
- Next by thread: [Ethereal-dev] nettl (HP-UX) icmp fixes
- Index(es):





