summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2022-09-22 17:06:36 +0800
committerPo Lu <luangruo@yahoo.com>2022-09-22 17:06:36 +0800
commit9369e4242fa51d53b05ce95842f124522289d8a3 (patch)
treefa60f4c449ff68792598868e4e05d8cb275467f0
parent101f3cf5b9b5600147d4406c3be8daf174e1a543 (diff)
downloademacs-9369e4242fa51d53b05ce95842f124522289d8a3.tar.gz
Work around rare crash when turning scroll wheel
* src/xterm.c (handle_one_xevent): Don't allow devices to be added twice handling hierarcy events.
-rw-r--r--src/xterm.c44
1 files changed, 28 insertions, 16 deletions
diff --git a/src/xterm.c b/src/xterm.c
index 97c070736c2..6860ef20800 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -23000,24 +23000,36 @@ handle_one_xevent (struct x_display_info *dpyinfo,
any_changed = true;
}
- x_catch_errors (dpyinfo->display);
- info = XIQueryDevice (dpyinfo->display, hev->info[i].deviceid,
- &ndevices);
- x_uncatch_errors ();
-
- if (info && info->enabled)
+ /* Under unknown circumstances, multiple
+ XIDeviceEnabled events are sent at once,
+ causing the device to be duplicated. Check
+ that the device doesn't exist before adding
+ it. */
+
+ if (!xi_device_from_id (dpyinfo,
+ hev->info[i].deviceid))
{
- dpyinfo->devices
- = xrealloc (dpyinfo->devices, (sizeof *dpyinfo->devices
- * ++dpyinfo->num_devices));
- memset (dpyinfo->devices + dpyinfo->num_devices - 1,
- 0, sizeof *dpyinfo->devices);
- device = &dpyinfo->devices[dpyinfo->num_devices - 1];
- xi_populate_device_from_info (device, info);
- }
+ x_catch_errors (dpyinfo->display);
+ info = XIQueryDevice (dpyinfo->display,
+ hev->info[i].deviceid,
+ &ndevices);
+ x_uncatch_errors ();
- if (info)
- XIFreeDeviceInfo (info);
+ if (info && info->enabled)
+ {
+ dpyinfo->devices
+ = xrealloc (dpyinfo->devices,
+ (sizeof *dpyinfo->devices
+ * ++dpyinfo->num_devices));
+ memset (dpyinfo->devices + dpyinfo->num_devices - 1,
+ 0, sizeof *dpyinfo->devices);
+ device = &dpyinfo->devices[dpyinfo->num_devices - 1];
+ xi_populate_device_from_info (device, info);
+ }
+
+ if (info)
+ XIFreeDeviceInfo (info);
+ }
}
else if (hev->info[i].flags & XIDeviceDisabled)
disabled[n_disabled++] = hev->info[i].deviceid;