You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

84 lines
3.0 KiB

From 9086681b0775ad92ce39df96d22ff5a3fe06c68f Mon Sep 17 00:00:00 2001
From: Mamoru TASAKA <mtasaka@fedoraproject.org>
Date: Fri, 4 Mar 2022 11:24:49 +0900
Subject: [PATCH] print_xinput_event: check if XIRawEvent.raw_values is
available
gcc12 -sanitize=address shows that XIRawEvent.raw_values is not always
available.
XIRawEvent buffer is allocated on wireToRawEvent() in XExtInt.c in libXi.
Follow wireToRawEvent() implementation to check is XIRawEvent.raw_values
is available, using XIRawEvent.valuators.mask_len, valuators.mask and
XIMaskIsSet.
---
driver/xinput.c | 38 ++++++++++++++++++++++++++++++++------
1 file changed, 32 insertions(+), 6 deletions(-)
diff --git a/driver/xinput.c b/driver/xinput.c
index 9402a4f..2ce2ce1 100644
--- a/driver/xinput.c
+++ b/driver/xinput.c
@@ -296,6 +296,30 @@ print_kbd_event (XEvent *xev, XComposeStatus *compose, Bool x11_p)
}
}
+/* see wireToRawEvent, count_bits in libXi and XIMaskIsSet in X11/extensions/XI2.h */
+static void
+print_xi_raw_event_raw_values (XIRawEvent *re)
+{
+ int mask_pos;
+ double *raw_values_pos = re->raw_values;
+ int first_time_p;
+
+ first_time_p = 1;
+
+ for (mask_pos = 0; mask_pos < re->valuators.mask_len * sizeof(char); mask_pos++)
+ {
+ if (XIMaskIsSet(re->valuators.mask, mask_pos))
+ {
+ if (first_time_p)
+ {
+ first_time_p = 0;
+ fprintf(stderr, " %7.02f", *raw_values_pos++);
+ } else {
+ fprintf(stderr, ", %-7.02f", *raw_values_pos++);
+ }
+ }
+ }
+}
void
print_xinput_event (Display *dpy, XEvent *xev, const char *desc)
@@ -371,11 +395,12 @@ print_xinput_event (Display *dpy, XEvent *xev, const char *desc)
XQueryPointer (dpy, DefaultRootWindow (dpy),
&root_ret, &child_ret, &root_x, &root_y,
&win_x, &win_y, &mask);
- fprintf (stderr, "%s: XI _RawButton%s %4d, %-4d %7.02f, %-7.02f\n",
+ fprintf (stderr, "%s: XI _RawButton%s %4d, %-4d",
blurb(),
(re->evtype == XI_RawButtonPress ? "Press " : "Release"),
- root_x, root_y,
- re->raw_values[0], re->raw_values[1]);
+ root_x, root_y);
+ print_xi_raw_event_raw_values(re);
+ fprintf(stderr, "\n");
}
break;
@@ -390,9 +415,10 @@ print_xinput_event (Display *dpy, XEvent *xev, const char *desc)
&root_ret, &child_ret, &root_x, &root_y,
&win_x, &win_y, &mask);
fprintf (stderr,
- "%s: XI_RawMotion %4d, %-4d %7.02f, %-7.02f%s\n",
- blurb(), root_x, root_y, re->raw_values[0], re->raw_values[1],
- (desc ? desc : ""));
+ "%s: XI_RawMotion %4d, %-4d ",
+ blurb(), root_x, root_y);
+ print_xi_raw_event_raw_values(re);
+ fprintf (stderr, "%s\n", (desc ? desc : ""));
}
break;
--
2.35.1