every GUI action, which will erease a currently unsaved capture file,

will now raise a dialog "Save xy before z?" with Yes/No/Cancel buttons.

svn path=/trunk/; revision=9908
This commit is contained in:
Ulf Lamping 2004-01-29 23:11:38 +00:00
parent 419837e531
commit 3c76ec1aa2
8 changed files with 261 additions and 21 deletions

View File

@ -1,7 +1,7 @@
/* capture_dlg.c
* Routines for packet capture windows
*
* $Id: capture_dlg.c,v 1.97 2004/01/26 09:05:59 guy Exp $
* $Id: capture_dlg.c,v 1.98 2004/01/29 23:11:37 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -48,6 +48,7 @@
#include "ringbuffer.h"
#include <epan/filesystem.h>
#include "compat_macros.h"
#include "file_dlg.h"
#ifdef _WIN32
#include "capture-wpcap.h"
@ -260,7 +261,7 @@ set_link_type_list(GtkWidget *linktype_om, GtkWidget *entry)
}
void
capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
capture_prep(void)
{
GtkWidget *main_vb,
*capture_fr, *capture_vb,
@ -759,6 +760,42 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
gtk_widget_show(cap_open_w);
}
static void
capture_prep_answered_cb(gpointer dialog _U_, gint btn, gpointer data)
{
switch(btn) {
case(ESD_BTN_YES):
/* save file first */
file_save_as_cmd(after_save_capture_dialog, data);
break;
case(ESD_BTN_NO):
capture_prep();
break;
case(ESD_BTN_CANCEL):
break;
default:
g_assert_not_reached();
}
}
void
capture_prep_cb(GtkWidget *w, gpointer d _U_)
{
gpointer dialog;
if((cfile.state != FILE_CLOSED) && !cfile.user_saved) {
/* user didn't saved his current file, ask him */
dialog = simple_dialog(ESD_TYPE_QUEST | ESD_TYPE_MODAL,
ESD_BTN_YES | ESD_BTN_NO | ESD_BTN_CANCEL,
"Save packets to \"%s\" before capturing?",
cf_get_display_name(&cfile));
simple_dialog_set_cb(dialog, capture_prep_answered_cb, NULL);
} else {
/* unchanged file, just capture a new one */
capture_prep();
}
}
static void
select_link_type_cb(GtkWidget *w, gpointer data)
{

View File

@ -1,7 +1,7 @@
/* capture_dlg.h
* Definitions for packet capture windows
*
* $Id: capture_dlg.h,v 1.3 2002/08/28 21:03:46 jmayer Exp $
* $Id: capture_dlg.h,v 1.4 2004/01/29 23:11:37 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -29,4 +29,6 @@
void capture_prep_cb(GtkWidget *, gpointer);
void capture_stop_cb(GtkWidget *, gpointer);
void capture_prep(void);
#endif /* capture.h */

View File

@ -1,7 +1,7 @@
/* file_dlg.c
* Dialog boxes for handling files
*
* $Id: file_dlg.c,v 1.84 2004/01/25 21:55:10 guy Exp $
* $Id: file_dlg.c,v 1.85 2004/01/29 23:11:37 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -48,6 +48,10 @@
#include "../ui_util.h"
#include "gtk/color_filters.h"
#include "gtk/color_dlg.h"
#ifdef HAVE_LIBPCAP
#include "capture_dlg.h"
#endif
static void file_open_ok_cb(GtkWidget *w, GtkFileSelection *fs);
static void file_open_destroy_cb(GtkWidget *win, gpointer user_data);
@ -200,7 +204,7 @@ static GtkWidget *file_open_w;
/* Open a file */
void
file_open_cmd_cb(GtkWidget *w, gpointer data _U_)
file_open_cmd(GtkWidget *w)
{
GtkWidget *main_vb, *filter_hbox, *filter_bt, *filter_te,
*m_resolv_cb, *n_resolv_cb, *t_resolv_cb;
@ -334,6 +338,39 @@ file_open_cmd_cb(GtkWidget *w, gpointer data _U_)
gtk_widget_show(file_open_w);
}
void file_open_answered_cb(gpointer dialog _U_, gint btn, gpointer data _U_)
{
switch(btn) {
case(ESD_BTN_YES):
/* save file first */
file_save_as_cmd(after_save_open_dialog, data);
break;
case(ESD_BTN_NO):
file_open_cmd(data);
break;
case(ESD_BTN_CANCEL):
break;
default:
g_assert_not_reached();
}
}
void
file_open_cmd_cb(GtkWidget *widget, gpointer data _U_) {
gpointer dialog;
if((cfile.state != FILE_CLOSED) && !cfile.user_saved) {
/* user didn't saved his current file, ask him */
dialog = simple_dialog(ESD_TYPE_QUEST | ESD_TYPE_MODAL,
ESD_BTN_YES | ESD_BTN_NO | ESD_BTN_CANCEL,
"Save your capture file before open a new one?");
simple_dialog_set_cb(dialog, file_open_answered_cb, widget);
} else {
/* unchanged file, just open a new one */
file_open_cmd(widget);
}
}
static void
file_open_ok_cb(GtkWidget *w, GtkFileSelection *fs) {
gchar *cf_name, *rfilter, *s;
@ -426,10 +463,38 @@ file_open_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_)
file_open_w = NULL;
}
void file_close_confirmed_cb(gpointer dialog _U_, gint btn, gpointer data _U_)
{
switch(btn) {
case(ESD_BTN_YES):
/* save file first */
file_save_as_cmd(after_save_close_file, NULL);
break;
case(ESD_BTN_NO):
cf_close(&cfile);
break;
case(ESD_BTN_CANCEL):
break;
default:
g_assert_not_reached();
}
}
/* Close a file */
void
file_close_cmd_cb(GtkWidget *widget _U_, gpointer data _U_) {
cf_close(&cfile);
gpointer dialog;
if((cfile.state != FILE_CLOSED) && !cfile.user_saved) {
/* user didn't saved his current file, ask him */
dialog = simple_dialog(ESD_TYPE_QUEST | ESD_TYPE_MODAL,
ESD_BTN_YES | ESD_BTN_NO | ESD_BTN_CANCEL,
"Save your capture file before closing it?");
simple_dialog_set_cb(dialog, file_close_confirmed_cb, NULL);
} else {
/* unchanged file, just close it */
cf_close(&cfile);
}
}
void
@ -739,8 +804,12 @@ file_set_save_marked_sensitive(void)
}
}
action_after_save_e action_after_save_g;
gpointer action_after_save_data_g;
void
file_save_as_cmd_cb(GtkWidget *w _U_, gpointer data _U_)
file_save_as_cmd(action_after_save_e action_after_save, gpointer action_after_save_data)
{
GtkWidget *ok_bt, *main_vb, *ft_hb, *ft_lb, *range_fr, *range_tb;
GtkTooltips *tooltips;
@ -768,6 +837,11 @@ file_save_as_cmd_cb(GtkWidget *w _U_, gpointer data _U_)
file_save_as_w = file_selection_new ("Ethereal: Save Capture File As");
SIGNAL_CONNECT(file_save_as_w, "destroy", file_save_as_destroy_cb, NULL);
/* as the dialog might already be gone, when using this values, we cannot
* set data to the dialog object, but keep global values */
action_after_save_g = action_after_save;
action_after_save_data_g = action_after_save_data;
#if GTK_MAJOR_VERSION < 2
accel_group = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(file_save_as_w), accel_group);
@ -949,6 +1023,12 @@ file_save_as_cmd_cb(GtkWidget *w _U_, gpointer data _U_)
gtk_widget_show(file_save_as_w);
}
void
file_save_as_cmd_cb(GtkWidget *w _U_, gpointer data _U_)
{
file_save_as_cmd(after_save_no_action, NULL);
}
static void
file_save_as_ok_cb(GtkWidget *w _U_, GtkFileSelection *fs) {
gchar *cf_name;
@ -983,12 +1063,41 @@ file_save_as_ok_cb(GtkWidget *w _U_, GtkFileSelection *fs) {
}
/* The write succeeded; get rid of the file selection box. */
gtk_widget_destroy(GTK_WIDGET (fs));
/* cf_save might already closed our dialog! */
if (file_save_as_w)
gtk_widget_destroy(GTK_WIDGET (fs));
/* Save the directory name for future file dialogs. */
dirname = get_dirname(cf_name); /* Overwrites cf_name */
set_last_open_dir(dirname);
g_free(cf_name);
/* we have finished saving, do we have pending things to do? */
switch(action_after_save_g) {
case(after_save_no_action):
break;
case(after_save_open_dialog):
file_open_cmd(action_after_save_data_g);
break;
case(after_save_open_recent_file):
menu_open_recent_file_cmd(action_after_save_data_g);
break;
#ifdef HAVE_LIBPCAP
case(after_save_capture_dialog):
capture_prep();
break;
#endif
case(after_save_close_file):
cf_close(&cfile);
break;
case(after_save_exit):
main_do_quit();
break;
default:
g_assert_not_reached();
}
action_after_save_g = after_save_no_action;
}
void

