aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGilbert Ramirez <gram@alumni.rice.edu>1999-12-29 20:10:12 +0000
committerGilbert Ramirez <gram@alumni.rice.edu>1999-12-29 20:10:12 +0000
commit8162d65615239222d3c22f684ce121d2b39f9039 (patch)
treec6fa5d6ff97fee388a3f2f0efd5ccccce1abe957
parentdcd0869b373bcdc2c6a85243035b69c558f472da (diff)
downloadwireshark-8162d65615239222d3c22f684ce121d2b39f9039.tar.gz
wireshark-8162d65615239222d3c22f684ce121d2b39f9039.tar.bz2
wireshark-8162d65615239222d3c22f684ce121d2b39f9039.zip
Changed the protocol tree widget from a GtkTree to a GtkCTree. The two reasons
I did this: First, Havoc Pennington, in "GTK+/Gnome Application Development", in Appendix seciton A.3.88, recommends using GtkCTree instead of GtkTree because GtkCtree is faster, and GtkTree has limitation on its total row height: since it must fit inside a GdkWindow, it is limited to 32,768 pixels of height. GtkTree is more flexible with regards to the types of widgets that can be placed in the tree, but since we deal only with text, that doesn't matter, at least for now. Secondly, a GtkTree doesn't allow arrow-key navigation (at least as far as I could tell). It always bothered me that the up and down arrow keys worked in the packet list and in the hex dump, but no in the protocol tree. GtkCTree does allow arrow-key navigation. In fact, GtkCTree is a subclass of GtkCList (the packet list widget), so they behave a lot alike. I went ahead and fixed the selection bar which has been bothering Richard for a long time now. :) In the GUI preferences dialogue, you can now set both the packet list selection bar and the protocol tree selection bar to either "browse" or "select" mode. "browse" mode is what you're used to: the arrow keys move an outline of the selection bar, but do not change the selection. "select" mode does change the selection when the arrow keys are pressed. The default behavior is set to "select", which seems more natural for a first-time user. svn path=/trunk/; revision=1393
-rw-r--r--doc/ethereal.pod.template11
-rw-r--r--file.c32
-rw-r--r--gtk/gtkglobals.h4
-rw-r--r--gtk/gui_prefs.c103
-rw-r--r--gtk/main.c100
-rw-r--r--gtk/proto_draw.c102
-rw-r--r--prefs.c27
-rw-r--r--prefs.h4
8 files changed, 274 insertions, 109 deletions
diff --git a/doc/ethereal.pod.template b/doc/ethereal.pod.template
index 00e768d62f..f19ee216fa 100644
--- a/doc/ethereal.pod.template
+++ b/doc/ethereal.pod.template
@@ -399,8 +399,15 @@ desired color. The new text colors are displayed in a sample window.
=item GUI Preferences
The I<GUI> page is used to modify small aspects of the GUI to your own
-personal taste. The only current option is the placement of the
-vertical scrollbars in the three panes, either on the left or the right.
+personal taste. The vertical scrollbars in the three panes can be
+set to be either on the left or the right. The selection bar in the
+packet list and protocol tree can have either a "browse" or "select"
+behavior. If the selection bar has a "browse" behavior, the arrow keys
+will move an outline of the selection bar, allowing you to browse
+the rest of the list or tree without changing the selection
+until you press the space bar. If the selection bar has a "select"
+behavior, the arrow keys will move the selection bar and change
+the selection to the new item in the packet list or protocol tree.
=back
diff --git a/file.c b/file.c
index 74c85508a0..1d0028e6b8 100644
--- a/file.c
+++ b/file.c
@@ -1,7 +1,7 @@
/* file.c
* File I/O routines
*
- * $Id: file.c,v 1.142 1999/12/29 07:25:48 guy Exp $
+ * $Id: file.c,v 1.143 1999/12/29 20:09:45 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -1064,9 +1064,6 @@ change_time_formats(capture_file *cf)
static void
clear_tree_and_hex_views(void)
{
- GList *selection;
- GtkWidget *tmp_item;
-
/* Clear the hex dump. */
gtk_text_freeze(GTK_TEXT(byte_view));
gtk_text_set_point(GTK_TEXT(byte_view), 0);
@@ -1074,25 +1071,9 @@ clear_tree_and_hex_views(void)
gtk_text_get_length(GTK_TEXT(byte_view)));
gtk_text_thaw(GTK_TEXT(byte_view));
- /* Deselect any selected tree item. gtktree.c should
- * do this when we clear_items, but it doesn't. I copied
- * this while() loop from gtktree.c, gtk_real_tree_select_child()
- */
- if (GTK_TREE(tree_view)->root_tree) {
- selection = GTK_TREE(tree_view)->root_tree->selection;
- while (selection) {
- tmp_item = selection->data;
- gtk_tree_item_deselect(GTK_TREE_ITEM(tmp_item));
- gtk_widget_unref(tmp_item);
- selection = selection->next;
- }
- g_list_free(GTK_TREE(tree_view)->root_tree->selection);
- GTK_TREE(tree_view)->root_tree->selection = NULL;
- }
+ /* Remove all nodes in ctree. This is how it's done in testgtk.c in GTK+ */
+ gtk_clist_clear ( GTK_CLIST(tree_view) );
- /* Clear the protocol tree view. The length arg of -1
- * means to clear all items up to the end. */
- gtk_tree_clear_items(GTK_TREE(tree_view), 0, -1);
}
gboolean
@@ -1225,12 +1206,6 @@ select_packet(capture_file *cf, int row)
frame_data *fd;
int i;
- /* Clear out whatever's currently in the hex dump. */
- gtk_text_freeze(GTK_TEXT(byte_view));
- gtk_text_set_point(GTK_TEXT(byte_view), 0);
- gtk_text_forward_delete(GTK_TEXT(byte_view),
- gtk_text_get_length(GTK_TEXT(byte_view)));
-
/* Search through the list of frames to see which one is in
this row. */
for (fd = cf->plist, i = 0; fd != NULL; fd = fd->next, i++) {
@@ -1259,7 +1234,6 @@ select_packet(capture_file *cf, int row)
proto_tree_draw(cf->protocol_tree, tree_view);
packet_hex_print(GTK_TEXT(byte_view), cf->pd, cf->current_frame->cap_len,
-1, -1, cf->current_frame->encoding);
- gtk_text_thaw(GTK_TEXT(byte_view));
/* A packet is selected, so "File/Print Packet" has something to print. */
set_menu_sensitivity("/File/Print Packet", TRUE);
diff --git a/gtk/gtkglobals.h b/gtk/gtkglobals.h
index cc6417a072..6326009fb1 100644
--- a/gtk/gtkglobals.h
+++ b/gtk/gtkglobals.h
@@ -1,7 +1,7 @@
/* gtkglobals.h
* GTK-related Global defines, etc.
*
- * $Id: gtkglobals.h,v 1.3 1999/12/16 06:20:15 gram Exp $
+ * $Id: gtkglobals.h,v 1.4 1999/12/29 20:10:09 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -37,5 +37,7 @@ extern GdkFont *m_r_font, *m_b_font;
extern GtkStyle *item_style;
void set_scrollbar_placement(int); /* 1=right, 0=left */
+void set_plist_sel_browse(gboolean);
+void set_ptree_sel_browse(gboolean);
#endif
diff --git a/gtk/gui_prefs.c b/gtk/gui_prefs.c
index 05a2f7f0ef..717be022cf 100644
--- a/gtk/gui_prefs.c
+++ b/gtk/gui_prefs.c
@@ -1,7 +1,7 @@
/* gui_prefs.c
* Dialog box for GUI preferences
*
- * $Id: gui_prefs.c,v 1.1 1999/12/16 06:20:15 gram Exp $
+ * $Id: gui_prefs.c,v 1.2 1999/12/29 20:10:10 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -41,28 +41,38 @@
#endif
static void scrollbar_menu_item_cb(GtkWidget *w, gpointer data);
+static void plist_sel_browse_cb(GtkWidget *w, gpointer data);
+static void ptree_sel_browse_cb(GtkWidget *w, gpointer data);
static gboolean temp_gui_scrollbar_on_right;
+static gboolean temp_gui_plist_sel_browse;
+static gboolean temp_gui_ptree_sel_browse;
GtkWidget*
gui_prefs_show(void)
{
- GtkWidget *main_vb, *hbox, *label;
+ GtkWidget *main_tb, *main_vb, *label;
GtkWidget *menu_item_left, *menu_item_right,
*scrollbar_menu, *scrollbar_option_menu;
temp_gui_scrollbar_on_right = prefs.gui_scrollbar_on_right;
+ temp_gui_plist_sel_browse = prefs.gui_plist_sel_browse;
+ temp_gui_ptree_sel_browse = prefs.gui_ptree_sel_browse;
/* Main vertical box */
main_vb = gtk_vbox_new(FALSE, 5);
- gtk_container_border_width(GTK_CONTAINER(main_vb), 5);
+ gtk_container_border_width( GTK_CONTAINER(main_vb), 5 );
- /* Scrollbar placment hbox */
- hbox = gtk_hbox_new(FALSE, 5);
- gtk_box_pack_start( GTK_BOX(main_vb), hbox, FALSE, FALSE, 5);
+ /* Main table */
+ main_tb = gtk_table_new(3, 2, FALSE);
+ gtk_box_pack_start( GTK_BOX(main_vb), main_tb, FALSE, FALSE, 0 );
+ gtk_table_set_row_spacings( GTK_TABLE(main_tb), 10 );
+ gtk_table_set_col_spacings( GTK_TABLE(main_tb), 15 );
+ /* Scrollbar placment */
label = gtk_label_new("Vertical Scrollbar Placement:");
- gtk_container_add( GTK_CONTAINER(hbox), label );
+ gtk_misc_set_alignment( GTK_MISC(label), 1.0, 0.5 );
+ gtk_table_attach_defaults( GTK_TABLE(main_tb), label, 0, 1, 0, 1 );
/* Create a simple menu containing the LEFT/RIGHT choices for
* the scrollbar placement option */
@@ -83,8 +93,60 @@ gui_prefs_show(void)
scrollbar_menu );
gtk_option_menu_set_history( GTK_OPTION_MENU(scrollbar_option_menu),
temp_gui_scrollbar_on_right);
- gtk_container_add( GTK_CONTAINER(hbox), scrollbar_option_menu );
+ gtk_table_attach_defaults( GTK_TABLE(main_tb), scrollbar_option_menu,
+ 1, 2, 0, 1 );
+ /* Packet list selection browseable */
+ label = gtk_label_new("Packet-list selection bar movement:");
+ gtk_misc_set_alignment( GTK_MISC(label), 1.0, 0.5 );
+ gtk_table_attach_defaults( GTK_TABLE(main_tb), label, 0, 1, 1, 2 );
+
+ /* Create a simple menu containing the LEFT/RIGHT choices */
+ scrollbar_menu = gtk_menu_new();
+ menu_item_left = gtk_menu_item_new_with_label("Selects");
+ menu_item_right = gtk_menu_item_new_with_label("Browses");
+ gtk_menu_append( GTK_MENU(scrollbar_menu), menu_item_left );
+ gtk_menu_append( GTK_MENU(scrollbar_menu), menu_item_right );
+
+ gtk_signal_connect( GTK_OBJECT(menu_item_left), "activate",
+ plist_sel_browse_cb, GINT_TO_POINTER(FALSE) );
+ gtk_signal_connect( GTK_OBJECT(menu_item_right), "activate",
+ plist_sel_browse_cb, GINT_TO_POINTER(TRUE) );
+
+ /* Create the option menu from the option */
+ scrollbar_option_menu = gtk_option_menu_new();
+ gtk_option_menu_set_menu( GTK_OPTION_MENU(scrollbar_option_menu),
+ scrollbar_menu );
+ gtk_option_menu_set_history( GTK_OPTION_MENU(scrollbar_option_menu),
+ temp_gui_plist_sel_browse);
+ gtk_table_attach_defaults( GTK_TABLE(main_tb), scrollbar_option_menu,
+ 1, 2, 1, 2 );
+
+ /* Proto tree selection browseable */
+ label = gtk_label_new("Protocol-tree selection bar movement:");
+ gtk_misc_set_alignment( GTK_MISC(label), 1.0, 0.5 );
+ gtk_table_attach_defaults( GTK_TABLE(main_tb), label, 0, 1, 2, 3 );
+
+ /* Create a simple menu containing the LEFT/RIGHT choices */
+ scrollbar_menu = gtk_menu_new();
+ menu_item_left = gtk_menu_item_new_with_label("Selects");
+ menu_item_right = gtk_menu_item_new_with_label("Browses");
+ gtk_menu_append( GTK_MENU(scrollbar_menu), menu_item_left );
+ gtk_menu_append( GTK_MENU(scrollbar_menu), menu_item_right );
+
+ gtk_signal_connect( GTK_OBJECT(menu_item_left), "activate",
+ ptree_sel_browse_cb, GINT_TO_POINTER(FALSE) );
+ gtk_signal_connect( GTK_OBJECT(menu_item_right), "activate",
+ ptree_sel_browse_cb, GINT_TO_POINTER(TRUE) );
+
+ /* Create the option menu from the option */
+ scrollbar_option_menu = gtk_option_menu_new();
+ gtk_option_menu_set_menu( GTK_OPTION_MENU(scrollbar_option_menu),
+ scrollbar_menu );
+ gtk_option_menu_set_history( GTK_OPTION_MENU(scrollbar_option_menu),
+ temp_gui_ptree_sel_browse);
+ gtk_table_attach_defaults( GTK_TABLE(main_tb), scrollbar_option_menu,
+ 1, 2, 2, 3 );
/* Show 'em what we got */
gtk_widget_show_all(main_vb);
@@ -102,10 +164,30 @@ scrollbar_menu_item_cb(GtkWidget *w, gpointer data)
set_scrollbar_placement(value);
}
+static void
+plist_sel_browse_cb(GtkWidget *w, gpointer data)
+{
+ gboolean value = GPOINTER_TO_INT(data);
+
+ temp_gui_plist_sel_browse = value;
+ set_plist_sel_browse(value);
+}
+
+static void
+ptree_sel_browse_cb(GtkWidget *w, gpointer data)
+{
+ gboolean value = GPOINTER_TO_INT(data);
+
+ temp_gui_ptree_sel_browse = value;
+ set_ptree_sel_browse(value);
+}
+
void
gui_prefs_ok(GtkWidget *w)
{
prefs.gui_scrollbar_on_right = temp_gui_scrollbar_on_right;
+ prefs.gui_plist_sel_browse = temp_gui_plist_sel_browse;
+ prefs.gui_ptree_sel_browse = temp_gui_ptree_sel_browse;
gui_prefs_delete(w);
}
@@ -121,7 +203,12 @@ gui_prefs_cancel(GtkWidget *w)
/* Reset scrollbar placement value back to what the
* current preferences says it should be */
temp_gui_scrollbar_on_right = prefs.gui_scrollbar_on_right;
+ temp_gui_plist_sel_browse = prefs.gui_plist_sel_browse;
+ temp_gui_ptree_sel_browse = prefs.gui_ptree_sel_browse;
+
set_scrollbar_placement(prefs.gui_scrollbar_on_right);
+ set_plist_sel_browse(prefs.gui_plist_sel_browse);
+ set_ptree_sel_browse(prefs.gui_ptree_sel_browse);
gui_prefs_delete(w);
}
diff --git a/gtk/main.c b/gtk/main.c
index 7c9c5f6bf1..822709e2a9 100644
--- a/gtk/main.c
+++ b/gtk/main.c
@@ -1,6 +1,6 @@
/* main.c
*
- * $Id: main.c,v 1.76 1999/12/16 06:20:16 gram Exp $
+ * $Id: main.c,v 1.77 1999/12/29 20:10:10 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -31,7 +31,6 @@
* - Multiple window support
* - Add cut/copy/paste
* - Create header parsing routines
- * - Make byte view scrollbars automatic?
* - Make byte view selections more fancy?
*
*/
@@ -708,7 +707,7 @@ filter_reset_cb(GtkWidget *w, gpointer data)
}
/* What to do when a list item is selected/unselected */
-void
+static void
packet_list_select_cb(GtkWidget *w, gint row, gint col, gpointer evt) {
#ifdef HAVE_LIBPCAP
@@ -723,31 +722,36 @@ packet_list_select_cb(GtkWidget *w, gint row, gint col, gpointer evt) {
select_packet(&cf, row);
}
-void
+static void
packet_list_unselect_cb(GtkWidget *w, gint row, gint col, gpointer evt) {
unselect_packet(&cf);
}
-void
-tree_view_cb(GtkWidget *w, gpointer data) {
-
- field_info *finfo;
- int tree_selected_start = -1;
- int tree_selected_len = -1;
-
- if (GTK_TREE(w)->selection) {
- finfo =
- gtk_object_get_data(GTK_OBJECT(GTK_TREE(w)->selection->data),
- E_TREEINFO_FIELD_INFO_KEY);
- g_assert(finfo);
- finfo_selected = finfo;
- tree_selected_start = finfo->start;
- tree_selected_len = finfo->length;
- }
+static void
+tree_view_select_row_cb(GtkCTree *ctree, GList *node, gint column, gpointer user_data)
+{
+ field_info *finfo;
+ int tree_selected_start = -1;
+ int tree_selected_len = -1;
+
+ g_assert(node);
+ finfo = gtk_ctree_node_get_row_data( ctree, GTK_CTREE_NODE(node) );
+ g_assert(finfo);
+
+ finfo_selected = finfo;
+ tree_selected_start = finfo->start;
+ tree_selected_len = finfo->length;
- packet_hex_print(GTK_TEXT(byte_view), cf.pd, cf.current_frame->cap_len,
- tree_selected_start, tree_selected_len,
- cf.current_frame->encoding);
+ packet_hex_print(GTK_TEXT(byte_view), cf.pd, cf.current_frame->cap_len,
+ tree_selected_start, tree_selected_len, cf.current_frame->encoding);
+}
+
+static void
+tree_view_unselect_row_cb(GtkCTree *ctree, GList *node, gint column, gpointer user_data)
+{
+ finfo_selected = NULL;
+ packet_hex_print(GTK_TEXT(byte_view), cf.pd, cf.current_frame->cap_len,
+ -1, -1, cf.current_frame->encoding);
}
void collapse_all_cb(GtkWidget *widget, gpointer data) {
@@ -781,6 +785,30 @@ set_scrollbar_placement(int pos) /* 0=left, 1=right */
}
}
+void
+set_plist_sel_browse(gboolean val)
+{
+ if (finfo_selected)
+ unselect_packet(&cf);
+
+ if (val) {
+ gtk_clist_set_selection_mode(GTK_CLIST(packet_list), GTK_SELECTION_SINGLE);
+ }
+ else {
+ gtk_clist_set_selection_mode(GTK_CLIST(packet_list), GTK_SELECTION_EXTENDED);
+ }
+}
+
+void
+set_ptree_sel_browse(gboolean val)
+{
+ if (val) {
+ gtk_clist_set_selection_mode(GTK_CLIST(tree_view), GTK_SELECTION_SINGLE);
+ }
+ else {
+ gtk_clist_set_selection_mode(GTK_CLIST(tree_view), GTK_SELECTION_EXTENDED);
+ }
+}
void
file_quit_cmd_cb (GtkWidget *widget, gpointer data) {
@@ -1207,13 +1235,16 @@ main(int argc, char *argv[])
gtk_widget_show(l_pane);
/* Packet list */
- packet_list = gtk_clist_new_with_titles(cf.cinfo.num_cols, cf.cinfo.col_title);
- gtk_clist_column_titles_passive(GTK_CLIST(packet_list));
pkt_scrollw = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(pkt_scrollw),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_widget_show(pkt_scrollw);
+ gtk_paned_add1(GTK_PANED(u_pane), pkt_scrollw);
+
+ packet_list = gtk_clist_new_with_titles(cf.cinfo.num_cols, cf.cinfo.col_title);
gtk_container_add(GTK_CONTAINER(pkt_scrollw), packet_list);
+ gtk_clist_column_titles_passive(GTK_CLIST(packet_list));
+ set_plist_sel_browse(prefs->gui_plist_sel_browse);
pl_style = gtk_style_new();
gdk_font_unref(pl_style->font);
pl_style->font = m_r_font;
@@ -1238,7 +1269,6 @@ main(int argc, char *argv[])
pl_style->font);
}
gtk_widget_set_usize(packet_list, -1, pl_size);
- gtk_paned_add1(GTK_PANED(u_pane), pkt_scrollw);
gtk_widget_show(packet_list);
/* Tree view */
@@ -1249,15 +1279,15 @@ main(int argc, char *argv[])
gtk_widget_set_usize(tv_scrollw, -1, tv_size);
gtk_widget_show(tv_scrollw);
- tree_view = gtk_tree_new();
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(tv_scrollw), tree_view);
- gtk_tree_set_selection_mode(GTK_TREE(tree_view), GTK_SELECTION_SINGLE);
-
- gtk_tree_set_view_lines(GTK_TREE(tree_view), FALSE);
- gtk_tree_set_view_mode(GTK_TREE(tree_view), GTK_TREE_VIEW_ITEM);
-
- gtk_signal_connect(GTK_OBJECT(tree_view), "selection_changed",
- GTK_SIGNAL_FUNC(tree_view_cb), NULL);
+ tree_view = gtk_ctree_new(1, 0);
+ gtk_container_add(GTK_CONTAINER(tv_scrollw), tree_view);
+ gtk_ctree_set_line_style(GTK_CTREE(tree_view), GTK_CTREE_LINES_NONE);
+ gtk_ctree_set_expander_style(GTK_CTREE(tree_view), GTK_CTREE_EXPANDER_SQUARE);
+ set_ptree_sel_browse(prefs->gui_ptree_sel_browse);
+ gtk_signal_connect(GTK_OBJECT(tree_view), "tree-select-row",
+ 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_widget_show(tree_view);
item_style = gtk_style_new();
diff --git a/gtk/proto_draw.c b/gtk/proto_draw.c
index f68399d2cb..26f3ab25fd 100644
--- a/gtk/proto_draw.c
+++ b/gtk/proto_draw.c
@@ -1,7 +1,7 @@
/* gtkpacket.c
* Routines for GTK+ packet display
*
- * $Id: proto_draw.c,v 1.11 1999/12/15 07:03:11 gram Exp $
+ * $Id: proto_draw.c,v 1.12 1999/12/29 20:10:12 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -161,8 +161,9 @@ void expand_all_tree(proto_tree *protocol_tree, GtkWidget *tree_view) {
for(i=0; i < num_tree_types; i++) {
tree_is_expanded[i] = TRUE;
}
- gtk_tree_clear_items(GTK_TREE(tree_view), 0, -1);
+ gtk_clist_clear ( GTK_CLIST(tree_view) );
proto_tree_draw(protocol_tree, tree_view);
+ gtk_ctree_expand_recursive(GTK_CTREE(tree_view), NULL);
}
void collapse_all_tree(proto_tree *protocol_tree, GtkWidget *tree_view) {
@@ -170,43 +171,73 @@ void collapse_all_tree(proto_tree *protocol_tree, GtkWidget *tree_view) {
for(i=0; i < num_tree_types; i++) {
tree_is_expanded[i] = FALSE;
}
- gtk_tree_clear_items(GTK_TREE(tree_view), 0, -1);
+ gtk_clist_clear ( GTK_CLIST(tree_view) );
proto_tree_draw(protocol_tree, tree_view);
}
static void
-expand_tree(GtkWidget *w, gpointer data) {
- gboolean *val = (gint *) data;
- *val = TRUE;
-}
+expand_tree(GtkCTree *ctree, GList *node, gpointer user_data)
+{
+ field_info *finfo;
+ gboolean *val;
-static void
-collapse_tree(GtkWidget *w, gpointer data) {
- gboolean *val = (gint *) data;
- *val = FALSE;
+ finfo = gtk_ctree_node_get_row_data( ctree, GTK_CTREE_NODE(node) );
+ g_assert(finfo);
+
+ val = &tree_is_expanded[finfo->tree_type];
+ *val = TRUE;
}
static void
-set_item_style(GtkWidget *widget, gpointer dummy)
+collapse_tree(GtkCTree *ctree, GList *node, gpointer user_data)
{
- gtk_widget_set_style(widget, item_style);
+ field_info *finfo;
+ gboolean *val;
+
+ finfo = gtk_ctree_node_get_row_data( ctree, GTK_CTREE_NODE(node) );
+ g_assert(finfo);
+
+ val = &tree_is_expanded[finfo->tree_type];
+ *val = FALSE;
}
+struct proto_tree_draw_info {
+ GtkCTree *ctree;
+ GtkCTreeNode *ctree_node;
+};
+
void
proto_tree_draw(proto_tree *protocol_tree, GtkWidget *tree_view)
{
+ struct proto_tree_draw_info info;
+
+ info.ctree = GTK_CTREE(tree_view);
+ info.ctree_node = NULL;
+
+ gtk_clist_freeze ( GTK_CLIST(tree_view) );
+
g_node_children_foreach((GNode*) protocol_tree, G_TRAVERSE_ALL,
- proto_tree_draw_node, tree_view);
+ proto_tree_draw_node, &info);
+
+ gtk_signal_connect( GTK_OBJECT(info.ctree), "tree-expand",
+ (GtkSignalFunc) expand_tree, NULL );
+ gtk_signal_connect( GTK_OBJECT(info.ctree), "tree-collapse",
+ (GtkSignalFunc) collapse_tree, NULL );
+
+ gtk_clist_thaw ( GTK_CLIST(tree_view) );
}
static void
proto_tree_draw_node(GNode *node, gpointer data)
{
- GtkWidget *tree_view = (GtkWidget*) data;
+ struct proto_tree_draw_info info;
+ struct proto_tree_draw_info *parent_info = (struct proto_tree_draw_info*) data;
+
field_info *fi = (field_info*) (node->data);
- GtkWidget *ti, *subtree;
gchar label_str[ITEM_LABEL_LENGTH];
gchar *label_ptr;
+ GtkCTreeNode *parent;
+ gboolean is_leaf, is_expanded;
if (!fi->visible)
return;
@@ -219,25 +250,32 @@ proto_tree_draw_node(GNode *node, gpointer data)
label_ptr = label_str;
proto_item_fill_label(fi, label_str);
}
-
- ti = gtk_tree_item_new_with_label(label_ptr);
- gtk_container_foreach(GTK_CONTAINER(ti), set_item_style, NULL);
-
- gtk_object_set_data(GTK_OBJECT(ti), E_TREEINFO_FIELD_INFO_KEY, (gpointer) fi);
- gtk_tree_append(GTK_TREE(tree_view), ti);
- gtk_widget_show(ti);
if (g_node_n_children(node) > 0) {
- subtree = gtk_tree_new();
- gtk_tree_item_set_subtree(GTK_TREE_ITEM(ti), GTK_WIDGET(subtree));
- if (tree_is_expanded[fi->tree_type])
- gtk_tree_item_expand(GTK_TREE_ITEM(ti));
- gtk_signal_connect(GTK_OBJECT(ti), "expand", (GtkSignalFunc) expand_tree,
- (gpointer) &tree_is_expanded[fi->tree_type]);
- gtk_signal_connect(GTK_OBJECT(ti), "collapse", (GtkSignalFunc) collapse_tree,
- (gpointer) &tree_is_expanded[fi->tree_type]);
+ is_leaf = FALSE;
+ if (tree_is_expanded[fi->tree_type]) {
+ is_expanded = TRUE;
+ }
+ else {
+ is_expanded = FALSE;
+ }
+ }
+ else {
+ is_leaf = TRUE;
+ is_expanded = FALSE;
+ }
+
+ info.ctree = parent_info->ctree;
+ parent = gtk_ctree_insert_node ( info.ctree, parent_info->ctree_node, NULL,
+ &label_ptr, 5, NULL, NULL, NULL, NULL,
+ is_leaf, is_expanded );
+
+ gtk_ctree_node_set_row_data( GTK_CTREE(info.ctree), parent, fi );
+ gtk_ctree_node_set_row_style( GTK_CTREE(info.ctree), parent, item_style);
+ if (!is_leaf) {
+ info.ctree_node = parent;
g_node_children_foreach(node, G_TRAVERSE_ALL,
- proto_tree_draw_node, subtree);
+ proto_tree_draw_node, &info);
}
}
diff --git a/prefs.c b/prefs.c
index 81d79c1254..40b46385c3 100644
--- a/prefs.c
+++ b/prefs.c
@@ -1,7 +1,7 @@
/* prefs.c
* Routines for handling preferences
*
- * $Id: prefs.c,v 1.26 1999/12/29 05:53:41 guy Exp $
+ * $Id: prefs.c,v 1.27 1999/12/29 20:09:46 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -187,6 +187,8 @@ read_prefs(char **pf_path_return) {
prefs.st_server_bg.green = 65535;
prefs.st_server_bg.blue = 65535;
prefs.gui_scrollbar_on_right = TRUE;
+ prefs.gui_plist_sel_browse = FALSE;
+ prefs.gui_ptree_sel_browse = FALSE;
}
if (! pf_path) {
@@ -301,6 +303,8 @@ read_prefs(char **pf_path_return) {
#define PRS_STREAM_SR_FG "stream.server.fg"
#define PRS_STREAM_SR_BG "stream.server.bg"
#define PRS_GUI_SCROLLBAR_ON_RIGHT "gui.scrollbar_on_right"
+#define PRS_GUI_PLIST_SEL_BROWSE "gui.packet_list_sel_browse"
+#define PRS_GUI_PTREE_SEL_BROWSE "gui.protocol_tree_sel_browse"
#define RED_COMPONENT(x) ((((x) >> 16) & 0xff) * 65535 / 255)
#define GREEN_COMPONENT(x) ((((x) >> 8) & 0xff) * 65535 / 255)
@@ -392,6 +396,20 @@ set_pref(gchar *pref, gchar *value) {
else {
prefs.gui_scrollbar_on_right = FALSE;
}
+ } else if (strcmp(pref, PRS_GUI_PLIST_SEL_BROWSE) == 0) {
+ if (strcmp(value, "TRUE") == 0) {
+ prefs.gui_plist_sel_browse = TRUE;
+ }
+ else {
+ prefs.gui_plist_sel_browse = FALSE;
+ }
+ } else if (strcmp(pref, PRS_GUI_PTREE_SEL_BROWSE) == 0) {
+ if (strcmp(value, "TRUE") == 0) {
+ prefs.gui_ptree_sel_browse = TRUE;
+ }
+ else {
+ prefs.gui_ptree_sel_browse = FALSE;
+ }
} else {
return 0;
@@ -480,5 +498,12 @@ write_prefs(void) {
fprintf(pf, PRS_GUI_SCROLLBAR_ON_RIGHT ": %s\n",
prefs.gui_scrollbar_on_right == TRUE ? "TRUE" : "FALSE");
+ fprintf(pf, "\n# Packet-list selection bar can be used to browse w/o selecting? TRUE/FALSE\n");
+ fprintf(pf, PRS_GUI_PLIST_SEL_BROWSE ": %s\n",
+ prefs.gui_plist_sel_browse == TRUE ? "TRUE" : "FALSE");
+
+ fprintf(pf, "\n# Protocol-tree selection bar can be used to browse w/o selecting? TRUE/FALSE\n");
+ fprintf(pf, PRS_GUI_PTREE_SEL_BROWSE ": %s\n",
+ prefs.gui_ptree_sel_browse == TRUE ? "TRUE" : "FALSE");
fclose(pf);
}
diff --git a/prefs.h b/prefs.h
index db22822cdb..b61d275d1e 100644
--- a/prefs.h
+++ b/prefs.h
@@ -1,7 +1,7 @@
/* prefs.h
* Definitions for preference handling routines
*
- * $Id: prefs.h,v 1.11 1999/12/16 06:19:50 gram Exp $
+ * $Id: prefs.h,v 1.12 1999/12/29 20:09:47 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -45,6 +45,8 @@ typedef struct _e_prefs {
gint num_cols;
GdkColor st_client_fg, st_client_bg, st_server_fg, st_server_bg;
gboolean gui_scrollbar_on_right;
+ gboolean gui_plist_sel_browse;
+ gboolean gui_ptree_sel_browse;
} e_prefs;
extern e_prefs prefs;