diff options
author | Po Lu <luangruo@yahoo.com> | 2022-09-22 17:06:36 +0800 |
---|---|---|
committer | Po Lu <luangruo@yahoo.com> | 2022-09-22 17:06:36 +0800 |
commit | 9369e4242fa51d53b05ce95842f124522289d8a3 (patch) | |
tree | fa60f4c449ff68792598868e4e05d8cb275467f0 | |
parent | 101f3cf5b9b5600147d4406c3be8daf174e1a543 (diff) | |
download | emacs-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.c | 44 |
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; |