aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--gtk/main.c5
-rw-r--r--gtk/menu.c21
-rw-r--r--gtk/prefs_dlg.c68
-rw-r--r--gtk/prefs_dlg.h3
-rw-r--r--menu.h5
-rw-r--r--prefs.c21
-rw-r--r--prefs.h12
8 files changed, 127 insertions, 9 deletions
diff --git a/AUTHORS b/AUTHORS
index 7eb98f5bfe..ba1714fa0c 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -43,6 +43,7 @@ Laurent Deniel <deniel@worldnet.fr> {
GUI enhancements (about & help windows)
Follow TCP stream for IPv6
Protocol activation/deactivation (Edit:protocols)
+ "Properties..." menu item
Miscellaneous enhancements and fixes
}
diff --git a/gtk/main.c b/gtk/main.c
index 5f923c692a..9f5ce244d9 100644
--- a/gtk/main.c
+++ b/gtk/main.c
@@ -1,6 +1,6 @@
/* main.c
*
- * $Id: main.c,v 1.133 2000/08/11 13:33:06 deniel Exp $
+ * $Id: main.c,v 1.134 2000/08/15 20:46:17 deniel Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -483,6 +483,8 @@ tree_view_select_row_cb(GtkCTree *ctree, GList *node, gint column, gpointer user
finfo_selected = finfo;
+ set_menus_for_selected_tree_row(TRUE);
+
packet_hex_print(GTK_TEXT(byte_view), cfile.pd, cfile.current_frame->cap_len,
finfo->start, finfo->length, cfile.current_frame->flags.encoding);
}
@@ -491,6 +493,7 @@ static void
tree_view_unselect_row_cb(GtkCTree *ctree, GList *node, gint column, gpointer user_data)
{
finfo_selected = NULL;
+ set_menus_for_selected_tree_row(FALSE);
packet_hex_print(GTK_TEXT(byte_view), cfile.pd, cfile.current_frame->cap_len,
-1, -1, cfile.current_frame->flags.encoding);
}
diff --git a/gtk/menu.c b/gtk/menu.c
index b6ea7eddb8..59cd56c6c1 100644
--- a/gtk/menu.c
+++ b/gtk/menu.c
@@ -1,7 +1,7 @@
/* menu.c
* Menu routines
*
- * $Id: menu.c,v 1.35 2000/08/13 14:03:50 deniel Exp $
+ * $Id: menu.c,v 1.36 2000/08/15 20:41:59 deniel Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -158,6 +158,7 @@ static GtkItemFactoryEntry tree_view_menu_items[] =
{
{"/Match Selected", NULL, GTK_MENU_FUNC(match_selected_cb), 0, NULL},
{"/Resolve Name", NULL, GTK_MENU_FUNC(resolve_name_cb), 0, NULL},
+ {"/Properties...", NULL, GTK_MENU_FUNC(properties_cb), 0, NULL},
{"/Follow TCP Stream", NULL, GTK_MENU_FUNC(follow_stream_cb), 0, NULL},
{"/Filters...", NULL, GTK_MENU_FUNC(filter_dialog_cb), 0, NULL},
{"/<separator>", NULL, NULL, 0, "<Separator>"},
@@ -345,5 +346,21 @@ set_menus_for_selected_packet(gboolean have_selected_packet)
set_menu_sensitivity("/Tools/Follow TCP Stream",
have_selected_packet ? (pi.ipproto == 6) : FALSE);
set_menu_sensitivity("/Resolve Name",
- have_selected_packet && !g_resolving_actif);
+ have_selected_packet && !g_resolving_actif);
+}
+
+/* Enable or disable menu items based on whether a tree row is selected. */
+void
+set_menus_for_selected_tree_row(gboolean have_selected_tree)
+{
+ gboolean properties = FALSE;
+ if (finfo_selected) {
+ header_field_info *hfinfo = finfo_selected->hfinfo;
+ if (hfinfo->parent == -1) {
+ properties = prefs_is_registered_protocol(hfinfo->abbrev);
+ } else {
+ properties = prefs_is_registered_protocol(proto_registrar_get_abbrev(hfinfo->parent));
+ }
+ }
+ set_menu_sensitivity("/Properties...", have_selected_tree && properties);
}
diff --git a/gtk/prefs_dlg.c b/gtk/prefs_dlg.c
index 1c8b322038..b148e2a40d 100644
--- a/gtk/prefs_dlg.c
+++ b/gtk/prefs_dlg.c
@@ -1,7 +1,7 @@
/* prefs_dlg.c
* Routines for handling preferences
*
- * $Id: prefs_dlg.c,v 1.17 2000/08/11 13:33:05 deniel Exp $
+ * $Id: prefs_dlg.c,v 1.18 2000/08/15 20:41:58 deniel Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -74,6 +74,14 @@ static void prefs_main_destroy_cb(GtkWidget *, gpointer);
#define E_STREAM_PAGE_KEY "tcp_stream_options_page"
#define E_GUI_PAGE_KEY "gui_options_page"
+#define FIRST_PROTO_PREFS_PAGE 4
+
+/*
+ * Keep a static pointer to the notebook to be able to choose the
+ * displayed page.
+ */
+static GtkWidget *notebook;
+
/*
* Keep a static pointer to the current "Preferences" window, if any, so that
* if somebody tries to do "Edit:Preferences" while there's already a
@@ -260,7 +268,7 @@ prefs_cb(GtkWidget *w, gpointer dummy) {
gtk_container_add(GTK_CONTAINER(main_vb), top_hb);
gtk_widget_show(top_hb);
- prefs_nb = gtk_notebook_new();
+ notebook = prefs_nb = gtk_notebook_new();
gtk_container_add(GTK_CONTAINER(main_vb), prefs_nb);
gtk_widget_show(prefs_nb);
@@ -603,3 +611,59 @@ prefs_main_destroy_cb(GtkWidget *win, gpointer user_data)
/* Note that we no longer have a "Preferences" dialog box. */
prefs_w = NULL;
}
+
+struct properties_data {
+ GtkWidget *w;
+ int page_num;
+ char *title;
+};
+
+/* XXX this way of searching the correct page number is really ugly ... */
+static void
+module_search_properties(module_t *module, gpointer user_data)
+{
+ struct properties_data *p = (struct properties_data *)user_data;
+
+ if (p->title == NULL) return;
+ if (strcmp(module->title, p->title) == 0) {
+ /* found it */
+ gtk_notebook_set_page(GTK_NOTEBOOK(p->w), p->page_num);
+ p->title = NULL;
+ } else {
+ p->page_num++;
+ }
+}
+
+void
+properties_cb(GtkWidget *w, gpointer dummy)
+{
+ gchar *title = NULL;
+ struct properties_data p;
+
+ if (finfo_selected) {
+ header_field_info *hfinfo = finfo_selected->hfinfo;
+ if (hfinfo->parent == -1) {
+ title = prefs_get_title_by_name(hfinfo->abbrev);
+ } else {
+ title =
+ prefs_get_title_by_name(proto_registrar_get_abbrev(hfinfo->parent));
+ }
+ } else {
+ return;
+ }
+
+ if (!title) return;
+
+ if (prefs_w != NULL) {
+ reactivate_window(prefs_w);
+ } else {
+ prefs_cb(w, dummy);
+ }
+
+ p.w = notebook;
+ p.page_num = FIRST_PROTO_PREFS_PAGE;
+ p.title = title;
+
+ prefs_module_foreach(module_search_properties, &p);
+
+}
diff --git a/gtk/prefs_dlg.h b/gtk/prefs_dlg.h
index 94c06237a8..44a7fb45f9 100644
--- a/gtk/prefs_dlg.h
+++ b/gtk/prefs_dlg.h
@@ -1,7 +1,7 @@
/* prefs_dlg.h
* Definitions for preference handling routines
*
- * $Id: prefs_dlg.h,v 1.4 2000/08/11 13:32:59 deniel Exp $
+ * $Id: prefs_dlg.h,v 1.5 2000/08/15 20:41:59 deniel Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -29,5 +29,6 @@
#include "prefs.h"
void prefs_cb(GtkWidget *, gpointer);
+void properties_cb(GtkWidget *, gpointer);
#endif
diff --git a/menu.h b/menu.h
index f442803569..b55454a7d6 100644
--- a/menu.h
+++ b/menu.h
@@ -2,7 +2,7 @@
* Definitions for menu routines with toolkit-independent APIs but
* toolkit-dependent implementations.
*
- * $Id: menu.h,v 1.7 2000/01/03 03:56:55 guy Exp $
+ * $Id: menu.h,v 1.8 2000/08/15 20:42:09 deniel Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -52,6 +52,9 @@ void set_menus_for_captured_packets(gboolean);
/* Enable or disable menu items based on whether a packet is selected. */
void set_menus_for_selected_packet(gboolean);
+/* Enable or disable menu items based on whether a tree row is selected. */
+void set_menus_for_selected_tree_row(gboolean);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/prefs.c b/prefs.c
index f5d85bf525..df8ad0dc93 100644
--- a/prefs.c
+++ b/prefs.c
@@ -1,7 +1,7 @@
/* prefs.c
* Routines for handling preferences
*
- * $Id: prefs.c,v 1.34 2000/08/11 13:34:44 deniel Exp $
+ * $Id: prefs.c,v 1.35 2000/08/15 20:42:09 deniel Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -229,6 +229,25 @@ find_preference(module_t *module, char *name)
}
/*
+ * Returns TRUE if the given protocol has registered preferences
+ */
+gboolean
+prefs_is_registered_protocol(char *name)
+{
+ return (find_module(name) != NULL);
+}
+
+/*
+ * Returns the module title of a registered protocol
+ */
+char *
+prefs_get_title_by_name(char *name)
+{
+ module_t *m = find_module(name);
+ return (m) ? m->title : NULL;
+}
+
+/*
* Register a preference with an unsigned integral value.
*/
void
diff --git a/prefs.h b/prefs.h
index c53410ab82..52a723d6dd 100644
--- a/prefs.h
+++ b/prefs.h
@@ -1,7 +1,7 @@
/* prefs.h
* Definitions for preference handling routines
*
- * $Id: prefs.h,v 1.17 2000/07/09 03:29:28 guy Exp $
+ * $Id: prefs.h,v 1.18 2000/08/15 20:42:10 deniel Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -88,6 +88,16 @@ struct preference;
typedef struct preference pref_t;
/*
+ * Returns TRUE if the given protocol has registered preferences
+ */
+gboolean prefs_is_registered_protocol(char *name);
+
+/*
+ * Returns the module title of a registered protocol (or NULL if unknown)
+ */
+char *prefs_get_title_by_name(char *name);
+
+/*
* Register a preference with an unsigned integral value.
*/
void prefs_register_uint_preference(module_t *module, const char *name,