]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix error during DND from both Emacs and GTK at the same time
authorPo Lu <luangruo@yahoo.com>
Sat, 4 Jun 2022 12:00:40 +0000 (20:00 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 4 Jun 2022 12:01:07 +0000 (20:01 +0800)
* src/xterm.c (x_dnd_get_target_window): Make mapping and
releasing the COW atomic.  This is to fix a rare bug when
MPX (multi-pointer X) is in use and the user tries to drag
from both GTK and Emacs at the same time using multiple seats.

src/xterm.c

index edfb89070ff3d30463d401e808d677306e03d79b..34a40da548f1f8165651d694b069b11d8e7bc545 100644 (file)
@@ -3524,10 +3524,13 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
                                  dpyinfo->Xatom_NET_WM_CM_Sn) != None)
            {
              x_catch_errors (dpyinfo->display);
+             XGrabServer (dpyinfo->display);
              overlay_window = XCompositeGetOverlayWindow (dpyinfo->display,
                                                           dpyinfo->root_window);
              XCompositeReleaseOverlayWindow (dpyinfo->display,
                                              dpyinfo->root_window);
+             XUngrabServer (dpyinfo->display);
+
              if (!x_had_errors_p (dpyinfo->display))
                {
                  XGetWindowAttributes (dpyinfo->display, overlay_window, &attrs);
@@ -3682,10 +3685,13 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
                              dpyinfo->Xatom_NET_WM_CM_Sn) != None)
        {
          x_catch_errors (dpyinfo->display);
+         XGrabServer (dpyinfo->display);
          overlay_window = XCompositeGetOverlayWindow (dpyinfo->display,
                                                       dpyinfo->root_window);
          XCompositeReleaseOverlayWindow (dpyinfo->display,
                                          dpyinfo->root_window);
+         XUngrabServer (dpyinfo->display);
+
          if (!x_had_errors_p (dpyinfo->display))
            {
              XGetWindowAttributes (dpyinfo->display, overlay_window, &attrs);