Witness: enum witness_notifyResponse_type
[wireshark-wip.git] / ui / gtk / time_shift_dlg.c
blob8a8ddb0b05e921c9f408f07944e6c1b826713c30
1 /* time_shift_dlg.c
2 * Routines for "Time Shift" window
3 * Submitted by Edwin Groothuis <wireshark@mavetju.org>
5 * $Id$
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
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.
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.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 #include "config.h"
28 #include "globals.h"
30 #include <gtk/gtk.h>
32 #include <epan/proto.h>
33 #include <epan/dfilter/dfilter.h>
34 #include <epan/strutil.h>
35 #include <epan/prefs.h>
37 #include "ui/time_shift.h"
38 #include "ui/alert_box.h"
39 #include "ui/simple_dialog.h"
40 #include "ui/main_statusbar.h"
42 #include "ui/gtk/gui_utils.h"
43 #include "ui/gtk/time_shift_dlg.h"
44 #include "ui/gtk/dlg_utils.h"
45 #include "ui/gtk/stock_icons.h"
46 #include "ui/gtk/prefs_dlg.h"
47 #include "ui/gtk/keys.h"
48 #include "ui/gtk/help_dlg.h"
50 /* Capture callback data keys */
51 #define E_TIMESHIFT_SELECT "timeshift_select"
52 #define E_TIMESHIFT_OFFSET_KEY "timeshift_offset_te"
53 #define E_SETTIME_SELECT "settime_select"
54 #define E_SETTIME_TIME_KEY "settime_time_te"
55 #define E_SETTIME_PACKETNUMBER_KEY "settime_packetnumber_te"
56 #define E_ADJTIME_SELECT "adjtime_select"
57 #define E_ADJTIME_TIME1_KEY "adjtime_time1_te"
58 #define E_ADJTIME_PACKETNUMBER1_KEY "adjtime_packetnumber1_te"
59 #define E_ADJTIME_TIME2_KEY "adjtime_time2_te"
60 #define E_ADJTIME_PACKETNUMBER2_KEY "adjtime_packetnumber2_te"
61 #define E_UNDO_SELECT "undo_select"
62 #define E_UNDO_SHIFT_KEY "undo_shift_cb"
64 static void time_shift_apply_cb(GtkWidget *ok_bt, GtkWindow *parent_w);
65 static void time_shift_close_cb(GtkWidget *close_bt, gpointer parent_w);
66 static void time_shift_frame_destroy_cb(GtkWidget *win, gpointer user_data);
68 static void error_message(const gchar *msg);
71 * Keep a static pointer to the current "Time Shift" window, if any, so
72 * that if somebody tries to do "Time Shift" while there's already a
73 * "Time Shift" window up, we just pop up the existing one, rather than
74 * creating a new one.
76 static GtkWidget *time_shift_frame_w;
78 void
79 time_shift_cb(GtkWidget *w _U_, gpointer d _U_)
81 GtkWidget *main_vb, *label,
82 *types_vb, *indent,
84 *timeshift_offset_hb,
85 *timeshift_offset_text_box,
87 *settime_time_hb,
88 *settime_packetnumber_text_box,
89 *settime_time_text_box,
91 *adjtime_offset_hb,
92 *adjtime_packetnumber1_text_box,
93 *adjtime_packetnumber2_text_box,
94 *adjtime_time1_text_box,
95 *adjtime_time2_text_box,
97 *undo_offset_hb,
98 *undo_type_hb,
100 *timeshift_rb, *settime_rb,
101 *adjtime_rb, *undo_rb,
103 *bbox, *apply_bt, *close_bt, *help_bt;
104 GString * frame_str = g_string_new("");
105 gint rb_size = 0, rb_spacing = 0, indent_width = 0;
107 if (time_shift_frame_w != NULL) {
108 /* There's already a "Time Shift" dialog box; reactivate it. */
109 reactivate_window(time_shift_frame_w);
110 return;
113 time_shift_frame_w = dlg_window_new("Wireshark: Time Shift");
114 gtk_container_set_border_width (GTK_CONTAINER (time_shift_frame_w), DLG_OUTER_MARGIN);
116 /* Container for each row of widgets */
117 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_UNRELATED_SPACING, FALSE);
118 gtk_container_add(GTK_CONTAINER(time_shift_frame_w), main_vb);
122 * Shift All Packets frame
124 types_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
125 gtk_box_pack_start(GTK_BOX(main_vb), types_vb, TRUE, TRUE, 0);
127 /* Radio button row */
128 timeshift_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
129 gtk_box_pack_start(GTK_BOX(types_vb), timeshift_offset_hb, FALSE, FALSE, 0);
131 timeshift_rb = gtk_radio_button_new_with_label (NULL, "Shift all packets");
132 gtk_box_pack_start(GTK_BOX(timeshift_offset_hb), timeshift_rb, TRUE, TRUE, 0);
133 gtk_widget_set_tooltip_text(timeshift_rb, "Shift the time on the frames.");
135 gtk_widget_style_get(timeshift_rb, "indicator-size", &rb_size,
136 "indicator-spacing", &rb_spacing, NULL);
137 indent_width += rb_size + rb_spacing;
138 /* Time Shift entry row */
139 timeshift_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
140 gtk_box_pack_start(GTK_BOX(types_vb), timeshift_offset_hb, FALSE, FALSE, 0);
142 indent = gtk_alignment_new(0,0,0,0);
143 gtk_widget_set_size_request(indent, indent_width, -1);
144 gtk_box_pack_start(GTK_BOX(timeshift_offset_hb), indent, FALSE, FALSE, 0);
146 label = gtk_label_new("Time offset in the format [+-][[hh:]mm:]ss[.ddd]");
147 gtk_box_pack_start(GTK_BOX(timeshift_offset_hb), label, FALSE, FALSE, 0);
149 timeshift_offset_text_box = gtk_entry_new();
150 gtk_box_pack_start(GTK_BOX(timeshift_offset_hb), timeshift_offset_text_box,
151 TRUE, TRUE, 0);
152 gtk_widget_set_tooltip_text(timeshift_offset_text_box,
153 "Enter the time to shift here. The format is "
154 "[+-][[hh:]mm:]ss.[.ddddddddd].");
157 * Set Packet Number to Time frame
159 types_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
160 gtk_box_pack_start(GTK_BOX(main_vb), types_vb, TRUE, TRUE, 0);
161 /* time shift type row */
162 settime_time_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
163 gtk_box_pack_start(GTK_BOX(types_vb), settime_time_hb, FALSE,
164 FALSE, 0);
166 settime_rb = gtk_radio_button_new_with_label(gtk_radio_button_get_group(
167 GTK_RADIO_BUTTON(timeshift_rb)), "Set packet to time");
168 gtk_box_pack_start(GTK_BOX(settime_time_hb), settime_rb, TRUE, TRUE, 0);
169 gtk_widget_set_tooltip_text(settime_rb,
170 "Set the time of a certain frame and adjust the rest of the frames "
171 "automatically.");
173 settime_time_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
174 gtk_box_pack_start(GTK_BOX(types_vb), settime_time_hb, FALSE,
175 FALSE, 0);
177 indent = gtk_alignment_new(0,0,0,0);
178 gtk_widget_set_size_request(indent, indent_width, -1);
179 gtk_box_pack_start(GTK_BOX(settime_time_hb), indent, FALSE, FALSE, 0);
181 label = gtk_label_new("Packet number");
182 gtk_box_pack_start(GTK_BOX(settime_time_hb), label, FALSE, FALSE, 0);
184 if (cfile.current_frame) {
185 g_string_printf(frame_str, "%u", cfile.current_frame->num);
186 } else {
187 g_string_printf(frame_str, "%u", cfile.first_displayed);
189 settime_packetnumber_text_box = gtk_entry_new();
190 gtk_box_pack_start(GTK_BOX(settime_time_hb), settime_packetnumber_text_box,
191 TRUE, TRUE, 0);
192 gtk_entry_set_text(GTK_ENTRY(settime_packetnumber_text_box), frame_str->str);
193 gtk_widget_set_tooltip_text(settime_packetnumber_text_box,
194 "The frame which will be set to the time.");
196 /* time shift row */
197 settime_time_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
198 gtk_box_pack_start(GTK_BOX(types_vb), settime_time_hb, FALSE, FALSE,
201 indent = gtk_alignment_new(0,0,0,0);
202 gtk_widget_set_size_request(indent, indent_width, -1);
203 gtk_box_pack_start(GTK_BOX(settime_time_hb), indent, FALSE, FALSE, 0);
205 label = gtk_label_new("Set packet to time [YYYY-MM-DD] hh:mm:ss[.ddd]");
206 gtk_box_pack_start(GTK_BOX(settime_time_hb), label, FALSE, FALSE, 0);
208 settime_time_text_box = gtk_entry_new();
209 gtk_box_pack_start(GTK_BOX(settime_time_hb), settime_time_text_box, TRUE,
210 TRUE, 0);
211 gtk_widget_set_tooltip_text(settime_time_text_box,
212 "The time for the frame in the format of [YYYY-MM-DD] "
213 "hh:mm:ss[.ddddddddd]");
216 * Set two Packet Numbers to Time frame and extrapolate
218 types_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
219 gtk_box_pack_start(GTK_BOX(main_vb), types_vb, TRUE, TRUE, 0);
221 /* packet number row 1 */
222 adjtime_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
223 gtk_box_pack_start(GTK_BOX(types_vb), adjtime_offset_hb, FALSE, FALSE, 0);
225 adjtime_rb = gtk_radio_button_new_with_label(gtk_radio_button_get_group(
226 GTK_RADIO_BUTTON(timeshift_rb)), "Set packets to time and extrapolate");
227 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), adjtime_rb, TRUE, TRUE, 0);
228 gtk_widget_set_tooltip_text(adjtime_rb,
229 "Set the time of two frames and adjust the rest of the frames "
230 "automatically.");
232 adjtime_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
233 gtk_box_pack_start(GTK_BOX(types_vb), adjtime_offset_hb, FALSE, FALSE, 0);
235 indent = gtk_alignment_new(0,0,0,0);
236 gtk_widget_set_size_request(indent, indent_width, -1);
237 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), indent, FALSE, FALSE, 0);
239 label = gtk_label_new("Packet number");
240 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), label, FALSE, FALSE, 0);
242 adjtime_packetnumber1_text_box = gtk_entry_new();
243 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), adjtime_packetnumber1_text_box,
244 TRUE, TRUE, 0);
245 gtk_entry_set_text(GTK_ENTRY(adjtime_packetnumber1_text_box), frame_str->str);
246 gtk_widget_set_tooltip_text(adjtime_packetnumber1_text_box,
247 "The frame which will be set to the time.");
249 /* time shift row */
250 adjtime_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
251 gtk_box_pack_start(GTK_BOX(types_vb), adjtime_offset_hb, FALSE, FALSE,
254 indent = gtk_alignment_new(0,0,0,0);
255 gtk_widget_set_size_request(indent, indent_width, -1);
256 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), indent, FALSE, FALSE, 0);
258 label = gtk_label_new("Set packet to time [YYYY-MM-DD] hh:mm:ss[.ddd]");
259 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), label, FALSE, FALSE, 0);
261 adjtime_time1_text_box = gtk_entry_new();
262 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), adjtime_time1_text_box, TRUE,
263 TRUE, 0);
264 gtk_entry_set_text(GTK_ENTRY(adjtime_time1_text_box), "");
265 gtk_widget_set_tooltip_text(adjtime_time1_text_box,
266 "The time for the frame in the format of [YYYY-MM-DD] "
267 "hh:mm:ss[.ddddddddd]");
269 /* packet number row 2 */
270 adjtime_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
271 gtk_box_pack_start(GTK_BOX(types_vb), adjtime_offset_hb, FALSE,
272 FALSE, 0);
274 indent = gtk_alignment_new(0,0,0,0);
275 gtk_widget_set_size_request(indent, indent_width, -1);
276 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), indent, FALSE, FALSE, 0);
278 label = gtk_label_new("Packet number");
279 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), label, FALSE, FALSE, 0);
281 g_string_printf(frame_str, "%u", cfile.last_displayed);
282 adjtime_packetnumber2_text_box = gtk_entry_new();
283 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), adjtime_packetnumber2_text_box,
284 TRUE, TRUE, 0);
285 gtk_entry_set_text(GTK_ENTRY(adjtime_packetnumber2_text_box), frame_str->str);
286 gtk_widget_set_tooltip_text(adjtime_packetnumber2_text_box,
287 "The frame which will be set to the time.");
289 /* time shift row */
290 adjtime_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
291 gtk_box_pack_start(GTK_BOX(types_vb), adjtime_offset_hb, FALSE, FALSE,
294 indent = gtk_alignment_new(0,0,0,0);
295 gtk_widget_set_size_request(indent, indent_width, -1);
296 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), indent, FALSE, FALSE, 0);
298 label = gtk_label_new("Set packet to time [YYYY-MM-DD] hh:mm:ss[.ddd]");
299 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), label, FALSE, FALSE, 0);
301 adjtime_time2_text_box = gtk_entry_new();
302 gtk_box_pack_start(GTK_BOX(adjtime_offset_hb), adjtime_time2_text_box, TRUE,
303 TRUE, 0);
304 gtk_entry_set_text(GTK_ENTRY(adjtime_time2_text_box), "");
305 gtk_widget_set_tooltip_text(adjtime_time2_text_box,
306 "The time for the frame in the format of [YYYY-MM-DD] "
307 "hh:mm:ss[.ddddddddd]");
310 * Undo all shifts
312 types_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, DLG_LABEL_SPACING, FALSE);
313 gtk_box_pack_start(GTK_BOX(main_vb), types_vb, TRUE, TRUE, 0);
315 /* time shift type row */
316 undo_type_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
317 gtk_box_pack_start(GTK_BOX(types_vb), undo_type_hb, TRUE, TRUE, 0);
319 /* time shift row */
320 undo_offset_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DLG_BUTTON_SPACING, FALSE);
321 gtk_box_pack_start(GTK_BOX(types_vb), undo_offset_hb, FALSE,
322 FALSE, 0);
324 undo_rb = gtk_radio_button_new_with_label(gtk_radio_button_get_group(
325 GTK_RADIO_BUTTON(timeshift_rb)), "Undo all shifts");
326 gtk_box_pack_start(GTK_BOX(undo_offset_hb), undo_rb, TRUE, TRUE, 0);
327 gtk_widget_set_tooltip_text(undo_rb,
328 "Undo all the Time Shift offsets on the frames.");
331 * Button row
333 bbox = dlg_button_row_new(GTK_STOCK_APPLY, GTK_STOCK_CLOSE, GTK_STOCK_HELP,
334 NULL);
335 gtk_box_pack_start(GTK_BOX(main_vb), bbox, TRUE, TRUE, 0);
337 apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_APPLY);
338 g_signal_connect(apply_bt, "clicked", G_CALLBACK(time_shift_apply_cb),
339 time_shift_frame_w);
340 gtk_widget_set_tooltip_text(apply_bt,
341 "Apply the Time Shift options to the frame data.");
343 close_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
344 window_set_cancel_button(time_shift_frame_w, close_bt, window_cancel_button_cb);
345 g_signal_connect(close_bt, "clicked", G_CALLBACK(time_shift_close_cb),
346 time_shift_frame_w);
347 gtk_widget_set_tooltip_text(close_bt, "Close this dialog box.");
349 help_bt = (GtkWidget *)g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
350 g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb),
351 (gpointer)HELP_TIME_SHIFT_DIALOG);
352 gtk_widget_set_tooltip_text(help_bt,
353 "Help on how the Time Shift feature works.");
355 /* Link everything together */
357 g_object_set_data(G_OBJECT(time_shift_frame_w), E_TIMESHIFT_SELECT,
358 timeshift_rb);
359 g_object_set_data(G_OBJECT(time_shift_frame_w), E_TIMESHIFT_OFFSET_KEY,
360 timeshift_offset_text_box);
361 g_object_set_data(G_OBJECT(time_shift_frame_w), E_SETTIME_SELECT, settime_rb);
362 g_object_set_data(G_OBJECT(time_shift_frame_w), E_SETTIME_TIME_KEY,
363 settime_time_text_box);
364 g_object_set_data(G_OBJECT(time_shift_frame_w), E_SETTIME_PACKETNUMBER_KEY,
365 settime_packetnumber_text_box);
366 g_object_set_data(G_OBJECT(time_shift_frame_w), E_ADJTIME_SELECT, adjtime_rb);
367 g_object_set_data(G_OBJECT(time_shift_frame_w), E_ADJTIME_TIME1_KEY,
368 adjtime_time1_text_box);
369 g_object_set_data(G_OBJECT(time_shift_frame_w), E_ADJTIME_PACKETNUMBER1_KEY,
370 adjtime_packetnumber1_text_box);
371 g_object_set_data(G_OBJECT(time_shift_frame_w), E_ADJTIME_TIME2_KEY,
372 adjtime_time2_text_box);
373 g_object_set_data(G_OBJECT(time_shift_frame_w), E_ADJTIME_PACKETNUMBER2_KEY,
374 adjtime_packetnumber2_text_box);
375 g_object_set_data(G_OBJECT(time_shift_frame_w), E_UNDO_SELECT, undo_rb);
377 dlg_set_activate(timeshift_offset_text_box, apply_bt);
379 /* Give the initial focus to the "offset" entry box. */
380 gtk_widget_grab_focus(timeshift_offset_text_box);
382 g_signal_connect(time_shift_frame_w, "delete_event",
383 G_CALLBACK(window_delete_event_cb), NULL);
384 g_signal_connect(time_shift_frame_w, "destroy",
385 G_CALLBACK(time_shift_frame_destroy_cb), NULL);
387 g_string_free(frame_str, TRUE);
388 gtk_widget_show_all(time_shift_frame_w);
389 window_present(time_shift_frame_w);
392 static void
393 error_message(const gchar *msg)
395 if (msg)
396 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", msg);
399 static void
400 time_shift_apply_cb(GtkWidget *ok_bt _U_, GtkWindow *parent_w)
402 GtkWidget *flag_rb, *offset_te, *packetnumber_te, *time_te;
403 const gchar *offset_text, *time_text, *time2_text;
404 guint packet_num, packet2_num;
406 if (cfile.state == FILE_CLOSED) {
407 /* Nothing to do here */
408 return;
410 if (cfile.state == FILE_READ_IN_PROGRESS) {
411 error_message("The Time Shift functions are not available on live captures.");
412 return;
416 flag_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
417 E_TIMESHIFT_SELECT);
418 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(flag_rb)) == TRUE) {
419 offset_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
420 E_TIMESHIFT_OFFSET_KEY);
421 offset_text = gtk_entry_get_text(GTK_ENTRY(offset_te));
422 error_message(time_shift_all(&cfile, offset_text));
423 return;
426 flag_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
427 E_SETTIME_SELECT);
428 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(flag_rb)) == TRUE) {
429 packetnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
430 E_SETTIME_PACKETNUMBER_KEY);
431 packet_num = (guint)strtol((char *)gtk_entry_get_text(GTK_ENTRY(packetnumber_te)), NULL, 10);
432 time_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
433 E_SETTIME_TIME_KEY);
434 time_text = gtk_entry_get_text(GTK_ENTRY(time_te));
435 error_message(time_shift_settime(&cfile, packet_num, time_text));
436 return;
439 flag_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
440 E_ADJTIME_SELECT);
441 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(flag_rb)) == TRUE) {
442 packetnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
443 E_ADJTIME_PACKETNUMBER1_KEY);
444 packet_num = (guint)strtol((char *)gtk_entry_get_text(GTK_ENTRY(packetnumber_te)), NULL, 10);
445 time_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
446 E_ADJTIME_TIME1_KEY);
447 time_text = gtk_entry_get_text(GTK_ENTRY(time_te));
449 packetnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
450 E_ADJTIME_PACKETNUMBER2_KEY);
451 packet2_num = (guint)strtol((char *)gtk_entry_get_text(GTK_ENTRY(packetnumber_te)), NULL, 10);
452 time_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w),
453 E_ADJTIME_TIME2_KEY);
454 time2_text = gtk_entry_get_text(GTK_ENTRY(time_te));
456 error_message(time_shift_adjtime(&cfile, packet_num, time_text, packet2_num, time2_text));
457 return;
460 flag_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_UNDO_SELECT);
461 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(flag_rb)) == TRUE) {
462 error_message(time_shift_undo(&cfile));
463 return;
467 static void
468 time_shift_close_cb(GtkWidget *close_bt _U_, gpointer parent_w _U_)
470 gtk_grab_remove(GTK_WIDGET(parent_w));
471 window_destroy(GTK_WIDGET(parent_w));
474 static void
475 time_shift_frame_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
477 /* Note that we no longer have a "Time Shift" dialog box. */
478 time_shift_frame_w = NULL;