[mutter/wip/carlosg/capabilities-and-dimensions: 10/11] backends/x11: Implement get_dimensions() in X11 input devices
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/capabilities-and-dimensions: 10/11] backends/x11: Implement get_dimensions() in X11 input devices
- Date: Tue, 6 Sep 2022 15:38:35 +0000 (UTC)
commit b08f30855c827bdaa8cefd263c25d43ae3edb14b
Author: Carlos Garnacho <carlosg gnome org>
Date: Tue Sep 6 13:00:04 2022 +0200
backends/x11: Implement get_dimensions() in X11 input devices
We can get the information from X11 itself, so do the calculations to return
the device physical size.
src/backends/x11/meta-input-device-x11.c | 76 ++++++++++++++++++++++++++++++++
1 file changed, 76 insertions(+)
---
diff --git a/src/backends/x11/meta-input-device-x11.c b/src/backends/x11/meta-input-device-x11.c
index 556881680e..a3c36f82e0 100644
--- a/src/backends/x11/meta-input-device-x11.c
+++ b/src/backends/x11/meta-input-device-x11.c
@@ -273,6 +273,81 @@ meta_input_device_x11_is_mode_switch_button (ClutterInputDevice *device,
return button_group == (int) group;
}
+static gboolean
+meta_input_device_x11_get_dimensions (ClutterInputDevice *device,
+ int *width,
+ int *height)
+{
+ MetaInputDeviceX11 *device_x11 = META_INPUT_DEVICE_X11 (device);
+ ClutterSeat *seat = clutter_input_device_get_seat (device);
+ MetaSeatX11 *seat_x11 = META_SEAT_X11 (seat);
+ MetaBackendX11 *backend_x11 =
+ META_BACKEND_X11 (meta_seat_x11_get_backend (seat_x11));
+ Display *xdisplay =
+ meta_backend_x11_get_xdisplay (backend_x11);
+ XIDeviceInfo *info;
+ uint *value, w, h;
+ int i, n_info;
+ static gboolean atoms_initialized = FALSE;
+ static Atom abs_axis_atoms[4] = { 0, };
+
+ meta_clutter_x11_trap_x_errors ();
+
+ info = XIQueryDevice (xdisplay, device_x11->device_id, &n_info);
+ *width = *height = w = h = 0;
+
+ if (meta_clutter_x11_untrap_x_errors ())
+ return FALSE;
+
+ if (!info)
+ return FALSE;
+
+ if (G_UNLIKELY (!atoms_initialized))
+ {
+ const char *abs_axis_atom_names[4] = {
+ "Abs X",
+ "Abs MT Position X",
+ "Abs Y",
+ "Abs MT Position Y",
+ };
+
+ XInternAtoms (xdisplay,
+ (char **) abs_axis_atom_names,
+ G_N_ELEMENTS (abs_axis_atom_names),
+ False,
+ abs_axis_atoms);
+ atoms_initialized = TRUE;
+ }
+
+ for (i = 0; i < info->num_classes; i++)
+ {
+ XIValuatorClassInfo *valuator_info;
+
+ if (info->classes[i]->type != XIValuatorClass)
+ continue;
+
+ valuator_info = (XIValuatorClassInfo *) info->classes[i];
+
+ if (valuator_info->label == abs_axis_atoms[0] || /* Abs X */
+ valuator_info->label == abs_axis_atoms[1]) /* Abs MT X */
+ value = &w;
+ else if (valuator_info->label == abs_axis_atoms[2] || /* Abs Y */
+ valuator_info->label == abs_axis_atoms[3]) /* Abs MT Y */
+ value = &h;
+ else
+ continue;
+
+ *value = (valuator_info->max - valuator_info->min) * 1000 / valuator_info->resolution;
+ }
+
+ *width = w;
+ *height = h;
+
+ XIFreeDeviceInfo (info);
+
+ return (w != 0 && h != 0);
+}
+
static void
meta_input_device_x11_class_init (MetaInputDeviceX11Class *klass)
{
@@ -287,6 +362,7 @@ meta_input_device_x11_class_init (MetaInputDeviceX11Class *klass)
device_class->is_grouped = meta_input_device_x11_is_grouped;
device_class->get_group_n_modes = meta_input_device_x11_get_group_n_modes;
device_class->is_mode_switch_button = meta_input_device_x11_is_mode_switch_button;
+ device_class->get_dimensions = meta_input_device_x11_get_dimensions;
props[PROP_ID] =
g_param_spec_int ("id",
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]