summaryrefslogtreecommitdiff
path: root/gtk/gtkfilechooserdialog.c
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@ximian.com>2004-12-15 01:37:41 +0000
committerFederico Mena Quintero <federico@src.gnome.org>2004-12-15 01:37:41 +0000
commit9f558a1540603428e1735a32bdc00c7a67dedc45 (patch)
tree8fbcaab30fa53e75dd7f4918b93c092772893795 /gtk/gtkfilechooserdialog.c
parentfaa58ba49c9f4f2c5dca18ac0abbbbdbb1cd685d (diff)
downloadgtk+-9f558a1540603428e1735a32bdc00c7a67dedc45.tar.gz
Merged from gtk-2-4:
2004-12-14 Federico Mena Quintero <federico@ximian.com> Merged from gtk-2-4: Fix #145470: * gtk/gtkfilechooserdefault.c (gtk_file_chooser_default_initial_focus): Queue a pending operation to select the first row if we are not finished loading yet. (gtk_file_chooser_default_class_init): Override GtkWidget::map(). (gtk_file_chooser_default_map): New ::map() handler; refresh the file and bookmark lists. * gtk/gtkfilechooserdialog.c (gtk_file_chooser_dialog_class_init): Override GtkWidget::map() and GtkWidget::unmap(). (gtk_file_chooser_dialog_constructor): Don't call initial_focus() here. (gtk_file_chooser_dialog_map): Map the file chooser widget if needed. Call initial_focus() here. (gtk_file_chooser_dialog_unmap): Unmap the file chooser widget. When we are re-mapped, the widget will get mapped as well and it will have a chance to refresh.
Diffstat (limited to 'gtk/gtkfilechooserdialog.c')
-rw-r--r--gtk/gtkfilechooserdialog.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/gtk/gtkfilechooserdialog.c b/gtk/gtkfilechooserdialog.c
index 83c8ebe290..381f87203f 100644
--- a/gtk/gtkfilechooserdialog.c
+++ b/gtk/gtkfilechooserdialog.c
@@ -60,6 +60,8 @@ static void gtk_file_chooser_dialog_get_property (GObject *obj
GValue *value,
GParamSpec *pspec);
+static void gtk_file_chooser_dialog_map (GtkWidget *widget);
+static void gtk_file_chooser_dialog_unmap (GtkWidget *widget);
static void gtk_file_chooser_dialog_style_set (GtkWidget *widget,
GtkStyle *previous_style);
@@ -118,6 +120,8 @@ gtk_file_chooser_dialog_class_init (GtkFileChooserDialogClass *class)
gobject_class->get_property = gtk_file_chooser_dialog_get_property;
gobject_class->finalize = gtk_file_chooser_dialog_finalize;
+ widget_class->map = gtk_file_chooser_dialog_map;
+ widget_class->unmap = gtk_file_chooser_dialog_unmap;
widget_class->style_set = gtk_file_chooser_dialog_style_set;
_gtk_file_chooser_install_properties (gobject_class);
@@ -397,8 +401,6 @@ gtk_file_chooser_dialog_constructor (GType type,
_gtk_file_chooser_set_delegate (GTK_FILE_CHOOSER (object),
GTK_FILE_CHOOSER (priv->widget));
- _gtk_file_chooser_embed_initial_focus (GTK_FILE_CHOOSER_EMBED (priv->widget));
-
gtk_widget_pop_composite_child ();
return object;
@@ -487,6 +489,39 @@ set_default_size (GtkFileChooserDialog *dialog)
}
#endif
+/* GtkWidget::map handler */
+static void
+gtk_file_chooser_dialog_map (GtkWidget *widget)
+{
+ GtkFileChooserDialog *dialog = GTK_FILE_CHOOSER_DIALOG (widget);
+ GtkFileChooserDialogPrivate *priv = GTK_FILE_CHOOSER_DIALOG_GET_PRIVATE (dialog);
+
+ if (!GTK_WIDGET_MAPPED (priv->widget))
+ gtk_widget_map (priv->widget);
+
+ GTK_WIDGET_CLASS (parent_class)->map (widget);
+
+ _gtk_file_chooser_embed_initial_focus (GTK_FILE_CHOOSER_EMBED (priv->widget));
+}
+
+/* GtkWidget::unmap handler */
+static void
+gtk_file_chooser_dialog_unmap (GtkWidget *widget)
+{
+ GtkFileChooserDialog *dialog = GTK_FILE_CHOOSER_DIALOG (widget);
+ GtkFileChooserDialogPrivate *priv = GTK_FILE_CHOOSER_DIALOG_GET_PRIVATE (dialog);
+
+ GTK_WIDGET_CLASS (parent_class)->unmap (widget);
+
+ /* See bug #145470. We unmap the GtkFileChooserWidget so that if the dialog
+ * is remapped, the widget will be remapped as well. Implementations should
+ * refresh their contents when this happens, as some applications keep a
+ * single file chooser alive and map/unmap it as needed, rather than creating
+ * a new file chooser every time they need one.
+ */
+ gtk_widget_unmap (priv->widget);
+}
+
static void
gtk_file_chooser_dialog_style_set (GtkWidget *widget,
GtkStyle *previous_style)