summaryrefslogtreecommitdiff
path: root/gtk/gtkfilechooserbutton.c
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@ximian.com>2005-10-07 19:54:32 +0000
committerFederico Mena Quintero <federico@src.gnome.org>2005-10-07 19:54:32 +0000
commitcca93029274bc39591f1d844ada3564c73c232da (patch)
tree58cedd63ca142670c4518994457b081394d91088 /gtk/gtkfilechooserbutton.c
parentcab26ded6f1bc150f83178c68f058608534901d9 (diff)
downloadgtk+-cca93029274bc39591f1d844ada3564c73c232da.tar.gz
Fixes bug #317999:
2005-10-07 Federico Mena Quintero <federico@ximian.com> Fixes bug #317999: * tests/autotestfilechooser.c (test_reload_sequence): Ensure that the the result of gtk_file_chooser_get_folder() is NULL or non-NULL at the right times. Log the tests. (test_button_folder_states): New test for the initial states of the current folder in GtkFileChooserButton. (main): Test that the number of warnings/errors/critical errors is zero. * gtk/gtkfilechooser.c (gtk_file_chooser_get_current_folder): Clarify the documentation on when this can return NULL. (gtk_file_chooser_get_current_folder_uri): Likewise. * gtk/gtkfilechooserbutton.c (struct _GtkFileChooserButtonPrivate): Added a folder_has_been_set flag; we use it to keep track of whether a folder has been set. (gtk_file_chooser_button_map): Implement. If no folder has been loaded before, we at least try to load $cwd here. (gtk_file_chooser_button_constructor): If the construct-time dialog already has a folder set, turn on our folder_has_been_set flag. (dialog_current_folder_changed_cb): Turn on our folder_has_been_set flag.
Diffstat (limited to 'gtk/gtkfilechooserbutton.c')
-rw-r--r--gtk/gtkfilechooserbutton.c45
1 files changed, 44 insertions, 1 deletions
diff --git a/gtk/gtkfilechooserbutton.c b/gtk/gtkfilechooserbutton.c
index e9117f9328..94458b9a62 100644
--- a/gtk/gtkfilechooserbutton.c
+++ b/gtk/gtkfilechooserbutton.c
@@ -155,6 +155,9 @@ struct _GtkFileChooserButtonPrivate
/* 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;
};
@@ -211,6 +214,7 @@ static void gtk_file_chooser_button_show_all (GtkWidget *wi
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,
@@ -322,6 +326,7 @@ gtk_file_chooser_button_class_init (GtkFileChooserButtonClass * class)
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;
@@ -593,6 +598,7 @@ gtk_file_chooser_button_constructor (GType type,
GObject *object;
GtkFileChooserButtonPrivate *priv;
GSList *list;
+ char *current_folder;
object = (*G_OBJECT_CLASS (gtk_file_chooser_button_parent_class)->constructor) (type,
n_params,
@@ -627,6 +633,13 @@ gtk_file_chooser_button_constructor (GType type,
-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;
@@ -1013,6 +1026,28 @@ gtk_file_chooser_button_hide (GtkWidget *widget)
(*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)
@@ -2060,7 +2095,15 @@ static void
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