[gnome-builder/wip/commands] commands: introduce command providers



commit ae73bf07c10d0f37885c53f1c13dda073d717e66
Author: Christian Hergert <christian hergert me>
Date:   Tue Oct 7 17:42:17 2014 -0700

    commands: introduce command providers
    
    You can force a command provider by using it's id followed by :
    For example, to get a python command, you can do:
    
      py: hex(10)
    
    Of course, the python command isn't finished yet.

 src/commands/gb-command-manager.c         |   64 +++++++++
 src/commands/gb-command-manager.h         |   19 ++-
 src/commands/gb-command-provider.c        |  207 +++++++++++++++++++++++++++++
 src/commands/gb-command-provider.h        |   72 ++++++++++
 src/commands/gb-commands-internal.c       |    9 +-
 src/commands/gb-python-command-provider.c |   78 +++++++++++
 src/commands/gb-python-command-provider.h |   56 ++++++++
 src/gnome-builder.mk                      |    4 +
 8 files changed, 497 insertions(+), 12 deletions(-)
---
diff --git a/src/commands/gb-command-manager.c b/src/commands/gb-command-manager.c
index 26d9538..2722473 100644
--- a/src/commands/gb-command-manager.c
+++ b/src/commands/gb-command-manager.c
@@ -42,6 +42,7 @@
 struct _GbCommandManagerPrivate
 {
   GHashTable *commands;
+  GHashTable *providers;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GbCommandManager, gb_command_manager, G_TYPE_OBJECT)
@@ -64,6 +65,34 @@ gb_command_manager_get_default (void)
 }
 
 void
+gb_command_manager_add_provider (GbCommandManager  *manager,
+                                 GbCommandProvider *provider)
+{
+  const gchar *id;
+
+  g_return_if_fail (GB_IS_COMMAND_MANAGER (manager));
+  g_return_if_fail (GB_IS_COMMAND_PROVIDER (provider));
+
+  id = gb_command_provider_get_id (provider);
+
+  if (!id)
+    {
+      g_warning ("Cannot register provider with NULL id.");
+      return;
+    }
+
+  if (g_hash_table_lookup (manager->priv->providers, id))
+    {
+      g_warning ("Cannot register duplicate provider \"%s\"", id);
+      return;
+    }
+
+  g_hash_table_insert (manager->priv->providers,
+                       g_strdup (id),
+                       g_object_ref (provider));
+}
+
+void
 gb_command_manager_register (GbCommandManager *manager,
                              GbCommand        *command)
 {
@@ -133,6 +162,7 @@ gb_command_manager_lookup (GbCommandManager  *manager,
                            GVariant         **parameters)
 {
   GbCommandManagerPrivate *priv;
+  const gchar *colon;
   GbCommand *command;
   GVariant *variant = NULL;
   gchar *name;
@@ -142,12 +172,43 @@ gb_command_manager_lookup (GbCommandManager  *manager,
 
   priv = manager->priv;
 
+  /*
+   * First let's look for a specified provider like "py:".
+   */
+  if ((colon = strchr (command_text, ':')))
+    {
+      GbCommandProvider *provider;
+      gchar *key;
+
+      key = g_strndup (command_text, colon - command_text);
+      provider = g_hash_table_lookup (manager->priv->providers, key);
+      g_free (key);
+
+      if (provider)
+        {
+          command = gb_command_provider_create (provider, command_text);
+          if (command)
+            return command;
+        }
+    }
+
+  /*
+   * Now let's look up a command by name.
+   */
   name = gb_command_manager_parse (manager, command_text, &variant);
   if (!name)
     return NULL;
 
   command = g_hash_table_lookup (priv->commands, name);
 
+  /*
+   * Now let's see if a command provider will create one for us.
+   */
+  if (!command)
+    {
+      /* TODO */
+    }
+
   if (command && parameters)
     *parameters = variant ? g_variant_ref (variant) : NULL;
 
@@ -163,6 +224,7 @@ gb_command_manager_finalize (GObject *object)
   GbCommandManagerPrivate *priv = GB_COMMAND_MANAGER (object)->priv;
 
   g_clear_pointer (&priv->commands, g_hash_table_unref);
+  g_clear_pointer (&priv->providers, g_hash_table_unref);
 
   G_OBJECT_CLASS (gb_command_manager_parent_class)->finalize (object);
 }
@@ -181,4 +243,6 @@ gb_command_manager_init (GbCommandManager *self)
   self->priv = gb_command_manager_get_instance_private (self);
   self->priv->commands = g_hash_table_new_full (g_str_hash, g_str_equal,
                                                 g_free, g_object_unref);
+  self->priv->providers = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                                 g_free, g_object_unref);
 }
