2 * Routines for "Time Shift" window
3 * Submitted by Edwin Groothuis <wireshark@mavetju.org>
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.
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
76 static GtkWidget
*time_shift_frame_w
;
79 time_shift_cb(GtkWidget
*w _U_
, gpointer d _U_
)
81 GtkWidget
*main_vb
, *label
,
85 *timeshift_offset_text_box
,
88 *settime_packetnumber_text_box
,
89 *settime_time_text_box
,
92 *adjtime_packetnumber1_text_box
,
93 *adjtime_packetnumber2_text_box
,
94 *adjtime_time1_text_box
,
95 *adjtime_time2_text_box
,
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
);
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
,
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
,
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 "
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
,
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
);
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
,
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.");
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
,
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 "
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
,
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.");
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
,
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
,
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
,
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.");
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
,
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]");
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);
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
,
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.");
333 bbox
= dlg_button_row_new(GTK_STOCK_APPLY
, GTK_STOCK_CLOSE
, GTK_STOCK_HELP
,
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
),
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
),
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
,
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
);
393 error_message(const gchar
*msg
)
396 simple_dialog(ESD_TYPE_ERROR
, ESD_BTN_OK
, "%s", msg
);
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 */
410 if (cfile
.state
== FILE_READ_IN_PROGRESS
) {
411 error_message("The Time Shift functions are not available on live captures.");
416 flag_rb
= (GtkWidget
*)g_object_get_data(G_OBJECT(parent_w
),
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
));
426 flag_rb
= (GtkWidget
*)g_object_get_data(G_OBJECT(parent_w
),
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
),
434 time_text
= gtk_entry_get_text(GTK_ENTRY(time_te
));
435 error_message(time_shift_settime(&cfile
, packet_num
, time_text
));
439 flag_rb
= (GtkWidget
*)g_object_get_data(G_OBJECT(parent_w
),
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
));
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
));
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
));
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
;