From 414b63170028ad66ca68cd7e8652d79cc410ffbf Mon Sep 17 00:00:00 2001 From: Ulf Lamping Date: Thu, 29 Apr 2004 17:03:27 +0000 Subject: [PATCH] added selection of different main window pane layouts, also added some preferences and a new preference page for this svn path=/trunk/; revision=10729 --- gtk/Makefile.am | 3 +- gtk/Makefile.common | 3 +- gtk/layout_prefs.c | 385 ++++++++++++++++++++++++++++++++++++++++++++ gtk/layout_prefs.h | 51 ++++++ gtk/main.c | 172 ++++++++++++++------ gtk/prefs_dlg.c | 37 ++++- prefs.c | 43 ++++- prefs.h | 6 +- 8 files changed, 646 insertions(+), 54 deletions(-) create mode 100644 gtk/layout_prefs.c create mode 100644 gtk/layout_prefs.h diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 8713dc02fa..f3b6f8f628 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -1,7 +1,7 @@ # Makefile.am # Automake file for the GTK interface routines for Ethereal # -# $Id: Makefile.am,v 1.95 2004/04/23 02:00:13 gerald Exp $ +# $Id: Makefile.am,v 1.96 2004/04/29 17:03:27 ulfl Exp $ # # Ethereal - Network traffic analyzer # By Gerald Combs @@ -59,6 +59,7 @@ noinst_HEADERS = \ help_dlg.h \ hostlist_table.h \ keys.h \ + layout_prefs.h \ main.h \ menu.h \ mtp3_stat.h \ diff --git a/gtk/Makefile.common b/gtk/Makefile.common index a1e1a4b68e..1d57d131a2 100644 --- a/gtk/Makefile.common +++ b/gtk/Makefile.common @@ -3,7 +3,7 @@ # a) common to both files and # b) portable between both files # -# $Id: Makefile.common,v 1.11 2004/04/22 21:29:34 ulfl Exp $ +# $Id: Makefile.common,v 1.12 2004/04/29 17:03:27 ulfl Exp $ # # Ethereal - Network traffic analyzer # By Gerald Combs @@ -52,6 +52,7 @@ ETHEREAL_GTK_SRC = \ gui_prefs.c \ help_dlg.c \ hostlist_table.c \ + layout_prefs.c \ main.c \ menu.c \ nameres_prefs.c \ diff --git a/gtk/layout_prefs.c b/gtk/layout_prefs.c new file mode 100644 index 0000000000..2c32b76c0c --- /dev/null +++ b/gtk/layout_prefs.c @@ -0,0 +1,385 @@ +/* layout_prefs.c + * Dialog box for layout preferences + * + * $Id: layout_prefs.c,v 1.1 2004/04/29 17:03:27 ulfl Exp $ + * + * Ethereal - Network traffic analyzer + * By Gerald Combs + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "globals.h" +#include "layout_prefs.h" +#include "gtkglobals.h" +/*#include */ +#include "prefs.h" +/*#include "prefs_dlg.h"*/ +/*#include "ui_util.h"*/ +#include "main.h" +#include "compat_macros.h" +/*#include "dlg_utils.h"*/ + +#include "../image/icon_layout_1.xpm" +#include "../image/icon_layout_2.xpm" +#include "../image/icon_layout_3.xpm" +#include "../image/icon_layout_4.xpm" +#include "../image/icon_layout_5.xpm" +#include "../image/icon_layout_6.xpm" + +#define LAYOUT_QTY 6 + + +static void layout_validate_cb(GtkWidget *w _U_, gpointer data); + + + +typedef struct { + layout_type_e type; + layout_pane_content_e content[3]; +} layout_t; + + +#define LAYOUT_TYPE_BUTTONS_KEY "layout_type_buttons" + +#define LAYOUT_NONE_RB_KEY "layout_none_radio_button" +#define LAYOUT_PLIST_RB_KEY "layout_plist_radio_button" +#define LAYOUT_PDETAILS_RB_KEY "layout_pdetails_radio_button" +#define LAYOUT_PBYTES_RB_KEY "layout_pbytes_radio_button" + +#define LAYOUT_CONTENT1_VB_KEY "layout_content1_vbox" +#define LAYOUT_CONTENT2_VB_KEY "layout_content2_vbox" +#define LAYOUT_CONTENT3_VB_KEY "layout_content3_vbox" + + +/* be sure to use a parent widget which is already being displayed */ +static GtkWidget *xpm_to_widget(GtkWidget *parent, const char ** xpm) { +#if GTK_MAJOR_VERSION < 2 + GdkPixmap *icon; + GdkBitmap * mask; + + + icon = gdk_pixmap_create_from_xpm_d(parent->window, &mask, &parent->style->white, (char **) xpm); + return gtk_pixmap_new(icon, mask); +#else + GdkPixbuf * pixbuf; + GdkPixmap * pixmap; + GdkBitmap * bitmap; + + + pixbuf = gdk_pixbuf_new_from_xpm_data(xpm); + gdk_pixbuf_render_pixmap_and_mask_for_colormap (pixbuf, gtk_widget_get_colormap(parent), &pixmap, &bitmap, 128); + + return gtk_image_new_from_pixmap (pixmap, bitmap); +#endif +} + + +static GtkWidget *layout_content_radio_vbox(GtkWidget *main_vb, GtkTooltips *tooltips, int i, layout_pane_content_e content) { + GtkWidget *radio_vb, *radio_lb; + GtkWidget *radio_none_rb, *radio_plist_rb, *radio_pdetails_rb, *radio_pbytes_rb; + char buf[64]; + + + /* radio vbox */ + radio_vb = gtk_vbox_new(FALSE, 0); + gtk_container_set_border_width(GTK_CONTAINER(radio_vb), 6); + + g_snprintf (buf, sizeof(buf), "Pane %d:", i); + radio_lb = gtk_label_new(buf); + gtk_misc_set_alignment(GTK_MISC(radio_lb), 0.0, 0.5); + gtk_container_add(GTK_CONTAINER(radio_vb), radio_lb); + + radio_none_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(NULL, "None", NULL); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(radio_none_rb), content == layout_pane_content_none); + gtk_tooltips_set_tip (tooltips, radio_none_rb, "Put nothing in this pane.", NULL); + gtk_container_add(GTK_CONTAINER(radio_vb), radio_none_rb); + + radio_plist_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(radio_none_rb, "Packet List", NULL); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(radio_plist_rb), content == layout_pane_content_plist); + gtk_tooltips_set_tip (tooltips, radio_plist_rb, "Put the packet list in this pane.", NULL); + gtk_container_add(GTK_CONTAINER(radio_vb), radio_plist_rb); + + radio_pdetails_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(radio_none_rb, "Packet Details", NULL); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(radio_pdetails_rb), content == layout_pane_content_pdetails); + gtk_tooltips_set_tip (tooltips, radio_pdetails_rb, "Put the packet details tree in this pane.", NULL); + gtk_container_add(GTK_CONTAINER(radio_vb), radio_pdetails_rb); + + radio_pbytes_rb = RADIO_BUTTON_NEW_WITH_MNEMONIC(radio_none_rb, "Packet Bytes", NULL); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(radio_pbytes_rb), content == layout_pane_content_pbytes); + gtk_tooltips_set_tip (tooltips, radio_pbytes_rb, "Put the packet bytes hexdump in this pane.", NULL); + gtk_container_add(GTK_CONTAINER(radio_vb), radio_pbytes_rb); + + OBJECT_SET_DATA(radio_vb, LAYOUT_NONE_RB_KEY, radio_none_rb); + OBJECT_SET_DATA(radio_vb, LAYOUT_PLIST_RB_KEY, radio_plist_rb); + OBJECT_SET_DATA(radio_vb, LAYOUT_PDETAILS_RB_KEY, radio_pdetails_rb); + OBJECT_SET_DATA(radio_vb, LAYOUT_PBYTES_RB_KEY, radio_pbytes_rb); + + SIGNAL_CONNECT(radio_none_rb, "toggled", layout_validate_cb, main_vb); + SIGNAL_CONNECT(radio_plist_rb, "toggled", layout_validate_cb, main_vb); + SIGNAL_CONNECT(radio_pdetails_rb, "toggled", layout_validate_cb, main_vb); + SIGNAL_CONNECT(radio_pbytes_rb, "toggled", layout_validate_cb, main_vb); + + return radio_vb; +} + +static void +layout_type_changed_cb (GtkToggleButton * togglebutton, gpointer user_data) +{ + GtkWidget ** layout_type_buttons = (GtkWidget**) user_data; + static gboolean dampen_feedback_loop = FALSE; + + if (!dampen_feedback_loop) { + int i; + dampen_feedback_loop = TRUE; + for (i=0; itype - 1]), TRUE); + + radio_vb = OBJECT_GET_DATA(main_vb, LAYOUT_CONTENT1_VB_KEY); + layout_pane_set_content(radio_vb, layout->content[0]); + radio_vb = OBJECT_GET_DATA(main_vb, LAYOUT_CONTENT2_VB_KEY); + layout_pane_set_content(radio_vb, layout->content[1]); + radio_vb = OBJECT_GET_DATA(main_vb, LAYOUT_CONTENT3_VB_KEY); + layout_pane_set_content(radio_vb, layout->content[2]); +} + +static void layout_get(GtkWidget * main_vb, layout_t *layout_out) { + GtkWidget *radio_vb; + GtkWidget ** layout_type_buttons = OBJECT_GET_DATA(main_vb, LAYOUT_TYPE_BUTTONS_KEY); + int i; + + for (i=0; itype = i + 1; + break; + } + } + + radio_vb = OBJECT_GET_DATA(main_vb, LAYOUT_CONTENT1_VB_KEY); + layout_out->content[0] = layout_pane_get_content(radio_vb); + radio_vb = OBJECT_GET_DATA(main_vb, LAYOUT_CONTENT2_VB_KEY); + layout_out->content[1] = layout_pane_get_content(radio_vb); + radio_vb = OBJECT_GET_DATA(main_vb, LAYOUT_CONTENT3_VB_KEY); + layout_out->content[2] = layout_pane_get_content(radio_vb); +} + +static void layout_validate(layout_t *layout) { + + if(layout->content[1] == layout->content[0]) { + layout->content[1] = layout_pane_content_none; + } + if(layout->content[2] == layout->content[0] || layout->content[2] == layout->content[1]) { + layout->content[2] = layout_pane_content_none; + } +} + + +static void layout_validate_cb(GtkWidget *w _U_, gpointer data) { + layout_t layout; + + layout_get(data, &layout); + layout_validate(&layout); + layout_set(data, &layout); +} + +static void +layout_defaults_cb (GtkWidget * w _U_, gpointer data _U_) +{ + layout_t default_layout = { + layout_type_5, + layout_pane_content_plist, + layout_pane_content_pdetails, + layout_pane_content_pbytes + }; + + layout_set(data, &default_layout); +} + + +GtkWidget* +layout_prefs_show(void) +{ +#if GTK_MAJOR_VERSION < 2 + GtkAccelGroup *accel_group; +#endif + GtkTooltips *tooltips; + + GtkWidget *main_vb, *button_hb, *type_tb; + GtkWidget *radio_hb, *radio_vb; + GtkWidget *default_vb, *default_bt; + + const guint8 ** inline_txt [LAYOUT_QTY] = { + icon_layout_5_xpm, icon_layout_2_xpm, icon_layout_1_xpm, + icon_layout_4_xpm, icon_layout_3_xpm, icon_layout_6_xpm }; + GtkWidget ** layout_type_buttons = g_malloc (sizeof(GtkWidget*) * LAYOUT_QTY); + + int i; + + + /* main vertical box */ + main_vb = gtk_vbox_new(FALSE, 7); + gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5); + +#if GTK_MAJOR_VERSION < 2 + /* Accelerator group for the accelerators (or, as they're called in + Windows and, I think, in Motif, "mnemonics"; Alt+ is a mnemonic, + Ctrl+ is an accelerator). */ + accel_group = gtk_accel_group_new(); + /*gtk_window_add_accel_group(GTK_WINDOW(main_win), accel_group);*/ +#endif + + /* Enable tooltips */ + tooltips = gtk_tooltips_new(); + + + /* button hbox */ + button_hb = gtk_hbox_new(FALSE, 0); + gtk_container_set_border_width(GTK_CONTAINER(button_hb), 6); + gtk_box_pack_start (GTK_BOX(main_vb), button_hb, FALSE, FALSE, 0); + + /* pane layout */ + for (i=0; i + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __LAYOUT_PREFS_H__ +#define __LAYOUT_PREFS_H__ + +typedef enum { + layout_unused, /* entry currently unused */ + layout_type_5, + layout_type_2, + layout_type_1, + layout_type_4, + layout_type_3, + layout_type_6 +} layout_type_e; + +typedef enum { + layout_pane_content_none, + layout_pane_content_plist, + layout_pane_content_pdetails, + layout_pane_content_pbytes +} layout_pane_content_e; + + +GtkWidget *layout_prefs_show(void); +void layout_prefs_fetch(GtkWidget *w); +void layout_prefs_apply(GtkWidget *w); +void layout_prefs_destroy(GtkWidget *w); + +#endif diff --git a/gtk/main.c b/gtk/main.c index 41cb3bb8a4..3cb0eecb51 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1,6 +1,6 @@ /* main.c * - * $Id: main.c,v 1.426 2004/04/27 19:16:11 ulfl Exp $ + * $Id: main.c,v 1.427 2004/04/29 17:03:27 ulfl Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -89,6 +89,7 @@ #include "color_filters.h" #include "color_utils.h" #include "filter_prefs.h" +#include "layout_prefs.h" #include "file_dlg.h" #include "column.h" #include "print.h" @@ -131,7 +132,8 @@ capture_file cfile; GtkWidget *main_display_filter_widget=NULL; GtkWidget *top_level = NULL, *tree_view, *byte_nb_ptr, *tv_scrollw; -GtkWidget *main_upper_pane, *main_lower_pane; +GtkWidget *none_lb, *main_pane_v1, *main_pane_v2, *main_pane_h1, *main_pane_h2; +GtkWidget *main_first_pane, *main_second_pane; GtkWidget *status_pane; GtkWidget *menubar, *main_vbox, *main_tb, *pkt_scrollw, *stat_hbox, *filter_tb; static GtkWidget *info_bar; @@ -1287,12 +1289,13 @@ main_load_window_geometry(GtkWidget *widget } } + /* XXX - rename recent settings? */ if (recent.gui_geometry_main_upper_pane) - gtk_paned_set_position(GTK_PANED(main_upper_pane), recent.gui_geometry_main_upper_pane); + gtk_paned_set_position(GTK_PANED(main_first_pane), recent.gui_geometry_main_upper_pane); if (recent.gui_geometry_main_lower_pane) - gtk_paned_set_position(GTK_PANED(main_lower_pane), recent.gui_geometry_main_lower_pane); + gtk_paned_set_position(GTK_PANED(main_second_pane), recent.gui_geometry_main_lower_pane); if (recent.gui_geometry_status_pane) - gtk_paned_set_position(GTK_PANED(status_pane), recent.gui_geometry_status_pane); + gtk_paned_set_position(GTK_PANED(status_pane), recent.gui_geometry_status_pane); #endif } @@ -1348,8 +1351,8 @@ main_save_window_geometry(GtkWidget *widget) recent.gui_geometry_main_maximized = (state == GDK_WINDOW_STATE_MAXIMIZED); } - recent.gui_geometry_main_upper_pane = gtk_paned_get_position(GTK_PANED(main_upper_pane)); - recent.gui_geometry_main_lower_pane = gtk_paned_get_position(GTK_PANED(main_lower_pane)); + recent.gui_geometry_main_upper_pane = gtk_paned_get_position(GTK_PANED(main_first_pane)); + recent.gui_geometry_main_lower_pane = gtk_paned_get_position(GTK_PANED(main_second_pane)); recent.gui_geometry_status_pane = gtk_paned_get_position(GTK_PANED(status_pane)); #endif } @@ -3524,12 +3527,34 @@ void foreach_remove_a_child(GtkWidget *widget, gpointer data) { gtk_container_remove(GTK_CONTAINER(data), widget); } +GtkWidget *main_widget_layout(gint layout_content) +{ + switch(layout_content) { + case(layout_pane_content_none): + return none_lb; + break; + case(layout_pane_content_plist): + return pkt_scrollw; + break; + case(layout_pane_content_pdetails): + return tv_scrollw; + break; + case(layout_pane_content_pbytes): + return byte_nb_ptr; + break; + default: + g_assert_not_reached(); + return NULL; + } +} + + /* * Rearrange the main window widgets */ void main_widgets_rearrange(void) { gint widgets = 0; - GtkWidget *w[10]; + GtkWidget *pane_content[3]; gboolean filter_toolbar_show_in_statusbar = prefs.filter_toolbar_show_in_statusbar; /* be a bit faster */ @@ -3542,19 +3567,24 @@ void main_widgets_rearrange(void) { gtk_widget_ref(pkt_scrollw); gtk_widget_ref(tv_scrollw); gtk_widget_ref(byte_nb_ptr); - gtk_widget_ref(main_upper_pane); - gtk_widget_ref(main_lower_pane); gtk_widget_ref(stat_hbox); gtk_widget_ref(info_bar); gtk_widget_ref(packets_bar); gtk_widget_ref(status_pane); + gtk_widget_ref(none_lb); + gtk_widget_ref(main_pane_v1); + gtk_widget_ref(main_pane_v2); + gtk_widget_ref(main_pane_h1); + gtk_widget_ref(main_pane_h2); /* empty all containers participating */ - gtk_container_foreach(GTK_CONTAINER(main_vbox), foreach_remove_a_child, main_vbox); - gtk_container_foreach(GTK_CONTAINER(main_upper_pane), foreach_remove_a_child, main_upper_pane); - gtk_container_foreach(GTK_CONTAINER(main_lower_pane), foreach_remove_a_child, main_lower_pane); + gtk_container_foreach(GTK_CONTAINER(main_vbox), foreach_remove_a_child, main_vbox); gtk_container_foreach(GTK_CONTAINER(stat_hbox), foreach_remove_a_child, stat_hbox); - gtk_container_foreach(GTK_CONTAINER(status_pane), foreach_remove_a_child, status_pane); + gtk_container_foreach(GTK_CONTAINER(status_pane), foreach_remove_a_child, status_pane); + gtk_container_foreach(GTK_CONTAINER(main_pane_v1), foreach_remove_a_child, main_pane_v1); + gtk_container_foreach(GTK_CONTAINER(main_pane_v2), foreach_remove_a_child, main_pane_v2); + gtk_container_foreach(GTK_CONTAINER(main_pane_h1), foreach_remove_a_child, main_pane_h1); + gtk_container_foreach(GTK_CONTAINER(main_pane_h2), foreach_remove_a_child, main_pane_h2); /* add the menubar always at the top */ gtk_box_pack_start(GTK_BOX(main_vbox), menubar, FALSE, TRUE, 0); @@ -3569,39 +3599,85 @@ void main_widgets_rearrange(void) { gtk_box_pack_start(GTK_BOX(main_vbox), filter_tb, FALSE, TRUE, 1); } - /* get the info, which and how many of the main widgets should be shown */ + /* get the corresponding widgets to the content setting */ + pane_content[0] = main_widget_layout(prefs.gui_layout_content_1); + pane_content[1] = main_widget_layout(prefs.gui_layout_content_2); + pane_content[2] = main_widget_layout(prefs.gui_layout_content_3); + + /* fill the main layout panes */ + switch(prefs.gui_layout_type) { + case(layout_type_5): + main_first_pane = main_pane_v1; + main_second_pane = main_pane_v2; + gtk_paned_add1(GTK_PANED(main_first_pane), pane_content[0]); + gtk_paned_add2(GTK_PANED(main_first_pane), main_second_pane); + gtk_paned_pack1(GTK_PANED(main_second_pane), pane_content[1], TRUE, TRUE); + gtk_paned_pack2(GTK_PANED(main_second_pane), pane_content[2], FALSE, FALSE); + break; + case(layout_type_2): + main_first_pane = main_pane_v1; + main_second_pane = main_pane_h1; + gtk_paned_add1(GTK_PANED(main_first_pane), pane_content[0]); + gtk_paned_add2(GTK_PANED(main_first_pane), main_second_pane); + gtk_paned_pack1(GTK_PANED(main_second_pane), pane_content[1], TRUE, TRUE); + gtk_paned_pack2(GTK_PANED(main_second_pane), pane_content[2], FALSE, FALSE); + break; + case(layout_type_1): + main_first_pane = main_pane_v1; + main_second_pane = main_pane_h1; + gtk_paned_add1(GTK_PANED(main_first_pane), main_second_pane); + gtk_paned_add2(GTK_PANED(main_first_pane), pane_content[2]); + gtk_paned_pack1(GTK_PANED(main_second_pane), pane_content[0], TRUE, TRUE); + gtk_paned_pack2(GTK_PANED(main_second_pane), pane_content[1], FALSE, FALSE); + break; + case(layout_type_4): + main_first_pane = main_pane_h1; + main_second_pane = main_pane_v1; + gtk_paned_add1(GTK_PANED(main_first_pane), pane_content[0]); + gtk_paned_add2(GTK_PANED(main_first_pane), main_second_pane); + gtk_paned_pack1(GTK_PANED(main_second_pane), pane_content[1], TRUE, TRUE); + gtk_paned_pack2(GTK_PANED(main_second_pane), pane_content[2], FALSE, FALSE); + break; + case(layout_type_3): + main_first_pane = main_pane_h1; + main_second_pane = main_pane_v1; + gtk_paned_add1(GTK_PANED(main_first_pane), main_second_pane); + gtk_paned_add2(GTK_PANED(main_first_pane), pane_content[2]); + gtk_paned_pack1(GTK_PANED(main_second_pane), pane_content[0], TRUE, TRUE); + gtk_paned_pack2(GTK_PANED(main_second_pane), pane_content[1], FALSE, FALSE); + break; + case(layout_type_6): + main_first_pane = main_pane_h1; + main_second_pane = main_pane_h2; + gtk_paned_add1(GTK_PANED(main_first_pane), pane_content[0]); + gtk_paned_add2(GTK_PANED(main_first_pane), main_second_pane); + gtk_paned_pack1(GTK_PANED(main_second_pane), pane_content[1], TRUE, TRUE); + gtk_paned_pack2(GTK_PANED(main_second_pane), pane_content[2], FALSE, FALSE); + break; + default: + g_assert_not_reached(); + } + + gtk_container_add(GTK_CONTAINER(main_vbox), main_first_pane); + + /* hide widgets on users recent settings */ + /* XXX - do we still need this? */ if (recent.packet_list_show) { - w[widgets++] = pkt_scrollw; + gtk_widget_show(pkt_scrollw); + } else { + gtk_widget_hide(pkt_scrollw); } if (recent.tree_view_show) { - w[widgets++] = tv_scrollw; + gtk_widget_show(tv_scrollw); + } else { + gtk_widget_hide(tv_scrollw); } if (recent.byte_view_show) { - w[widgets++] = byte_nb_ptr; - } - - /* show the main widgets, depending on their number */ - switch(widgets) { - case(0): - break; - case(1): - gtk_container_add(GTK_CONTAINER(main_vbox), w[0]); - break; - case(2): - gtk_container_add(GTK_CONTAINER(main_vbox), main_upper_pane); - gtk_paned_pack1(GTK_PANED(main_upper_pane), w[0], TRUE, TRUE); - gtk_paned_pack2(GTK_PANED(main_upper_pane), w[1], FALSE, FALSE); - break; - case(3): - gtk_container_add(GTK_CONTAINER(main_vbox), main_upper_pane); - gtk_paned_add1(GTK_PANED(main_upper_pane), w[0]); - gtk_paned_add2(GTK_PANED(main_upper_pane), main_lower_pane); - - gtk_paned_pack1(GTK_PANED(main_lower_pane), w[1], TRUE, TRUE); - gtk_paned_pack2(GTK_PANED(main_lower_pane), w[2], FALSE, FALSE); - break; + gtk_widget_show(byte_nb_ptr); + } else { + gtk_widget_hide(byte_nb_ptr); } /* statusbar hbox */ @@ -3624,6 +3700,7 @@ void main_widgets_rearrange(void) { gtk_widget_show(main_vbox); } + static void create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs) { @@ -3712,13 +3789,16 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs) /* Panes for the packet list, tree, and byte view */ - main_lower_pane = gtk_vpaned_new(); - gtk_paned_gutter_size(GTK_PANED(main_lower_pane), (GTK_PANED(main_lower_pane))->handle_size); - gtk_widget_show(main_lower_pane); + none_lb = gtk_label_new("None"); - main_upper_pane = gtk_vpaned_new(); - gtk_paned_gutter_size(GTK_PANED(main_upper_pane), (GTK_PANED(main_upper_pane))->handle_size); - gtk_widget_show(main_upper_pane); + main_pane_v1 = gtk_vpaned_new(); + gtk_widget_show(main_pane_v1); + main_pane_v2 = gtk_vpaned_new(); + gtk_widget_show(main_pane_v2); + main_pane_h1 = gtk_hpaned_new(); + gtk_widget_show(main_pane_h1); + main_pane_h2 = gtk_hpaned_new(); + gtk_widget_show(main_pane_h2); /* filter toolbar */ #if GTK_MAJOR_VERSION < 2 diff --git a/gtk/prefs_dlg.c b/gtk/prefs_dlg.c index 2d2957d473..67bd3adb44 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.80 2004/03/13 15:15:25 ulfl Exp $ + * $Id: prefs_dlg.c,v 1.81 2004/04/29 17:03:27 ulfl Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -42,6 +42,7 @@ #include "print_prefs.h" #include "stream_prefs.h" #include "gui_prefs.h" +#include "layout_prefs.h" #include "capture_prefs.h" #include "nameres_prefs.h" #include "ui_util.h" @@ -71,6 +72,7 @@ static void prefs_tree_select_cb(GtkTreeSelection *, gpointer); #endif #define E_GUI_PAGE_KEY "gui_options_page" +#define E_GUI_LAYOUT_PAGE_KEY "gui_layout_page" #define E_GUI_COLUMN_PAGE_KEY "gui_column_options_page" #define E_GUI_FONT_PAGE_KEY "gui_font_options_page" #define E_GUI_STREAM_PAGE_KEY "gui_tcp_stream_options_page" @@ -338,7 +340,7 @@ prefs_cb(GtkWidget *w _U_, gpointer dummy _U_) { GtkWidget *top_hb, *bbox, *prefs_nb, *ct_sb, *frame, *ok_bt, *apply_bt, *save_bt, *cancel_bt; - GtkWidget *gui_pg, *gui_font_pg, *gui_column_pg, *gui_stream_pg; + GtkWidget *gui_pg, *gui_layout_pg, *gui_font_pg, *gui_column_pg, *gui_stream_pg; #ifdef HAVE_LIBPCAP GtkWidget *capture_pg; #endif @@ -465,6 +467,27 @@ prefs_cb(GtkWidget *w _U_, gpointer dummy _U_) #endif cts.page++; + /* GUI layout prefs */ + frame = gtk_frame_new("Layout"); + gtk_widget_show(GTK_WIDGET(frame)); + gui_layout_pg = layout_prefs_show(); + gtk_container_add(GTK_CONTAINER(frame), gui_layout_pg); + OBJECT_SET_DATA(prefs_w, E_GUI_LAYOUT_PAGE_KEY, gui_layout_pg); + gtk_notebook_append_page (GTK_NOTEBOOK(prefs_nb), frame, NULL); + strcpy(label_str, "Layout"); +#if GTK_MAJOR_VERSION < 2 + ct_node = gtk_ctree_insert_node(GTK_CTREE(cts.tree), ct_base_node, NULL, + &label_ptr, 5, NULL, NULL, NULL, NULL, TRUE, TRUE); + gtk_ctree_node_set_row_data(GTK_CTREE(cts.tree), ct_node, + GINT_TO_POINTER(cts.page)); +#else + gtk_tree_store_append(store, &iter, &base_iter); + gtk_tree_store_set(store, &iter, 0, label_str, 1, cts.page, -1); + /* expand the parent */ + gtk_tree_view_expand_all(GTK_TREE_VIEW(cts.tree)); +#endif + cts.page++; + /* GUI Column prefs */ frame = gtk_frame_new("Columns"); gtk_widget_show(GTK_WIDGET(frame)); @@ -481,8 +504,6 @@ prefs_cb(GtkWidget *w _U_, gpointer dummy _U_) #else gtk_tree_store_append(store, &iter, &base_iter); gtk_tree_store_set(store, &iter, 0, label_str, 1, cts.page, -1); - /* expand the parent */ - gtk_tree_view_expand_all(GTK_TREE_VIEW(cts.tree)); #endif cts.page++; @@ -1007,6 +1028,7 @@ prefs_main_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w) column_prefs_fetch(OBJECT_GET_DATA(parent_w, E_GUI_COLUMN_PAGE_KEY)); stream_prefs_fetch(OBJECT_GET_DATA(parent_w, E_GUI_STREAM_PAGE_KEY)); gui_prefs_fetch(OBJECT_GET_DATA(parent_w, E_GUI_PAGE_KEY)); + layout_prefs_fetch(OBJECT_GET_DATA(parent_w, E_GUI_LAYOUT_PAGE_KEY)); #ifdef HAVE_LIBPCAP #ifdef _WIN32 /* Is WPcap loaded? */ @@ -1025,6 +1047,7 @@ prefs_main_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w) column_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_COLUMN_PAGE_KEY)); stream_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_STREAM_PAGE_KEY)); gui_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_PAGE_KEY)); + layout_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_LAYOUT_PAGE_KEY)); #ifdef HAVE_LIBPCAP #ifdef _WIN32 /* Is WPcap loaded? */ @@ -1059,6 +1082,7 @@ prefs_main_apply_cb(GtkWidget *apply_bt _U_, gpointer parent_w) column_prefs_fetch(OBJECT_GET_DATA(parent_w, E_GUI_COLUMN_PAGE_KEY)); stream_prefs_fetch(OBJECT_GET_DATA(parent_w, E_GUI_STREAM_PAGE_KEY)); gui_prefs_fetch(OBJECT_GET_DATA(parent_w, E_GUI_PAGE_KEY)); + layout_prefs_fetch(OBJECT_GET_DATA(parent_w, E_GUI_LAYOUT_PAGE_KEY)); #ifdef HAVE_LIBPCAP #ifdef _WIN32 /* Is WPcap loaded? */ @@ -1077,6 +1101,7 @@ prefs_main_apply_cb(GtkWidget *apply_bt _U_, gpointer parent_w) column_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_COLUMN_PAGE_KEY)); stream_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_STREAM_PAGE_KEY)); gui_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_PAGE_KEY)); + layout_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_LAYOUT_PAGE_KEY)); #ifdef HAVE_LIBPCAP #ifdef _WIN32 /* Is WPcap loaded? */ @@ -1111,6 +1136,7 @@ prefs_main_save_cb(GtkWidget *save_bt _U_, gpointer parent_w) column_prefs_fetch(OBJECT_GET_DATA(parent_w, E_GUI_COLUMN_PAGE_KEY)); stream_prefs_fetch(OBJECT_GET_DATA(parent_w, E_GUI_STREAM_PAGE_KEY)); gui_prefs_fetch(OBJECT_GET_DATA(parent_w, E_GUI_PAGE_KEY)); + layout_prefs_fetch(OBJECT_GET_DATA(parent_w, E_GUI_LAYOUT_PAGE_KEY)); #ifdef HAVE_LIBPCAP #ifdef _WIN32 /* Is WPcap loaded? */ @@ -1160,6 +1186,7 @@ prefs_main_save_cb(GtkWidget *save_bt _U_, gpointer parent_w) column_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_COLUMN_PAGE_KEY)); stream_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_STREAM_PAGE_KEY)); gui_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_PAGE_KEY)); + layout_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_LAYOUT_PAGE_KEY)); #ifdef HAVE_LIBPCAP #ifdef _WIN32 /* Is WPcap loaded? */ @@ -1259,6 +1286,7 @@ prefs_main_cancel_cb(GtkWidget *cancel_bt _U_, gpointer parent_w) column_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_COLUMN_PAGE_KEY)); stream_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_STREAM_PAGE_KEY)); gui_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_PAGE_KEY)); + layout_prefs_apply(OBJECT_GET_DATA(parent_w, E_GUI_LAYOUT_PAGE_KEY)); nameres_prefs_apply(OBJECT_GET_DATA(parent_w, E_NAMERES_PAGE_KEY)); prefs_apply_all(); @@ -1289,6 +1317,7 @@ prefs_main_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_) column_prefs_destroy(OBJECT_GET_DATA(prefs_w, E_GUI_COLUMN_PAGE_KEY)); stream_prefs_destroy(OBJECT_GET_DATA(prefs_w, E_GUI_STREAM_PAGE_KEY)); gui_prefs_destroy(OBJECT_GET_DATA(prefs_w, E_GUI_PAGE_KEY)); + layout_prefs_destroy(OBJECT_GET_DATA(prefs_w, E_GUI_LAYOUT_PAGE_KEY)); #ifdef HAVE_LIBPCAP #ifdef _WIN32 /* Is WPcap loaded? */ diff --git a/prefs.c b/prefs.c index 2e265e5d16..3d5c777b00 100644 --- a/prefs.c +++ b/prefs.c @@ -1,7 +1,7 @@ /* prefs.c * Routines for handling preferences * - * $Id: prefs.c,v 1.128 2004/04/06 19:02:17 ulfl Exp $ + * $Id: prefs.c,v 1.129 2004/04/29 17:03:26 ulfl Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -95,6 +95,9 @@ static gchar *gui_fileopen_style_text[] = static gchar *gui_toolbar_style_text[] = { "ICONS", "TEXT", "BOTH", NULL }; +static gchar *gui_layout_content_text[] = + { "NONE", "PLIST", "PDETAILS", "PBYTES", NULL }; + /* * List of all modules with preference settings. */ @@ -990,6 +993,10 @@ read_prefs(int *gpf_errno_return, int *gpf_read_errno_return, prefs.gui_fileopen_style = FO_STYLE_LAST_OPENED; prefs.gui_recent_files_count_max = 10; prefs.gui_fileopen_dir = g_strdup(""); + prefs.gui_layout_type = 1; + prefs.gui_layout_content_1 = 0; + prefs.gui_layout_content_2 = 1; + prefs.gui_layout_content_3 = 2; /* set the default values for the capture dialog box */ prefs.capture_device = NULL; @@ -1293,6 +1300,10 @@ prefs_set_pref(char *prefarg) #define PRS_GUI_GEOMETRY_MAIN_HEIGHT "gui.geometry.main.height" #define PRS_GUI_TOOLBAR_MAIN_SHOW "gui.toolbar_main_show" #define PRS_GUI_TOOLBAR_MAIN_STYLE "gui.toolbar_main_style" +#define PRS_GUI_LAYOUT_TYPE "gui.layout_type" +#define PRS_GUI_LAYOUT_CONTENT_1 "gui.layout_content_1" +#define PRS_GUI_LAYOUT_CONTENT_2 "gui.layout_content_2" +#define PRS_GUI_LAYOUT_CONTENT_3 "gui.layout_content_3" /* * This applies to more than just captures, so it's not "capture.name_resolve"; @@ -1601,6 +1612,19 @@ set_pref(gchar *pref_name, gchar *value) prefs.gui_fileopen_dir = g_strdup(value); } else if (strcmp(pref_name, PRS_GUI_FILEOPEN_REMEMBERED_DIR) == 0) { /* deprecated */ + } else if (strcmp(pref_name, PRS_GUI_LAYOUT_TYPE) == 0) { + prefs.gui_layout_type = strtoul(value, NULL, 10); + + } else if (strcmp(pref_name, PRS_GUI_LAYOUT_CONTENT_1) == 0) { + prefs.gui_layout_content_1 = + find_index_from_string_array(value, gui_layout_content_text, 0); + } else if (strcmp(pref_name, PRS_GUI_LAYOUT_CONTENT_2) == 0) { + prefs.gui_layout_content_2 = + find_index_from_string_array(value, gui_layout_content_text, 0); + } else if (strcmp(pref_name, PRS_GUI_LAYOUT_CONTENT_3) == 0) { + prefs.gui_layout_content_3 = + find_index_from_string_array(value, gui_layout_content_text, 0); + /* handle the capture options */ } else if (strcmp(pref_name, PRS_CAP_DEVICE) == 0) { if (prefs.capture_device != NULL) @@ -2190,6 +2214,19 @@ write_prefs(char **pf_path_return) prefs.gui_fileopen_dir); } + fprintf(pf, "\n# Layout type (1-6).\n"); + fprintf(pf, PRS_GUI_LAYOUT_TYPE ": %d\n", + prefs.gui_layout_type); + + fprintf(pf, "\n# Layout content of the panes (1-3).\n"); + fprintf(pf, "# One of: NONE, PLIST, PDETAILS, PBYTES\n"); + fprintf(pf, PRS_GUI_LAYOUT_CONTENT_1 ": %s\n", + gui_layout_content_text[prefs.gui_layout_content_1]); + fprintf(pf, PRS_GUI_LAYOUT_CONTENT_2 ": %s\n", + gui_layout_content_text[prefs.gui_layout_content_2]); + fprintf(pf, PRS_GUI_LAYOUT_CONTENT_3 ": %s\n", + gui_layout_content_text[prefs.gui_layout_content_3]); + fprintf(pf, "\n####### Name Resolution ########\n"); fprintf(pf, "\n# Resolve addresses to names?\n"); @@ -2283,6 +2320,10 @@ copy_prefs(e_prefs *dest, e_prefs *src) dest->gui_toolbar_main_style = src->gui_toolbar_main_style; dest->gui_fileopen_dir = g_strdup(src->gui_fileopen_dir); dest->gui_fileopen_style = src->gui_fileopen_style; + dest->gui_layout_type = src->gui_layout_type; + dest->gui_layout_content_1 = src->gui_layout_content_1; + dest->gui_layout_content_2 = src->gui_layout_content_2; + dest->gui_layout_content_3 = src->gui_layout_content_3; dest->gui_font_name1 = g_strdup(src->gui_font_name1); dest->gui_font_name2 = g_strdup(src->gui_font_name2); dest->gui_marked_fg = src->gui_marked_fg; diff --git a/prefs.h b/prefs.h index cade11ed4c..9120ea709c 100644 --- a/prefs.h +++ b/prefs.h @@ -1,7 +1,7 @@ /* prefs.h * Definitions for preference handling routines * - * $Id: prefs.h,v 1.57 2004/04/06 19:02:17 ulfl Exp $ + * $Id: prefs.h,v 1.58 2004/04/29 17:03:26 ulfl Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -93,6 +93,10 @@ typedef struct _e_prefs { guint gui_fileopen_style; guint gui_recent_files_count_max; gchar *gui_fileopen_dir; + gint gui_layout_type; + gint gui_layout_content_1; + gint gui_layout_content_2; + gint gui_layout_content_3; guint32 name_resolve; gint name_resolve_concurrency; gchar *capture_device;