diff --git a/src/backends/native/meta-kms-device.c b/src/backends/native/meta-kms-device.c index 5849eebba..37e7fcd2f 100644 --- a/src/backends/native/meta-kms-device.c +++ b/src/backends/native/meta-kms-device.c @@ -236,6 +236,26 @@ typedef struct _CreateImplDeviceData char *out_driver_description; } CreateImplDeviceData; +static gboolean +get_driver_info (int fd, + char **name, + char **description) +{ + drmVersion *drm_version; + + drm_version = drmGetVersion (fd); + if (!drm_version) + return FALSE; + + *name = g_strndup (drm_version->name, + drm_version->name_len); + *description = g_strndup (drm_version->desc, + drm_version->desc_len); + drmFreeVersion (drm_version); + + return TRUE; +} + static MetaKmsImplDevice * meta_create_kms_impl_device (MetaKmsDevice *device, MetaKmsImpl *impl, @@ -243,6 +263,8 @@ meta_create_kms_impl_device (MetaKmsDevice *device, GError **error) { int ret; + g_autofree char *driver_name = NULL; + g_autofree char *driver_description = NULL; meta_assert_in_kms_impl (meta_kms_impl_get_kms (impl)); @@ -255,10 +277,18 @@ meta_create_kms_impl_device (MetaKmsDevice *device, return NULL; } + if (!get_driver_info (fd, &driver_name, &driver_description)) + { + driver_name = g_strdup ("unknown"); + driver_description = g_strdup ("Unknown"); + } + return g_initable_new (META_TYPE_KMS_IMPL_DEVICE_SIMPLE, NULL, error, "device", device, "impl", impl, "fd", fd, + "driver-name", driver_name, + "driver-description", driver_description, NULL); } diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c index c0989ec58..c180aa111 100644 --- a/src/backends/native/meta-kms-impl-device.c +++ b/src/backends/native/meta-kms-impl-device.c @@ -45,6 +45,8 @@ enum PROP_DEVICE, PROP_IMPL, PROP_FD, + PROP_DRIVER_NAME, + PROP_DRIVER_DESCRIPTION, N_PROPS }; @@ -549,24 +551,6 @@ init_fallback_modes (MetaKmsImplDevice *impl_device) priv->fallback_modes = g_list_reverse (modes); } -static void -init_info (MetaKmsImplDevice *impl_device) -{ - MetaKmsImplDevicePrivate *priv = - meta_kms_impl_device_get_instance_private (impl_device); - drmVersion *drm_version; - - drm_version = drmGetVersion (priv->fd); - if (!drm_version) - return; - - priv->driver_name = g_strndup (drm_version->name, - drm_version->name_len); - priv->driver_description = g_strndup (drm_version->desc, - drm_version->desc_len); - drmFreeVersion (drm_version); -} - void meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device) { @@ -693,6 +677,12 @@ meta_kms_impl_device_get_property (GObject *object, case PROP_FD: g_value_set_int (value, priv->fd); break; + case PROP_DRIVER_NAME: + g_value_set_string (value, priv->driver_name); + break; + case PROP_DRIVER_DESCRIPTION: + g_value_set_string (value, priv->driver_name); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -720,6 +710,12 @@ meta_kms_impl_device_set_property (GObject *object, case PROP_FD: priv->fd = g_value_get_int (value); break; + case PROP_DRIVER_NAME: + priv->driver_name = g_value_dup_string (value); + break; + case PROP_DRIVER_DESCRIPTION: + priv->driver_description = g_value_dup_string (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -769,7 +765,6 @@ meta_kms_impl_device_initable_init (GInitable *initable, init_crtcs (impl_device, drm_resources); init_planes (impl_device); - init_info (impl_device); init_fallback_modes (impl_device); @@ -829,5 +824,21 @@ meta_kms_impl_device_class_init (MetaKmsImplDeviceClass *klass) G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + obj_props[PROP_DRIVER_NAME] = + g_param_spec_string ("driver-name", + "driver-name", + "DRM device driver name", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + obj_props[PROP_DRIVER_DESCRIPTION] = + g_param_spec_string ("driver-description", + "driver-description", + "DRM device driver description", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, N_PROPS, obj_props); }