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
This commit is contained in:
Guy Harris 2000-01-18 08:38:18 +00:00
parent 4aaff9af74
commit 4603877dc4
7 changed files with 124 additions and 17 deletions

View File

@ -195,6 +195,7 @@ Jerry Talkington <jerryt@netapp.com> {
updates to HTTP support
Filter selection/editing GUI improvements
WCCP 1.0 support
Right-mouse-button menu support
}
Dave Chapeskie <dchapes@ddm.on.ca> {

View File

@ -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<protocol tree> 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<protocol tree> highlights the corresponding

7
file.c
View File

@ -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 <gerald@zing.org>
@ -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,

View File

@ -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 <gerald@zing.org>
@ -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

View File

@ -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 <gerald@zing.org>
@ -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();

View File

@ -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 <gerald@zing.org>
@ -28,6 +28,7 @@
#endif
#include <gtk/gtk.h>
#include <glib.h>
#include <string.h>
#include <stdio.h>
@ -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);
"<LastBranch>" -> create a right justified branch
*/
/* main menu */
static GtkItemFactoryEntry menu_items[] =
{
{"/_File", NULL, NULL, 0, "<Branch>" },
@ -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},
{"/<separator>", NULL, NULL, 0, "<Separator>"},
{"/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},
{"/<separator>", NULL, NULL, 0, "<Separator>"},
{"/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, "<main>", 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, "<main>", 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, "<main>", 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

View File

@ -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 <gerald@zing.org>
@ -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
}