summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-11-19 18:51:58 +0100
committerMarge Bot <marge-bot@gnome.org>2020-11-27 15:14:34 +0000
commitf117a157dcd0e009d0cde82d9f8094a245cced82 (patch)
tree824b08f051d57d3144373e4c9337baaa5c41dae5
parent18fdcfc95afe62273668f6f637efdc2245e0ffe1 (diff)
downloadmutter-f117a157dcd0e009d0cde82d9f8094a245cced82.tar.gz
clutter: Add vmethod to find out group for pad features
Do it so the wayland bits don't have to access native input devices internals. The data is still readonly, idempotent, etc. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403>
-rw-r--r--clutter/clutter/clutter-enums.h7
-rw-r--r--clutter/clutter/clutter-input-device.c46
-rw-r--r--clutter/clutter/clutter-input-device.h12
-rw-r--r--src/backends/native/meta-input-device-native.c102
-rw-r--r--src/backends/native/meta-input-device-native.h1
-rw-r--r--src/wayland/meta-wayland-tablet-pad-group.c30
-rw-r--r--src/wayland/meta-wayland-tablet-pad.c68
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);