[gnome-builder] buffer: Allow buffers to be loaded without displaying them



commit 0a4f850c673b76a6531db8afb5141c87e9a9a26d
Author: Matthew Leeds <mleeds redhat com>
Date:   Fri Jun 10 21:12:08 2016 -0400

    buffer: Allow buffers to be loaded without displaying them
    
    In order for :vsplit <file> to work, the buffer has to be loaded in a
    separate IdeLayoutStack rather than the normal way of adding an
    IdeEditorView to the existing stack. This commit adds a parameter to
    ide_workbench_open_files_async and the functions further down the call
    stack so that buffers can be loaded without immediately displaying them
    to the user. Instead, a callback will be used to load the buffer when
    the split is created.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=767540

 libide/buffers/ide-buffer-manager.c            |   30 ++++++----
 libide/buffers/ide-buffer-manager.h            |    2 +
 libide/editor/ide-editor-perspective.c         |    9 ++-
 libide/editor/ide-editor-view-actions.c        |    9 +++-
 libide/editor/ide-editor-workbench-addin.c     |   41 ++++++++++---
 libide/ide-context.c                           |    5 ++
 libide/ide-workbench-addin.h                   |   79 ++++++++++++++++++++++++
 libide/workbench/ide-layout-stack.c            |    4 +-
 libide/workbench/ide-workbench-actions.c       |    4 +-
 libide/workbench/ide-workbench-addin.c         |   15 +++--
 libide/workbench/ide-workbench-open.c          |   47 ++++++++++----
 libide/workbench/ide-workbench.h               |    8 +++
 plugins/build-tools/gbp-build-panel.c          |    4 +-
 plugins/command-bar/gb-vim.c                   |    4 +-
 plugins/file-search/gb-file-search-provider.c  |    4 +-
 plugins/project-tree/gb-project-tree-actions.c |   15 ++++-
 plugins/project-tree/gb-project-tree-builder.c |    4 +-
 tests/test-ide-buffer-manager.c                |    3 +
 tests/test-ide-buffer.c                        |    3 +
 19 files changed, 237 insertions(+), 53 deletions(-)
---
diff --git a/libide/buffers/ide-buffer-manager.c b/libide/buffers/ide-buffer-manager.c
index 917edfc..0660e20 100644
--- a/libide/buffers/ide-buffer-manager.c
+++ b/libide/buffers/ide-buffer-manager.c
@@ -68,11 +68,12 @@ typedef struct
 
 typedef struct
 {
-  IdeBuffer           *buffer;
-  IdeFile             *file;
-  IdeProgress         *progress;
-  GtkSourceFileLoader *loader;
-  guint                is_new : 1;
+  IdeBuffer            *buffer;
+  IdeFile              *file;
+  IdeProgress          *progress;
+  GtkSourceFileLoader  *loader;
+  guint                 is_new : 1;
+  IdeWorkbenchOpenFlags flags;
 } LoadState;
 
 typedef struct
