diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h index f5423c12b..4678f7768 100644 --- a/src/backends/meta-backend-private.h +++ b/src/backends/meta-backend-private.h @@ -182,4 +182,8 @@ void meta_backend_add_gpu (MetaBackend *backend, META_EXPORT_TEST GList * meta_backend_get_gpus (MetaBackend *backend); +#ifdef HAVE_LIBWACOM +WacomDeviceDatabase * meta_backend_get_wacom_database (MetaBackend *backend); +#endif + #endif /* META_BACKEND_PRIVATE_H */ diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c index 6295c8b7e..f75df806b 100644 --- a/src/backends/meta-backend.c +++ b/src/backends/meta-backend.c @@ -134,6 +134,10 @@ struct _MetaBackendPrivate MetaProfiler *profiler; #endif +#ifdef HAVE_LIBWACOM + WacomDeviceDatabase *wacom_db; +#endif + ClutterBackend *clutter_backend; ClutterActor *stage; @@ -199,6 +203,10 @@ meta_backend_finalize (GObject *object) g_clear_object (&priv->remote_access_controller); #endif +#ifdef HAVE_LIBWACOM + g_clear_pointer (&priv->wacom_db, libwacom_database_destroy); +#endif + if (priv->sleep_signal_id) g_dbus_connection_signal_unsubscribe (priv->system_bus, priv->sleep_signal_id); if (priv->upower_watch_id) @@ -715,6 +723,15 @@ meta_backend_constructed (GObject *object) MetaBackendClass *backend_class = META_BACKEND_GET_CLASS (backend); +#ifdef HAVE_LIBWACOM + priv->wacom_db = libwacom_database_new (); + if (!priv->wacom_db) + { + g_warning ("Could not create database of Wacom devices, " + "expect tablets to misbehave"); + } +#endif + if (backend_class->is_lid_closed != meta_backend_real_is_lid_closed) return; @@ -1442,3 +1459,13 @@ meta_backend_get_gpus (MetaBackend *backend) return priv->gpus; } + +#ifdef HAVE_LIBWACOM +WacomDeviceDatabase * +meta_backend_get_wacom_database (MetaBackend *backend) +{ + MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); + + return priv->wacom_db; +} +#endif diff --git a/src/backends/meta-input-device-private.h b/src/backends/meta-input-device-private.h new file mode 100644 index 000000000..a2cbd4864 --- /dev/null +++ b/src/backends/meta-input-device-private.h @@ -0,0 +1,48 @@ +/* + * Copyright © 2020 Red Hat Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Author: Carlos Garnacho + */ +#ifndef META_INPUT_DEVICE_H +#define META_INPUT_DEVICE_H + +#include + +#ifdef HAVE_LIBWACOM +#include +#endif + +#include "clutter/clutter-mutter.h" + +typedef struct _MetaInputDeviceClass MetaInputDeviceClass; +typedef struct _MetaInputDevice MetaInputDevice; + +struct _MetaInputDeviceClass +{ + ClutterInputDeviceClass parent_class; +}; + +#define META_TYPE_INPUT_DEVICE (meta_input_device_get_type ()) +G_DECLARE_DERIVABLE_TYPE (MetaInputDevice, + meta_input_device, + META, INPUT_DEVICE, + ClutterInputDevice) + +#ifdef HAVE_LIBWACOM +WacomDevice * meta_input_device_get_wacom_device (MetaInputDevice *input_device); +#endif + +#endif /* META_INPUT_DEVICE_H */ diff --git a/src/backends/meta-input-device.c b/src/backends/meta-input-device.c new file mode 100644 index 000000000..e05c024e3 --- /dev/null +++ b/src/backends/meta-input-device.c @@ -0,0 +1,137 @@ +/* + * Copyright © 2020 Red Hat Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Author: Carlos Garnacho + */ + +#include "config.h" + +#include "backends/meta-backend-private.h" +#include "meta-input-device-private.h" + +typedef struct _MetaInputDevicePrivate MetaInputDevicePrivate; + +struct _MetaInputDevicePrivate +{ +#ifdef HAVE_LIBWACOM + WacomDevice *wacom_device; +#else + /* Just something to have non-zero sized struct otherwise */ + gpointer wacom_device; +#endif +}; + +enum +{ + PROP_WACOM_DEVICE = 1, + N_PROPS +}; + +static GParamSpec *props[N_PROPS] = { 0 }; + +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MetaInputDevice, + meta_input_device, + CLUTTER_TYPE_INPUT_DEVICE) + +static void +meta_input_device_init (MetaInputDevice *input_device) +{ +} + +static void +meta_input_device_constructed (GObject *object) +{ + MetaInputDevice *input_device = META_INPUT_DEVICE (object); +#ifdef HAVE_LIBWACOM + WacomDeviceDatabase *wacom_db; + MetaInputDevicePrivate *priv; + const char *node; +#endif + + G_OBJECT_CLASS (meta_input_device_parent_class)->constructed (object); + +#ifdef HAVE_LIBWACOM + priv = meta_input_device_get_instance_private (input_device); + wacom_db = meta_backend_get_wacom_database (meta_get_backend ()); + node = clutter_input_device_get_device_node (CLUTTER_INPUT_DEVICE (input_device)); + priv->wacom_device = libwacom_new_from_path (wacom_db, node, + WFALLBACK_NONE, NULL); +#endif /* HAVE_LIBWACOM */ +} + +static void +meta_input_device_finalize (GObject *object) +{ +#ifdef HAVE_LIBWACOM + MetaInputDevicePrivate *priv; + + priv = meta_input_device_get_instance_private (META_INPUT_DEVICE (object)); + + g_clear_pointer (&priv->wacom_device, libwacom_destroy); +#endif /* HAVE_LIBWACOM */ + + G_OBJECT_CLASS (meta_input_device_parent_class)->finalize (object); +} + +static void +meta_input_device_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + MetaInputDevicePrivate *priv; + + priv = meta_input_device_get_instance_private (META_INPUT_DEVICE (object)); + + switch (prop_id) + { + case PROP_WACOM_DEVICE: + g_value_set_pointer (value, priv->wacom_device); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +meta_input_device_class_init (MetaInputDeviceClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructed = meta_input_device_constructed; + object_class->finalize = meta_input_device_finalize; + object_class->get_property = meta_input_device_get_property; + + props[PROP_WACOM_DEVICE] = + g_param_spec_pointer ("wacom-device", + "Wacom device", + "Wacom device", + G_PARAM_READABLE); + + g_object_class_install_properties (object_class, N_PROPS, props); +} + +#ifdef HAVE_LIBWACOM +WacomDevice * +meta_input_device_get_wacom_device (MetaInputDevice *input_device) +{ + MetaInputDevicePrivate *priv; + + priv = meta_input_device_get_instance_private (input_device); + + return priv->wacom_device; +} +#endif /* HAVE_LIBWACOM */ diff --git a/src/backends/native/meta-input-device-native.c b/src/backends/native/meta-input-device-native.c index 34054c5e9..4b87eb2a0 100644 --- a/src/backends/native/meta-input-device-native.c +++ b/src/backends/native/meta-input-device-native.c @@ -31,7 +31,7 @@ G_DEFINE_TYPE (MetaInputDeviceNative, meta_input_device_native, - CLUTTER_TYPE_INPUT_DEVICE) + META_TYPE_INPUT_DEVICE) enum { diff --git a/src/backends/native/meta-input-device-native.h b/src/backends/native/meta-input-device-native.h index 9b3a21904..59cff51ef 100644 --- a/src/backends/native/meta-input-device-native.h +++ b/src/backends/native/meta-input-device-native.h @@ -28,6 +28,7 @@ #include +#include "backends/meta-input-device-private.h" #include "backends/native/meta-seat-native.h" #include "clutter/clutter-mutter.h" diff --git a/src/backends/x11/meta-input-device-x11.c b/src/backends/x11/meta-input-device-x11.c index af07c34f6..3d96c344e 100644 --- a/src/backends/x11/meta-input-device-x11.c +++ b/src/backends/x11/meta-input-device-x11.c @@ -52,7 +52,7 @@ struct _MetaInputDeviceX11Class G_DEFINE_TYPE (MetaInputDeviceX11, meta_input_device_x11, - CLUTTER_TYPE_INPUT_DEVICE) + META_TYPE_INPUT_DEVICE) static void meta_input_device_x11_constructed (GObject *object) diff --git a/src/backends/x11/meta-input-device-x11.h b/src/backends/x11/meta-input-device-x11.h index eacef955a..1cbee031a 100644 --- a/src/backends/x11/meta-input-device-x11.h +++ b/src/backends/x11/meta-input-device-x11.h @@ -26,6 +26,7 @@ #include #endif +#include "backends/meta-input-device-private.h" #include "clutter/clutter.h" G_BEGIN_DECLS diff --git a/src/meson.build b/src/meson.build index b882b5350..bb1b48b44 100644 --- a/src/meson.build +++ b/src/meson.build @@ -190,6 +190,7 @@ mutter_sources = [ 'backends/meta-idle-monitor-dbus.c', 'backends/meta-idle-monitor-dbus.h', 'backends/meta-idle-monitor-private.h', + 'backends/meta-input-device.c', 'backends/meta-input-mapper.c', 'backends/meta-input-mapper-private.h', 'backends/meta-input-settings.c',