added selection of different main window pane layouts,

also added some preferences and a new preference page for this

svn path=/trunk/; revision=10729
This commit is contained in:
Ulf Lamping 2004-04-29 17:03:27 +00:00
parent 9cd7838304
commit 414b631700
8 changed files with 646 additions and 54 deletions

View File

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

View File

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

385
gtk/layout_prefs.c Normal file
View File

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

51
gtk/layout_prefs.h Normal file
View File

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

View File

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

View File

@ -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? */

43
prefs.c
View File

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

View File

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