static void firewall_destroy_cb(GtkWidget * win, gpointer data);
static void firewall_copy_cmd_cb(GtkWidget * w, gpointer data);
static void firewall_save_as_cmd_cb(GtkWidget * w, gpointer data);
-static void firewall_save_as_ok_cb(GtkWidget * w, gpointer fs);
+static gboolean firewall_save_as_ok_cb(GtkWidget * w, gpointer fs);
static void firewall_save_as_destroy_cb(GtkWidget * win, gpointer user_data);
#define WS_RULE_INFO_KEY "rule_info_key"
GtkWidget *new_win;
rule_info_t *rule_info = data;
+#if 0 /* XXX: GtkFileChooserDialog/gtk_dialog_run currently being used is effectively modal so this is not req'd */
if (rule_info->firewall_save_as_w != NULL) {
/* There's already a dialog box; reactivate it. */
reactivate_window(rule_info->firewall_save_as_w);
return;
}
-
+#endif
new_win = file_selection_new("Wireshark: Save Firewall ACL Rule",
FILE_SELECTION_SAVE);
rule_info->firewall_save_as_w = new_win;
+#if GTK_CHECK_VERSION(2,8,0)
+ gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(new_win), TRUE);
+#endif
/* Tuck away the rule_info object into the window */
g_object_set_data(G_OBJECT(new_win), WS_RULE_INFO_KEY, rule_info);
g_signal_connect(new_win, "destroy", G_CALLBACK(firewall_save_as_destroy_cb), rule_info);
+#if 0
if (gtk_dialog_run(GTK_DIALOG(new_win)) == GTK_RESPONSE_ACCEPT)
{
firewall_save_as_ok_cb(new_win, new_win);
} else {
window_destroy(new_win);
}
+#else
+ /* "Run" the GtkFileChooserDialog. */
+ /* Upon exit: If "Accept" run the OK callback. */
+ /* If the OK callback returns with a FALSE status, re-run the dialog.*/
+ /* If not accept (ie: cancel) destroy the window. */
+ /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must* */
+ /* return with a TRUE status so that the dialog window will be destroyed. */
+ /* Trying to re-run the dialog after popping up an alert box will not work */
+ /* since the user will not be able to dismiss the alert box. */
+ /* The (somewhat unfriendly) effect: the user must re-invoke the */
+ /* GtkFileChooserDialog whenever the OK callback pops up an alert box. */
+ /* */
+ /* ToDo: use GtkFileChooserWidget in a dialog window instead of */
+ /* GtkFileChooserDialog. */
+ while (gtk_dialog_run(GTK_DIALOG(new_win)) == GTK_RESPONSE_ACCEPT) {
+ if (firewall_save_as_ok_cb(NULL, new_win)) {
+ break; /* we're done */
+ }
+ }
+ window_destroy(new_win);
+#endif
}
-static void
+static gboolean
firewall_save_as_ok_cb(GtkWidget * w _U_, gpointer fs)
{
gchar *to_name, *rule;
GtkTextIter start, end;
GtkTextBuffer *buf;
- to_name = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fs)));
+ to_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fs));
/* Perhaps the user specified a directory instead of a file.
Check whether they did. */
set_last_open_dir(to_name);
g_free(to_name);
file_selection_set_current_folder(fs, get_last_open_dir());
- return;
+ gtk_file_chooser_set_current_name(fs, "");
+ return FALSE; /* run the dialog again */
}
rule_info = g_object_get_data(G_OBJECT(fs), WS_RULE_INFO_KEY);
if (fh == NULL) {
open_failure_alert_box(to_name, errno, TRUE);
g_free(to_name);
- return;
+ return TRUE;
}
buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(rule_info->text));
fputs(rule, fh);
fclose(fh);
+#if 0 /* handled by caller (for now) */
gtk_widget_hide(GTK_WIDGET(fs));
window_destroy(GTK_WIDGET(fs));
-
+#endif
/* Save the directory name for future file dialogs. */
dirname = get_dirname(to_name); /* Overwrites to_name */
set_last_open_dir(dirname);
g_free(to_name);
+
+ return TRUE;
}
static void
save_as_w = NULL;
}
-static void
+static gboolean
pixbuf_save_button_cb(GtkWidget *save_as_w, GdkPixbuf *pixbuf)
{
gchar *filename, *file_type;
GError *error = NULL;
gboolean ret;
- filename = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(save_as_w)));
+ filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(save_as_w));
type_cm = g_object_get_data(G_OBJECT(save_as_w), "type_cm");
file_type = gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_cm));
g_free(file_type);
file_selection_set_current_folder(save_as_w,
get_last_open_dir());
- return;
+ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(save_as_w), "");
+ return FALSE;
}
ret = gdk_pixbuf_save(pixbuf, filename, file_type, &error, NULL);
gtk_window_set_transient_for(GTK_WINDOW(simple_w),
GTK_WINDOW(save_as_w));
}
+ return TRUE;
}
void
return;
}
+#if 0 /* XXX: GtkFileChooserDialog/gtk_dialog_run currently being used is effectively modal so this is not req'd */
if(save_as_w != NULL) {
/* If this save as window is already open, re-open it */
reactivate_window(save_as_w);
return;
}
+#endif
save_as_w = file_selection_new("Wireshark: Save Graph As ...",
FILE_SELECTION_SAVE);
+#if GTK_CHECK_VERSION(2,8,0)
+ gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(save_as_w), TRUE);
+#endif
/* Container for each row of widgets */
main_vb = gtk_vbox_new(FALSE, 0);
parent = gtk_widget_get_parent_window(w);
gdk_window_set_transient_for(save_as_w->window, parent);
+#if 0
if(gtk_dialog_run(GTK_DIALOG(save_as_w)) == GTK_RESPONSE_ACCEPT)
pixbuf_save_button_cb(save_as_w, pixbuf);
window_destroy(save_as_w);
+#else
+ /* "Run" the GtkFileChooserDialog. */
+ /* Upon exit: If "Accept" run the OK callback. */
+ /* If the OK callback returns with a FALSE status, re-run the dialog.*/
+ /* If not accept (ie: cancel) destroy the window. */
+ /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must* */
+ /* return with a TRUE status so that the dialog window will be destroyed. */
+ /* Trying to re-run the dialog after popping up an alert box will not work */
+ /* since the user will not be able to dismiss the alert box. */
+ /* The (somewhat unfriendly) effect: the user must re-invoke the */
+ /* GtkFileChooserDialog whenever the OK callback pops up an alert box. */
+ /* */
+ /* ToDo: use GtkFileChooserWidget in a dialog window instead of */
+ /* GtkFileChooserDialog. */
+ while (gtk_dialog_run(GTK_DIALOG(save_as_w)) == GTK_RESPONSE_ACCEPT) {
+ if (pixbuf_save_button_cb(save_as_w, pixbuf)) {
+ break; /* we're done */
+ }
+ }
+ window_destroy(save_as_w);
+#endif
}
#endif /* GTK_CHECK_VERSION(2,6,0) */