[gnome-builder] devices: simplify device manager and provider
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] devices: simplify device manager and provider
- Date: Fri, 23 Feb 2018 02:48:45 +0000 (UTC)
commit 9e00b6b8db354ed8c189c811ab66fefea187342e
Author: Christian Hergert <chergert redhat com>
Date: Thu Feb 22 17:56:58 2018 -0800
devices: simplify device manager and provider
This simplifies our very old device manager design. Since we wrote this, we
learned a few things about using GListModel and async provider
initialization.
This applies those lessons as we start looking at more device integration.
IdeDeviceProvider is now a base class, since libpeas supports that.
src/libide/devices/ide-device-manager.c | 340 +++++++++-----------------
src/libide/devices/ide-device-manager.h | 18 +-
src/libide/devices/ide-device-provider.c | 2 -
src/plugins/mingw/ide-mingw-device-provider.c | 234 +++++-------------
src/plugins/mingw/ide-mingw-device-provider.h | 2 +-
src/plugins/mingw/ide-mingw-device.c | 10 +-
src/plugins/mingw/mingw-plugin.c | 7 -
7 files changed, 191 insertions(+), 422 deletions(-)
---
diff --git a/src/libide/devices/ide-device-manager.c b/src/libide/devices/ide-device-manager.c
index 3056544d5..6a9eea439 100644
--- a/src/libide/devices/ide-device-manager.c
+++ b/src/libide/devices/ide-device-manager.c
@@ -19,17 +19,17 @@
#include <glib/gi18n.h>
#include <libpeas/peas.h>
+#include "ide-debug.h"
+
#include "devices/ide-device.h"
#include "devices/ide-device-manager.h"
#include "devices/ide-device-provider.h"
-
#include "local/ide-local-device.h"
#include "plugins/ide-extension-util.h"
struct _IdeDeviceManager
{
- IdeObject parent_instance;
-
+ IdeObject parent_instance;
GPtrArray *devices;
PeasExtensionSet *providers;
};
@@ -39,182 +39,136 @@ static void list_model_init_interface (GListModelInterface *iface);
G_DEFINE_TYPE_WITH_CODE (IdeDeviceManager, ide_device_manager, IDE_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, list_model_init_interface))
-enum {
- PROP_0,
- PROP_SETTLED,
- LAST_PROP
-};
-
-enum {
- DEVICE_ADDED,
- DEVICE_REMOVED,
- LAST_SIGNAL
-};
-
-static guint signals [LAST_SIGNAL];
-static GParamSpec *properties [LAST_PROP];
-
-static void
-get_settled (PeasExtensionSet *set,
- PeasPluginInfo *plugin_info,
- PeasExtension *exten,
- gpointer user_data)
-{
- gboolean *settled = user_data;
-
- if (!ide_device_provider_get_settled (IDE_DEVICE_PROVIDER (exten)))
- *settled = FALSE;
-}
-
-gboolean
-ide_device_manager_get_settled (IdeDeviceManager *self)
-{
- gboolean settled = TRUE;
-
- g_return_val_if_fail (IDE_IS_DEVICE_MANAGER (self), FALSE);
-
- peas_extension_set_foreach (self->providers,
- (PeasExtensionSetForeachFunc)get_settled,
- &settled);
-
- return settled;
-}
-
static void
-ide_device_manager__provider_notify_settled (IdeDeviceManager *self,
- GParamSpec *pspec,
+ide_device_manager_provider_device_added_cb (IdeDeviceManager *self,
+ IdeDevice *device,
IdeDeviceProvider *provider)
{
- g_return_if_fail (IDE_IS_DEVICE_MANAGER (self));
- g_return_if_fail (IDE_IS_DEVICE_PROVIDER (provider));
-
- g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SETTLED]);
-}
-
-static void
-ide_device_manager_do_add_device (IdeDeviceManager *self,
- IdeDevice *device)
-{
- guint position;
+ IDE_ENTRY;
g_assert (IDE_IS_DEVICE_MANAGER (self));
g_assert (IDE_IS_DEVICE (device));
+ g_assert (IDE_IS_DEVICE_PROVIDER (provider));
- position = self->devices->len;
g_ptr_array_add (self->devices, g_object_ref (device));
- g_list_model_items_changed (G_LIST_MODEL (self), position, 0, 1);
-}
-
-static void
-ide_device_manager__provider_device_added (IdeDeviceManager *self,
- IdeDevice *device,
- IdeDeviceProvider *provider)
-{
- g_return_if_fail (IDE_IS_DEVICE_MANAGER (self));
- g_return_if_fail (IDE_IS_DEVICE (device));
- g_return_if_fail (IDE_IS_DEVICE_PROVIDER (provider));
+ g_list_model_items_changed (G_LIST_MODEL (self), self->devices->len - 1, 0, 1);
- ide_device_manager_do_add_device (self, device);
- g_signal_emit (self, signals [DEVICE_ADDED], 0, provider, device);
+ IDE_EXIT;
}
static void
-ide_device_manager__provider_device_removed (IdeDeviceManager *self,
- IdeDevice *device,
- IdeDeviceProvider *provider)
+ide_device_manager_provider_device_removed_cb (IdeDeviceManager *self,
+ IdeDevice *device,
+ IdeDeviceProvider *provider)
{
- guint i;
-
- g_return_if_fail (IDE_IS_DEVICE_MANAGER (self));
- g_return_if_fail (IDE_IS_DEVICE (device));
- g_return_if_fail (IDE_IS_DEVICE_PROVIDER (provider));
+ IDE_ENTRY;
- if (self->devices == NULL)
- return;
+ g_assert (IDE_IS_DEVICE_MANAGER (self));
+ g_assert (IDE_IS_DEVICE (device));
+ g_assert (IDE_IS_DEVICE_PROVIDER (provider));
- for (i = 0; i < self->devices->len; i++)
+ for (guint i = 0; i < self->devices->len; i++)
{
- IdeDevice *current = g_ptr_array_index (self->devices, i);
+ IdeDevice *element = g_ptr_array_index (self->devices, i);
- if (current == device)
+ if (element == device)
{
g_ptr_array_remove_index (self->devices, i);
g_list_model_items_changed (G_LIST_MODEL (self), i, 1, 0);
- g_signal_emit (self, signals [DEVICE_REMOVED], 0, provider, device);
- return;
+ break;
}
}
- g_warning (_("The device ā%sā could not be found."),
- ide_device_get_id (device));
+ IDE_EXIT;
}
-void
-ide_device_manager_add_provider (IdeDeviceManager *self,
- IdeDeviceProvider *provider)
+static void
+ide_device_manager_provider_load_cb (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ IdeDeviceProvider *provider = (IdeDeviceProvider *)object;
+ g_autoptr(IdeDeviceManager) self = user_data;
+ g_autoptr(GError) error = NULL;
+
+ IDE_ENTRY;
+
+ g_assert (IDE_IS_DEVICE_PROVIDER (provider));
+ g_assert (G_IS_ASYNC_RESULT (result));
+ g_assert (IDE_IS_DEVICE_MANAGER (self));
+
+ if (!ide_device_provider_load_finish (provider, result, &error))
+ g_warning ("%s failed to load: %s",
+ G_OBJECT_TYPE_NAME (provider),
+ error->message);
+
+ IDE_EXIT;
+}
+
+static void
+ide_device_manager_provider_added_cb (PeasExtensionSet *set,
+ PeasPluginInfo *plugin_info,
+ PeasExtension *exten,
+ gpointer user_data)
{
+ IdeDeviceManager *self = user_data;
+ IdeDeviceProvider *provider = (IdeDeviceProvider *)exten;
g_autoptr(GPtrArray) devices = NULL;
- guint i;
+ guint position;
- g_return_if_fail (IDE_IS_DEVICE_MANAGER (self));
- g_return_if_fail (IDE_IS_DEVICE_PROVIDER (provider));
+ IDE_ENTRY;
- g_signal_connect_object (provider,
- "notify::settled",
- G_CALLBACK (ide_device_manager__provider_notify_settled),
- self,
- G_CONNECT_SWAPPED);
+ g_assert (PEAS_IS_EXTENSION_SET (set));
+ g_assert (IDE_IS_DEVICE_MANAGER (self));
+ g_assert (plugin_info != NULL);
+ g_assert (IDE_IS_DEVICE_PROVIDER (provider));
g_signal_connect_object (provider,
"device-added",
- G_CALLBACK (ide_device_manager__provider_device_added),
+ G_CALLBACK (ide_device_manager_provider_device_added_cb),
self,
G_CONNECT_SWAPPED);
g_signal_connect_object (provider,
"device-removed",
- G_CALLBACK (ide_device_manager__provider_device_removed),
+ G_CALLBACK (ide_device_manager_provider_device_removed_cb),
self,
G_CONNECT_SWAPPED);
devices = ide_device_provider_get_devices (provider);
+ position = self->devices->len;
- for (i = 0; i < devices->len; i++)
+ for (guint i = 0; i < devices->len; i++)
{
- IdeDevice *device;
+ IdeDevice *device = g_ptr_array_index (devices, i);
- device = g_ptr_array_index (devices, i);
- ide_device_manager__provider_device_added (self, device, provider);
+ g_assert (IDE_IS_DEVICE (device));
+
+ g_ptr_array_add (self->devices, g_object_ref (device));
}
-}
-static void
-ide_device_manager_provider_added (PeasExtensionSet *set,
- PeasPluginInfo *plugin_info,
- PeasExtension *exten,
- gpointer user_data)
-{
- IdeDeviceManager *self = user_data;
- IdeDeviceProvider *provider = (IdeDeviceProvider *)exten;
+ if (devices->len > 0)
+ g_list_model_items_changed (G_LIST_MODEL (self), position, 0, devices->len);
- g_assert (PEAS_IS_EXTENSION_SET (set));
- g_assert (IDE_IS_DEVICE_MANAGER (self));
- g_assert (plugin_info != NULL);
- g_assert (IDE_IS_DEVICE_PROVIDER (provider));
+ ide_device_provider_load_async (provider,
+ NULL,
+ ide_device_manager_provider_load_cb,
+ g_object_ref (self));
- ide_device_manager_add_provider (self, provider);
+ IDE_EXIT;
}
static void
-ide_device_manager_provider_removed (PeasExtensionSet *set,
- PeasPluginInfo *plugin_info,
- PeasExtension *exten,
- gpointer user_data)
+ide_device_manager_provider_removed_cb (PeasExtensionSet *set,
+ PeasPluginInfo *plugin_info,
+ PeasExtension *exten,
+ gpointer user_data)
{
IdeDeviceManager *self = user_data;
IdeDeviceProvider *provider = (IdeDeviceProvider *)exten;
g_autoptr(GPtrArray) devices = NULL;
- gsize i;
+
+ IDE_ENTRY;
g_assert (PEAS_IS_EXTENSION_SET (set));
g_assert (IDE_IS_DEVICE_MANAGER (self));
@@ -223,22 +177,32 @@ ide_device_manager_provider_removed (PeasExtensionSet *set,
devices = ide_device_provider_get_devices (provider);
- for (i = 0; i < devices->len; i++)
+ for (guint i = 0; i < devices->len; i++)
{
- IdeDevice *device = g_ptr_array_index (devices, i);
+ IdeDevice *removed_device = g_ptr_array_index (devices, i);
- ide_device_manager__provider_device_removed (self, device, provider);
+ for (guint j = 0; j < self->devices->len; j++)
+ {
+ IdeDevice *device = g_ptr_array_index (self->devices, j);
+
+ if (device == removed_device)
+ {
+ g_ptr_array_remove_index (self->devices, j);
+ g_list_model_items_changed (G_LIST_MODEL (self), j, 1, 0);
+ break;
+ }
+ }
}
g_signal_handlers_disconnect_by_func (provider,
- G_CALLBACK (ide_device_manager__provider_notify_settled),
- self);
- g_signal_handlers_disconnect_by_func (provider,
- G_CALLBACK (ide_device_manager__provider_device_added),
+ G_CALLBACK (ide_device_manager_provider_device_added_cb),
self);
+
g_signal_handlers_disconnect_by_func (provider,
- G_CALLBACK (ide_device_manager__provider_device_removed),
+ G_CALLBACK (ide_device_manager_provider_device_removed_cb),
self);
+
+ IDE_EXIT;
}
static void
@@ -250,55 +214,26 @@ ide_device_manager_add_providers (IdeDeviceManager *self)
context = ide_object_get_context (IDE_OBJECT (self));
- self->providers = ide_extension_set_new (peas_engine_get_default (),
- IDE_TYPE_DEVICE_PROVIDER,
- "context", context,
- NULL);
+ self->providers = peas_extension_set_new (peas_engine_get_default (),
+ IDE_TYPE_DEVICE_PROVIDER,
+ "context", context,
+ NULL);
g_signal_connect (self->providers,
"extension-added",
- G_CALLBACK (ide_device_manager_provider_added),
+ G_CALLBACK (ide_device_manager_provider_added_cb),
self);
g_signal_connect (self->providers,
"extension-removed",
- G_CALLBACK (ide_device_manager_provider_removed),
+ G_CALLBACK (ide_device_manager_provider_removed_cb),
self);
peas_extension_set_foreach (self->providers,
- (PeasExtensionSetForeachFunc)ide_device_manager_provider_added,
+ (PeasExtensionSetForeachFunc)ide_device_manager_provider_added_cb,
self);
}
-/**
- * ide_device_manager_get_devices:
- *
- * Retrieves all of the devices that are registered with the #IdeDeviceManager.
- *
- * Returns: (transfer container) (element-type Ide.Device): An array of devices
- * registered with the #IdeManager.
- */
-GPtrArray *
-ide_device_manager_get_devices (IdeDeviceManager *self)
-{
- GPtrArray *ret;
- guint i;
-
- g_return_val_if_fail (IDE_IS_DEVICE_MANAGER (self), NULL);
-
- ret = g_ptr_array_new_with_free_func (g_object_unref);
-
- for (i = 0; i < self->devices->len; i++)
- {
- IdeDevice *device;
-
- device = g_ptr_array_index (self->devices, i);
- g_ptr_array_add (ret, g_object_ref (device));
- }
-
- return ret;
-}
-
static void
ide_device_manager_add_local (IdeDeviceManager *self)
{
@@ -308,10 +243,9 @@ ide_device_manager_add_local (IdeDeviceManager *self)
g_return_if_fail (IDE_IS_DEVICE_MANAGER (self));
context = ide_object_get_context (IDE_OBJECT (self));
- device = g_object_new (IDE_TYPE_LOCAL_DEVICE,
- "context", context,
- NULL);
- ide_device_manager_do_add_device (self, device);
+ device = g_object_new (IDE_TYPE_LOCAL_DEVICE, "context", context, NULL);
+ g_ptr_array_add (self->devices, g_steal_pointer (&device));
+ g_list_model_items_changed (G_LIST_MODEL (self), self->devices->len - 1, 0, 1);
}
static GType
@@ -356,33 +290,25 @@ ide_device_manager_constructed (GObject *object)
}
static void
-ide_device_manager_finalize (GObject *object)
+ide_device_manager_dispose (GObject *object)
{
IdeDeviceManager *self = (IdeDeviceManager *)object;
- g_clear_pointer (&self->devices, g_ptr_array_unref);
+ if (self->devices->len > 0)
+ g_ptr_array_remove_range (self->devices, 0, self->devices->len);
g_clear_object (&self->providers);
- G_OBJECT_CLASS (ide_device_manager_parent_class)->finalize (object);
+ G_OBJECT_CLASS (ide_device_manager_parent_class)->dispose (object);
}
static void
-ide_device_manager_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
+ide_device_manager_finalize (GObject *object)
{
- IdeDeviceManager *self = IDE_DEVICE_MANAGER(object);
+ IdeDeviceManager *self = (IdeDeviceManager *)object;
- switch (prop_id)
- {
- case PROP_SETTLED:
- g_value_set_boolean (value, ide_device_manager_get_settled (self));
- break;
+ g_clear_pointer (&self->devices, g_ptr_array_unref);
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
- }
+ G_OBJECT_CLASS (ide_device_manager_parent_class)->finalize (object);
}
static void
@@ -391,39 +317,8 @@ ide_device_manager_class_init (IdeDeviceManagerClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->constructed = ide_device_manager_constructed;
+ object_class->dispose = ide_device_manager_dispose;
object_class->finalize = ide_device_manager_finalize;
- object_class->get_property = ide_device_manager_get_property;
-
- properties [PROP_SETTLED] =
- g_param_spec_boolean ("settled",
- "Settled",
- "If the device providers have settled.",
- FALSE,
- (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_properties (object_class, LAST_PROP, properties);
-
- signals [DEVICE_ADDED] =
- g_signal_new ("device-added",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- 0,
- NULL, NULL, NULL,
- G_TYPE_NONE,
- 2,
- IDE_TYPE_DEVICE_PROVIDER,
- IDE_TYPE_DEVICE);
-
- signals [DEVICE_REMOVED] =
- g_signal_new ("device-removed",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- 0,
- NULL, NULL, NULL,
- G_TYPE_NONE,
- 2,
- IDE_TYPE_DEVICE_PROVIDER,
- IDE_TYPE_DEVICE);
}
static void
@@ -442,6 +337,7 @@ ide_device_manager_init (IdeDeviceManager *self)
/**
* ide_device_manager_get_device:
+ * @self: an #IdeDeviceManager
* @device_id: The device identifier string.
*
* Fetches the first device that matches the device identifier @device_id.
@@ -452,11 +348,9 @@ IdeDevice *
ide_device_manager_get_device (IdeDeviceManager *self,
const gchar *device_id)
{
- gsize i;
-
g_return_val_if_fail (IDE_IS_DEVICE_MANAGER (self), NULL);
- for (i = 0; i < self->devices->len; i++)
+ for (guint i = 0; i < self->devices->len; i++)
{
IdeDevice *device;
const gchar *id;
diff --git a/src/libide/devices/ide-device-manager.h b/src/libide/devices/ide-device-manager.h
index 8754eb964..2821f12f7 100644
--- a/src/libide/devices/ide-device-manager.h
+++ b/src/libide/devices/ide-device-manager.h
@@ -18,10 +18,8 @@
#pragma once
-#include "ide-version-macros.h"
-
#include "ide-object.h"
-#include "devices/ide-device-manager.h"
+#include "ide-version-macros.h"
G_BEGIN_DECLS
@@ -30,17 +28,7 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (IdeDeviceManager, ide_device_manager, IDE, DEVICE_MANAGER, IdeObject)
IDE_AVAILABLE_IN_ALL
-void ide_device_manager_add_provider (IdeDeviceManager *self,
- IdeDeviceProvider *provider);
-IDE_AVAILABLE_IN_ALL
-GPtrArray *ide_device_manager_get_devices (IdeDeviceManager *self);
-IDE_AVAILABLE_IN_ALL
-gboolean ide_device_manager_get_settled (IdeDeviceManager *self);
-IDE_AVAILABLE_IN_ALL
-void ide_device_manager_remove_provider (IdeDeviceManager *self,
- IdeDeviceProvider *provider);
-IDE_AVAILABLE_IN_ALL
-IdeDevice *ide_device_manager_get_device (IdeDeviceManager *self,
- const gchar *device_id);
+IdeDevice *ide_device_manager_get_device (IdeDeviceManager *self,
+ const gchar *device_id);
G_END_DECLS
diff --git a/src/libide/devices/ide-device-provider.c b/src/libide/devices/ide-device-provider.c
index 0abe19c0e..7796fb42b 100644
--- a/src/libide/devices/ide-device-provider.c
+++ b/src/libide/devices/ide-device-provider.c
@@ -227,8 +227,6 @@ ide_device_provider_emit_device_removed (IdeDeviceProvider *provider,
* operation so that the device manager does not need to wait for additional
* devices to enter the "settled" state.
*
- * Returns: %TRUE if successful; otherwise %FALSE and @error is set.
- *
* Since: 3.28
*/
void
diff --git a/src/plugins/mingw/ide-mingw-device-provider.c b/src/plugins/mingw/ide-mingw-device-provider.c
index e10fa23c9..9cfec207d 100644
--- a/src/plugins/mingw/ide-mingw-device-provider.c
+++ b/src/plugins/mingw/ide-mingw-device-provider.c
@@ -25,212 +25,112 @@
struct _IdeMingwDeviceProvider
{
- IdeObject parent_instance;
-
- GPtrArray *devices;
-
- guint settled : 1;
+ IdeDeviceProvider parent_instance;
};
-static void device_provider_iface_init (IdeDeviceProviderInterface *iface);
-
-G_DEFINE_DYNAMIC_TYPE_EXTENDED (IdeMingwDeviceProvider,
- ide_mingw_device_provider,
- IDE_TYPE_OBJECT,
- 0,
- G_IMPLEMENT_INTERFACE (IDE_TYPE_DEVICE_PROVIDER,
- device_provider_iface_init))
-
-enum {
- PROP_0,
- PROP_SETTLED,
- LAST_PROP
-};
-
-static GParamSpec *properties [LAST_PROP];
-
-static GPtrArray *
-ide_mingw_device_provider_get_devices (IdeDeviceProvider *provider)
-{
- IdeMingwDeviceProvider *self = (IdeMingwDeviceProvider *)provider;
-
- g_return_val_if_fail (IDE_IS_MINGW_DEVICE_PROVIDER (self), NULL);
-
- return g_ptr_array_ref (self->devices);
-}
+G_DEFINE_TYPE (IdeMingwDeviceProvider, ide_mingw_device_provider, IDE_TYPE_DEVICE_PROVIDER)
static void
-ide_mingw_device_provider_discover_worker (GTask *task,
- gpointer source_object,
- gpointer task_data,
- GCancellable *cancellable)
+ide_mingw_device_provider_load_worker (GTask *task,
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable)
{
IdeMingwDeviceProvider *self = source_object;
- GPtrArray *devices;
+ g_autoptr(GPtrArray) devices = NULL;
+ g_autofree gchar *x32 = NULL;
+ g_autofree gchar *x64 = NULL;
IdeContext *context;
- gchar *mingw_path;
+
+ IDE_ENTRY;
g_assert (G_IS_TASK (task));
g_assert (IDE_IS_MINGW_DEVICE_PROVIDER (self));
-
- devices = g_ptr_array_new_with_free_func (g_object_unref);
+ g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
context = ide_object_get_context (IDE_OBJECT (self));
+ devices = g_ptr_array_new_with_free_func (g_object_unref);
- g_assert (IDE_IS_CONTEXT (context));
-
- /*
- * FIXME:
- *
- * I'm almost certain this is not the proper way to check for mingw support.
- * Someone that knows how this works, please fix this up!
- */
-
- mingw_path = g_find_program_in_path ("x86_64-w64-mingw32-gcc");
- if (mingw_path != NULL)
- {
- IdeDevice *device;
-
- g_free (mingw_path);
- /* add 64-bit mingw device */
- device = ide_mingw_device_new (context,
- _("MinGW 64-bit"),
- "local-x86_64-w64-mingw32",
- "x86_64-w64-mingw32");
- g_ptr_array_add (devices, device);
- }
-
- mingw_path = g_find_program_in_path ("i686-w64-mingw32-gcc");
- if (mingw_path != NULL)
- {
- IdeDevice *device;
-
- g_free (mingw_path);
- /* add 32-bit mingw device */
- device = ide_mingw_device_new (context,
- _("MinGW 32-bit"),
- "local-i686-w64-mingw32",
- "i686-w64-mingw32");
- g_ptr_array_add (devices, device);
- }
-
- g_task_return_pointer (task, devices, (GDestroyNotify)g_ptr_array_unref);
-
- ide_object_release (IDE_OBJECT (self));
+ if (NULL != (x64 = g_find_program_in_path ("x86_64-w64-mingw32-gcc")))
+ g_ptr_array_add (devices,
+ ide_mingw_device_new (context,
+ _("MinGW 64-bit"),
+ "local-x86_64-w64-mingw32",
+ "x86_64-w64-mingw32"));
+
+ if (NULL != (x32 = g_find_program_in_path ("i686-w64-mingw32-gcc")))
+ g_ptr_array_add (devices,
+ ide_mingw_device_new (context,
+ _("MinGW 32-bit"),
+ "local-i686-w64-mingw32",
+ "i686-w64-mingw32"));
+
+ g_task_return_pointer (task,
+ g_steal_pointer (&devices),
+ (GDestroyNotify)g_ptr_array_unref);
+
+ IDE_EXIT;
}
static void
-load_cb (GObject *object,
- GAsyncResult *result,
- gpointer user_data)
+ide_mingw_device_provider_load_async (IdeDeviceProvider *provider,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
- IdeMingwDeviceProvider *self = (IdeMingwDeviceProvider *)object;
- GTask *task = (GTask *)result;
- GPtrArray *devices;
- gsize i;
-
- g_assert (IDE_IS_MINGW_DEVICE_PROVIDER (self));
- g_assert (G_IS_TASK (task));
-
- devices = g_task_propagate_pointer (task, NULL);
+ IdeMingwDeviceProvider *self = (IdeMingwDeviceProvider *)provider;
+ g_autoptr(GTask) task = NULL;
- if (devices)
- {
- g_clear_pointer (&self->devices, g_ptr_array_unref);
- self->devices = devices;
+ IDE_ENTRY;
- for (i = 0; i < devices->len; i++)
- {
- IdeDevice *device;
+ g_assert (IDE_IS_MINGW_DEVICE_PROVIDER (self));
+ g_assert (IDE_IS_DEVICE_PROVIDER (provider));
- device = g_ptr_array_index (devices, i);
- ide_device_provider_emit_device_added (IDE_DEVICE_PROVIDER (self), device);
- }
- }
+ task = g_task_new (self, cancellable, callback, user_data);
+ g_task_set_source_tag (task, ide_mingw_device_provider_load_async);
+ ide_context_hold_for_object (ide_object_get_context (IDE_OBJECT (self)), task);
+ g_task_run_in_thread (task, ide_mingw_device_provider_load_worker);
- self->settled = TRUE;
- g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SETTLED]);
+ IDE_EXIT;
}
-static void
-ide_mingw_device_provider_constructed (GObject *object)
-{
- IdeMingwDeviceProvider *self = (IdeMingwDeviceProvider *)object;
- g_autoptr(GTask) task = NULL;
-
- g_assert (IDE_IS_MINGW_DEVICE_PROVIDER (self));
-
- ide_object_hold (IDE_OBJECT (self));
- task = g_task_new (self, NULL, load_cb, NULL);
- g_task_run_in_thread (task, ide_mingw_device_provider_discover_worker);
-}
-static void
-ide_mingw_device_provider_finalize (GObject *object)
+static gboolean
+ide_mingw_device_provider_load_finish (IdeDeviceProvider *provider,
+ GAsyncResult *result,
+ GError **error)
{
- IdeMingwDeviceProvider *self = (IdeMingwDeviceProvider *)object;
-
- g_clear_pointer (&self->devices, g_ptr_array_unref);
+ g_autoptr(GPtrArray) devices = NULL;
- G_OBJECT_CLASS (ide_mingw_device_provider_parent_class)->finalize (object);
-}
+ IDE_ENTRY;
-static void
-ide_mingw_device_provider_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- IdeMingwDeviceProvider *self = IDE_MINGW_DEVICE_PROVIDER(object);
+ g_assert (IDE_IS_MINGW_DEVICE_PROVIDER (provider));
+ g_assert (G_IS_TASK (result));
- switch (prop_id)
+ if (NULL != (devices = g_task_propagate_pointer (G_TASK (result), error)))
{
- case PROP_SETTLED:
- g_value_set_boolean (value, self->settled);
- break;
+ for (guint i = 0; i < devices->len; i++)
+ {
+ IdeDevice *device = g_ptr_array_index (devices, i);
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ g_assert (IDE_IS_DEVICE (device));
+
+ ide_device_provider_emit_device_added (provider, device);
+ }
}
+
+ IDE_RETURN (TRUE);
}
static void
ide_mingw_device_provider_class_init (IdeMingwDeviceProviderClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->constructed = ide_mingw_device_provider_constructed;
- object_class->finalize = ide_mingw_device_provider_finalize;
- object_class->get_property = ide_mingw_device_provider_get_property;
+ IdeDeviceProviderClass *provider_class = IDE_DEVICE_PROVIDER_CLASS (klass);
- properties [PROP_SETTLED] =
- g_param_spec_boolean ("settled",
- "Settled",
- "Settled",
- FALSE,
- (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_properties (object_class, LAST_PROP, properties);
-}
-
-static void
-ide_mingw_device_provider_class_finalize (IdeMingwDeviceProviderClass *klass)
-{
+ provider_class->load_async = ide_mingw_device_provider_load_async;
+ provider_class->load_finish = ide_mingw_device_provider_load_finish;
}
static void
ide_mingw_device_provider_init (IdeMingwDeviceProvider *self)
{
- self->devices = g_ptr_array_new_with_free_func (g_object_unref);
-}
-
-static void
-device_provider_iface_init (IdeDeviceProviderInterface *iface)
-{
- iface->get_devices = ide_mingw_device_provider_get_devices;
-}
-
-void
-_ide_mingw_device_provider_register_type (GTypeModule *module)
-{
- ide_mingw_device_provider_register_type (module);
}
diff --git a/src/plugins/mingw/ide-mingw-device-provider.h b/src/plugins/mingw/ide-mingw-device-provider.h
index 03aba88db..abe7c8794 100644
--- a/src/plugins/mingw/ide-mingw-device-provider.h
+++ b/src/plugins/mingw/ide-mingw-device-provider.h
@@ -24,6 +24,6 @@ G_BEGIN_DECLS
#define IDE_TYPE_MINGW_DEVICE_PROVIDER (ide_mingw_device_provider_get_type())
-G_DECLARE_FINAL_TYPE (IdeMingwDeviceProvider,ide_mingw_device_provider, IDE, MINGW_DEVICE_PROVIDER,
IdeObject)
+G_DECLARE_FINAL_TYPE (IdeMingwDeviceProvider,ide_mingw_device_provider, IDE, MINGW_DEVICE_PROVIDER,
IdeDeviceProvider)
G_END_DECLS
diff --git a/src/plugins/mingw/ide-mingw-device.c b/src/plugins/mingw/ide-mingw-device.c
index 89f0b4325..3f7de2ea1 100644
--- a/src/plugins/mingw/ide-mingw-device.c
+++ b/src/plugins/mingw/ide-mingw-device.c
@@ -26,7 +26,7 @@ struct _IdeMingwDevice
gchar *system_type;
};
-G_DEFINE_DYNAMIC_TYPE (IdeMingwDevice, ide_mingw_device, IDE_TYPE_DEVICE)
+G_DEFINE_TYPE (IdeMingwDevice, ide_mingw_device, IDE_TYPE_DEVICE)
IdeDevice *
ide_mingw_device_new (IdeContext *context,
@@ -78,11 +78,7 @@ ide_mingw_device_class_init (IdeMingwDeviceClass *klass)
device_class->get_system_type = ide_mingw_device_get_system_type;
}
-static void ide_mingw_device_class_finalize (IdeMingwDeviceClass *klass) { }
-static void ide_mingw_device_init (IdeMingwDevice *self) { }
-
-void
-_ide_mingw_device_register_type (GTypeModule *module)
+static void
+ide_mingw_device_init (IdeMingwDevice *self)
{
- ide_mingw_device_register_type (module);
}
diff --git a/src/plugins/mingw/mingw-plugin.c b/src/plugins/mingw/mingw-plugin.c
index 73015b411..1fe787d4f 100644
--- a/src/plugins/mingw/mingw-plugin.c
+++ b/src/plugins/mingw/mingw-plugin.c
@@ -19,16 +19,9 @@
#include <libpeas/peas.h>
#include "ide-mingw-device-provider.h"
-#include "ide-mingw-device.h"
-
-void _ide_mingw_device_provider_register_type (GTypeModule *module);
-void _ide_mingw_device_register_type (GTypeModule *module);
void
ide_mingw_register_types (PeasObjectModule *module)
{
- _ide_mingw_device_provider_register_type (G_TYPE_MODULE (module));
- _ide_mingw_device_register_type (G_TYPE_MODULE (module));
-
peas_object_module_register_extension_type (module, IDE_TYPE_DEVICE_PROVIDER,
IDE_TYPE_MINGW_DEVICE_PROVIDER);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]