Add an item to the "File/Print" dialog box to ask that the full hex data
[obnox/wireshark/wip.git] / display.c
1 /* display.c
2  * Routines for packet display windows
3  *
4  * $Id: display.c,v 1.12 1999/09/29 22:19:12 guy Exp $
5  *
6  * Ethereal - Network traffic analyzer
7  * By Gerald Combs <gerald@zing.org>
8  * Copyright 1998 Gerald Combs
9  *
10  * 
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version.
15  * 
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  * 
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24  */
25
26
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
30
31 #ifdef HAVE_SYS_TYPES_H
32 # include <sys/types.h>
33 #endif
34
35 #include <gtk/gtk.h>
36
37 #include <stdlib.h>
38 #include <stdio.h>
39 #include <string.h>
40
41 #ifdef HAVE_UNISTD_H
42 #include <unistd.h>
43 #endif
44
45 #include <time.h>
46
47 #ifdef HAVE_SYS_SOCKET_H
48 #include <sys/socket.h>
49 #endif
50
51 #ifdef HAVE_WINSOCK_H
52 #include <winsock.h>
53 #endif
54
55 #ifdef HAVE_SYS_IOCTL_H
56 #include <sys/ioctl.h>
57 #endif
58
59 #ifdef HAVE_NET_IF_H
60 #include <net/if.h>
61 #endif
62
63 #include <signal.h>
64 #include <errno.h>
65
66 #ifdef NEED_SNPRINTF_H
67 # ifdef HAVE_STDARG_H
68 #  include <stdarg.h>
69 # else
70 #  include <varargs.h>
71 # endif
72 # include "snprintf.h"
73 #endif
74
75 #ifdef HAVE_SYS_SOCKIO_H
76 # include <sys/sockio.h>
77 #endif
78
79 #include "globals.h"
80 #include "timestamp.h"
81 #include "packet.h"
82 #include "file.h"
83 #include "display.h"
84
85 extern capture_file  cf;
86 extern GtkWidget *packet_list;
87
88 /* Display callback data keys */
89 #define E_DISPLAY_TIME_ABS_KEY   "display_time_abs"
90 #define E_DISPLAY_TIME_REL_KEY   "display_time_rel"
91 #define E_DISPLAY_TIME_DELTA_KEY "display_time_delta"
92 #define E_DISPLAY_AUTO_SCROLL_KEY "display_auto_scroll"
93 #define E_DISPLAY_NAME_RESOLUTION_KEY "display_name_resolution"
94
95 static void display_opt_ok_cb(GtkWidget *, gpointer);
96 static void display_opt_apply_cb(GtkWidget *, gpointer);
97 static void display_opt_close_cb(GtkWidget *, gpointer);
98
99 /*
100  * Keep track of whether the "Display Options" window is active, so that,
101  * if it is, selecting "Display/Options" doesn't pop up another such
102  * window.
103  */
104 static int display_opt_window_active;
105 static ts_type prev_timestamp_type;
106
107 void
108 display_opt_cb(GtkWidget *w, gpointer d) {
109   GtkWidget     *display_opt_w, *button, *main_vb, *bbox, *ok_bt, *apply_bt, *cancel_bt;
110
111   /* If there's already a "Display Options" window active, don't pop
112      up another one.
113
114      XXX - this should arguably give the input focus to the active
115      "Display Options" window, if possible. */
116   if (display_opt_window_active)
117     return;
118
119   /* Save the current timestamp type, so that "Cancel" can put it back
120      if we've changed it with "Apply". */
121   prev_timestamp_type = timestamp_type;
122
123   display_opt_w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
124   gtk_window_set_title(GTK_WINDOW(display_opt_w), "Ethereal: Display Options");
125   
126   /* Container for each row of widgets */
127   main_vb = gtk_vbox_new(FALSE, 3);
128   gtk_container_border_width(GTK_CONTAINER(main_vb), 5);
129   gtk_container_add(GTK_CONTAINER(display_opt_w), main_vb);
130   gtk_widget_show(main_vb);
131   
132   button = gtk_radio_button_new_with_label(NULL, "Time of day");
133   gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button),
134                (timestamp_type == ABSOLUTE));
135   gtk_object_set_data(GTK_OBJECT(display_opt_w), E_DISPLAY_TIME_ABS_KEY,
136                button);
137   gtk_box_pack_start(GTK_BOX(main_vb), button, TRUE, TRUE, 0);
138   gtk_widget_show(button);
139
140   button = gtk_radio_button_new_with_label(
141                gtk_radio_button_group(GTK_RADIO_BUTTON(button)),
142                "Seconds since beginning of capture");
143   gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button),
144                (timestamp_type == RELATIVE));
145   gtk_object_set_data(GTK_OBJECT(display_opt_w), E_DISPLAY_TIME_REL_KEY,
146                button);
147   gtk_box_pack_start(GTK_BOX(main_vb), button, TRUE, TRUE, 0);
148   gtk_widget_show(button);
149
150   button = gtk_radio_button_new_with_label(
151                gtk_radio_button_group(GTK_RADIO_BUTTON(button)),
152                "Seconds since previous frame");
153   gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button),
154                (timestamp_type == DELTA));
155   gtk_object_set_data(GTK_OBJECT(display_opt_w), E_DISPLAY_TIME_DELTA_KEY,
156                 button);
157   gtk_box_pack_start(GTK_BOX(main_vb), button, TRUE, TRUE, 0);
158   gtk_widget_show(button);
159
160   button = gtk_check_button_new_with_label("Automatic scrolling in live capture");
161   gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button), auto_scroll_live);
162   gtk_object_set_data(GTK_OBJECT(display_opt_w), E_DISPLAY_AUTO_SCROLL_KEY,
163                       button);
164   gtk_box_pack_start(GTK_BOX(main_vb), button, TRUE, TRUE, 0);
165   gtk_widget_show(button);
166
167   button = gtk_check_button_new_with_label("Name resolution");
168   gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button), g_resolving_actif);
169   gtk_object_set_data(GTK_OBJECT(display_opt_w), E_DISPLAY_NAME_RESOLUTION_KEY,
170                       button);
171   gtk_box_pack_start(GTK_BOX(main_vb), button, TRUE, TRUE, 0);
172   gtk_widget_show(button);
173   
174   /* Button row: OK, Apply, and Cancel buttons */
175   bbox = gtk_hbutton_box_new();
176   gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
177   gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
178   gtk_container_add(GTK_CONTAINER(main_vb), bbox);
179   gtk_widget_show(bbox);
180
181   ok_bt = gtk_button_new_with_label ("OK");
182   gtk_signal_connect(GTK_OBJECT(ok_bt), "clicked",
183     GTK_SIGNAL_FUNC(display_opt_ok_cb), GTK_OBJECT(display_opt_w));
184   GTK_WIDGET_SET_FLAGS(ok_bt, GTK_CAN_DEFAULT);
185   gtk_box_pack_start (GTK_BOX (bbox), ok_bt, TRUE, TRUE, 0);
186   gtk_widget_grab_default(ok_bt);
187   gtk_widget_show(ok_bt);
188
189   apply_bt = gtk_button_new_with_label ("Apply");
190   gtk_signal_connect(GTK_OBJECT(apply_bt), "clicked",
191     GTK_SIGNAL_FUNC(display_opt_apply_cb), GTK_OBJECT(display_opt_w));
192   GTK_WIDGET_SET_FLAGS(apply_bt, GTK_CAN_DEFAULT);
193   gtk_box_pack_start (GTK_BOX (bbox), apply_bt, TRUE, TRUE, 0);
194   gtk_widget_show(apply_bt);
195
196   cancel_bt = gtk_button_new_with_label ("Cancel");
197   gtk_signal_connect(GTK_OBJECT(cancel_bt), "clicked",
198     GTK_SIGNAL_FUNC(display_opt_close_cb), GTK_OBJECT(display_opt_w));
199   GTK_WIDGET_SET_FLAGS(cancel_bt, GTK_CAN_DEFAULT);
200   gtk_box_pack_start (GTK_BOX (bbox), cancel_bt, TRUE, TRUE, 0);
201   gtk_widget_show(cancel_bt);
202
203   display_opt_window_active = TRUE;
204   gtk_widget_show(display_opt_w);
205 }
206
207 static void
208 display_opt_ok_cb(GtkWidget *ok_bt, gpointer parent_w) {
209   GtkWidget *button;
210
211   button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
212                                               E_DISPLAY_TIME_ABS_KEY);
213   if (GTK_TOGGLE_BUTTON (button)->active)
214     timestamp_type = ABSOLUTE;
215
216   button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
217                                               E_DISPLAY_TIME_REL_KEY);
218   if (GTK_TOGGLE_BUTTON (button)->active)
219     timestamp_type = RELATIVE;
220
221   button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
222                                               E_DISPLAY_TIME_DELTA_KEY);
223   if (GTK_TOGGLE_BUTTON (button)->active)
224     timestamp_type = DELTA;
225
226   button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
227                                              E_DISPLAY_AUTO_SCROLL_KEY);
228   auto_scroll_live = (GTK_TOGGLE_BUTTON (button)->active);
229
230   button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
231                                              E_DISPLAY_NAME_RESOLUTION_KEY);
232   g_resolving_actif = (GTK_TOGGLE_BUTTON (button)->active);
233
234   gtk_widget_destroy(GTK_WIDGET(parent_w));
235   display_opt_window_active = FALSE;
236
237   change_time_formats(&cf);
238 }
239
240 static void
241 display_opt_apply_cb(GtkWidget *ok_bt, gpointer parent_w) {
242   GtkWidget *button;
243
244   button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
245                                               E_DISPLAY_TIME_ABS_KEY);
246   if (GTK_TOGGLE_BUTTON (button)->active)
247     timestamp_type = ABSOLUTE;
248
249   button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
250                                               E_DISPLAY_TIME_REL_KEY);
251   if (GTK_TOGGLE_BUTTON (button)->active)
252     timestamp_type = RELATIVE;
253
254   button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
255                                               E_DISPLAY_TIME_DELTA_KEY);
256   if (GTK_TOGGLE_BUTTON (button)->active)
257     timestamp_type = DELTA;
258
259   button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
260                                              E_DISPLAY_AUTO_SCROLL_KEY);
261   auto_scroll_live = (GTK_TOGGLE_BUTTON (button)->active);
262
263   button = (GtkWidget *) gtk_object_get_data(GTK_OBJECT(parent_w),
264                                              E_DISPLAY_NAME_RESOLUTION_KEY);
265   g_resolving_actif = (GTK_TOGGLE_BUTTON (button)->active);
266
267   change_time_formats(&cf);
268 }
269
270 static void
271 display_opt_close_cb(GtkWidget *close_bt, gpointer parent_w) {
272
273   if (timestamp_type != prev_timestamp_type) {
274     timestamp_type = prev_timestamp_type;
275     change_time_formats(&cf);
276   }
277
278   gtk_grab_remove(GTK_WIDGET(parent_w));
279   gtk_widget_destroy(GTK_WIDGET(parent_w));
280   display_opt_window_active = FALSE;
281 }