[gnome-builder] gui: introduce IdeCommandManager



commit 9ca356e84794be764582abc636ea0d9260662226
Author: Christian Hergert <chergert redhat com>
Date:   Wed Aug 7 00:49:47 2019 -0700

    gui: introduce IdeCommandManager
    
    This extracts the command management and creation of providers into a new
    command provider class in libide-gui. Doing so allows us to keep them
    persistent across runs which can save some time while typing.
    
    It also allows us to potentially do some new things like map shortcuts
    to them in the not-distant-future.

 src/libide/gui/ide-command-manager.c               | 308 +++++++++++++++++++++
 src/libide/gui/ide-command-manager.h               |  48 ++++
 src/libide/gui/libide-gui.h                        |   1 +
 src/libide/gui/meson.build                         |   2 +
 .../command-bar/gbp-command-bar-command-provider.c |   4 +-
 .../command-bar/gbp-command-bar-command-provider.h |   2 +-
 src/plugins/command-bar/gbp-command-bar-model.c    | 257 -----------------
 src/plugins/command-bar/gbp-command-bar-model.h    |  42 ---
 src/plugins/command-bar/gbp-command-bar.c          |  78 ++++--
 src/plugins/command-bar/gbp-gaction-command.c      |  14 +
 src/plugins/command-bar/meson.build                |   1 -
 11 files changed, 430 insertions(+), 327 deletions(-)