diff --git a/src/commands/gb-command-manager.h b/src/commands/gb-command-manager.h
index ac7f357..87c5cfa 100644
--- a/src/commands/gb-command-manager.h
+++ b/src/commands/gb-command-manager.h
@@ -22,6 +22,7 @@
 #include <gio/gio.h>
 
 #include "gb-command.h"
+#include "gb-command-provider.h"
 
 G_BEGIN_DECLS
 
@@ -50,14 +51,16 @@ struct _GbCommandManagerClass
   GObjectClass parent;
 };
 
-GType             gb_command_manager_get_type    (void) G_GNUC_CONST;
-GbCommandManager *gb_command_manager_new         (void);
-GbCommandManager *gb_command_manager_get_default (void);
-void              gb_command_manager_register    (GbCommandManager  *manager,
-                                                  GbCommand         *command);
-GbCommand        *gb_command_manager_lookup      (GbCommandManager  *manager,
-                                                  const gchar       *command_text,
-                                                  GVariant         **parameters);
+GType             gb_command_manager_get_type     (void) G_GNUC_CONST;
+GbCommandManager *gb_command_manager_new          (void);
+GbCommandManager *gb_command_manager_get_default  (void);
+void              gb_command_manager_register     (GbCommandManager  *manager,
+                                                   GbCommand         *command);
+void              gb_command_manager_add_provider (GbCommandManager  *manager,
+                                                   GbCommandProvider *provider);
+GbCommand        *gb_command_manager_lookup       (GbCommandManager  *manager,
+                                                   const gchar       *command_text,
+                                                   GVariant         **parameters);
 
 G_END_DECLS
 
