[gnome-builder] project-selector: keep windows open until new workbench opens



commit 3ef828cb25986e7c47388f81eb87ccd9925741dd
Author: Christian Hergert <christian hergert me>
Date:   Wed Apr 15 12:31:01 2015 -0700

    project-selector: keep windows open until new workbench opens
    
    It was kind of jarring to have the dialog disappear before the workbench
    would show up. Especially since we need to start reporting feedback error
    messages in the not-too-distant future.
    
    Additionally, I think it was causing weird states in the shell on
    3.14.x+jhbuild setups.

 src/app/gb-application-actions.c |   26 ++++++++++++++++++++++++--
 src/app/gb-application.c         |   33 +++++++++++++++++++++++++++------
 src/app/gb-application.h         |   14 ++++++++++----
 src/dialogs/gb-projects-dialog.c |   34 +++++++++++++++++++++++++++++-----
 4 files changed, 90 insertions(+), 17 deletions(-)
---
diff --git a/src/app/gb-application-actions.c b/src/app/gb-application-actions.c
index a4b2428..9aa5749 100644
--- a/src/app/gb-application-actions.c
+++ b/src/app/gb-application-actions.c
@@ -185,6 +185,27 @@ gb_application_actions_open_project (GSimpleAction *action,
 }
 
 static void
+gb_application_actions_open_project_cb (GObject      *object,
+                                        GAsyncResult *result,
+                                        gpointer      user_data)
+{
+  GbApplication *self = (GbApplication *)object;
+  g_autoptr(GbNewProjectDialog) window = user_data;
+  g_autoptr(GError) error = NULL;
+
+  g_assert (GB_IS_NEW_PROJECT_DIALOG (window));
+
+  if (!gb_application_open_project_finish (self, result, &error))
+    {
+      /* todo: warning message */
+      g_warning ("%s", error->message);
+    }
+
+  gtk_widget_hide (GTK_WIDGET (window));
+  gtk_widget_destroy (GTK_WIDGET (window));
+}
+
+static void
 gb_application_actions__window_open_project (GbApplication      *self,
                                              GFile              *project_file,
                                              GbNewProjectDialog *window)
@@ -193,8 +214,9 @@ gb_application_actions__window_open_project (GbApplication      *self,
   g_assert (G_IS_FILE (project_file));
   g_assert (GB_IS_NEW_PROJECT_DIALOG (window));
 
-  gb_application_open_project (self, project_file, NULL);
-  gtk_widget_destroy (GTK_WIDGET (window));
+  gb_application_open_project_async (self, project_file, NULL, NULL,
+                                     gb_application_actions_open_project_cb,
+                                     g_object_ref (window));
 }
 
 static void
