[gnome-builder] project-selector: keep windows open until new workbench opens
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] project-selector: keep windows open until new workbench opens
- Date: Wed, 15 Apr 2015 19:31:07 +0000 (UTC)
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]