diff --git a/src/commands/gb-command-provider.c b/src/commands/gb-command-provider.c
new file mode 100644
index 0000000..ff2b376
--- /dev/null
+++ b/src/commands/gb-command-provider.c
@@ -0,0 +1,207 @@
+/* gb-command-provider.c
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * 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/>.
+ */
+
+#include <glib/gi18n.h>
+
+#include "gb-command-provider.h"
+
+struct _GbCommandProviderPrivate
+{
+  gchar *id;
+  gchar *name;
+};
+
+G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GbCommandProvider, gb_command_provider, G_TYPE_OBJECT)
+
+enum {
+  PROP_0,
+  PROP_ID,
+  PROP_NAME,
+  LAST_PROP
+};
+
+enum {
+  CREATE,
+  LAST_SIGNAL
+};
+
+static GParamSpec *gParamSpecs [LAST_PROP];
+static guint       gSignals [LAST_SIGNAL];
+
+const gchar *
+gb_command_provider_get_name (GbCommandProvider *provider)
+{
+  g_return_val_if_fail (GB_IS_COMMAND_PROVIDER (provider), NULL);
+
+  return provider->priv->name;
+}
+
+void
+gb_command_provider_set_name (GbCommandProvider *provider,
+                              const gchar       *name)
+{
+  g_return_if_fail (GB_IS_COMMAND_PROVIDER (provider));
+
+  if (provider->priv->name != name)
+    {
+      g_free (provider->priv->name);
+      provider->priv->name = g_strdup (name);
+      g_object_notify_by_pspec (G_OBJECT (provider), gParamSpecs [PROP_NAME]);
+    }
+}
+
+const gchar *
+gb_command_provider_get_id (GbCommandProvider *provider)
+{
+  g_return_val_if_fail (GB_IS_COMMAND_PROVIDER (provider), NULL);
+
+  return provider->priv->id;
+}
+
+void
+gb_command_provider_set_id (GbCommandProvider *provider,
+                            const gchar       *id)
+{
+  g_return_if_fail (GB_IS_COMMAND_PROVIDER (provider));
+
+  if (provider->priv->id != id)
+    {
+      g_free (provider->priv->id);
+      provider->priv->id = g_strdup (id);
+      g_object_notify_by_pspec (G_OBJECT (provider), gParamSpecs [PROP_ID]);
+    }
+}
+
+GbCommand *
+gb_command_provider_create (GbCommandProvider *provider,
+                            const gchar       *command_text)
+{
+  GbCommand *ret = NULL;
+
+  g_return_val_if_fail (GB_IS_COMMAND_PROVIDER (provider), NULL);
+  g_return_val_if_fail (command_text, NULL);
+
+  g_signal_emit (provider, gSignals [CREATE], 0, command_text, &ret);
+
+  return ret;
+}
+
+static void
+gb_command_provider_finalize (GObject *object)
+{
+  GbCommandProviderPrivate *priv = GB_COMMAND_PROVIDER (object)->priv;
+
+  g_clear_pointer (&priv->name, g_free);
+  g_clear_pointer (&priv->id, g_free);
+
+  G_OBJECT_CLASS (gb_command_provider_parent_class)->finalize (object);
+}
+
+static void
+gb_command_provider_get_property (GObject    *object,
+                                  guint       prop_id,
+                                  GValue     *value,
+                                  GParamSpec *pspec)
+{
+  GbCommandProvider *self = GB_COMMAND_PROVIDER (object);
+
+  switch (prop_id)
+    {
+    case PROP_ID:
+      g_value_set_string (value, gb_command_provider_get_id (self));
+      break;
+
+    case PROP_NAME:
+      g_value_set_string (value, gb_command_provider_get_name (self));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gb_command_provider_set_property (GObject      *object,
+                                  guint         prop_id,
+                                  const GValue *value,
+                                  GParamSpec   *pspec)
+{
+  GbCommandProvider *self = GB_COMMAND_PROVIDER (object);
+
+  switch (prop_id)
+    {
+    case PROP_ID:
+      gb_command_provider_set_id (self, g_value_get_string (value));
+      break;
+
+    case PROP_NAME:
+      gb_command_provider_set_name (self, g_value_get_string (value));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gb_command_provider_class_init (GbCommandProviderClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = gb_command_provider_finalize;
+  object_class->get_property = gb_command_provider_get_property;
+  object_class->set_property = gb_command_provider_set_property;
+
+  gParamSpecs [PROP_ID] =
+    g_param_spec_string ("id",
+                         _("Id"),
+                         _("Identifier"),
+                         NULL,
+                         (G_PARAM_READWRITE |
+                          G_PARAM_STATIC_STRINGS));
+  g_object_class_install_property (object_class, PROP_ID,
+                                   gParamSpecs [PROP_ID]);
+
+  gParamSpecs [PROP_NAME] =
+    g_param_spec_string ("name",
+                         _("Name"),
+                         _("The name of the provider."),
+                         NULL,
+                         (G_PARAM_READWRITE |
+                          G_PARAM_STATIC_STRINGS));
+  g_object_class_install_property (object_class, PROP_NAME,
+                                   gParamSpecs [PROP_NAME]);
+
+  gSignals [CREATE] =
+    g_signal_new ("create",
+                  GB_TYPE_COMMAND_PROVIDER,
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (GbCommandProviderClass, create),
+                  g_signal_accumulator_first_wins,
+                  NULL,
+                  NULL,
+                  GB_TYPE_COMMAND,
+                  1,
+                  G_TYPE_STRING);
+}
+
+static void
+gb_command_provider_init (GbCommandProvider *self)
+{
+  self->priv = gb_command_provider_get_instance_private (self);
+}
diff --git a/src/commands/gb-command-provider.h b/src/commands/gb-command-provider.h
new file mode 100644
index 0000000..b55def2
--- /dev/null
+++ b/src/commands/gb-command-provider.h
@@ -0,0 +1,72 @@
+/* gb-command-provider.h
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * 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 GB_COMMAND_PROVIDER_H
+#define GB_COMMAND_PROVIDER_H
+
+#include <glib-object.h>
+
+#include "gb-command.h"
+
+G_BEGIN_DECLS
+
+#define GB_TYPE_COMMAND_PROVIDER            (gb_command_provider_get_type())
+#define GB_COMMAND_PROVIDER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_PROVIDER, 
GbCommandProvider))
+#define GB_COMMAND_PROVIDER_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_PROVIDER, 
GbCommandProvider const))
+#define GB_COMMAND_PROVIDER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_COMMAND_PROVIDER, 
GbCommandProviderClass))
+#define GB_IS_COMMAND_PROVIDER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_COMMAND_PROVIDER))
+#define GB_IS_COMMAND_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_COMMAND_PROVIDER))
+#define GB_COMMAND_PROVIDER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_COMMAND_PROVIDER, 
GbCommandProviderClass))
+
+typedef struct _GbCommandProvider        GbCommandProvider;
+typedef struct _GbCommandProviderClass   GbCommandProviderClass;
+typedef struct _GbCommandProviderPrivate GbCommandProviderPrivate;
+
+struct _GbCommandProvider
+{
+  GObject parent;
+
+  /*< private >*/
+  GbCommandProviderPrivate *priv;
+};
+
+struct _GbCommandProviderClass
+{
+  GObjectClass parent;
+
+  GbCommand *(*create) (GbCommandProvider *provider,
+                        const gchar       *command_text);
+
+  gpointer _padding1;
+  gpointer _padding2;
+  gpointer _padding3;
+};
+
+GType        gb_command_provider_get_type (void) G_GNUC_CONST;
+const gchar *gb_command_provider_get_id   (GbCommandProvider *provider);
+void         gb_command_provider_set_id   (GbCommandProvider *provider,
+                                           const gchar       *id);
+const gchar *gb_command_provider_get_name (GbCommandProvider *provider);
+void         gb_command_provider_set_name (GbCommandProvider *provider,
+                                           const gchar       *name);
+GbCommand   *gb_command_provider_create   (GbCommandProvider *provider,
+                                           const gchar       *command_text);
+
+G_END_DECLS
+
+#endif /* GB_COMMAND_PROVIDER_H */
diff --git a/src/commands/gb-commands-internal.c b/src/commands/gb-commands-internal.c
index 5dfbca1..6557766 100644
--- a/src/commands/gb-commands-internal.c
+++ b/src/commands/gb-commands-internal.c
@@ -26,7 +26,7 @@
 #include "gb-commands-internal.h"
 #include "gb-editor-tab.h"
 #include "gb-editor-workspace.h"
-#include "gb-python-command.h"
+#include "gb-python-command-provider.h"
 
 typedef void (*TextCommandFunc) (GbCommand        *command,
                                  GVariant         *parameters,
@@ -158,6 +158,7 @@ static TextCommand gTextCommands[] = {
 void
 gb_commands_internal_init (void)
 {
+  GbCommandProvider *provider;
   GbCommandManager *manager;
   GbCommand *command;
   guint i;
@@ -178,7 +179,7 @@ gb_commands_internal_init (void)
       g_object_unref (command);
     }
 
-  command = gb_python_command_new ();
-  gb_command_manager_register (manager, command);
-  g_object_unref (command);
+  provider = gb_python_command_provider_new ();
+  gb_command_manager_add_provider (manager, provider);
+  g_object_unref (provider);
 }
diff --git a/src/commands/gb-python-command-provider.c b/src/commands/gb-python-command-provider.c
new file mode 100644
index 0000000..391bd6d
--- /dev/null
+++ b/src/commands/gb-python-command-provider.c
@@ -0,0 +1,78 @@
+/* gb-python-command-provider.c
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * 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/>.
+ */
+
+#include <glib/gi18n.h>
+
+#include "gb-python-command.h"
+#include "gb-python-command-provider.h"
+#include "gb-string.h"
+
+G_DEFINE_TYPE (GbPythonCommandProvider, gb_python_command_provider,
+               GB_TYPE_COMMAND_PROVIDER)
+
+GbCommandProvider *
+gb_python_command_provider_new (void)
+{
+  return g_object_new (GB_TYPE_PYTHON_COMMAND_PROVIDER, NULL);
+}
+
+static GbCommand *
+gb_python_command_provider_create (GbCommandProvider *provider,
+                                   const gchar       *command_text)
+{
+  GbCommand *ret = NULL;
+
+  g_return_val_if_fail (GB_IS_PYTHON_COMMAND_PROVIDER (provider), NULL);
+  g_return_val_if_fail (command_text, NULL);
+
+  if (g_str_has_prefix (command_text, "py:"))
+    {
+      gchar *stripped;
+
+      stripped = g_strstrip (g_strdup (command_text + 3));
+
+      if (gb_str_empty0 (stripped))
+        {
+          g_free (stripped);
+          return NULL;
+        }
+
+      ret = g_object_new (GB_TYPE_PYTHON_COMMAND,
+                          "command-text", stripped,
+                          NULL);
+
+      g_free (stripped);
+    }
+
+  return ret;
+}
+
+static void
+gb_python_command_provider_class_init (GbPythonCommandProviderClass *klass)
+{
+  GbCommandProviderClass *provider_class = GB_COMMAND_PROVIDER_CLASS (klass);
+
+  provider_class->create = gb_python_command_provider_create;
+}
+
+static void
+gb_python_command_provider_init (GbPythonCommandProvider *self)
+{
+  gb_command_provider_set_id (GB_COMMAND_PROVIDER (self), "py");
+  gb_command_provider_set_name (GB_COMMAND_PROVIDER (self), _("Python"));
+}
diff --git a/src/commands/gb-python-command-provider.h b/src/commands/gb-python-command-provider.h
new file mode 100644
index 0000000..4cc67af
--- /dev/null
+++ b/src/commands/gb-python-command-provider.h
@@ -0,0 +1,56 @@
+/* gb-python-command-provider.h
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * 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 GB_PYTHON_COMMAND_PROVIDER_H
+#define GB_PYTHON_COMMAND_PROVIDER_H
+
+#include "gb-command-provider.h"
+
+G_BEGIN_DECLS
+
+#define GB_TYPE_PYTHON_COMMAND_PROVIDER            (gb_python_command_provider_get_type())
+#define GB_PYTHON_COMMAND_PROVIDER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_PYTHON_COMMAND_PROVIDER, GbPythonCommandProvider))
+#define GB_PYTHON_COMMAND_PROVIDER_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_PYTHON_COMMAND_PROVIDER, GbPythonCommandProvider const))
+#define GB_PYTHON_COMMAND_PROVIDER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  
GB_TYPE_PYTHON_COMMAND_PROVIDER, GbPythonCommandProviderClass))
+#define GB_IS_PYTHON_COMMAND_PROVIDER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GB_TYPE_PYTHON_COMMAND_PROVIDER))
+#define GB_IS_PYTHON_COMMAND_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  
GB_TYPE_PYTHON_COMMAND_PROVIDER))
+#define GB_PYTHON_COMMAND_PROVIDER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  
GB_TYPE_PYTHON_COMMAND_PROVIDER, GbPythonCommandProviderClass))
+
+typedef struct _GbPythonCommandProvider        GbPythonCommandProvider;
+typedef struct _GbPythonCommandProviderClass   GbPythonCommandProviderClass;
+typedef struct _GbPythonCommandProviderPrivate GbPythonCommandProviderPrivate;
+
+struct _GbPythonCommandProvider
+{
+  GbCommandProvider parent;
+
+  /*< private >*/
+  GbPythonCommandProviderPrivate *priv;
+};
+
+struct _GbPythonCommandProviderClass
+{
+  GbCommandProviderClass parent;
+};
+
+GType              gb_python_command_provider_get_type (void) G_GNUC_CONST;
+GbCommandProvider *gb_python_command_provider_new      (void);
+
+G_END_DECLS
+
+#endif /* GB_PYTHON_COMMAND_PROVIDER_H */
diff --git a/src/gnome-builder.mk b/src/gnome-builder.mk
index bae3c18..4fd4c6c 100644
--- a/src/gnome-builder.mk
+++ b/src/gnome-builder.mk
@@ -17,12 +17,16 @@ libgnome_builder_la_SOURCES = \
        src/commands/gb-command-bar-item.h \
        src/commands/gb-command-manager.c \
        src/commands/gb-command-manager.h \
+       src/commands/gb-command-provider.c \
+       src/commands/gb-command-provider.h \
        src/commands/gb-command-task.c \
        src/commands/gb-command-task.h \
        src/commands/gb-commands-internal.c \
        src/commands/gb-commands-internal.h \
        src/commands/gb-python-command.c \
        src/commands/gb-python-command.h \
+       src/commands/gb-python-command-provider.c \
+       src/commands/gb-python-command-provider.h \
        src/devhelp/gb-devhelp-navigation-item.c \
        src/devhelp/gb-devhelp-navigation-item.h \
        src/devhelp/gb-devhelp-tab.c \


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