aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Lamping <ulf.lamping@web.de>2004-04-29 17:03:27 +0000
committerUlf Lamping <ulf.lamping@web.de>2004-04-29 17:03:27 +0000
commit414b63170028ad66ca68cd7e8652d79cc410ffbf (patch)
tree6b48f00ec5f1e6ef5c2327571a8b6370fcf8b2c6
parent9cd78383043a9391658330b8ab445bc50dbab0db (diff)
downloadwireshark-414b63170028ad66ca68cd7e8652d79cc410ffbf.tar.gz
wireshark-414b63170028ad66ca68cd7e8652d79cc410ffbf.tar.bz2
wireshark-414b63170028ad66ca68cd7e8652d79cc410ffbf.zip
added selection of different main window pane layouts,
also added some preferences and a new preference page for this svn path=/trunk/; revision=10729
-rw-r--r--gtk/Makefile.am3
-rw-r--r--gtk/Makefile.common3
-rw-r--r--gtk/layout_prefs.c385
-rw-r--r--gtk/layout_prefs.h51
-rw-r--r--gtk/main.c174
-rw-r--r--gtk/prefs_dlg.c37
-rw-r--r--prefs.c43
-rw-r--r--prefs.h6
8 files changed, 647 insertions, 55 deletions
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 <gerald@ethereal.com>
@@ -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 <gerald@ethereal.com>
@@ -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 <gerald@ethereal.com>
+ * 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 <gtk/gtk.h>
+
+#include "globals.h"
+#include "layout_prefs.h"
+#include "gtkglobals.h"
+/*#include <epan/resolv.h>*/
+#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; i<LAYOUT_QTY; ++i) {
+ GtkToggleButton * tb = GTK_TOGGLE_BUTTON(layout_type_buttons[i]);
+ gboolean active = togglebutton==tb;
+ if (gtk_toggle_button_get_active(tb) != active)
+ gtk_toggle_button_set_active (tb, active);
+ }
+ dampen_feedback_loop = FALSE;
+ }
+}
+
+
+static layout_pane_content_e layout_pane_get_content(GtkWidget * radio_vb) {
+
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(radio_vb, LAYOUT_NONE_RB_KEY))))
+ return layout_pane_content_none;
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(radio_vb, LAYOUT_PLIST_RB_KEY))))
+ return layout_pane_content_plist;
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(radio_vb, LAYOUT_PDETAILS_RB_KEY))))
+ return layout_pane_content_pdetails;
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(radio_vb, LAYOUT_PBYTES_RB_KEY))))
+ return layout_pane_content_pbytes;
+
+ g_assert_not_reached();
+ return -1;
+}
+
+static void layout_pane_set_content(GtkWidget * radio_vb, layout_pane_content_e pane_content) {
+
+
+ switch(pane_content) {
+ case(layout_pane_content_none):
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(radio_vb, LAYOUT_NONE_RB_KEY)), TRUE);
+ break;
+ case(layout_pane_content_plist):
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(radio_vb, LAYOUT_PLIST_RB_KEY)), TRUE);
+ break;
+ case(layout_pane_content_pdetails):
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(radio_vb, LAYOUT_PDETAILS_RB_KEY)), TRUE);
+ break;
+ case(layout_pane_content_pbytes):
+ gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(radio_vb, LAYOUT_PBYTES_RB_KEY)), TRUE);
+ break;
+ default:
+ g_assert_not_reached();
+ }
+}
+
+
+
+static void layout_set(GtkWidget * main_vb, layout_t *layout) {
+ GtkWidget *radio_vb;
+ GtkWidget ** layout_type_buttons = OBJECT_GET_DATA(main_vb, LAYOUT_TYPE_BUTTONS_KEY);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(layout_type_buttons[layout->type - 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; i<LAYOUT_QTY; ++i) {
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(layout_type_buttons[i]))) {
+ layout_out->type = 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+<key> is a mnemonic,
+ Ctrl+<key> 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<LAYOUT_QTY; ++i)
+ {
+ type_tb = gtk_toggle_button_new ();
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(type_tb), (i + 1) == prefs.gui_layout_type);
+
+ gtk_container_add (GTK_CONTAINER(type_tb), xpm_to_widget(top_level, inline_txt[i]));
+
+ SIGNAL_CONNECT(type_tb, "toggled", layout_type_changed_cb, layout_type_buttons);
+ layout_type_buttons[i] = type_tb;
+ gtk_box_pack_start (GTK_BOX(button_hb), type_tb, TRUE, FALSE, 0);
+ }
+
+ OBJECT_SET_DATA(main_vb, LAYOUT_TYPE_BUTTONS_KEY, layout_type_buttons);
+
+ /* radio hbox */
+ radio_hb = gtk_hbox_new(FALSE, 0);
+ gtk_container_set_border_width(GTK_CONTAINER(radio_hb), 6);
+ gtk_box_pack_start (GTK_BOX(main_vb), radio_hb, FALSE, FALSE, 0);
+
+ radio_vb = layout_content_radio_vbox(main_vb, tooltips, 1, prefs.gui_layout_content_1);
+ gtk_container_set_border_width(GTK_CONTAINER(radio_vb), 6);
+ gtk_box_pack_start (GTK_BOX(radio_hb), radio_vb, FALSE, FALSE, 0);
+ OBJECT_SET_DATA(main_vb, LAYOUT_CONTENT1_VB_KEY, radio_vb);
+
+ radio_vb = layout_content_radio_vbox(main_vb, tooltips, 2, prefs.gui_layout_content_2);
+ gtk_container_set_border_width(GTK_CONTAINER(radio_vb), 6);
+ gtk_box_pack_start (GTK_BOX(radio_hb), radio_vb, FALSE, FALSE, 0);
+ OBJECT_SET_DATA(main_vb, LAYOUT_CONTENT2_VB_KEY, radio_vb);
+
+ radio_vb = layout_content_radio_vbox(main_vb, tooltips, 3, prefs.gui_layout_content_3);
+ gtk_container_set_border_width(GTK_CONTAINER(radio_vb), 6);
+ gtk_box_pack_start (GTK_BOX(radio_hb), radio_vb, FALSE, FALSE, 0);
+ OBJECT_SET_DATA(main_vb, LAYOUT_CONTENT3_VB_KEY, radio_vb);
+
+ default_vb = gtk_vbox_new(FALSE, 0);
+ default_bt = gtk_button_new_with_label("Defaults");
+ gtk_tooltips_set_tip (tooltips, default_bt, "Reset the pane layout settings to default values.", NULL);
+ SIGNAL_CONNECT(default_bt, "clicked", layout_defaults_cb, main_vb);
+ gtk_box_pack_end(GTK_BOX(default_vb), default_bt, FALSE, FALSE, 0);
+ gtk_box_pack_end(GTK_BOX(radio_hb), default_vb, FALSE, FALSE, 0);
+
+ /* Show 'em what we got */
+ gtk_widget_show_all(main_vb);
+
+ return(main_vb);
+}
+
+void
+layout_prefs_fetch(GtkWidget *w)
+{
+ layout_t layout_fetched;
+
+ layout_get(w, &layout_fetched);
+
+ prefs.gui_layout_type = layout_fetched.type;
+ prefs.gui_layout_content_1 = layout_fetched.content[0];
+ prefs.gui_layout_content_2 = layout_fetched.content[1];
+ prefs.gui_layout_content_3 = layout_fetched.content[2];
+}
+
+void
+layout_prefs_apply(GtkWidget *w _U_)
+{
+ main_widgets_rearrange();
+}
+
+void
+layout_prefs_destroy(GtkWidget *main_vb)
+{
+ GtkWidget ** layout_type_buttons = OBJECT_GET_DATA(main_vb, LAYOUT_TYPE_BUTTONS_KEY);
+
+ g_free(layout_type_buttons);
+}
+
diff --git a/gtk/layout_prefs.h b/gtk/layout_prefs.h
new file mode 100644
index 0000000000..3f7e918905
--- /dev/null
+++ b/gtk/layout_prefs.h
@@ -0,0 +1,51 @@
+/* layout_prefs.h
+ * Definitions for layout preferences window
+ *
+ * $Id: layout_prefs.h,v 1.1 2004/04/29 17:03:27 ulfl Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * 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 <gerald@ethereal.com>
@@ -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);
-
- 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);
+ none_lb = gtk_label_new("None");
+
+ 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 <gerald@ethereal.com>
@@ -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 <gerald@ethereal.com>
@@ -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 <gerald@ethereal.com>
@@ -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;