@@ -594,6 +595,7 @@ ide_buffer_manager__load_file_query_info_cb (GObject      *object,
   LoadState *state;
   GError *error = NULL;
   gsize size = 0;
+  gboolean create_new_view;
 
   IDE_ENTRY;
 
@@ -649,7 +651,8 @@ ide_buffer_manager__load_file_query_info_cb (GObject      *object,
       _ide_buffer_set_mtime (state->buffer, &tv);
     }
 
-  g_signal_emit (self, signals [LOAD_BUFFER], 0, state->buffer, !state->is_new);
+  create_new_view = (state->flags & WORKBENCH_OPEN_FLAGS_BG) ? FALSE : state->is_new;
+  g_signal_emit (self, signals [LOAD_BUFFER], 0, state->buffer, create_new_view);
 
   gtk_source_file_loader_load_async (state->loader,
                                      G_PRIORITY_DEFAULT,
@@ -725,6 +728,7 @@ void
 ide_buffer_manager_load_file_async (IdeBufferManager     *self,
                                     IdeFile              *file,
                                     gboolean              force_reload,
+                                    IdeWorkbenchOpenFlags flags,
                                     IdeProgress         **progress,
                                     GCancellable         *cancellable,
                                     GAsyncReadyCallback   callback,
@@ -762,7 +766,8 @@ ide_buffer_manager_load_file_async (IdeBufferManager     *self,
                                   "fraction", 1.0,
                                   NULL);
       g_task_return_pointer (task, g_object_ref (buffer), g_object_unref);
-      ide_buffer_manager_set_focus_buffer (self, buffer);
+      if (!(flags & WORKBENCH_OPEN_FLAGS_BG))
+        ide_buffer_manager_set_focus_buffer (self, buffer);
       IDE_EXIT;
     }
 
@@ -770,6 +775,7 @@ ide_buffer_manager_load_file_async (IdeBufferManager     *self,
   state->is_new = (buffer == NULL);
   state->file = g_object_ref (file);
   state->progress = ide_progress_new ();
+  state->flags = flags;
 
   if (buffer)
     {
@@ -1394,14 +1400,14 @@ ide_buffer_manager_class_init (IdeBufferManagerClass *klass)
   /**
    * IdeBufferManager::load-buffer:
    * @self: An #IdeBufferManager.
-   * @buffer: an #IdeBuffer.
-   * @reloading: if the buffer is being reloaded
+   * @buffer: An #IdeBuffer.
+   * @create_new_view: Whether to create a new #IdeEditorView for the buffer.
    *
    * This signal is emitted when a request has been made to load a buffer from storage. You might
    * connect to this signal to be notified when loading of a buffer has begun.
    *
-   * If @reloading is %TRUE, then the buffer is being force-reloaded due to changes
-   * from the host file-system.
+   * If @create_new_view is %FALSE, then the buffer is probably being force-reloaded due to
+   * changes from the host file-system.
    */
   signals [LOAD_BUFFER] = g_signal_new ("load-buffer",
                                          G_TYPE_FROM_CLASS (klass),
@@ -1697,7 +1703,7 @@ ide_buffer_manager_create_temporary_buffer (IdeBufferManager *self)
                        NULL);
 
   g_signal_emit (self, signals [CREATE_BUFFER], 0, file, &buffer);
-  g_signal_emit (self, signals [LOAD_BUFFER], 0, buffer, FALSE);
+  g_signal_emit (self, signals [LOAD_BUFFER], 0, buffer, TRUE);
   ide_buffer_manager_add_buffer (self, buffer);
   g_signal_emit (self, signals [BUFFER_LOADED], 0, buffer);
 
diff --git a/libide/buffers/ide-buffer-manager.h b/libide/buffers/ide-buffer-manager.h
index b9c4689..9172b7e 100644
--- a/libide/buffers/ide-buffer-manager.h
+++ b/libide/buffers/ide-buffer-manager.h
@@ -23,6 +23,7 @@
 #include <gtksourceview/completion-providers/words/gtksourcecompletionwords.h>
 
 #include "ide-object.h"
+#include "ide-workbench.h"
 
 #include "files/ide-file.h"
 
@@ -37,6 +38,7 @@ IdeBuffer                *ide_buffer_manager_create_temporary_buffer
 void                      ide_buffer_manager_load_file_async     (IdeBufferManager     *self,
                                                                   IdeFile              *file,
                                                                   gboolean              force_reload,
+                                                                  IdeWorkbenchOpenFlags flags,
                                                                   IdeProgress         **progress,
                                                                   GCancellable         *cancellable,
                                                                   GAsyncReadyCallback   callback,
diff --git a/libide/editor/ide-editor-perspective.c b/libide/editor/ide-editor-perspective.c
index 33f555a..cfdce09 100644
--- a/libide/editor/ide-editor-perspective.c
+++ b/libide/editor/ide-editor-perspective.c
@@ -30,6 +30,7 @@
 #include "editor/ide-editor-view.h"
 #include "util/ide-gtk.h"
 #include "workbench/ide-layout-grid.h"
+#include "workbench/ide-workbench.h"
 #include "workbench/ide-workbench-header-bar.h"
 
 struct _IdeEditorPerspective
@@ -148,7 +149,7 @@ ide_editor_perspective_context_set (GtkWidget  *widget,
 static void
 ide_editor_perspective_load_buffer (IdeEditorPerspective *self,
                                     IdeBuffer            *buffer,
-                                    gboolean              reloading,
+                                    gboolean              create_new_view,
                                     IdeBufferManager     *buffer_manager)
 {
   IdeEditorView *view;
@@ -163,7 +164,7 @@ ide_editor_perspective_load_buffer (IdeEditorPerspective *self,
    * We only want to create a new view when the buffer is originally
    * created, not when it's reloaded.
    */
-  if (reloading)
+  if (!create_new_view)
     {
       ide_buffer_manager_set_focus_buffer (buffer_manager, buffer);
       return;
@@ -598,6 +599,7 @@ ide_editor_perspective_focus_location_full (IdeEditorPerspective *self,
       IdeBufferManager *bufmgr;
       IdeWorkbench *workbench;
       IdeContext *context;
+      IdeWorkbenchOpenFlags flags;
 
       workbench = ide_widget_get_workbench (GTK_WIDGET (self));
       context = ide_workbench_get_context (workbench);
@@ -607,9 +609,12 @@ ide_editor_perspective_focus_location_full (IdeEditorPerspective *self,
       state->self = g_object_ref (self);
       state->location = ide_source_location_ref (location);
 
+      flags = WORKBENCH_OPEN_FLAGS_NONE;
+
       ide_buffer_manager_load_file_async (bufmgr,
                                           lookup.file,
                                           FALSE,
+                                          flags,
                                           NULL,
                                           NULL,
                                           ide_editor_perspective_focus_location_cb,
diff --git a/libide/editor/ide-editor-view-actions.c b/libide/editor/ide-editor-view-actions.c
index 6fce05d..1489756 100644
--- a/libide/editor/ide-editor-view-actions.c
+++ b/libide/editor/ide-editor-view-actions.c
@@ -34,6 +34,7 @@
 #include "util/ide-gtk.h"
 #include "util/ide-progress.h"
 #include "vcs/ide-vcs.h"
+#include "workbench/ide-workbench.h"
 
 static void
 ide_editor_view_actions_source_view_notify (IdeSourceView *source_view,
@@ -517,10 +518,12 @@ find_other_file_cb (GObject      *object,
     {
       IdeWorkbench *workbench;
       GFile *gfile;
+      IdeWorkbenchOpenFlags flags;
 
       gfile = ide_file_get_file (ret);
       workbench = ide_widget_get_workbench (GTK_WIDGET (self));
-      ide_workbench_open_files_async (workbench, &gfile, 1, "editor", NULL, NULL, NULL);
+      flags = WORKBENCH_OPEN_FLAGS_NONE;
+      ide_workbench_open_files_async (workbench, &gfile, 1, "editor", flags, NULL, NULL, NULL);
     }
 }
 
@@ -581,6 +584,7 @@ ide_editor_view_actions_reload_buffer (GSimpleAction *action,
   IdeBufferManager *buffer_manager;
   IdeFile *file;
   g_autoptr(IdeProgress) progress = NULL;
+  IdeWorkbenchOpenFlags flags;
 
   g_assert (IDE_IS_EDITOR_VIEW (self));
 
@@ -592,9 +596,12 @@ ide_editor_view_actions_reload_buffer (GSimpleAction *action,
   gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (self->progress_bar), 0.0);
   gtk_widget_show (GTK_WIDGET (self->progress_bar));
 
+  flags = WORKBENCH_OPEN_FLAGS_NONE;
+
   ide_buffer_manager_load_file_async (buffer_manager,
                                       file,
                                       TRUE,
+                                      flags,
                                       &progress,
                                       NULL,
                                       ide_editor_view_actions_reload_buffer_cb,
diff --git a/libide/editor/ide-editor-workbench-addin.c b/libide/editor/ide-editor-workbench-addin.c
index 90a9c0a..f07ebea 100644
--- a/libide/editor/ide-editor-workbench-addin.c
+++ b/libide/editor/ide-editor-workbench-addin.c
@@ -29,6 +29,7 @@
 #include "editor/ide-editor-perspective.h"
 #include "editor/ide-editor-workbench-addin.h"
 #include "util/ide-gtk.h"
+#include "workbench/ide-workbench.h"
 #include "workbench/ide-workbench-header-bar.h"
 
 struct _IdeEditorWorkbenchAddin
@@ -39,6 +40,12 @@ struct _IdeEditorWorkbenchAddin
   IdeWorkbench         *workbench;
 };
 
+typedef struct
+{
+  IdeWorkbenchOpenFlags flags;
+  IdeUri               *uri;
+} OpenFileTaskData;
+
 static void ide_workbench_addin_iface_init (IdeWorkbenchAddinInterface *iface);
 
 G_DEFINE_TYPE_EXTENDED (IdeEditorWorkbenchAddin, ide_editor_workbench_addin, G_TYPE_OBJECT, 0,
@@ -46,6 +53,13 @@ G_DEFINE_TYPE_EXTENDED (IdeEditorWorkbenchAddin, ide_editor_workbench_addin, G_T
                                                ide_workbench_addin_iface_init))
 
 static void
+open_file_task_data_free (OpenFileTaskData *open_file_task_data)
+{
+  ide_uri_unref (open_file_task_data->uri);
+  g_slice_free (OpenFileTaskData, open_file_task_data);
+}
+
+static void
 ide_editor_workbench_addin_class_init (IdeEditorWorkbenchAddinClass *klass)
 {
 }
@@ -153,6 +167,7 @@ ide_editor_workbench_addin_open_cb (GObject      *object,
   g_autoptr(GTask) task = user_data;
   GError *error = NULL;
   const gchar *fragment;
+  OpenFileTaskData *open_file_task_data;
   IdeUri *uri;
 
   g_assert (IDE_IS_BUFFER_MANAGER (buffer_manager));
@@ -161,6 +176,8 @@ ide_editor_workbench_addin_open_cb (GObject      *object,
   self = g_task_get_source_object (task);
   g_assert (IDE_IS_EDITOR_WORKBENCH_ADDIN (self));
 
+  open_file_task_data = g_task_get_task_data (task);
+
   buffer = ide_buffer_manager_load_file_finish (buffer_manager, result, &error);
 
   if (buffer == NULL)
@@ -170,7 +187,7 @@ ide_editor_workbench_addin_open_cb (GObject      *object,
       return;
     }
 
-  uri = g_task_get_task_data (task);
+  uri = open_file_task_data->uri;
   fragment = ide_uri_get_fragment (uri);
 
   if (fragment != NULL)
@@ -187,23 +204,25 @@ ide_editor_workbench_addin_open_cb (GObject      *object,
         }
     }
 
-  if (self->perspective != NULL)
+  if (self->perspective != NULL && !(open_file_task_data->flags & WORKBENCH_OPEN_FLAGS_BG))
     ide_editor_perspective_focus_buffer_in_current_stack (self->perspective, buffer);
 
   g_task_return_boolean (task, TRUE);
 }
 
 static void
-ide_editor_workbench_addin_open_async (IdeWorkbenchAddin   *addin,
-                                       IdeUri              *uri,
-                                       const gchar         *content_type,
-                                       GCancellable        *cancellable,
-                                       GAsyncReadyCallback  callback,
-                                       gpointer             user_data)
+ide_editor_workbench_addin_open_async (IdeWorkbenchAddin    *addin,
+                                       IdeUri               *uri,
+                                       const gchar          *content_type,
+                                       IdeWorkbenchOpenFlags flags,
+                                       GCancellable         *cancellable,
+                                       GAsyncReadyCallback   callback,
+                                       gpointer              user_data)
 {
   IdeEditorWorkbenchAddin *self = (IdeEditorWorkbenchAddin *)addin;
   IdeBufferManager *buffer_manager;
   IdeContext *context;
+  OpenFileTaskData *open_file_task_data;
   g_autoptr(GTask) task = NULL;
   g_autoptr(IdeFile) ifile = NULL;
   g_autoptr(GFile) gfile = NULL;
@@ -214,7 +233,10 @@ ide_editor_workbench_addin_open_async (IdeWorkbenchAddin   *addin,
   g_assert (IDE_IS_WORKBENCH (self->workbench));
 
   task = g_task_new (self, cancellable, callback, user_data);
-  g_task_set_task_data (task, ide_uri_ref (uri), (GDestroyNotify)ide_uri_unref);
+  open_file_task_data = g_slice_new (OpenFileTaskData);
+  open_file_task_data->flags = flags;
+  open_file_task_data->uri = ide_uri_ref(uri);
+  g_task_set_task_data (task, open_file_task_data, (GDestroyNotify)open_file_task_data_free);
 
   context = ide_workbench_get_context (self->workbench);
   buffer_manager = ide_context_get_buffer_manager (context);
@@ -243,6 +265,7 @@ ide_editor_workbench_addin_open_async (IdeWorkbenchAddin   *addin,
   ide_buffer_manager_load_file_async (buffer_manager,
                                       ifile,
                                       FALSE,
+                                      flags,
                                       NULL,
                                       cancellable,
                                       ide_editor_workbench_addin_open_cb,
diff --git a/libide/ide-context.c b/libide/ide-context.c
index 79f574a..4ed78d2 100644
--- a/libide/ide-context.c
+++ b/libide/ide-context.c
@@ -49,6 +49,7 @@
 #include "util/ide-async-helper.h"
 #include "util/ide-settings.h"
 #include "vcs/ide-vcs.h"
+#include "workbench/ide-workbench.h"
 
 #define RESTORE_FILES_MAX_FILES 20
 
@@ -1898,6 +1899,7 @@ restore_in_idle (gpointer user_data)
   IdeContext *self;
   GPtrArray *ar;
   GFile *file;
+  IdeWorkbenchOpenFlags flags;
 
   g_assert (G_IS_TASK (task));
 
@@ -1919,9 +1921,12 @@ restore_in_idle (gpointer user_data)
   ifile = ide_project_get_project_file (self->project, file);
   g_ptr_array_remove_index (ar, ar->len - 1);
 
+  flags = WORKBENCH_OPEN_FLAGS_NONE;
+
   ide_buffer_manager_load_file_async (self->buffer_manager,
                                       ifile,
                                       FALSE,
+                                      flags,
                                       NULL,
                                       g_task_get_cancellable (task),
                                       ide_context_restore__load_file_cb,
diff --git a/libide/ide-workbench-addin.h b/libide/ide-workbench-addin.h
new file mode 100644
index 0000000..2cd35be
--- /dev/null
+++ b/libide/ide-workbench-addin.h
@@ -0,0 +1,79 @@
+/* ide-workbench-addin.h
+ *
+ * Copyright (C) 2015 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef IDE_WORKBENCH_ADDIN_H
+#define IDE_WORKBENCH_ADDIN_H
+
+#include "ide-uri.h"
+#include "ide-workbench.h"
+
+G_BEGIN_DECLS
+
+#define IDE_TYPE_WORKBENCH_ADDIN (ide_workbench_addin_get_type())
+
+G_DECLARE_INTERFACE (IdeWorkbenchAddin, ide_workbench_addin, IDE, WORKBENCH_ADDIN, GObject)
+
+struct _IdeWorkbenchAddinInterface
+{
+  GTypeInterface parent;
+
+  gchar    *(*get_id)      (IdeWorkbenchAddin    *self);
+  void      (*load)        (IdeWorkbenchAddin    *self,
+                            IdeWorkbench         *workbench);
+  void      (*unload)      (IdeWorkbenchAddin    *self,
+                            IdeWorkbench         *workbench);
+  gboolean  (*can_open)    (IdeWorkbenchAddin    *self,
+                            IdeUri               *uri,
+                            const gchar          *content_type,
+                            gint                 *priority);
+  void      (*open_async)  (IdeWorkbenchAddin    *self,
+                            IdeUri               *uri,
+                            const gchar          *content_type,
+                            IdeWorkbenchOpenFlags flags,
+                            GCancellable         *cancellable,
+                            GAsyncReadyCallback   callback,
+                            gpointer              user_data);
+  gboolean  (*open_finish) (IdeWorkbenchAddin    *self,
+                            GAsyncResult         *result,
+                            GError              **error);
+
+};
+
+gchar    *ide_workbench_addin_get_id      (IdeWorkbenchAddin    *self);
+void      ide_workbench_addin_load        (IdeWorkbenchAddin    *self,
+                                           IdeWorkbench         *workbench);
+void      ide_workbench_addin_unload      (IdeWorkbenchAddin    *self,
+                                           IdeWorkbench         *workbench);
+gboolean  ide_workbench_addin_can_open    (IdeWorkbenchAddin    *self,
+                                           IdeUri               *uri,
+                                           const gchar          *content_type,
+                                           gint                 *priority);
+void      ide_workbench_addin_open_async  (IdeWorkbenchAddin    *self,
+                                           IdeUri               *uri,
+                                           const gchar          *content_type,
+                                           IdeWorkbenchOpenFlags flags,
+                                           GCancellable         *cancellable,
+                                           GAsyncReadyCallback   callback,
+                                           gpointer              user_data);
+gboolean  ide_workbench_addin_open_finish (IdeWorkbenchAddin    *self,
+                                           GAsyncResult         *result,
+                                           GError              **error);
+
+G_END_DECLS
+
+#endif /* IDE_WORKBENCH_ADDIN_H */
diff --git a/libide/workbench/ide-layout-stack.c b/libide/workbench/ide-layout-stack.c
index 94f39dc..6c2eef0 100644
--- a/libide/workbench/ide-layout-stack.c
+++ b/libide/workbench/ide-layout-stack.c
@@ -172,6 +172,7 @@ navigate_to_cb (IdeLayoutStack     *self,
 {
   IdeWorkbench *workbench;
   IdeUri *uri;
+  IdeWorkbenchOpenFlags flags;
 
   g_assert (IDE_IS_LAYOUT_STACK (self));
   g_assert (IDE_IS_BACK_FORWARD_ITEM (item));
@@ -179,7 +180,8 @@ navigate_to_cb (IdeLayoutStack     *self,
 
   uri = ide_back_forward_item_get_uri (item);
   workbench = ide_widget_get_workbench (GTK_WIDGET (self));
-  ide_workbench_open_uri_async (workbench, uri, NULL, NULL, NULL, NULL);
+  flags = WORKBENCH_OPEN_FLAGS_NONE;
+  ide_workbench_open_uri_async (workbench, uri, NULL, flags, NULL, NULL, NULL);
 }
 
 static void
diff --git a/libide/workbench/ide-workbench-actions.c b/libide/workbench/ide-workbench-actions.c
index 7e11692..dbe486f 100644
--- a/libide/workbench/ide-workbench-actions.c
+++ b/libide/workbench/ide-workbench-actions.c
@@ -86,11 +86,13 @@ ide_workbench_actions_open_with_dialog (GSimpleAction *action,
   if (ret == GTK_RESPONSE_OK)
     {
       g_autoptr(GFile) file = NULL;
+      IdeWorkbenchOpenFlags flags;
 
       IDE_PROBE;
 
       file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
-      ide_workbench_open_files_async (self, &file, 1, NULL, NULL,
+      flags = WORKBENCH_OPEN_FLAGS_NONE;
+      ide_workbench_open_files_async (self, &file, 1, NULL, flags, NULL,
                                       ide_workbench_actions_open_with_dialog_cb,
                                       NULL);
     }
diff --git a/libide/workbench/ide-workbench-addin.c b/libide/workbench/ide-workbench-addin.c
index e3aee2f..95f02ca 100644
--- a/libide/workbench/ide-workbench-addin.c
+++ b/libide/workbench/ide-workbench-addin.c
@@ -137,12 +137,13 @@ ide_workbench_addin_can_open (IdeWorkbenchAddin *self,
 }
 
 void
-ide_workbench_addin_open_async (IdeWorkbenchAddin   *self,
-                                IdeUri              *uri,
-                                const gchar         *content_type,
-                                GCancellable        *cancellable,
-                                GAsyncReadyCallback  callback,
-                                gpointer             user_data)
+ide_workbench_addin_open_async (IdeWorkbenchAddin    *self,
+                                IdeUri               *uri,
+                                const gchar          *content_type,
+                                IdeWorkbenchOpenFlags flags,
+                                GCancellable         *cancellable,
+                                GAsyncReadyCallback   callback,
+                                gpointer              user_data)
 {
   g_return_if_fail (IDE_IS_WORKBENCH_ADDIN (self));
   g_return_if_fail (uri != NULL);
@@ -152,7 +153,7 @@ ide_workbench_addin_open_async (IdeWorkbenchAddin   *self,
       (IDE_WORKBENCH_ADDIN_GET_IFACE (self)->open_finish == NULL))
     g_return_if_reached ();
 
-  IDE_WORKBENCH_ADDIN_GET_IFACE (self)->open_async (self, uri, content_type, cancellable, callback, 
user_data);
+  IDE_WORKBENCH_ADDIN_GET_IFACE (self)->open_async (self, uri, content_type, flags, cancellable, callback, 
user_data);
 }
 
 gboolean
diff --git a/libide/workbench/ide-workbench-open.c b/libide/workbench/ide-workbench-open.c
index acfabcd..2aac48e 100644
--- a/libide/workbench/ide-workbench-open.c
+++ b/libide/workbench/ide-workbench-open.c
@@ -34,13 +34,14 @@ typedef struct
 
 typedef struct
 {
-  IdeWorkbench *self;
-  GTask        *task;
-  IdeUri       *uri;
-  GArray       *loaders;
-  gchar        *content_type;
-  gchar        *hint;
-  guint         did_collect : 1;
+  IdeWorkbench         *self;
+  GTask                *task;
+  IdeUri               *uri;
+  GArray               *loaders;
+  gchar                *content_type;
+  IdeWorkbenchOpenFlags flags;
+  gchar                *hint;
+  guint                 did_collect : 1;
 } IdeWorkbenchOpenUriState;
 
 typedef struct
@@ -195,6 +196,7 @@ ide_workbench_open_uri_try_next (IdeWorkbenchOpenUriState *open_uri_state)
   ide_workbench_addin_open_async (loader->addin,
                                   open_uri_state->uri,
                                   open_uri_state->content_type,
+                                  open_uri_state->flags,
                                   g_task_get_cancellable (open_uri_state->task),
                                   ide_workbench_open_uri_cb,
                                   open_uri_state);
@@ -270,12 +272,13 @@ ide_workbench_open_discover_content_type (IdeWorkbenchOpenUriState *open_uri_sta
 }
 
 void
-ide_workbench_open_uri_async (IdeWorkbench        *self,
-                              IdeUri              *uri,
-                              const gchar         *hint,
-                              GCancellable        *cancellable,
-                              GAsyncReadyCallback  callback,
-                              gpointer             user_data)
+ide_workbench_open_uri_async (IdeWorkbench         *self,
+                              IdeUri               *uri,
+                              const gchar          *hint,
+                              IdeWorkbenchOpenFlags flags,
+                              GCancellable         *cancellable,
+                              GAsyncReadyCallback   callback,
+                              gpointer              user_data)
 {
   IdeWorkbenchOpenUriState *open_uri_state;
 
@@ -290,6 +293,7 @@ ide_workbench_open_uri_async (IdeWorkbench        *self,
   open_uri_state->loaders = g_array_new (FALSE, FALSE, sizeof (IdeWorkbenchLoader));
   open_uri_state->task = g_task_new (self, cancellable, callback, user_data);
   open_uri_state->hint = g_strdup (hint);
+  open_uri_state->flags = flags;
 
   g_array_set_clear_func (open_uri_state->loaders,
                           ide_workbench_loader_destroy);
@@ -352,11 +356,27 @@ ide_workbench_open_files_cb (GObject      *object,
     }
 }
 
+/**
+ * ide_workbench_open_files_async:
+ * @self: An #IdeWorkbench.
+ * @files: An array of #GFile objects to be opened.
+ * @n_files: The number of files given.
+ * @hint: The id of an #IdeWorkbenchAddin that should be preferred as a loader.
+ * @flags: A #IdeWorkbenchOpenFlags (if WORKBENCH_OPEN_FLAGS_BG is set, the buffer is loaded
+ * but not made visible in the UI).
+ * @cancellable: A #GCancellable.
+ * @callback: A #GASyncReadyCallback.
+ * @user_data: A #gpointer to hold user data.
+ *
+ * Starts the process of loading the buffers for the given @files, possibly
+ * creating an #IdeEditorView for each depending on @flags.
+ */
 void
 ide_workbench_open_files_async (IdeWorkbench         *self,
                                 GFile               **files,
                                 guint                 n_files,
                                 const gchar          *hint,
+                                IdeWorkbenchOpenFlags flags,
                                 GCancellable         *cancellable,
                                 GAsyncReadyCallback   callback,
                                 gpointer              user_data)
@@ -395,6 +415,7 @@ ide_workbench_open_files_async (IdeWorkbench         *self,
       ide_workbench_open_uri_async (self,
                                     uri,
                                     hint,
+                                    flags,
                                     cancellable,
                                     ide_workbench_open_files_cb,
                                     open_files_state);
diff --git a/libide/workbench/ide-workbench.h b/libide/workbench/ide-workbench.h
index 9a18534..75b06ab 100644
--- a/libide/workbench/ide-workbench.h
+++ b/libide/workbench/ide-workbench.h
@@ -28,6 +28,12 @@
 
 G_BEGIN_DECLS
 
+typedef enum
+{
+  WORKBENCH_OPEN_FLAGS_NONE = 0,
+  WORKBENCH_OPEN_FLAGS_BG = 1
+} IdeWorkbenchOpenFlags;
+
 #define IDE_TYPE_WORKBENCH (ide_workbench_get_type())
 
 G_DECLARE_FINAL_TYPE (IdeWorkbench, ide_workbench, IDE, WORKBENCH, GtkApplicationWindow)
@@ -43,6 +49,7 @@ gboolean        ide_workbench_open_project_finish          (IdeWorkbench
 void            ide_workbench_open_uri_async               (IdeWorkbench         *self,
                                                             IdeUri               *uri,
                                                             const gchar          *hint,
+                                                            IdeWorkbenchOpenFlags flags,
                                                             GCancellable         *cancellable,
                                                             GAsyncReadyCallback   callback,
                                                             gpointer              user_data);
@@ -53,6 +60,7 @@ void            ide_workbench_open_files_async             (IdeWorkbench
                                                             GFile               **files,
                                                             guint                 n_files,
                                                             const gchar          *hint,
+                                                            IdeWorkbenchOpenFlags flags,
                                                             GCancellable         *cancellable,
                                                             GAsyncReadyCallback   callback,
                                                             gpointer              user_data);
diff --git a/plugins/build-tools/gbp-build-panel.c b/plugins/build-tools/gbp-build-panel.c
index 81e6c02..21a2bfb 100644
--- a/plugins/build-tools/gbp-build-panel.c
+++ b/plugins/build-tools/gbp-build-panel.c
@@ -301,6 +301,7 @@ gbp_build_panel_diagnostic_activated (GbpBuildPanel *self,
   IdeDiagnostic *diagnostic;
   IdeSourceLocation *loc;
   IdeWorkbench *workbench;
+  IdeWorkbenchOpenFlags flags;
 
   g_assert (GBP_IS_BUILD_PANEL (self));
   g_assert (GTK_IS_LIST_BOX_ROW (row));
@@ -319,7 +320,8 @@ gbp_build_panel_diagnostic_activated (GbpBuildPanel *self,
     return;
 
   workbench = ide_widget_get_workbench (GTK_WIDGET (self));
-  ide_workbench_open_uri_async (workbench, uri, "editor", NULL, NULL, NULL);
+  flags = WORKBENCH_OPEN_FLAGS_NONE;
+  ide_workbench_open_uri_async (workbench, uri, "editor", flags, NULL, NULL, NULL);
 }
 
 static void
diff --git a/plugins/command-bar/gb-vim.c b/plugins/command-bar/gb-vim.c
index 16c012b..fd3c7ff 100644
--- a/plugins/command-bar/gb-vim.c
+++ b/plugins/command-bar/gb-vim.c
@@ -441,6 +441,7 @@ gb_vim_command_edit (GtkWidget      *active_widget,
   IdeVcs *vcs;
   GFile *workdir;
   GFile *file = NULL;
+  IdeWorkbenchOpenFlags flags;
 
   g_assert (GTK_IS_WIDGET (active_widget));
 
@@ -467,7 +468,8 @@ gb_vim_command_edit (GtkWidget      *active_widget,
   else
     file = g_file_get_child (workdir, options);
 
-  ide_workbench_open_files_async (workbench, &file, 1, "editor", NULL, NULL, NULL);
+  flags = WORKBENCH_OPEN_FLAGS_NONE;
+  ide_workbench_open_files_async (workbench, &file, 1, "editor", flags, NULL, NULL, NULL);
 
   g_clear_object (&file);
 
diff --git a/plugins/file-search/gb-file-search-provider.c b/plugins/file-search/gb-file-search-provider.c
index cac5369..7bfe125 100644
--- a/plugins/file-search/gb-file-search-provider.c
+++ b/plugins/file-search/gb-file-search-provider.c
@@ -226,14 +226,16 @@ gb_file_search_provider_activate (IdeSearchProvider *provider,
       IdeContext *context;
       IdeVcs *vcs;
       GFile *workdir;
+      IdeWorkbenchOpenFlags flags;
 
       context = ide_workbench_get_context (IDE_WORKBENCH (toplevel));
       vcs = ide_context_get_vcs (context);
       workdir = ide_vcs_get_working_directory (vcs);
       g_object_get (result, "path", &path, NULL);
       file = g_file_get_child (workdir, path);
+      flags = WORKBENCH_OPEN_FLAGS_NONE;
 
-      ide_workbench_open_files_async (IDE_WORKBENCH (toplevel), &file, 1, NULL, NULL, NULL, NULL);
+      ide_workbench_open_files_async (IDE_WORKBENCH (toplevel), &file, 1, NULL, flags, NULL, NULL, NULL);
     }
 }
 
diff --git a/plugins/project-tree/gb-project-tree-actions.c b/plugins/project-tree/gb-project-tree-actions.c
index 548fcdf..716ab6b 100644
--- a/plugins/project-tree/gb-project-tree-actions.c
+++ b/plugins/project-tree/gb-project-tree-actions.c
@@ -132,6 +132,7 @@ gb_project_tree_actions_open (GSimpleAction *action,
     {
       GFileInfo *file_info;
       GFile *file;
+      IdeWorkbenchOpenFlags flags;
 
       file_info = gb_project_file_get_file_info (GB_PROJECT_FILE (item));
       if (!file_info)
@@ -144,7 +145,9 @@ gb_project_tree_actions_open (GSimpleAction *action,
       if (!file)
         return;
 
-      ide_workbench_open_files_async (workbench, &file, 1, NULL, NULL, NULL, NULL);
+      flags = WORKBENCH_OPEN_FLAGS_NONE;
+
+      ide_workbench_open_files_async (workbench, &file, 1, NULL, flags, NULL, NULL, NULL);
     }
 }
 
@@ -197,6 +200,7 @@ gb_project_tree_actions_open_with_editor (GSimpleAction *action,
   GFile *file;
   IdeTreeNode *selected;
   GObject *item;
+  IdeWorkbenchOpenFlags flags;
 
   g_assert (GB_IS_PROJECT_TREE (self));
 
@@ -209,7 +213,9 @@ gb_project_tree_actions_open_with_editor (GSimpleAction *action,
       !(workbench = ide_widget_get_workbench (GTK_WIDGET (self))))
     return;
 
-  ide_workbench_open_files_async (workbench, &file, 1, "editor", NULL, NULL, NULL);
+  flags = WORKBENCH_OPEN_FLAGS_NONE;
+
+  ide_workbench_open_files_async (workbench, &file, 1, "editor", flags, NULL, NULL, NULL);
 }
 
 static void
@@ -380,6 +386,7 @@ gb_project_tree_actions__create_cb (GObject      *object,
   g_autoptr(GError) error = NULL;
   GbProjectTree *self;
   IdeWorkbench *workbench;
+  IdeWorkbenchOpenFlags flags;
 
   g_assert (G_IS_FILE (file));
   g_assert (IDE_IS_TREE_NODE (node));
@@ -398,7 +405,9 @@ gb_project_tree_actions__create_cb (GObject      *object,
   if (workbench == NULL)
     return;
 
-  ide_workbench_open_files_async (workbench, &file, 1, NULL, NULL, NULL, NULL);
+  flags = WORKBENCH_OPEN_FLAGS_NONE;
+
+  ide_workbench_open_files_async (workbench, &file, 1, NULL, flags, NULL, NULL, NULL);
 
   ide_tree_node_invalidate (node);
   ide_tree_node_expand (node, FALSE);
diff --git a/plugins/project-tree/gb-project-tree-builder.c b/plugins/project-tree/gb-project-tree-builder.c
index fdf633a..c972d18 100644
--- a/plugins/project-tree/gb-project-tree-builder.c
+++ b/plugins/project-tree/gb-project-tree-builder.c
@@ -329,6 +329,7 @@ gb_project_tree_builder_node_activated (IdeTreeBuilder *builder,
       GtkWidget *workbench;
       IdeTree *tree;
       GFile *file;
+      IdeWorkbenchOpenFlags flags;
 
       if (gb_project_file_get_is_directory (GB_PROJECT_FILE (item)))
         goto failure;
@@ -342,7 +343,8 @@ gb_project_tree_builder_node_activated (IdeTreeBuilder *builder,
         goto failure;
 
       workbench = gtk_widget_get_ancestor (GTK_WIDGET (tree), IDE_TYPE_WORKBENCH);
-      ide_workbench_open_files_async (IDE_WORKBENCH (workbench), &file, 1, NULL, NULL, NULL, NULL);
+      flags = WORKBENCH_OPEN_FLAGS_NONE;
+      ide_workbench_open_files_async (IDE_WORKBENCH (workbench), &file, 1, NULL, flags, NULL, NULL, NULL);
 
       return TRUE;
     }
diff --git a/tests/test-ide-buffer-manager.c b/tests/test-ide-buffer-manager.c
index e81a42e..aaa7412 100644
--- a/tests/test-ide-buffer-manager.c
+++ b/tests/test-ide-buffer-manager.c
@@ -122,6 +122,7 @@ test_buffer_manager_basic_cb1 (GObject      *object,
   IdeProject *project;
   g_autofree gchar *path = NULL;
   GError *error = NULL;
+  IdeWorkbenchOpenFlags flags;
 
   context = ide_context_new_finish (result, &error);
   g_assert_no_error (error);
@@ -135,10 +136,12 @@ test_buffer_manager_basic_cb1 (GObject      *object,
 
   path = g_build_filename (g_get_current_dir (), TEST_DATA_DIR, "project1", "configure.ac", NULL);
   file = ide_project_get_file_for_path (project, path);
+  flags = WORKBENCH_OPEN_FLAGS_NONE;
 
   ide_buffer_manager_load_file_async (buffer_manager,
                                       file,
                                       FALSE,
+                                      flags,
                                       &progress,
                                       g_task_get_cancellable (task),
                                       test_buffer_manager_basic_cb2,
diff --git a/tests/test-ide-buffer.c b/tests/test-ide-buffer.c
index 1c86246..9b862f6 100644
--- a/tests/test-ide-buffer.c
+++ b/tests/test-ide-buffer.c
@@ -86,6 +86,7 @@ test_buffer_basic_cb1 (GObject      *object,
   IdeBufferManager *manager;
   IdeProject *project;
   GError *error = NULL;
+  IdeWorkbenchOpenFlags flags;
 
   IDE_ENTRY;
 
@@ -97,10 +98,12 @@ test_buffer_basic_cb1 (GObject      *object,
   manager = ide_context_get_buffer_manager (context);
   project = ide_context_get_project (context);
   file = ide_project_get_file_for_path (project, "test-ide-buffer.tmp");
+  flags = WORKBENCH_OPEN_FLAGS_NONE;
 
   ide_buffer_manager_load_file_async (manager,
                                       file,
                                       FALSE,
+                                      flags,
                                       NULL,
                                       g_task_get_cancellable (task),
                                       test_buffer_basic_cb2,



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