[gnome-builder/wip/chergert/deviced] device-manager: add current device property
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/chergert/deviced] device-manager: add current device property
- Date: Sat, 24 Feb 2018 01:07:17 +0000 (UTC)
commit f38b2db2ec7c2ef80b07c9917fa301f46128dc55
Author: Christian Hergert <chergert redhat com>
Date: Fri Feb 23 17:05:48 2018 -0800
device-manager: add current device property
This also changes our ABI while we still can to be more sensible
in getting a device by id.
src/libide/config/ide-configuration.c | 4 +-
src/libide/devices/ide-device-manager.c | 152 ++++++++++++++++++++++++++++++--
src/libide/devices/ide-device-manager.h | 9 +-
3 files changed, 156 insertions(+), 9 deletions(-)
---
diff --git a/src/libide/config/ide-configuration.c b/src/libide/config/ide-configuration.c
index 9dfab740f..8edfa6e35 100644
--- a/src/libide/config/ide-configuration.c
+++ b/src/libide/config/ide-configuration.c
@@ -144,7 +144,7 @@ ide_configuration_real_get_device (IdeConfiguration *self)
{
IdeContext *context = ide_object_get_context (IDE_OBJECT (self));
IdeDeviceManager *device_manager = ide_context_get_device_manager (context);
- IdeDevice *device = ide_device_manager_get_device (device_manager, priv->device_id);
+ IdeDevice *device = ide_device_manager_get_device_by_id (device_manager, priv->device_id);
if (device != NULL)
return g_object_ref (device);
@@ -207,7 +207,7 @@ ide_configuration_device_manager_items_changed (IdeConfiguration *self,
if (ide_object_is_unloading (IDE_OBJECT (self)))
return;
- device = ide_device_manager_get_device (device_manager, priv->device_id);
+ device = ide_device_manager_get_device_by_id (device_manager, priv->device_id);
device_ready = !!device;
if (!priv->device_ready && device_ready)
diff --git a/src/libide/devices/ide-device-manager.c b/src/libide/devices/ide-device-manager.c
index a8b36586e..07b99e518 100644
--- a/src/libide/devices/ide-device-manager.c
+++ b/src/libide/devices/ide-device-manager.c
@@ -30,8 +30,25 @@
struct _IdeDeviceManager
{
- IdeObject parent_instance;
- GPtrArray *devices;
+ IdeObject parent_instance;
+
+ /*
+ * The currently selected device. Various subsystems will track this
+ * to update necessary changes for the device type. For example, the
+ * build pipeline will need to adjust things based on the current
+ * device to ensure we are building for the right architecture.
+ */
+ IdeDevice *device;
+
+ /*
+ * The devices that have been registered by IdeDeviceProvier plugins.
+ * It always has at least one device, the "local" device (IdeLocalDevice).
+ */
+ GPtrArray *devices;
+
+ /*
+ * The providers that are registered in plugins supporting IdeDeviceProvider.
+ */
PeasExtensionSet *providers;
};
@@ -40,6 +57,14 @@ 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_DEVICE,
+ N_PROPS
+};
+
+static GParamSpec *properties [N_PROPS];
+
static void
ide_device_manager_provider_device_added_cb (IdeDeviceManager *self,
IdeDevice *device,
@@ -317,6 +342,8 @@ ide_device_manager_dispose (GObject *object)
if (self->devices->len > 0)
g_ptr_array_remove_range (self->devices, 0, self->devices->len);
+
+ g_clear_object (&self->device);
g_clear_object (&self->providers);
G_OBJECT_CLASS (ide_device_manager_parent_class)->dispose (object);
@@ -332,6 +359,44 @@ ide_device_manager_finalize (GObject *object)
G_OBJECT_CLASS (ide_device_manager_parent_class)->finalize (object);
}
+static void
+ide_device_manager_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ IdeDeviceManager *self = IDE_DEVICE_MANAGER (object);
+
+ switch (prop_id)
+ {
+ case PROP_DEVICE:
+ g_value_set_object (value, ide_device_manager_get_device (self));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+ide_device_manager_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ IdeDeviceManager *self = IDE_DEVICE_MANAGER (object);
+
+ switch (prop_id)
+ {
+ case PROP_DEVICE:
+ ide_device_manager_set_device (self, g_value_get_object (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
static void
ide_device_manager_class_init (IdeDeviceManagerClass *klass)
{
@@ -340,6 +405,26 @@ ide_device_manager_class_init (IdeDeviceManagerClass *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;
+ object_class->set_property = ide_device_manager_set_property;
+
+ /**
+ * IdeDeviceManager:device:
+ *
+ * The "device" property indicates the currently selected device by the
+ * user. This is the device we will try to deploy to when running, and
+ * execute the application on.
+ *
+ * Since: 3.28
+ */
+ properties [PROP_DEVICE] =
+ g_param_spec_object ("device",
+ "Device",
+ "The currently selected device to build for",
+ IDE_TYPE_DEVICE,
+ G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class, N_PROPS, properties);
}
static void
@@ -357,7 +442,7 @@ ide_device_manager_init (IdeDeviceManager *self)
}
/**
- * ide_device_manager_get_device:
+ * ide_device_manager_get_device_by_id:
* @self: an #IdeDeviceManager
* @device_id: The device identifier string.
*
@@ -366,8 +451,8 @@ ide_device_manager_init (IdeDeviceManager *self)
* Returns: (transfer none): An #IdeDevice or %NULL.
*/
IdeDevice *
-ide_device_manager_get_device (IdeDeviceManager *self,
- const gchar *device_id)
+ide_device_manager_get_device_by_id (IdeDeviceManager *self,
+ const gchar *device_id)
{
g_return_val_if_fail (IDE_IS_DEVICE_MANAGER (self), NULL);
@@ -385,3 +470,60 @@ ide_device_manager_get_device (IdeDeviceManager *self,
return NULL;
}
+
+/**
+ * ide_device_manager_get_device:
+ * @self: a #IdeDeviceManager
+ *
+ * Gets the currently selected device.
+ * Usually, this is an #IdeLocalDevice.
+ *
+ * Returns: (transfer none) (not nullable): an #IdeDevice
+ *
+ * Since: 3.28
+ */
+IdeDevice *
+ide_device_manager_get_device (IdeDeviceManager *self)
+{
+ g_return_val_if_fail (IDE_IS_DEVICE_MANAGER (self), NULL);
+ g_return_val_if_fail (self->devices->len > 0, NULL);
+
+ if (self->device == NULL)
+ {
+ for (guint i = 0; i < self->devices->len; i++)
+ {
+ IdeDevice *device = g_ptr_array_index (self->devices, i);
+
+ if (IDE_IS_LOCAL_DEVICE (device))
+ return device;
+ }
+
+ g_assert_not_reached ();
+ }
+
+ return self->device;
+}
+
+/**
+ * ide_device_manager_set_device:
+ * @self: an #IdeDeviceManager
+ * @device: (nullable): an #IdeDevice or %NULL
+ *
+ * Sets the #IdeDeviceManager:device property, which is the currently selected
+ * device. Builder uses this to determine how to build the current project for
+ * the devices architecture and operating system.
+ *
+ * If @device is %NULL, the local device will be used.
+ *
+ * Since: 3.28
+ */
+void
+ide_device_manager_set_device (IdeDeviceManager *self,
+ IdeDevice *device)
+{
+ g_return_if_fail (IDE_IS_DEVICE_MANAGER (self));
+ g_return_if_fail (!device || IDE_IS_DEVICE (device));
+
+ if (g_set_object (&self->device, device))
+ g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_DEVICE]);
+}
diff --git a/src/libide/devices/ide-device-manager.h b/src/libide/devices/ide-device-manager.h
index 2821f12f7..617dc733b 100644
--- a/src/libide/devices/ide-device-manager.h
+++ b/src/libide/devices/ide-device-manager.h
@@ -28,7 +28,12 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (IdeDeviceManager, ide_device_manager, IDE, DEVICE_MANAGER, IdeObject)
IDE_AVAILABLE_IN_ALL
-IdeDevice *ide_device_manager_get_device (IdeDeviceManager *self,
- const gchar *device_id);
+IdeDevice *ide_device_manager_get_device (IdeDeviceManager *self);
+IDE_AVAILABLE_IN_ALL
+void ide_device_manager_set_device (IdeDeviceManager *self,
+ IdeDevice *device);
+IDE_AVAILABLE_IN_ALL
+IdeDevice *ide_device_manager_get_device_by_id (IdeDeviceManager *self,
+ const gchar *device_id);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]