[gnome-builder] buffer: Allow buffers to be loaded without displaying them
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] buffer: Allow buffers to be loaded without displaying them
- Date: Fri, 17 Jun 2016 18:58:53 +0000 (UTC)
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]