diff options
-rw-r--r-- | clutter/clutter/clutter-enums.h | 7 | ||||
-rw-r--r-- | clutter/clutter/clutter-input-device.c | 46 | ||||
-rw-r--r-- | clutter/clutter/clutter-input-device.h | 12 | ||||
-rw-r--r-- | src/backends/native/meta-input-device-native.c | 102 | ||||
-rw-r--r-- | src/backends/native/meta-input-device-native.h | 1 | ||||
-rw-r--r-- | src/wayland/meta-wayland-tablet-pad-group.c | 30 | ||||
-rw-r--r-- | src/wayland/meta-wayland-tablet-pad.c | 68 |
7 files changed, 178 insertions, 88 deletions
diff --git a/clutter/clutter/clutter-enums.h b/clutter/clutter/clutter-enums.h index bcc848b38..9b0c29fa0 100644 --- a/clutter/clutter/clutter-enums.h +++ b/clutter/clutter/clutter-enums.h @@ -1613,6 +1613,13 @@ typedef enum typedef enum { + CLUTTER_PAD_FEATURE_BUTTON, + CLUTTER_PAD_FEATURE_RING, + CLUTTER_PAD_FEATURE_STRIP, +} ClutterInputDevicePadFeature; + +typedef enum +{ CLUTTER_INPUT_CONTENT_HINT_COMPLETION = 1 << 0, CLUTTER_INPUT_CONTENT_HINT_SPELLCHECK = 1 << 1, CLUTTER_INPUT_CONTENT_HINT_AUTO_CAPITALIZATION = 1 << 2, diff --git a/clutter/clutter/clutter-input-device.c b/clutter/clutter/clutter-input-device.c index 87c8a6820..a6df00643 100644 --- a/clutter/clutter/clutter-input-device.c +++ b/clutter/clutter/clutter-input-device.c @@ -67,6 +67,7 @@ enum PROP_N_STRIPS, PROP_N_RINGS, PROP_N_MODE_GROUPS, + PROP_N_BUTTONS, PROP_DEVICE_NODE, PROP_LAST @@ -100,6 +101,7 @@ struct _ClutterInputDevicePrivate int n_rings; int n_strips; int n_mode_groups; + int n_buttons; gboolean has_cursor; }; @@ -216,6 +218,10 @@ clutter_input_device_set_property (GObject *gobject, priv->n_mode_groups = g_value_get_int (value); break; + case PROP_N_BUTTONS: + priv->n_buttons = g_value_get_int (value); + break; + case PROP_DEVICE_NODE: priv->node_path = g_value_dup_string (value); break; @@ -282,6 +288,10 @@ clutter_input_device_get_property (GObject *gobject, g_value_set_int (value, priv->n_mode_groups); break; + case PROP_N_BUTTONS: + g_value_set_int (value, priv->n_buttons); + break; + case PROP_DEVICE_NODE: g_value_set_string (value, priv->node_path); break; @@ -432,6 +442,13 @@ clutter_input_device_class_init (ClutterInputDeviceClass *klass) 0, G_MAXINT, 0, CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + obj_props[PROP_N_BUTTONS] = + g_param_spec_int ("n-buttons", + P_("Number of buttons"), + P_("Number of buttons"), + 0, G_MAXINT, 0, + CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + obj_props[PROP_DEVICE_NODE] = g_param_spec_string ("device-node", P_("Device node path"), @@ -1237,6 +1254,19 @@ clutter_input_device_get_n_mode_groups (ClutterInputDevice *device) } gint +clutter_input_device_get_n_buttons (ClutterInputDevice *device) +{ + ClutterInputDevicePrivate *priv = + clutter_input_device_get_instance_private (device); + + g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), 0); + g_return_val_if_fail (clutter_input_device_get_device_type (device) == + CLUTTER_PAD_DEVICE, 0); + + return priv->n_buttons; +} + +gint clutter_input_device_get_group_n_modes (ClutterInputDevice *device, gint group) { @@ -1295,6 +1325,22 @@ clutter_input_device_get_mode_switch_button_group (ClutterInputDevice *device, return -1; } +int +clutter_input_device_get_pad_feature_group (ClutterInputDevice *device, + ClutterInputDevicePadFeature feature, + int n_feature) +{ + ClutterInputDeviceClass *device_class; + + device_class = CLUTTER_INPUT_DEVICE_GET_CLASS (device); + if (!device_class->get_pad_feature_group) + return 0; + + return CLUTTER_INPUT_DEVICE_GET_CLASS (device)->get_pad_feature_group (device, + feature, + n_feature); +} + const gchar * clutter_input_device_get_device_node (ClutterInputDevice *device) { diff --git a/clutter/clutter/clutter-input-device.h b/clutter/clutter/clutter-input-device.h index c2a2521ce..28ab0443b 100644 --- a/clutter/clutter/clutter-input-device.h +++ b/clutter/clutter/clutter-input-device.h @@ -50,6 +50,10 @@ struct _ClutterInputDeviceClass gboolean (* is_grouped) (ClutterInputDevice *device, ClutterInputDevice *other_device); + int (* get_pad_feature_group) (ClutterInputDevice *device, + ClutterInputDevicePadFeature feature, + int n_feature); + /* Keyboard accessbility */ void (* process_kbd_a11y_event) (ClutterEvent *event, ClutterInputDevice *device, @@ -128,6 +132,9 @@ CLUTTER_EXPORT gint clutter_input_device_get_n_strips (ClutterInputDevice *device); CLUTTER_EXPORT gint clutter_input_device_get_n_mode_groups (ClutterInputDevice *device); +CLUTTER_EXPORT +int clutter_input_device_get_n_buttons (ClutterInputDevice *device); + CLUTTER_EXPORT gint clutter_input_device_get_group_n_modes (ClutterInputDevice *device, @@ -150,6 +157,11 @@ gboolean clutter_input_device_is_grouped (ClutterInputDev CLUTTER_EXPORT ClutterSeat * clutter_input_device_get_seat (ClutterInputDevice *device); +CLUTTER_EXPORT +int clutter_input_device_get_pad_feature_group (ClutterInputDevice *device, + ClutterInputDevicePadFeature feature, + int n_feature); + G_END_DECLS #endif /* __CLUTTER_INPUT_DEVICE_H__ */ diff --git a/src/backends/native/meta-input-device-native.c b/src/backends/native/meta-input-device-native.c index ec571cff0..86a61be12 100644 --- a/src/backends/native/meta-input-device-native.c +++ b/src/backends/native/meta-input-device-native.c @@ -52,6 +52,15 @@ typedef struct _SlowKeysEventPending guint timer; } SlowKeysEventPending; +typedef struct _PadFeature PadFeature; + +struct _PadFeature +{ + ClutterInputDevicePadFeature feature; + int n_feature; + int group; +}; + static void clear_slow_keys (MetaInputDeviceNative *device); static void stop_bounce_keys (MetaInputDeviceNative *device); static void stop_toggle_slowkeys (MetaInputDeviceNative *device); @@ -70,6 +79,8 @@ meta_input_device_native_finalize (GObject *object) stop_toggle_slowkeys (device_evdev); stop_mousekeys_move (device_evdev); + g_clear_pointer (&device_evdev->pad_features, g_array_unref); + G_OBJECT_CLASS (meta_input_device_native_parent_class)->finalize (object); } @@ -160,6 +171,31 @@ meta_input_device_native_is_grouped (ClutterInputDevice *device, libinput_device_get_device_group (other_libinput_device); } +static int +meta_input_device_native_get_pad_feature_group (ClutterInputDevice *device, + ClutterInputDevicePadFeature feature, + int n_feature) +{ + MetaInputDeviceNative *device_native = META_INPUT_DEVICE_NATIVE (device); + int i; + + if (!device_native->pad_features) + return -1; + + for (i = 0; i < device_native->pad_features->len; i++) + { + PadFeature *pad_feature; + + pad_feature = &g_array_index (device_native->pad_features, PadFeature, i); + + if (pad_feature->feature == feature && + pad_feature->n_feature == n_feature) + return pad_feature->group; + } + + return -1; +} + static void meta_input_device_native_bell_notify (MetaInputDeviceNative *device) { @@ -1183,17 +1219,18 @@ meta_input_device_native_a11y_maybe_notify_toggle_keys (MetaInputDeviceNative *d static void meta_input_device_native_class_init (MetaInputDeviceNativeClass *klass) { - ClutterInputDeviceClass *device_manager_class = CLUTTER_INPUT_DEVICE_CLASS (klass); + ClutterInputDeviceClass *device_class = CLUTTER_INPUT_DEVICE_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = meta_input_device_native_finalize; object_class->set_property = meta_input_device_native_set_property; object_class->get_property = meta_input_device_native_get_property; - device_manager_class->is_mode_switch_button = meta_input_device_native_is_mode_switch_button; - device_manager_class->get_group_n_modes = meta_input_device_native_get_group_n_modes; - device_manager_class->is_grouped = meta_input_device_native_is_grouped; - device_manager_class->process_kbd_a11y_event = meta_input_device_native_process_kbd_a11y_event; + device_class->is_mode_switch_button = meta_input_device_native_is_mode_switch_button; + device_class->get_group_n_modes = meta_input_device_native_get_group_n_modes; + device_class->is_grouped = meta_input_device_native_is_grouped; + device_class->get_pad_feature_group = meta_input_device_native_get_pad_feature_group; + device_class->process_kbd_a11y_event = meta_input_device_native_process_kbd_a11y_event; obj_props[PROP_DEVICE_MATRIX] = g_param_spec_boxed ("device-matrix", @@ -1219,6 +1256,53 @@ meta_input_device_native_init (MetaInputDeviceNative *self) self->output_ratio = 0; } +static void +update_pad_features (MetaInputDeviceNative *device_native) +{ + ClutterInputDevice *device = CLUTTER_INPUT_DEVICE (device_native); + struct libinput_device *libinput_device; + struct libinput_tablet_pad_mode_group *mode_group; + int n_groups, n_buttons, n_rings, n_strips, i, j; + + libinput_device = meta_input_device_native_get_libinput_device (device); + n_rings = libinput_device_tablet_pad_get_num_rings (libinput_device); + n_strips = libinput_device_tablet_pad_get_num_strips (libinput_device); + n_groups = libinput_device_tablet_pad_get_num_mode_groups (libinput_device); + n_buttons = libinput_device_tablet_pad_get_num_buttons (libinput_device); + + device_native->pad_features = g_array_new (FALSE, FALSE, sizeof (PadFeature)); + + for (i = 0; i < n_groups; i++) + { + mode_group = + libinput_device_tablet_pad_get_mode_group (libinput_device, i); + + for (j = 0; j < n_buttons; j++) + { + PadFeature feature = { CLUTTER_PAD_FEATURE_BUTTON, j, i }; + + if (libinput_tablet_pad_mode_group_has_button (mode_group, j)) + g_array_append_val (device_native->pad_features, feature); + } + + for (j = 0; j < n_rings; j++) + { + PadFeature feature = { CLUTTER_PAD_FEATURE_RING, j, i }; + + if (libinput_tablet_pad_mode_group_has_ring (mode_group, j)) + g_array_append_val (device_native->pad_features, feature); + } + + for (j = 0; j < n_strips; j++) + { + PadFeature feature = { CLUTTER_PAD_FEATURE_STRIP, j, i }; + + if (libinput_tablet_pad_mode_group_has_strip (mode_group, j)) + g_array_append_val (device_native->pad_features, feature); + } + } +} + /* * meta_input_device_native_new: * @manager: the device manager @@ -1235,7 +1319,7 @@ meta_input_device_native_new (MetaSeatImpl *seat_impl, MetaInputDeviceNative *device; ClutterInputDeviceType type; char *vendor, *product; - int n_rings = 0, n_strips = 0, n_groups = 1; + int n_rings = 0, n_strips = 0, n_groups = 1, n_buttons = 0; char *node_path; double width, height; @@ -1250,6 +1334,7 @@ meta_input_device_native_new (MetaSeatImpl *seat_impl, n_rings = libinput_device_tablet_pad_get_num_rings (libinput_device); n_strips = libinput_device_tablet_pad_get_num_strips (libinput_device); n_groups = libinput_device_tablet_pad_get_num_mode_groups (libinput_device); + n_buttons = libinput_device_tablet_pad_get_num_buttons (libinput_device); } device = g_object_new (META_TYPE_INPUT_DEVICE_NATIVE, @@ -1261,6 +1346,7 @@ meta_input_device_native_new (MetaSeatImpl *seat_impl, "n-rings", n_rings, "n-strips", n_strips, "n-mode-groups", n_groups, + "n-buttons", n_buttons, "device-node", node_path, "seat", seat_impl->seat_native, NULL); @@ -1274,6 +1360,10 @@ meta_input_device_native_new (MetaSeatImpl *seat_impl, g_free (product); g_free (node_path); + if (libinput_device_has_capability (libinput_device, + LIBINPUT_DEVICE_CAP_TABLET_PAD)) + update_pad_features (device); + if (libinput_device_get_size (libinput_device, &width, &height) == 0) device->device_aspect_ratio = width / height; diff --git a/src/backends/native/meta-input-device-native.h b/src/backends/native/meta-input-device-native.h index e76aade71..4203be907 100644 --- a/src/backends/native/meta-input-device-native.h +++ b/src/backends/native/meta-input-device-native.h @@ -71,6 +71,7 @@ struct _MetaInputDeviceNative struct libinput_device *libinput_device; MetaSeatImpl *seat_impl; ClutterInputDeviceTool *last_tool; + GArray *pad_features; cairo_matrix_t device_matrix; double device_aspect_ratio; /* w:h */ diff --git a/src/wayland/meta-wayland-tablet-pad-group.c b/src/wayland/meta-wayland-tablet-pad-group.c index 4229f834a..46d3d21fc 100644 --- a/src/wayland/meta-wayland-tablet-pad-group.c +++ b/src/wayland/meta-wayland-tablet-pad-group.c @@ -32,12 +32,6 @@ #include "wayland/meta-wayland-tablet-pad.h" #include "wayland/meta-wayland-tablet-seat.h" -#ifdef HAVE_NATIVE_BACKEND -#include "backends/native/meta-backend-native.h" -#include "backends/native/meta-event-native.h" -#include "backends/native/meta-input-device-native.h" -#endif - #include "tablet-unstable-v2-server-protocol.h" static void @@ -123,26 +117,14 @@ gboolean meta_wayland_tablet_pad_group_has_button (MetaWaylandTabletPadGroup *group, guint button) { -#ifdef HAVE_NATIVE_BACKEND - MetaBackend *backend = meta_get_backend (); - - if (META_IS_BACKEND_NATIVE (backend)) - { - struct libinput_device *libinput_device; - struct libinput_tablet_pad_mode_group *mode_group; - guint n_group; + int n_group = g_list_index (group->pad->groups, group); - libinput_device = meta_input_device_native_get_libinput_device (group->pad->device); - n_group = g_list_index (group->pad->groups, group); - mode_group = libinput_device_tablet_pad_get_mode_group (libinput_device, n_group); + if (clutter_input_device_get_pad_feature_group (group->pad->device, + CLUTTER_PAD_FEATURE_BUTTON, + button) == n_group) + return TRUE; - return libinput_tablet_pad_mode_group_has_button (mode_group, button); - } - else -#endif - { - return g_list_length (group->pad->groups) == 1; - } + return FALSE; } static void diff --git a/src/wayland/meta-wayland-tablet-pad.c b/src/wayland/meta-wayland-tablet-pad.c index d96bdfed4..22704aee7 100644 --- a/src/wayland/meta-wayland-tablet-pad.c +++ b/src/wayland/meta-wayland-tablet-pad.c @@ -38,12 +38,6 @@ #include "wayland/meta-wayland-tablet-seat.h" #include "wayland/meta-wayland-tablet.h" -#ifdef HAVE_NATIVE_BACKEND -#include <libinput.h> -#include "backends/native/meta-backend-native.h" -#include "backends/native/meta-input-device-native.h" -#endif - #include "tablet-unstable-v2-server-protocol.h" static void @@ -66,41 +60,20 @@ group_rings_strips (MetaWaylandTabletPad *pad) { gint n_group, n_elem; GList *g, *l; -#ifdef HAVE_NATIVE_BACKEND - MetaBackend *backend = meta_get_backend (); - struct libinput_device *libinput_device = NULL; - - if (META_IS_BACKEND_NATIVE (backend)) - libinput_device = meta_input_device_native_get_libinput_device (pad->device); -#endif for (n_group = 0, g = pad->groups; g; g = g->next) { MetaWaylandTabletPadGroup *group = g->data; -#ifdef HAVE_NATIVE_BACKEND - struct libinput_tablet_pad_mode_group *mode_group = NULL; - - if (libinput_device) - mode_group = libinput_device_tablet_pad_get_mode_group (libinput_device, n_group); -#endif for (n_elem = 0, l = pad->rings; l; l = l->next) { MetaWaylandTabletPadRing *ring = l->data; -#ifdef HAVE_NATIVE_BACKEND - if (mode_group) - { - if (libinput_tablet_pad_mode_group_has_ring (mode_group, n_elem)) - meta_wayland_tablet_pad_ring_set_group (ring, group); - } - else -#endif - { - /* Assign everything to the first group */ - if (n_group == 0) - meta_wayland_tablet_pad_ring_set_group (ring, group); - } + if (clutter_input_device_get_pad_feature_group (pad->device, + CLUTTER_PAD_FEATURE_RING, + n_elem) == n_group) + meta_wayland_tablet_pad_ring_set_group (ring, group); + n_elem++; } @@ -108,19 +81,10 @@ group_rings_strips (MetaWaylandTabletPad *pad) { MetaWaylandTabletPadStrip *strip = l->data; -#ifdef HAVE_NATIVE_BACKEND - if (mode_group) - { - if (libinput_tablet_pad_mode_group_has_strip (mode_group, n_elem)) - meta_wayland_tablet_pad_strip_set_group (strip, group); - } - else -#endif - { - /* Assign everything to the first group */ - if (n_group == 0) - meta_wayland_tablet_pad_strip_set_group (strip, group); - } + if (clutter_input_device_get_pad_feature_group (pad->device, + CLUTTER_PAD_FEATURE_STRIP, + n_elem) == n_group) + meta_wayland_tablet_pad_strip_set_group (strip, group); n_elem++; } @@ -133,9 +97,6 @@ MetaWaylandTabletPad * meta_wayland_tablet_pad_new (ClutterInputDevice *device, MetaWaylandTabletSeat *tablet_seat) { -#ifdef HAVE_NATIVE_BACKEND - MetaBackend *backend = meta_get_backend (); -#endif MetaWaylandTabletPad *pad; guint n_elems, i; @@ -149,16 +110,7 @@ meta_wayland_tablet_pad_new (ClutterInputDevice *device, pad->feedback = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) g_free); -#ifdef HAVE_NATIVE_BACKEND - /* Buttons, only can be honored this with the native backend */ - if (META_IS_BACKEND_NATIVE (backend)) - { - struct libinput_device *libinput_device; - - libinput_device = meta_input_device_native_get_libinput_device (device); - pad->n_buttons = libinput_device_tablet_pad_get_num_buttons (libinput_device); - } -#endif + pad->n_buttons = clutter_input_device_get_n_buttons (device); n_elems = clutter_input_device_get_n_mode_groups (pad->device); |