diff --git a/src/app/gb-application.c b/src/app/gb-application.c
index e723b10..23d4425 100644
--- a/src/app/gb-application.c
+++ b/src/app/gb-application.c
@@ -252,6 +252,7 @@ gb_application__context_new_cb (GObject      *object,
   GbWorkbench *workbench;
   GtkRequisition req;
   GPtrArray *ar;
+  gboolean ret = FALSE;
   GError *error = NULL;
   gsize i;
 
@@ -312,16 +313,21 @@ gb_application__context_new_cb (GObject      *object,
   gtk_window_maximize (GTK_WINDOW (workbench));
   gtk_window_present (GTK_WINDOW (workbench));
 
+  ret = TRUE;
+
 cleanup:
-  g_task_return_boolean (task, FALSE);
+  g_task_return_boolean (task, ret);
   g_application_unmark_busy (G_APPLICATION (self));
   g_application_release (G_APPLICATION (self));
 }
 
 void
-gb_application_open_project (GbApplication *self,
-                             GFile         *file,
-                             GPtrArray     *additional_files)
+gb_application_open_project_async (GbApplication       *self,
+                                   GFile               *file,
+                                   GPtrArray           *additional_files,
+                                   GCancellable        *cancellable,
+                                   GAsyncReadyCallback  callback,
+                                   gpointer             user_data)
 {
   g_autoptr(GFile) directory = NULL;
   g_autoptr(GTask) task = NULL;
@@ -331,6 +337,7 @@ gb_application_open_project (GbApplication *self,
 
   g_return_if_fail (GB_IS_APPLICATION (self));
   g_return_if_fail (G_IS_FILE (file));
+  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
 
   windows = gtk_application_get_windows (GTK_APPLICATION (self));
 
@@ -357,7 +364,7 @@ gb_application_open_project (GbApplication *self,
         }
     }
 
-  task = g_task_new (self, NULL, NULL, NULL);
+  task = g_task_new (self, cancellable, callback, user_data);
 
   if (additional_files)
     ar = g_ptr_array_ref (additional_files);
@@ -380,6 +387,20 @@ gb_application_open_project (GbApplication *self,
                          g_object_ref (task));
 }
 
+gboolean
+gb_application_open_project_finish (GbApplication  *self,
+                                    GAsyncResult   *result,
+                                    GError        **error)
+{
+  GTask *task = (GTask *)result;
+
+  g_return_val_if_fail (GB_IS_APPLICATION (self), FALSE);
+  g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
+  g_return_val_if_fail (G_IS_TASK (task), FALSE);
+
+  return g_task_propagate_boolean (task, error);
+}
+
 static void
 gb_application_open (GApplication   *application,
                      GFile         **files,
@@ -425,7 +446,7 @@ gb_application_open (GApplication   *application,
     {
       GFile *file = g_ptr_array_index (ar, 0);
 
-      gb_application_open_project (self, file, ar);
+      gb_application_open_project_async (self, file, ar, NULL, NULL, NULL);
     }
 
   IDE_EXIT;
diff --git a/src/app/gb-application.h b/src/app/gb-application.h
index 757541b..b4557bd 100644
--- a/src/app/gb-application.h
+++ b/src/app/gb-application.h
@@ -27,10 +27,16 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (GbApplication, gb_application, GB, APPLICATION, GtkApplication)
 
-void gb_application_open_project         (GbApplication *self,
-                                          GFile         *file,
-                                          GPtrArray     *additional_files);
-void gb_application_show_projects_window (GbApplication *self);
+void     gb_application_open_project_async   (GbApplication        *self,
+                                              GFile                *file,
+                                              GPtrArray            *additional_files,
+                                              GCancellable         *cancellable,
+                                              GAsyncReadyCallback   callback,
+                                              gpointer              user_data);
+gboolean gb_application_open_project_finish  (GbApplication        *self,
+                                              GAsyncResult         *result,
+                                              GError              **error);
+void     gb_application_show_projects_window (GbApplication        *self);
 
 G_END_DECLS
 
diff --git a/src/dialogs/gb-projects-dialog.c b/src/dialogs/gb-projects-dialog.c
index 5d8e138..8d8ed4c 100644
--- a/src/dialogs/gb-projects-dialog.c
+++ b/src/dialogs/gb-projects-dialog.c
@@ -80,6 +80,27 @@ gb_projects_dialog_update_delete_sensitivity (GbProjectsDialog *self)
 }
 
 static void
+gb_projects_dialog__app_open_project_cb (GObject      *object,
+                                         GAsyncResult *result,
+                                         gpointer      user_data)
+{
+  GbApplication *app = (GbApplication *)object;
+  g_autoptr(GError) error = NULL;
+  g_autoptr(GbProjectsDialog) self = user_data;
+
+  g_assert (GB_IS_APPLICATION (app));
+
+  if (!gb_application_open_project_finish (app, result, &error))
+    {
+      /* todo: error message dialog */
+      g_warning ("%s", error->message);
+    }
+
+  gtk_widget_hide (GTK_WIDGET (self));
+  gtk_widget_destroy (GTK_WIDGET (self));
+}
+
+static void
 gb_projects_dialog__listbox_row_activated_cb (GbProjectsDialog *self,
                                               GtkListBoxRow    *row,
                                               GtkListBox       *listbox)
@@ -110,9 +131,9 @@ gb_projects_dialog__listbox_row_activated_cb (GbProjectsDialog *self,
   app = g_application_get_default ();
   file = ide_project_info_get_file (project_info);
 
-  gb_application_open_project (GB_APPLICATION (app), file, NULL);
-
-  gtk_widget_destroy (GTK_WIDGET (self));
+  gb_application_open_project_async (GB_APPLICATION (app), file, NULL, NULL,
+                                     gb_projects_dialog__app_open_project_cb,
+                                     g_object_ref (self));
 }
 
 static void
@@ -345,9 +366,12 @@ gb_projects_dialog__window_open_project (GbProjectsDialog   *self,
   g_assert (GB_IS_NEW_PROJECT_DIALOG (dialog));
   g_assert (GB_IS_APPLICATION (app));
 
-  gb_application_open_project (GB_APPLICATION (app), project_file, NULL);
+  gb_application_open_project_async (GB_APPLICATION (app), project_file, NULL, NULL,
+                                     gb_projects_dialog__app_open_project_cb,
+                                     g_object_ref (self));
+
+  gtk_widget_hide (GTK_WIDGET (dialog));
   gtk_widget_destroy (GTK_WIDGET (dialog));
-  gtk_widget_destroy (GTK_WIDGET (self));
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]