summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Hasselmann <hasselmm@src.gnome.org>2007-05-31 21:45:20 +0000
committerMathias Hasselmann <hasselmm@src.gnome.org>2007-05-31 21:45:20 +0000
commit3ea5cea9a1dd87bd35bea4810c764ee5b2467b19 (patch)
treea0804ed8a28e854e14bd6de3b30cbe1534aba63d
parentdae6d72337d995318ccd78dbffdaefcc0a1c67d6 (diff)
downloadgdk-pixbuf-3ea5cea9a1dd87bd35bea4810c764ee5b2467b19.tar.gz
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
-rw-r--r--ChangeLog6
-rw-r--r--gtk/gtkfilechooserdialog.c19
-rw-r--r--tests/autotestfilechooser.c87
3 files changed, 91 insertions, 21 deletions
diff --git a/ChangeLog b/ChangeLog
index 7dde116bd..8041c2185 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/gtk/gtkfilechooserdialog.c b/gtk/gtkfilechooserdialog.c
index 5adf8b28f..fcd80ad46 100644
--- a/gtk/gtkfilechooserdialog.c
+++ b/gtk/gtkfilechooserdialog.c
@@ -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;
-
- if (!priv->response_requested && !_gtk_file_chooser_embed_should_respond (GTK_FILE_CHOOSER_EMBED (priv->widget)))
+ response_matters =
+ response_id == GTK_RESPONSE_ACCEPT
+ || response_id == GTK_RESPONSE_OK
+ || response_id == GTK_RESPONSE_YES
+ || response_id == GTK_RESPONSE_APPLY;
+
+ 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 *
diff --git a/tests/autotestfilechooser.c b/tests/autotestfilechooser.c
index 2706d9d52..181b72b3e 100644
--- a/tests/autotestfilechooser.c
+++ b/tests/autotestfilechooser.c
@@ -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 */