Reset the internal response_requested flag, once the response triggered by file_chooser_widget_response_requested has been processed (#347883)

svn path=/trunk/; revision=17994
This commit is contained in:
Mathias Hasselmann
2007-05-31 21:45:20 +00:00
parent dae6d72337
commit 3ea5cea9a1
3 changed files with 90 additions and 20 deletions

View File

@@ -1,3 +1,9 @@
2007-05-31 Mathias Hasselmann <mathias.hasselmann@gmx.de>
* gtk/gtkfilechooserdialog.c, tests/autotestfilechooser.c: Reset
the internal response_requested flag, once the response triggered by
file_chooser_widget_response_requested has been processed (#347883).
2007-05-30 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkselection-quartz.c (gdk_free_text_list): Add this

View File

@@ -423,21 +423,24 @@ response_cb (GtkDialog *dialog,
gint response_id)
{
GtkFileChooserDialogPrivate *priv;
gboolean response_matters;
priv = GTK_FILE_CHOOSER_DIALOG_GET_PRIVATE (dialog);
/* Act only on response IDs we recognize */
if (!(response_id == GTK_RESPONSE_ACCEPT
|| response_id == GTK_RESPONSE_OK
|| response_id == GTK_RESPONSE_YES
|| response_id == GTK_RESPONSE_APPLY))
return;
response_matters =
response_id == GTK_RESPONSE_ACCEPT
|| response_id == GTK_RESPONSE_OK
|| response_id == GTK_RESPONSE_YES
|| response_id == GTK_RESPONSE_APPLY;
if (!priv->response_requested && !_gtk_file_chooser_embed_should_respond (GTK_FILE_CHOOSER_EMBED (priv->widget)))
if (response_matters && !priv->response_requested &&
!_gtk_file_chooser_embed_should_respond (GTK_FILE_CHOOSER_EMBED (priv->widget)))
{
g_signal_stop_emission_by_name (dialog, "response");
priv->response_requested = FALSE;
}
priv->response_requested = FALSE;
}
static GtkWidget *

View File

@@ -281,23 +281,49 @@ test_black_box (void)
struct confirm_overwrite_closure {
GtkWidget *chooser;
GtkWidget *accept_button;
gboolean emitted_confirm_overwrite_signal;
gint confirm_overwrite_signal_emitted;
gchar *extension;
};
static GtkFileChooserConfirmation
confirm_overwrite_cb (GtkFileChooser *chooser, gpointer data)
{
struct confirm_overwrite_closure *closure;
closure = data;
struct confirm_overwrite_closure *closure = data;
printf ("bling!\n");
closure->emitted_confirm_overwrite_signal = TRUE;
closure->confirm_overwrite_signal_emitted += 1;
return GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME;
}
static void
overwrite_response_cb (GtkFileChooser *chooser, gint response, gpointer data)
{
struct confirm_overwrite_closure *closure = data;
char *filename;
printf ("plong!\n");
if (response != GTK_RESPONSE_ACCEPT)
return;
filename = gtk_file_chooser_get_filename (chooser);
if (!g_str_has_suffix (filename, closure->extension))
{
char *basename;
basename = g_path_get_basename (filename);
g_free (filename);
filename = g_strconcat (basename, closure->extension, NULL);
gtk_file_chooser_set_current_name (chooser, filename);
g_signal_stop_emission_by_name (chooser, "response");
gtk_dialog_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
}
}
static gboolean
confirm_overwrite_timeout_cb (gpointer data)
{
@@ -311,7 +337,7 @@ confirm_overwrite_timeout_cb (gpointer data)
/* http://bugzilla.gnome.org/show_bug.cgi?id=347883 */
static gboolean
test_confirm_overwrite_for_path (const char *path)
test_confirm_overwrite_for_path (const char *path, gboolean append_extension)
{
gboolean passed;
struct confirm_overwrite_closure closure;
@@ -319,18 +345,47 @@ test_confirm_overwrite_for_path (const char *path)
passed = TRUE;
closure.emitted_confirm_overwrite_signal = FALSE;
closure.extension = NULL;
closure.confirm_overwrite_signal_emitted = 0;
closure.chooser = gtk_file_chooser_dialog_new ("hello", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
NULL);
closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (closure.chooser), GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (closure.chooser),
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
gtk_dialog_set_default_response (GTK_DIALOG (closure.chooser), GTK_RESPONSE_ACCEPT);
gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (closure.chooser), TRUE);
g_signal_connect (closure.chooser, "confirm-overwrite",
G_CALLBACK (confirm_overwrite_cb), &closure);
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (closure.chooser), path);
if (append_extension)
{
char *extension;
filename = g_path_get_dirname (path);
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (closure.chooser), filename);
g_free (filename);
filename = g_path_get_basename (path);
extension = strchr (filename, '.');
if (extension)
{
closure.extension = g_strdup (extension);
*extension = '\0';
}
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (closure.chooser), filename);
g_free (filename);
g_signal_connect (closure.chooser, "response",
G_CALLBACK (overwrite_response_cb), &closure);
}
else
{
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (closure.chooser), path);
}
gdk_threads_add_timeout (2000, confirm_overwrite_timeout_cb, &closure);
gtk_dialog_run (GTK_DIALOG (closure.chooser));
@@ -341,9 +396,9 @@ test_confirm_overwrite_for_path (const char *path)
gtk_widget_destroy (closure.chooser);
passed = passed && closure.emitted_confirm_overwrite_signal;
passed = passed && (1 == closure.confirm_overwrite_signal_emitted);
log_test (passed, "Confirm overwrite");
log_test (passed, "Confirm overwrite for %s", path);
return passed;
}
@@ -353,7 +408,9 @@ test_confirm_overwrite (void)
{
gboolean passed = TRUE;
passed = passed && test_confirm_overwrite_for_path ("/etc/passwd"); /* a file we know will always exist */
/* first test for a file we know will always exist */
passed = passed && test_confirm_overwrite_for_path ("/etc/passwd", FALSE);
passed = passed && test_confirm_overwrite_for_path ("/etc/resolv.conf", TRUE);
return passed;
}
@@ -1027,12 +1084,16 @@ main (int argc, char **argv)
/* Start tests */
#if 0
passed = passed && test_black_box ();
#endif
passed = passed && test_confirm_overwrite ();
#if 0
passed = passed && test_action_widgets ();
passed = passed && test_reload ();
passed = passed && test_button_folder_states ();
passed = passed && test_folder_switch_and_filters ();
#endif
log_test (passed, "main(): main tests");
/* Warnings and errors */