---
diff --git a/src/libide/gui/ide-command-manager.c b/src/libide/gui/ide-command-manager.c
new file mode 100644
index 000000000..d2d2635fa
--- /dev/null
+++ b/src/libide/gui/ide-command-manager.c
@@ -0,0 +1,308 @@
+/* ide-command-manager.c
+ *
+ * Copyright 2019 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/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#define G_LOG_DOMAIN "ide-command-manager"
+
+#include "config.h"
+
+#include <libpeas/peas.h>
+#include <libide-plugins.h>
+#include <libide-threading.h>
+
+#include "ide-command.h"
+#include "ide-command-manager.h"
+#include "ide-command-provider.h"
+
+struct _IdeCommandManager
+{
+  IdeObject               parent_instance;
+  IdeExtensionSetAdapter *adapter;
+};
+
+typedef struct
+{
+  gchar        *typed_text;
+  GPtrArray    *results;
+  IdeWorkspace *workspace;
+  gint          n_active;
+} Query;
+
+G_DEFINE_TYPE (IdeCommandManager, ide_command_manager, IDE_TYPE_OBJECT)
+
+static void
+query_free (Query *q)
+{
+  g_assert (q->n_active == 0);
+  
+  g_clear_object (&q->workspace);
+  g_clear_pointer (&q->typed_text, g_free);
+  g_clear_pointer (&q->results, g_ptr_array_unref);
+  g_slice_free (Query, q);
+}
+
+static void
+ide_command_manager_provider_added_cb (IdeExtensionSetAdapter *set,
+                                       PeasPluginInfo         *plugin_info,
+                                       PeasExtension          *exten,
+                                       gpointer                user_data)
+{
+  IdeCommandProvider *provider = (IdeCommandProvider *)exten;
+  IdeCommandManager *self = user_data;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_EXTENSION_SET_ADAPTER (set));
+  g_assert (plugin_info != NULL);
+  g_assert (IDE_IS_COMMAND_PROVIDER (provider));
+  g_assert (IDE_IS_COMMAND_MANAGER (self));
+
+  g_debug ("Adding command provider %s", G_OBJECT_TYPE_NAME (exten));
+
+}
+
+static void
+ide_command_manager_provider_removed_cb (IdeExtensionSetAdapter *set,
+                                         PeasPluginInfo         *plugin_info,
+                                         PeasExtension          *exten,
+                                         gpointer                user_data)
+{
+  IdeCommandProvider *provider = (IdeCommandProvider *)exten;
+  IdeCommandManager *self = user_data;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_EXTENSION_SET_ADAPTER (set));
+  g_assert (plugin_info != NULL);
+  g_assert (IDE_IS_COMMAND_PROVIDER (provider));
+  g_assert (IDE_IS_COMMAND_MANAGER (self));
+
+  g_debug ("Removing command provider %s", G_OBJECT_TYPE_NAME (exten));
+
+}
+
+static void
+ide_command_manager_parent_set (IdeObject *object,
+                                IdeObject *parent)
+{
+  IdeCommandManager *self = (IdeCommandManager *)object;
+
+  g_assert (IDE_IS_COMMAND_MANAGER (self));
+  g_assert (!parent || IDE_IS_OBJECT (parent));
+
+  ide_clear_and_destroy_object (&self->adapter);
+
+  if (parent == NULL)
+    return;
+
+  self->adapter = ide_extension_set_adapter_new (IDE_OBJECT (self),
+                                                 peas_engine_get_default (),
+                                                 IDE_TYPE_COMMAND_PROVIDER,
+                                                 NULL, NULL);
+
+  g_signal_connect (self->adapter,
+                    "extension-added",
+                    G_CALLBACK (ide_command_manager_provider_added_cb),
+                    self);
+
+  g_signal_connect (self->adapter,
+                    "extension-removed",
+                    G_CALLBACK (ide_command_manager_provider_removed_cb),
+                    self);
+
+  ide_extension_set_adapter_foreach (self->adapter,
+                                     ide_command_manager_provider_added_cb,
+                                     self);
+}
+
+static void
+ide_command_manager_destroy (IdeObject *object)
+{
+  IdeCommandManager *self = (IdeCommandManager *)object;
+
+  ide_clear_and_destroy_object (&self->adapter);
+
+  IDE_OBJECT_CLASS (ide_command_manager_parent_class)->destroy (object);
+}
+
+static void
+ide_command_manager_class_init (IdeCommandManagerClass *klass)
+{
+  IdeObjectClass *i_object_class = IDE_OBJECT_CLASS (klass);
+
+  i_object_class->destroy = ide_command_manager_destroy;
+  i_object_class->parent_set = ide_command_manager_parent_set;
+}
+
+static void
+ide_command_manager_init (IdeCommandManager *self)
+{
+}
+
+/**
+ * ide_command_manager_from_context:
+ * @context: an #IdeContext
+ *
+ * Gets an #IdeCommandManager from the context.
+ *
+ * This may only be called on the main thread.
+ *
+ * Returns: (transfer none): an #IdeCommandManager
+ *
+ * Since: 3.34
+ */
+IdeCommandManager *
+ide_command_manager_from_context (IdeContext *context)
+{
+  IdeCommandManager *self;
+
+  g_return_val_if_fail (IDE_IS_CONTEXT (context), NULL);
+  g_return_val_if_fail (IDE_IS_MAIN_THREAD (), NULL);
+
+  if (!(self = ide_context_peek_child_typed (context, IDE_TYPE_COMMAND_MANAGER)))
+    {
+      g_autoptr(IdeCommandManager) freeme = NULL;
+      self = freeme = ide_object_ensure_child_typed (IDE_OBJECT (context),
+                                                     IDE_TYPE_COMMAND_MANAGER);
+    }
+
+  g_return_val_if_fail (IDE_IS_COMMAND_MANAGER (self), NULL);
+
+  return self;
+}
+
+static void
+ide_command_manager_query_cb (GObject      *object,
+                              GAsyncResult *result,
+                              gpointer      user_data)
+{
+  IdeCommandProvider *provider = (IdeCommandProvider *)object;
+  g_autoptr(IdeTask) task = user_data;
+  g_autoptr(GPtrArray) ret = NULL;
+  g_autoptr(GError) error = NULL;
+  Query *q;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_COMMAND_PROVIDER (provider));
+  g_assert (G_IS_ASYNC_RESULT (result));
+  g_assert (IDE_IS_TASK (task));
+
+  q = ide_task_get_task_data (task);
+
+  g_assert (q != NULL);
+  g_assert (q->n_active > 0);
+
+  if ((ret = ide_command_provider_query_finish (provider, result, &error)))
+    g_ptr_array_extend_and_steal (q->results, g_steal_pointer (&ret));
+
+  q->n_active--;
+
+  if (q->n_active == 0)
+    ide_task_return_pointer (task,
+                             g_steal_pointer (&q->results),
+                             g_ptr_array_unref);
+}
+
+static void
+ide_command_manager_query_foreach_cb (IdeExtensionSetAdapter *set,
+                                      PeasPluginInfo         *plugin_info,
+                                      PeasExtension          *exten,
+                                      gpointer                user_data)
+{
+  IdeCommandProvider *provider = (IdeCommandProvider *)exten;
+  IdeTask *task = user_data;
+  Query *q;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_EXTENSION_SET_ADAPTER (set));
+  g_assert (plugin_info != NULL);
+  g_assert (IDE_IS_COMMAND_PROVIDER (provider));
+  g_assert (IDE_IS_TASK (task));
+
+  q = ide_task_get_task_data (task);
+
+  g_assert (q != NULL);
+  g_assert (q->typed_text != NULL);
+  g_assert (IDE_IS_WORKSPACE (q->workspace));
+
+  q->n_active++;
+
+  ide_command_provider_query_async (provider,
+                                    q->workspace,
+                                    q->typed_text,
+                                    ide_task_get_cancellable (task),
+                                    ide_command_manager_query_cb,
+                                    g_object_ref (task));
+}
+
+void
+ide_command_manager_query_async  (IdeCommandManager   *self,
+                                  IdeWorkspace        *workspace,
+                                  const gchar         *typed_text,
+                                  GCancellable        *cancellable,
+                                  GAsyncReadyCallback  callback,
+                                  gpointer             user_data)
+{
+  g_autoptr(IdeTask) task = NULL;
+  Query *q;
+
+  g_return_if_fail (IDE_IS_COMMAND_MANAGER (self));
+  g_return_if_fail (IDE_IS_WORKSPACE (workspace));
+  g_return_if_fail (typed_text != NULL);
+  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
+
+  task = ide_task_new (self, cancellable, callback, user_data);
+  ide_task_set_source_tag (task, ide_command_manager_query_async);
+
+  q = g_slice_new0 (Query);
+  q->typed_text = g_strdup (typed_text);
+  q->results = g_ptr_array_new_with_free_func ((GDestroyNotify)ide_object_unref_and_destroy);
+  q->workspace = g_object_ref (workspace);
+  q->n_active = 0;
+  ide_task_set_task_data (task, q, query_free);
+
+  ide_extension_set_adapter_foreach (self->adapter,
+                                     ide_command_manager_query_foreach_cb,
+                                     task);
+
+  if (q->n_active == 0)
+    ide_task_return_pointer (task,
+                             g_steal_pointer (&q->results),
+                             g_ptr_array_unref);
+}
+
+/**
+ * ide_command_manager_query_finish:
+ *
+ * Returns: (transfer full) (element-type IdeCommand): an array of
+ *   #IdeCommand instances created by providers.
+ *
+ * Since: 3.34
+ */
+GPtrArray *
+ide_command_manager_query_finish (IdeCommandManager  *self,
+                                  GAsyncResult       *result,
+                                  GError            **error)
+{
+  GPtrArray *ret;
+
+  g_return_val_if_fail (IDE_IS_COMMAND_MANAGER (self), NULL);
+  g_return_val_if_fail (IDE_IS_TASK (result), NULL);
+
+  ret = ide_task_propagate_pointer (IDE_TASK (result), error);
+  return IDE_PTR_ARRAY_STEAL_FULL (&ret);
+}
diff --git a/src/libide/gui/ide-command-manager.h b/src/libide/gui/ide-command-manager.h
new file mode 100644
index 000000000..e4fbd3d96
--- /dev/null
+++ b/src/libide/gui/ide-command-manager.h
@@ -0,0 +1,48 @@
+/* ide-command-manager.h
+ *
+ * Copyright 2019 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/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include <libide-core.h>
+
+#include "ide-workspace.h"
+
+G_BEGIN_DECLS
+
+#define IDE_TYPE_COMMAND_MANAGER (ide_command_manager_get_type())
+
+IDE_AVAILABLE_IN_3_34
+G_DECLARE_FINAL_TYPE (IdeCommandManager, ide_command_manager, IDE, COMMAND_MANAGER, IdeObject)
+
+IDE_AVAILABLE_IN_3_34
+IdeCommandManager *ide_command_manager_from_context (IdeContext           *context);
+IDE_AVAILABLE_IN_3_34
+void               ide_command_manager_query_async  (IdeCommandManager    *self,
+                                                     IdeWorkspace         *workspace,
+                                                     const gchar          *typed_text,
+                                                     GCancellable         *cancellable,
+                                                     GAsyncReadyCallback   callback,
+                                                     gpointer              user_data);
+IDE_AVAILABLE_IN_3_34
+GPtrArray         *ide_command_manager_query_finish (IdeCommandManager    *self,
+                                                     GAsyncResult         *result,
+                                                     GError              **error);
+
+G_END_DECLS
diff --git a/src/libide/gui/libide-gui.h b/src/libide/gui/libide-gui.h
index 85afe78e7..47baf66ea 100644
--- a/src/libide/gui/libide-gui.h
+++ b/src/libide/gui/libide-gui.h
@@ -32,6 +32,7 @@
 #include "ide-application-addin.h"
 #include "ide-cell-renderer-fancy.h"
 #include "ide-command.h"
+#include "ide-command-manager.h"
 #include "ide-command-provider.h"
 #include "ide-config-view-addin.h"
 #include "ide-environment-editor.h"
diff --git a/src/libide/gui/meson.build b/src/libide/gui/meson.build
index b174408ae..9f469d2fa 100644
--- a/src/libide/gui/meson.build
+++ b/src/libide/gui/meson.build
@@ -12,6 +12,7 @@ libide_gui_public_headers = [
   'ide-application-addin.h',
   'ide-cell-renderer-fancy.h',
   'ide-command.h',
+  'ide-command-manager.h',
   'ide-command-provider.h',
   'ide-config-view-addin.h',
   'ide-environment-editor.h',
@@ -115,6 +116,7 @@ libide_gui_public_sources = [
   'ide-application-open.c',
   'ide-cell-renderer-fancy.c',
   'ide-command.c',
+  'ide-command-manager.c',
   'ide-command-provider.c',
   'ide-config-view-addin.c',
   'ide-environment-editor.c',
diff --git a/src/plugins/command-bar/gbp-command-bar-command-provider.c 
b/src/plugins/command-bar/gbp-command-bar-command-provider.c
index e8fc5453f..b8d0c861c 100644
--- a/src/plugins/command-bar/gbp-command-bar-command-provider.c
+++ b/src/plugins/command-bar/gbp-command-bar-command-provider.c
@@ -29,7 +29,7 @@
 
 struct _GbpCommandBarCommandProvider
 {
-  GObject parent_instance;
+  IdeObject parent_instance;
 };
 
 static void
@@ -170,7 +170,7 @@ command_provider_iface_init (IdeCommandProviderInterface *iface)
 
 G_DEFINE_TYPE_WITH_CODE (GbpCommandBarCommandProvider,
                          gbp_command_bar_command_provider,
-                         G_TYPE_OBJECT,
+                         IDE_TYPE_OBJECT,
                          G_IMPLEMENT_INTERFACE (IDE_TYPE_COMMAND_PROVIDER,
                                                 command_provider_iface_init))
 
diff --git a/src/plugins/command-bar/gbp-command-bar-command-provider.h 
b/src/plugins/command-bar/gbp-command-bar-command-provider.h
index 6407b5ad7..68e52de1f 100644
--- a/src/plugins/command-bar/gbp-command-bar-command-provider.h
+++ b/src/plugins/command-bar/gbp-command-bar-command-provider.h
@@ -26,6 +26,6 @@ G_BEGIN_DECLS
 
 #define GBP_TYPE_COMMAND_BAR_COMMAND_PROVIDER (gbp_command_bar_command_provider_get_type())
 
-G_DECLARE_FINAL_TYPE (GbpCommandBarCommandProvider, gbp_command_bar_command_provider, GBP, 
COMMAND_BAR_COMMAND_PROVIDER, GObject)
+G_DECLARE_FINAL_TYPE (GbpCommandBarCommandProvider, gbp_command_bar_command_provider, GBP, 
COMMAND_BAR_COMMAND_PROVIDER, IdeObject)
 
 G_END_DECLS
diff --git a/src/plugins/command-bar/gbp-command-bar.c b/src/plugins/command-bar/gbp-command-bar.c
index bb54613fe..1c5202ab6 100644
--- a/src/plugins/command-bar/gbp-command-bar.c
+++ b/src/plugins/command-bar/gbp-command-bar.c
@@ -25,7 +25,6 @@
 #include <libide-gui.h>
 
 #include "gbp-command-bar.h"
-#include "gbp-command-bar-model.h"
 #include "gbp-command-bar-private.h"
 #include "gbp-command-bar-suggestion.h"
 
@@ -40,18 +39,28 @@ struct _GbpCommandBar
 G_DEFINE_TYPE (GbpCommandBar, gbp_command_bar, DZL_TYPE_BIN)
 
 static void
-replace_model (GbpCommandBar      *self,
-               GbpCommandBarModel *model)
+replace_model (GbpCommandBar *self,
+               GListModel    *model)
 {
-  GListModel *old_model;
-
   g_assert (GBP_IS_COMMAND_BAR (self));
-  g_assert (!model || GBP_IS_COMMAND_BAR_MODEL (model));
+  g_assert (!model || G_IS_LIST_MODEL (model));
 
-  old_model = dzl_suggestion_entry_get_model (self->entry);
-  dzl_suggestion_entry_set_model (self->entry, G_LIST_MODEL (model));
-  if (old_model != NULL)
-    ide_object_destroy (IDE_OBJECT (old_model));
+  dzl_suggestion_entry_set_model (self->entry, model);
+}
+
+static gint
+compare_commands (gconstpointer a,
+                  gconstpointer b)
+{
+  gint a_prio = ide_command_get_priority (*(IdeCommand **)a);
+  gint b_prio = ide_command_get_priority (*(IdeCommand **)b);
+
+  if (a_prio < b_prio)
+    return -1;
+  if (a_prio > b_prio)
+    return 1;
+  else
+    return 0;
 }
 
 static void
@@ -59,23 +68,40 @@ gbp_command_bar_complete_cb (GObject      *object,
                              GAsyncResult *result,
                              gpointer      user_data)
 {
-  GbpCommandBarModel *model = (GbpCommandBarModel *)object;
+  IdeCommandManager *command_manager = (IdeCommandManager *)object;
   g_autoptr(GbpCommandBar) self = user_data;
+  g_autoptr(GPtrArray) res = NULL;
   g_autoptr(GError) error = NULL;
+  g_autoptr(GListStore) store = NULL;
 
-  g_assert (GBP_IS_COMMAND_BAR_MODEL (model));
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_COMMAND_MANAGER (command_manager));
   g_assert (G_IS_ASYNC_RESULT (result));
   g_assert (GBP_IS_COMMAND_BAR (self));
 
-  if (gbp_command_bar_model_complete_finish (model, result, &error))
-    replace_model (self, model);
+  if ((res = ide_command_manager_query_finish (command_manager, result, &error)))
+    {
+      g_ptr_array_sort (res, compare_commands);
+
+      store = g_list_store_new (GBP_TYPE_COMMAND_BAR_SUGGESTION);
+
+      for (guint i = 0; i < res->len; i++)
+        {
+          IdeCommand *command = g_ptr_array_index (res, i);
+          g_autoptr(GbpCommandBarSuggestion) suggestion = gbp_command_bar_suggestion_new (command);
+
+          g_list_store_append (store, suggestion);
+        }
+    }
+
+  replace_model (self, G_LIST_MODEL (store));
 }
 
 static void
 gbp_command_bar_changed_cb (GbpCommandBar      *self,
                             DzlSuggestionEntry *entry)
 {
-  g_autoptr(GbpCommandBarModel) model = NULL;
+  IdeCommandManager *command_manager;
   IdeWorkspace *workspace;
   const gchar *text;
   IdeContext *context;
@@ -94,15 +120,15 @@ gbp_command_bar_changed_cb (GbpCommandBar      *self,
   g_debug ("Command Bar: %s", text);
 
   context = ide_widget_get_context (GTK_WIDGET (self));
-  model = gbp_command_bar_model_new (context);
+  command_manager = ide_command_manager_from_context (context);
   workspace = ide_widget_get_workspace (GTK_WIDGET (self));
 
-  gbp_command_bar_model_complete_async (model,
-                                        workspace,
-                                        text,
-                                        NULL,
-                                        gbp_command_bar_complete_cb,
-                                        g_object_ref (self));
+  ide_command_manager_query_async (command_manager,
+                                   workspace,
+                                   text,
+                                   NULL,
+                                   gbp_command_bar_complete_cb,
+                                   g_object_ref (self));
 }
 
 static gboolean
@@ -196,11 +222,15 @@ gbp_command_bar_activate_suggestion_cb (GbpCommandBar      *self,
       GbpCommandBarSuggestion *cbs = GBP_COMMAND_BAR_SUGGESTION (suggestion);
       IdeCommand *command = gbp_command_bar_suggestion_get_command (cbs);
       IdeContext *context = ide_widget_get_context (GTK_WIDGET (entry));
+      IdeCommandManager *command_manager = ide_command_manager_from_context (context);
 
       if (ide_object_is_root (IDE_OBJECT (command)))
-        ide_object_append (IDE_OBJECT (context), IDE_OBJECT (command));
+        ide_object_append (IDE_OBJECT (command_manager), IDE_OBJECT (command));
 
-      ide_command_run_async (command, NULL, gbp_command_bar_run_cb, NULL);
+      ide_command_run_async (command,
+                             NULL,
+                             gbp_command_bar_run_cb,
+                             NULL);
     }
 
   gbp_command_bar_dismiss (self);
diff --git a/src/plugins/command-bar/gbp-gaction-command.c b/src/plugins/command-bar/gbp-gaction-command.c
index a18ccf6c6..94f443611 100644
--- a/src/plugins/command-bar/gbp-gaction-command.c
+++ b/src/plugins/command-bar/gbp-gaction-command.c
@@ -116,12 +116,26 @@ gbp_gaction_command_finalize (GObject *object)
   G_OBJECT_CLASS (gbp_gaction_command_parent_class)->finalize (object);
 }
 
+static gchar *
+gbp_gaction_command_repr (IdeObject *object)
+{
+  GbpGactionCommand *self = (GbpGactionCommand *)object;
+
+  return g_strdup_printf ("%s action=%s.%s",
+                          G_OBJECT_TYPE_NAME (self),
+                          self->group,
+                          self->name);
+}
+
 static void
 gbp_gaction_command_class_init (GbpGactionCommandClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  IdeObjectClass *i_object_class = IDE_OBJECT_CLASS (klass);
 
   object_class->finalize = gbp_gaction_command_finalize;
+
+  i_object_class->repr = gbp_gaction_command_repr;
 }
 
 static void
diff --git a/src/plugins/command-bar/meson.build b/src/plugins/command-bar/meson.build
index aebde636f..b03e61c99 100644
--- a/src/plugins/command-bar/meson.build
+++ b/src/plugins/command-bar/meson.build
@@ -2,7 +2,6 @@ plugins_sources += files([
   'command-bar-plugin.c',
   'gbp-command-bar.c',
   'gbp-command-bar-command-provider.c',
-  'gbp-command-bar-model.c',
   'gbp-command-bar-shortcuts.c',
   'gbp-command-bar-suggestion.c',
   'gbp-command-bar-workspace-addin.c',


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