From 4603877dc40c99c96a43f0ecb702b9d1c056d4b6 Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Tue, 18 Jan 2000 08:38:18 +0000 Subject: [PATCH] Jerry Talkington's changes to support, in the packet list and protocol tree panes, menus popped up by the right mouse button. svn path=/trunk/; revision=1504 --- AUTHORS | 1 + doc/ethereal.pod.template | 8 +-- file.c | 7 +-- gtk/keys.h | 6 ++- gtk/main.c | 6 ++- gtk/menu.c | 108 +++++++++++++++++++++++++++++++++++--- gtk/menu.h | 5 +- 7 files changed, 124 insertions(+), 17 deletions(-) diff --git a/AUTHORS b/AUTHORS index 2c6d4a2b27..4c49b271d7 100644 --- a/AUTHORS +++ b/AUTHORS @@ -195,6 +195,7 @@ Jerry Talkington { updates to HTTP support Filter selection/editing GUI improvements WCCP 1.0 support + Right-mouse-button menu support } Dave Chapeskie { diff --git a/doc/ethereal.pod.template b/doc/ethereal.pod.template index 076b00b906..2af512bbb2 100644 --- a/doc/ethereal.pod.template +++ b/doc/ethereal.pod.template @@ -316,11 +316,13 @@ through and select. The packet number, packet timestamp, source and destination addresses, protocol, and description are printed for each packet. An effort is made to display information as high up the protocol stack as possible, e.g. IP addresses are displayed for IP packets, but the -MAC layer address is displayed for unknown packet types. +MAC layer address is displayed for unknown packet types. The right +mouse button can be used to pop up a menu of operations. The middle pane contains a I for the currently-selected -packet. The tree displays each field and its value in each protocol header -in the stack. +packet. The tree displays each field and its value in each protocol +header in the stack. The right mouse button can be used to pop up a +menu of operations. The lowest pane contains a hex dump of the actual packet data. Selecting a field in the I highlights the corresponding diff --git a/file.c b/file.c index b359a6207e..ec95387014 100644 --- a/file.c +++ b/file.c @@ -1,7 +1,7 @@ /* file.c * File I/O routines * - * $Id: file.c,v 1.153 2000/01/15 00:22:30 gram Exp $ + * $Id: file.c,v 1.154 2000/01/18 08:37:55 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -310,8 +310,6 @@ read_cap_file(capture_file *cf) cf->filed = open(cf->filename, O_RDONLY); cf->fh = filed_open(cf->filed, "r"); cf->current_frame = cf->first_displayed; - /* Make the first row the selected row. */ - gtk_clist_select_row(GTK_CLIST(packet_list), 0, -1); thaw_clist(cf); gtk_progress_set_activity_mode(GTK_PROGRESS(prog_bar), FALSE); @@ -328,6 +326,9 @@ read_cap_file(capture_file *cf) /* Enable menu items that make sense if you have some captured packets. */ set_menus_for_captured_packets(TRUE); + /* Make the first row the selected row. */ + gtk_signal_emit_by_name(GTK_OBJECT(packet_list), "select_row", 0); + if (!success) { /* Put up a message box noting that the read failed somewhere along the line. Don't throw out the stuff we managed to read, though, diff --git a/gtk/keys.h b/gtk/keys.h index b64ec08511..af0841947e 100644 --- a/gtk/keys.h +++ b/gtk/keys.h @@ -1,7 +1,7 @@ /* keys.h * Key definitions for various objects * - * $Id: keys.h,v 1.9 2000/01/06 07:33:33 guy Exp $ + * $Id: keys.h,v 1.10 2000/01/18 08:38:16 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -40,4 +40,8 @@ #define PLUGINS_DFILTER_TE "plugins_dfilter_te" +#define PM_MENU_LIST_KEY "popup_menu_menu_list" +#define PM_PACKET_LIST_KEY "popup_menu_packet_list" +#define PM_TREE_VIEW_KEY "popup_menu_tree_view" + #endif diff --git a/gtk/main.c b/gtk/main.c index 5ebda1d7c1..9d40c96789 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1,6 +1,6 @@ /* main.c * - * $Id: main.c,v 1.91 2000/01/16 02:48:12 guy Exp $ + * $Id: main.c,v 1.92 2000/01/18 08:38:16 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -1539,6 +1539,8 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs) get_column_longest_string(get_column_format(i))); } gtk_widget_set_usize(packet_list, -1, pl_size); + gtk_signal_connect_object(GTK_OBJECT(packet_list), "button_press_event", + GTK_SIGNAL_FUNC(popup_menu_handler), gtk_object_get_data(GTK_OBJECT(popup_menu_object), PM_PACKET_LIST_KEY)); gtk_widget_show(packet_list); /* Tree view */ @@ -1562,6 +1564,8 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs) GTK_SIGNAL_FUNC(tree_view_select_row_cb), NULL); gtk_signal_connect(GTK_OBJECT(tree_view), "tree-unselect-row", GTK_SIGNAL_FUNC(tree_view_unselect_row_cb), NULL); + gtk_signal_connect_object(GTK_OBJECT(tree_view), "button_press_event", + GTK_SIGNAL_FUNC(popup_menu_handler), gtk_object_get_data(GTK_OBJECT(popup_menu_object), PM_TREE_VIEW_KEY)); gtk_widget_show(tree_view); item_style = gtk_style_new(); diff --git a/gtk/menu.c b/gtk/menu.c index 08ac0fe2d5..45693e6138 100644 --- a/gtk/menu.c +++ b/gtk/menu.c @@ -1,7 +1,7 @@ /* menu.c * Menu routines * - * $Id: menu.c,v 1.17 2000/01/17 17:12:42 oabad Exp $ + * $Id: menu.c,v 1.18 2000/01/18 08:38:18 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -28,6 +28,7 @@ #endif #include +#include #include #include @@ -50,6 +51,7 @@ #include "print.h" #include "follow.h" #include "colors.h" +#include "keys.h" #include "plugins.h" #define GTK_MENU_FUNC(a) ((GtkItemFactoryCallback)(a)) @@ -80,6 +82,7 @@ static void set_menu_sensitivity (gchar *, gint); "" -> create a right justified branch */ +/* main menu */ static GtkItemFactoryEntry menu_items[] = { {"/_File", NULL, NULL, 0, "" }, @@ -128,8 +131,35 @@ static GtkItemFactoryEntry menu_items[] = /* calculate the number of menu_items */ static int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); +/* packet list popup */ +static GtkItemFactoryEntry packet_list_menu_items[] = +{ + {"/Match Selected", NULL, GTK_MENU_FUNC(match_selected_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}, + {"/", NULL, NULL, 0, ""}, + {"/Colorize Display...", NULL, GTK_MENU_FUNC(color_display_cb), 0, NULL}, + {"/Print...", NULL, GTK_MENU_FUNC(file_print_cmd_cb), 0, NULL}, + {"/Print Packet", NULL, GTK_MENU_FUNC(file_print_packet_cmd_cb), 0, NULL}, +}; + +static GtkItemFactoryEntry tree_view_menu_items[] = +{ + {"/Match Selected", NULL, GTK_MENU_FUNC(match_selected_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}, + {"/", NULL, NULL, 0, ""}, + {"/Collapse All", NULL, GTK_MENU_FUNC(collapse_all_cb), 0, NULL}, + {"/Expand All", NULL, GTK_MENU_FUNC(expand_all_cb), 0, NULL} +}; + + static int initialize = TRUE; static GtkItemFactory *factory = NULL; +static GtkItemFactory *packet_list_menu_factory = NULL; +static GtkItemFactory *tree_view_menu_factory = NULL; + +static GSList *popup_menu_list = NULL; static GtkAccelGroup *grp; @@ -138,8 +168,10 @@ get_main_menu(GtkWidget ** menubar, GtkAccelGroup ** table) { grp = gtk_accel_group_new(); - if (initialize) + if (initialize) { + popup_menu_object = gtk_widget_new(GTK_TYPE_WIDGET, NULL); menus_init(); + } if (menubar) *menubar = factory->widget; @@ -154,6 +186,18 @@ menus_init(void) { if (initialize) { initialize = FALSE; + /* popup */ + + packet_list_menu_factory = gtk_item_factory_new(GTK_TYPE_MENU, "
", NULL); + gtk_item_factory_create_items_ac(packet_list_menu_factory, sizeof(packet_list_menu_items)/sizeof(packet_list_menu_items[0]), packet_list_menu_items, NULL, 2); + gtk_object_set_data(GTK_OBJECT(popup_menu_object), PM_PACKET_LIST_KEY, packet_list_menu_factory->widget); + popup_menu_list = g_slist_append((GSList *)popup_menu_list, packet_list_menu_factory); + + tree_view_menu_factory = gtk_item_factory_new(GTK_TYPE_MENU, "
", NULL); + gtk_item_factory_create_items_ac(tree_view_menu_factory, sizeof(tree_view_menu_items)/sizeof(tree_view_menu_items[0]), tree_view_menu_items, NULL, 2); + gtk_object_set_data(GTK_OBJECT(popup_menu_object), PM_TREE_VIEW_KEY, tree_view_menu_factory->widget); + popup_menu_list = g_slist_append((GSList *)popup_menu_list, tree_view_menu_factory); + factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", grp); gtk_item_factory_create_items_ac(factory, nmenu_items, menu_items, NULL,2); set_menus_for_unsaved_capture_file(FALSE); @@ -167,20 +211,68 @@ menus_init(void) { } } +void +set_menu_sensitivity_meat(GtkItemFactory *ifactory, gchar *path, gint val) { + GtkWidget *menu = NULL; + + if((menu = gtk_item_factory_get_widget(ifactory, path)) != NULL) { + gtk_widget_set_sensitive(menu,val); + } +} + static void set_menu_sensitivity (gchar *path, gint val) { - GtkWidget *menu; + GSList *menu_list = popup_menu_list; + gchar *shortpath = rindex(path, '/'); - if ((menu = gtk_item_factory_get_widget(factory, path)) != NULL) - gtk_widget_set_sensitive(menu, val); + set_menu_sensitivity_meat(factory, path, val); + + while (menu_list != NULL) { + set_menu_sensitivity_meat(menu_list->data, shortpath, val); + menu_list = g_slist_next(menu_list); + } + +} + +void +set_menu_object_data_meat(GtkItemFactory *ifactory, gchar *path, gchar *key, gpointer data) +{ + GtkWidget *menu = NULL; + + if ((menu = gtk_item_factory_get_widget(ifactory, path)) != NULL) + gtk_object_set_data(GTK_OBJECT(menu), key, data); } void set_menu_object_data (gchar *path, gchar *key, gpointer data) { - GtkWidget *menu; + GSList *menu_list = popup_menu_list; + gchar *shortpath = rindex(path, '/'); - if ((menu = gtk_item_factory_get_widget(factory, path)) != NULL) - gtk_object_set_data(GTK_OBJECT(menu), key, data); + set_menu_object_data_meat(factory, path, key, data); + while (menu_list != NULL) { + set_menu_object_data_meat(menu_list->data, shortpath, key, data); + menu_list = g_slist_next(menu_list); + } +} + +void +popup_menu_handler(GtkWidget *widget, GdkEvent *event) +{ + GtkWidget *menu = NULL; + GdkEventButton *event_button = NULL; + + if(widget == NULL || event == NULL) { + return; + } + + menu = widget; + if(event->type == GDK_BUTTON_PRESS) { + event_button = (GdkEventButton *) event; + + if(event_button->button == 3) { + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event_button->button, event_button->time); + } + } } /* Enable or disable menu items based on whether you have a capture file diff --git a/gtk/menu.h b/gtk/menu.h index 696e6ff13a..3890ba773d 100644 --- a/gtk/menu.h +++ b/gtk/menu.h @@ -1,7 +1,7 @@ /* menu.h * Menu definitions * - * $Id: menu.h,v 1.3 2000/01/03 04:06:09 guy Exp $ + * $Id: menu.h,v 1.4 2000/01/18 08:38:18 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -32,6 +32,9 @@ extern "C" { void get_main_menu (GtkWidget **, GtkAccelGroup **); void set_menu_object_data (gchar *path, gchar *key, gpointer data); +void popup_menu_handler(GtkWidget *widget, GdkEvent *event); + +GtkWidget *popup_menu_object; #ifdef __cplusplus }