View File

@ -1,7 +1,7 @@
/* file_dlg.h
* Definitions for dialog boxes for handling files
*
* $Id: file_dlg.h,v 1.7 2003/12/01 02:01:56 guy Exp $
* $Id: file_dlg.h,v 1.8 2004/01/29 23:11:37 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -25,6 +25,18 @@
#ifndef __FILE_DLG_H__
#define __FILE_DLG_H__
typedef enum {
after_save_no_action,
after_save_close_file,
after_save_open_dialog,
after_save_open_recent_file,
after_save_capture_dialog,
after_save_exit
} action_after_save_e;
void file_save_as_cmd(action_after_save_e action_after_save, gpointer action_after_save_data);
void file_open_cmd_cb(GtkWidget *, gpointer);
void file_save_cmd_cb(GtkWidget *, gpointer);
void file_save_as_cmd_cb(GtkWidget *, gpointer);

View File

@ -1,6 +1,6 @@
/* main.c
*
* $Id: main.c,v 1.378 2004/01/28 09:10:50 guy Exp $
* $Id: main.c,v 1.379 2004/01/29 23:11:37 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -172,6 +172,7 @@ static gboolean list_link_layer_types;
#endif
static void create_main_window(gint, gint, gint, e_prefs*);
static void file_quit_answered_cb(gpointer dialog _U_, gint btn, gpointer data _U_);
#ifdef WIN32
#if GTK_MAJOR_VERSION >= 2
static void try_to_get_windows_font_gtk2 (void);
@ -1096,8 +1097,8 @@ statusbar_pop_field_msg(void)
gtk_statusbar_pop(GTK_STATUSBAR(info_bar), help_ctx);
}
static gboolean
do_quit(void)
gboolean
main_do_quit(void)
{
gchar *rec_path;
@ -1175,8 +1176,21 @@ do_quit(void)
static gboolean
main_window_delete_event_cb(GtkWidget *widget _U_, GdkEvent *event _U_, gpointer data _U_)
{
/* "do_quit()" indicates whether the main window should be deleted. */
return do_quit();
gpointer dialog;
if((cfile.state != FILE_CLOSED) && !cfile.user_saved) {
/* user didn't saved his current file, ask him */
dialog = simple_dialog(ESD_TYPE_QUEST | ESD_TYPE_MODAL,
ESD_BTN_YES | ESD_BTN_NO | ESD_BTN_CANCEL,
"Save packets to \"%s\" before quit?",
cf_get_display_name(&cfile));
simple_dialog_set_cb(dialog, file_quit_answered_cb, NULL);
return TRUE;
} else {
/* unchanged file, just exit */
/* "main_do_quit()" indicates whether the main window should be deleted. */
return main_do_quit();
}
}
static gboolean
@ -1218,10 +1232,39 @@ main_window_configure_event_cb(GtkWidget *widget, GdkEvent *event _U_, gpointer
return FALSE;
}
void
file_quit_cmd_cb (GtkWidget *widget _U_, gpointer data _U_)
static void file_quit_answered_cb(gpointer dialog _U_, gint btn, gpointer data _U_)
{
do_quit();
switch(btn) {
case(ESD_BTN_YES):
/* save file first */
file_save_as_cmd(after_save_exit, NULL);
break;
case(ESD_BTN_NO):
main_do_quit();
break;
case(ESD_BTN_CANCEL):
break;
default:
g_assert_not_reached();
}
}
void
file_quit_cmd_cb(GtkWidget *widget _U_, gpointer data _U_)
{
gpointer dialog;
if((cfile.state != FILE_CLOSED) && !cfile.user_saved) {
/* user didn't saved his current file, ask him */
dialog = simple_dialog(ESD_TYPE_QUEST | ESD_TYPE_MODAL,
ESD_BTN_YES | ESD_BTN_NO | ESD_BTN_CANCEL,
"Save packets to \"%s\" before quit?",
cf_get_display_name(&cfile));
simple_dialog_set_cb(dialog, file_quit_answered_cb, NULL);
} else {
/* unchanged file, just exit */
main_do_quit();
}
}
static void

