[libdazzle/libdazzle-3-26] file-chooser-entry: be lazy with dialog construction
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libdazzle/libdazzle-3-26] file-chooser-entry: be lazy with dialog construction
- Date: Tue, 3 Oct 2017 20:54:31 +0000 (UTC)
commit 10ec62d7f056ef16e8cbe19f9139663f3f9e6f6a
Author: Christian Hergert <chergert redhat com>
Date: Wed Sep 20 03:20:16 2017 -0700
file-chooser-entry: be lazy with dialog construction
Creating the dialog up front takes resources since it involves
parsing various site specific data. Instead, we should just
delay this work until the entry button has been clicked (if
ever).
src/widgets/dzl-file-chooser-entry.c | 95 +++++++++++++++-------------------
1 files changed, 42 insertions(+), 53 deletions(-)
---
diff --git a/src/widgets/dzl-file-chooser-entry.c b/src/widgets/dzl-file-chooser-entry.c
index 57f8bbb..47ded17 100644
--- a/src/widgets/dzl-file-chooser-entry.c
+++ b/src/widgets/dzl-file-chooser-entry.c
@@ -30,6 +30,7 @@ typedef struct
GtkFileChooserDialog *dialog;
GtkFileFilter *filter;
GFile *file;
+ gchar *title;
GtkFileChooserAction action;
@@ -81,6 +82,7 @@ dzl_file_chooser_entry_sync_to_dialog (DzlFileChooserEntry *self)
"local-only", priv->local_only,
"show-hidden", priv->show_hidden,
"filter", priv->filter,
+ "title", priv->title,
NULL);
if (priv->file != NULL)
@@ -117,45 +119,56 @@ dzl_file_chooser_entry_sync_to_dialog (DzlFileChooserEntry *self)
}
}
-static gboolean
-dzl_file_chooser_entry_dialog_delete_event (DzlFileChooserEntry *self,
- GdkEvent *event,
- GtkFileChooserDialog *dialog)
+static void
+dzl_file_chooser_entry_dialog_response (DzlFileChooserEntry *self,
+ gint response_id,
+ GtkFileChooserDialog *dialog)
{
g_assert (DZL_IS_FILE_CHOOSER_ENTRY (self));
- g_assert (event != NULL);
g_assert (GTK_IS_FILE_CHOOSER_DIALOG (dialog));
- if (gtk_widget_in_destruction (GTK_WIDGET (self)))
- return GDK_EVENT_PROPAGATE;
+ if (response_id == GTK_RESPONSE_OK)
+ {
+ g_autoptr(GFile) file = NULL;
- gtk_widget_hide (GTK_WIDGET (dialog));
+ file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
+ if (file != NULL)
+ dzl_file_chooser_entry_set_file (self, file);
+ }
- return GDK_EVENT_STOP;
+ gtk_widget_destroy (GTK_WIDGET (dialog));
}
static void
-dzl_file_chooser_entry_dialog_response (DzlFileChooserEntry *self,
- gint response_id,
- GtkFileChooserDialog *dialog)
+dzl_file_chooser_entry_ensure_dialog (DzlFileChooserEntry *self)
{
- g_autoptr(GFile) file = NULL;
+ DzlFileChooserEntryPrivate *priv = dzl_file_chooser_entry_get_instance_private (self);
g_assert (DZL_IS_FILE_CHOOSER_ENTRY (self));
- g_assert (GTK_IS_FILE_CHOOSER_DIALOG (dialog));
- if (response_id == GTK_RESPONSE_CANCEL)
+ if (priv->dialog == NULL)
{
- gtk_widget_hide (GTK_WIDGET (dialog));
- return;
+ priv->dialog = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG,
+ "local-only", TRUE,
+ "modal", TRUE,
+ NULL);
+ g_signal_connect_object (priv->dialog,
+ "response",
+ G_CALLBACK (dzl_file_chooser_entry_dialog_response),
+ self,
+ G_CONNECT_SWAPPED);
+ g_signal_connect (priv->dialog,
+ "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &priv->dialog);
+ gtk_dialog_add_buttons (GTK_DIALOG (priv->dialog),
+ _("Cancel"), GTK_RESPONSE_CANCEL,
+ _("Open"), GTK_RESPONSE_OK,
+ NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (priv->dialog), GTK_RESPONSE_OK);
}
- file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
-
- if (file != NULL)
- dzl_file_chooser_entry_set_file (self, file);
-
- gtk_widget_hide (GTK_WIDGET (dialog));
+ dzl_file_chooser_entry_sync_to_dialog (self);
}
static void
@@ -167,10 +180,8 @@ dzl_file_chooser_entry_button_clicked (DzlFileChooserEntry *self,
g_assert (DZL_IS_FILE_CHOOSER_ENTRY (self));
g_assert (GTK_IS_BUTTON (button));
- dzl_file_chooser_entry_sync_to_dialog (self);
-
- if (priv->dialog != NULL)
- gtk_window_present (GTK_WINDOW (priv->dialog));
+ dzl_file_chooser_entry_ensure_dialog (self);
+ gtk_window_present (GTK_WINDOW (priv->dialog));
}
static GFile *
@@ -230,6 +241,7 @@ dzl_file_chooser_entry_finalize (GObject *object)
g_clear_object (&priv->file);
g_clear_object (&priv->filter);
+ g_clear_pointer (&priv->title, g_free);
G_OBJECT_CLASS (dzl_file_chooser_entry_parent_class)->finalize (object);
}
@@ -278,7 +290,7 @@ dzl_file_chooser_entry_get_property (GObject *object,
break;
case PROP_TITLE:
- g_value_set_string (value, gtk_window_get_title (GTK_WINDOW (priv->dialog)));
+ g_value_set_string (value, priv->title);
break;
default:
@@ -331,7 +343,8 @@ dzl_file_chooser_entry_set_property (GObject *object,
break;
case PROP_TITLE:
- gtk_window_set_title (GTK_WINDOW (priv->dialog), g_value_get_string (value));
+ g_free (priv->title);
+ priv->title = g_value_dup_string (value);
break;
default:
@@ -465,30 +478,6 @@ dzl_file_chooser_entry_init (DzlFileChooserEntry *self)
G_CALLBACK (gtk_widget_destroyed),
&priv->button);
gtk_container_add (GTK_CONTAINER (hbox), GTK_WIDGET (priv->button));
-
- priv->dialog = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG,
- "local-only", TRUE,
- "modal", TRUE,
- NULL);
- g_signal_connect_object (priv->dialog,
- "delete-event",
- G_CALLBACK (dzl_file_chooser_entry_dialog_delete_event),
- self,
- G_CONNECT_SWAPPED);
- g_signal_connect_object (priv->dialog,
- "response",
- G_CALLBACK (dzl_file_chooser_entry_dialog_response),
- self,
- G_CONNECT_SWAPPED);
- g_signal_connect (priv->dialog,
- "destroy",
- G_CALLBACK (gtk_widget_destroyed),
- &priv->dialog);
- gtk_dialog_add_buttons (GTK_DIALOG (priv->dialog),
- _("Cancel"), GTK_RESPONSE_CANCEL,
- _("Open"), GTK_RESPONSE_OK,
- NULL);
- gtk_dialog_set_default_response (GTK_DIALOG (priv->dialog), GTK_RESPONSE_OK);
}
static gchar *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]