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
This commit is contained in:
Gilbert Ramirez 1999-12-29 20:10:12 +00:00
parent dcd0869b37
commit 8162d65615
8 changed files with 276 additions and 111 deletions

View File

@ -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

32
file.c
View File

@ -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);

View File

@ -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

View File

@ -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);
}

View File

@ -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) {
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;
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);
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;
}
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();

View File

@ -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;
}
static void
collapse_tree(GtkWidget *w, gpointer data) {
gboolean *val = (gint *) data;
*val = FALSE;
}
static void
set_item_style(GtkWidget *widget, gpointer dummy)
expand_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 = TRUE;
}
static void
collapse_tree(GtkCTree *ctree, GList *node, gpointer user_data)
{
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);
}
}

27
prefs.c
View File

@ -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);
}

View File

@ -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;