View File

@ -1,7 +1,7 @@
/* main.h
* Global defines, etc.
*
* $Id: main.h,v 1.39 2004/01/25 18:51:25 ulfl Exp $
* $Id: main.h,v 1.40 2004/01/29 23:11:37 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -105,6 +105,7 @@ extern gboolean dfilter_combo_add_recent(gchar *s);
extern void dfilter_combo_add_empty(void);
extern void dfilter_recent_combo_write_all(FILE *rf);
extern gboolean main_do_quit(void);
extern void main_widgets_rearrange(void);
extern int main_filter_packets(capture_file *cf, const gchar *dftext);

View File

@ -1,7 +1,7 @@
/* menu.c
* Menu routines
*
* $Id: menu.c,v 1.151 2004/01/27 20:58:18 ulfl Exp $
* $Id: menu.c,v 1.152 2004/01/29 23:11:37 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -68,6 +68,7 @@
#include "recent.h"
#include "../ui_util.h"
#include "proto_draw.h"
#include "simple_dialog.h"
GtkWidget *popup_menu_object;
@ -767,7 +768,7 @@ clear_menu_recent_capture_file_cmd_cb(GtkWidget *w _U_, gpointer unused _U_) {
/* callback, if the user pushed a recent file submenu item */
void
menu_open_recent_file_cmd_cb(GtkWidget *w, gpointer unused _U_)
menu_open_recent_file_cmd(GtkWidget *w)
{
GtkWidget *submenu_recent_files;
GtkWidget *menu_item_child;
@ -792,6 +793,40 @@ menu_open_recent_file_cmd_cb(GtkWidget *w, gpointer unused _U_)
update_menu_recent_capture_file(submenu_recent_files);
}
static void menu_open_recent_file_answered_cb(gpointer dialog _U_, gint btn, gpointer data _U_)
{
switch(btn) {
case(ESD_BTN_YES):
/* save file first */
file_save_as_cmd(after_save_open_recent_file, data);
break;
case(ESD_BTN_NO):
menu_open_recent_file_cmd(data);
break;
case(ESD_BTN_CANCEL):
break;
default:
g_assert_not_reached();
}
}
void
menu_open_recent_file_cmd_cb(GtkWidget *widget, gpointer data _U_) {
gpointer dialog;
if((cfile.state != FILE_CLOSED) && !cfile.user_saved) {
/* user didn't saved his current file, ask him */
dialog = simple_dialog(ESD_TYPE_QUEST | ESD_TYPE_MODAL,
ESD_BTN_YES | ESD_BTN_NO | ESD_BTN_CANCEL,
"Save packets to \"%s\" before opening a new capture file?",
cf_get_display_name(&cfile));
simple_dialog_set_cb(dialog, menu_open_recent_file_answered_cb, widget);
} else {
/* unchanged file */
menu_open_recent_file_cmd(widget);
}
}
/* add the capture filename (with an absolute path) to the "Recent Files" menu */
void

View File

@ -1,7 +1,7 @@
/* menu.h
* Menu definitions
*
* $Id: menu.h,v 1.14 2004/01/19 00:42:10 ulfl Exp $
* $Id: menu.h,v 1.15 2004/01/29 23:11:38 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -31,6 +31,7 @@ extern "C" {
/* Write all recent capture filenames to the user's recent file */
void menu_recent_file_write_all(FILE *rf);
void menu_open_recent_file_cmd(GtkWidget *w);
GtkWidget *main_menu_new(GtkAccelGroup **);
void set_menu_object_data (gchar *path, gchar *key, gpointer data);