/* Used for hiding/showing the dialog when the button is hidden */
guint8 active : 1;
+
+ /* Used to track whether we need to set a default current folder on ::map() */
+ guint8 folder_has_been_set : 1;
};
static void gtk_file_chooser_button_hide_all (GtkWidget *widget);
static void gtk_file_chooser_button_show (GtkWidget *widget);
static void gtk_file_chooser_button_hide (GtkWidget *widget);
+static void gtk_file_chooser_button_map (GtkWidget *widget);
static gboolean gtk_file_chooser_button_mnemonic_activate (GtkWidget *widget,
gboolean group_cycling);
static void gtk_file_chooser_button_style_set (GtkWidget *widget,
widget_class->hide_all = gtk_file_chooser_button_hide_all;
widget_class->show = gtk_file_chooser_button_show;
widget_class->hide = gtk_file_chooser_button_hide;
+ widget_class->map = gtk_file_chooser_button_map;
widget_class->style_set = gtk_file_chooser_button_style_set;
widget_class->screen_changed = gtk_file_chooser_button_screen_changed;
widget_class->mnemonic_activate = gtk_file_chooser_button_mnemonic_activate;
GObject *object;
GtkFileChooserButtonPrivate *priv;
GSList *list;
+ char *current_folder;
object = (*G_OBJECT_CLASS (gtk_file_chooser_button_parent_class)->constructor) (type,
n_params,
-1);
}
+ current_folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (priv->dialog));
+ if (current_folder != NULL)
+ {
+ priv->folder_has_been_set = TRUE;
+ g_free (current_folder);
+ }
+
g_free (priv->backend);
priv->backend = NULL;
(*GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->hide) (widget);
}
+static void
+gtk_file_chooser_button_map (GtkWidget *widget)
+{
+ GtkFileChooserButtonPrivate *priv;
+
+ priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (widget);
+
+ if (!priv->folder_has_been_set)
+ {
+ char *current_working_dir;
+
+ current_working_dir = g_get_current_dir ();
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (widget), current_working_dir);
+ g_free (current_working_dir);
+
+ priv->folder_has_been_set = TRUE;
+ }
+
+ if (GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->map)
+ (*GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->map) (widget);
+}
+
static gboolean
gtk_file_chooser_button_mnemonic_activate (GtkWidget *widget,
gboolean group_cycling)
dialog_current_folder_changed_cb (GtkFileChooser *dialog,
gpointer user_data)
{
- g_signal_emit_by_name (user_data, "current-folder-changed");
+ GtkFileChooserButton *button;
+ GtkFileChooserButtonPrivate *priv;
+
+ button = GTK_FILE_CHOOSER_BUTTON (user_data);
+ priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button);
+
+ priv->folder_has_been_set = TRUE;
+
+ g_signal_emit_by_name (button, "current-folder-changed");
}
static void
#define GTK_FILE_SYSTEM_ENABLE_UNSUPPORTED
#include <config.h>
+#include <string.h>
#include <glib/gprintf.h>
#include <gtk/gtk.h>
#include "gtk/gtkfilechooserprivate.h"
GtkWidget *dialog;
GtkFileChooserDefault *impl;
gboolean passed;
+ char *folder;
passed = TRUE;
&& ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
: TRUE));
+
+ folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
+ passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
+ g_free (folder);
}
else
{
&& impl->load_state == LOAD_EMPTY
&& impl->reload_state == RELOAD_EMPTY
&& impl->load_timeout_id == 0);
+
+ folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
+ passed = passed && (folder == NULL);
}
+ log_test (passed, "test_reload_sequence(): initial status");
if (!passed)
return FALSE;
&& ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
: TRUE));
+
+ folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
+ passed = passed && (folder != NULL);
+ g_free (folder);
+
+ log_test (passed, "test_reload_sequence(): status after map");
if (!passed)
return FALSE;
if (!passed)
return FALSE;
+ folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
+ passed = passed && (folder != NULL);
+ g_free (folder);
+
+ log_test (passed, "test_reload_sequence(): status after unmap");
+ if (!passed)
+ return FALSE;
+
/* Map it again! */
gtk_widget_show_now (dialog);
if (!passed)
return FALSE;
- gtk_widget_destroy (dialog);
+ folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
+ passed = passed && (folder != NULL);
+ g_free (folder);
+
+ log_test (passed, "test_reload_sequence(): status after re-map");
+ gtk_widget_destroy (dialog);
return passed;
}
return passed;
}
+static gboolean
+test_button_folder_states_for_action (GtkFileChooserAction action, gboolean use_dialog, gboolean set_folder_on_dialog)
+{
+ gboolean passed;
+ GtkWidget *window;
+ GtkWidget *button;
+ char *folder;
+ gboolean must_have_folder_initially;
+ GtkWidget *dialog;
+
+ passed = TRUE;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ must_have_folder_initially = (use_dialog && set_folder_on_dialog);
+
+ if (use_dialog)
+ {
+ dialog = gtk_file_chooser_dialog_new ("Test", NULL, action,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+ NULL);
+ button = gtk_file_chooser_button_new_with_dialog (dialog);
+
+ if (set_folder_on_dialog)
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
+ }
+ else
+ {
+ button = gtk_file_chooser_button_new ("Test", action);
+ dialog = NULL; /* keep gcc happy */
+ }
+
+ gtk_container_add (GTK_CONTAINER (window), button);
+
+ /* Pre-map; no folder is set */
+
+ folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
+ if (must_have_folder_initially)
+ passed = passed && (folder != NULL);
+ else
+ passed = passed && (folder == NULL);
+
+ log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, pre-map, %s",
+ get_action_name (action),
+ use_dialog,
+ set_folder_on_dialog,
+ must_have_folder_initially ? "must have folder" : "folder must not be set");
+
+ /* Map; folder should be set */
+
+ gtk_widget_show_all (window);
+ gtk_widget_show_now (window);
+ folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
+ passed = passed && (folder != NULL);
+ log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, mapped, must have folder",
+ get_action_name (action),
+ use_dialog,
+ set_folder_on_dialog);
+ g_free (folder);
+
+ /* Unmap; folder should be set */
+
+ gtk_widget_hide (window);
+ folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
+ passed = passed && (folder != NULL);
+ log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, unmapped, must have folder",
+ get_action_name (action),
+ use_dialog,
+ set_folder_on_dialog);
+ g_free (folder);
+
+ /* Re-map; folder should be set */
+
+ gtk_widget_show_now (window);
+ folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
+ passed = passed && (folder != NULL);
+ log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, re-mapped, must have folder",
+ get_action_name (action),
+ use_dialog,
+ set_folder_on_dialog);
+ g_free (folder);
+
+ gtk_widget_destroy (window);
+
+ return passed;
+}
+
+static gboolean
+test_button_folder_states (void)
+{
+ /* GtkFileChooserButton only supports OPEN and SELECT_FOLDER */
+ static const GtkFileChooserAction actions_to_test[] = {
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
+ };
+ gboolean passed;
+ int i;
+
+ passed = TRUE;
+
+ for (i = 0; i < G_N_ELEMENTS (actions_to_test); i++)
+ {
+ passed = passed && test_button_folder_states_for_action (actions_to_test[i], FALSE, FALSE);
+ passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, FALSE);
+ passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, TRUE);
+ log_test (passed, "test_button_folder_states(): action %s", get_action_name (actions_to_test[i]));
+ }
+
+ log_test (passed, "test_button_folder_states(): all supported actions");
+ return passed;
+}
+
+static int num_warnings;
+static int num_errors;
+static int num_critical_errors;
+
+static void
+log_override_cb (const gchar *log_domain,
+ GLogLevelFlags log_level,
+ const gchar *message,
+ gpointer user_data)
+{
+ if (log_level & G_LOG_LEVEL_WARNING)
+ num_warnings++;
+
+ if (log_level & G_LOG_LEVEL_ERROR)
+ num_errors++;
+
+ if (log_level & G_LOG_LEVEL_CRITICAL)
+ num_critical_errors++;
+
+ g_log_default_handler (log_domain, log_level, message, user_data);
+}
+
int
main (int argc, char **argv)
{
+ static const char *domains[] = {
+ "Glib", "GLib-GObject", "GModule", "GThread", "Pango", "Gdk", "GdkPixbuf", "Gtk", "libgnomevfs"
+ };
+
+ gboolean passed;
+ gboolean zero_warnings;
+ gboolean zero_errors;
+ gboolean zero_critical_errors;
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (domains); i++)
+ g_log_set_handler (domains[i],
+ G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL | G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING,
+ log_override_cb, NULL);
+
gtk_init (&argc, &argv);
- test_action_widgets ();
- test_reload ();
+ passed = test_action_widgets ();
+ passed = passed && test_reload ();
+ passed = passed && test_button_folder_states ();
+ log_test (passed, "main(): main tests");
+
+ zero_warnings = num_warnings == 0;
+ zero_errors = num_errors == 0;
+ zero_critical_errors = num_critical_errors == 0;
+
+ log_test (zero_warnings, "main(): zero warnings (actual number %d)", num_warnings);
+ log_test (zero_errors, "main(): zero errors (actual number %d)", num_errors);
+ log_test (zero_critical_errors, "main(): zero critical errors (actual number %d)", num_critical_errors);
+
+ passed = passed && zero_warnings && zero_errors && zero_critical_errors;
+
+ log_test (passed, "main(): ALL TESTS");
return 0;
}