common: Add GsdDevice API to tell whether 2 devices are grouped

This will be used for pad devices, better than the current way of
comparing name strings coming from libwacom.

https://gitlab.gnome.org/GNOME/gnome-control-center/issues/415
This commit is contained in:
Carlos Garnacho 2019-12-05 15:52:32 +01:00
parent eb14c5a64f
commit 14da368600
2 changed files with 40 additions and 2 deletions

View file

@ -42,6 +42,7 @@ typedef struct
gchar *device_file;
gchar *vendor_id;
gchar *product_id;
gchar *group;
GsdDeviceType type;
guint width;
guint height;
@ -63,7 +64,8 @@ enum {
PROP_PRODUCT_ID,
PROP_TYPE,
PROP_WIDTH,
PROP_HEIGHT
PROP_HEIGHT,
PROP_GROUP
};
enum {
@ -124,6 +126,9 @@ gsd_device_set_property (GObject *object,
case PROP_HEIGHT:
priv->height = g_value_get_uint (value);
break;
case PROP_GROUP:
priv->group = g_value_dup_string (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -162,6 +167,9 @@ gsd_device_get_property (GObject *object,
case PROP_HEIGHT:
g_value_set_uint (value, priv->height);
break;
case PROP_GROUP:
g_value_set_string (value, priv->group);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -179,6 +187,7 @@ gsd_device_finalize (GObject *object)
g_free (priv->vendor_id);
g_free (priv->product_id);
g_free (priv->device_file);
g_free (priv->group);
G_OBJECT_CLASS (gsd_device_parent_class)->finalize (object);
}
@ -248,6 +257,14 @@ gsd_device_class_init (GsdDeviceClass *klass)
0, G_MAXUINT, 0,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
PROP_GROUP,
g_param_spec_string ("group",
"Group",
"Group",
NULL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
}
static void
@ -385,7 +402,7 @@ device_is_evdev (GUdevDevice *device)
static GsdDevice *
create_device (GUdevDevice *udev_device)
{
const gchar *vendor, *product, *name;
const gchar *vendor, *product, *name, *group;
guint width, height;
g_autoptr(GUdevDevice) parent = NULL;
@ -404,6 +421,8 @@ create_device (GUdevDevice *udev_device)
width = g_udev_device_get_property_as_int (udev_device, "ID_INPUT_WIDTH_MM");
height = g_udev_device_get_property_as_int (udev_device, "ID_INPUT_HEIGHT_MM");
group = g_udev_device_get_property (udev_device, "LIBINPUT_DEVICE_GROUP");
return g_object_new (GSD_TYPE_DEVICE,
"name", name,
"device-file", g_udev_device_get_device_file (udev_device),
@ -412,6 +431,7 @@ create_device (GUdevDevice *udev_device)
"product-id", product,
"width", width,
"height", height,
"group", group,
NULL);
}
@ -654,3 +674,19 @@ gsd_device_manager_lookup_gdk_device (GsdDeviceManager *manager,
return klass->lookup_device (manager, gdk_device);
}
gboolean
gsd_device_shares_group (GsdDevice *device1,
GsdDevice *device2)
{
GsdDevicePrivate *priv1, *priv2;
priv1 = gsd_device_get_instance_private (GSD_DEVICE (device1));
priv2 = gsd_device_get_instance_private (GSD_DEVICE (device2));
/* Don't group NULLs together */
if (!priv1->group && !priv2->group)
return FALSE;
return g_strcmp0 (priv1->group, priv2->group) == 0;
}

View file

@ -80,5 +80,7 @@ gboolean gsd_device_get_dimensions (GsdDevice *device,
GsdDevice * gsd_device_manager_lookup_gdk_device (GsdDeviceManager *manager,
GdkDevice *gdk_device);
gboolean gsd_device_shares_group (GsdDevice *device1,
GsdDevice *device2);
G_END_DECLS