]> git.eshelyaron.com Git - emacs.git/commitdiff
Work around rare crash when turning scroll wheel
authorPo Lu <luangruo@yahoo.com>
Thu, 22 Sep 2022 09:06:36 +0000 (17:06 +0800)
committerPo Lu <luangruo@yahoo.com>
Thu, 22 Sep 2022 09:06:36 +0000 (17:06 +0800)
* src/xterm.c (handle_one_xevent): Don't allow devices to be
added twice handling hierarcy events.

src/xterm.c

index 97c070736c215a94c32106bed67da3fdc4f40be8..6860ef20800af1bf21a166ff8f68c2f622a06553 100644 (file)
@@ -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;