]> git.eshelyaron.com Git - emacs.git/commitdiff
Handle errors getting selection ownership when starting DND
authorPo Lu <luangruo@yahoo.com>
Sat, 16 Apr 2022 00:54:40 +0000 (08:54 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 16 Apr 2022 00:54:40 +0000 (08:54 +0800)
* src/xterm.c (x_clear_dnd_targets): New function.
(x_dnd_begin_drag_and_drop): Handle errors in `x_own_selection'.

src/xterm.c

index f80b2ad2f0278dbdbf4785c10e290fa041d543f6..c5b31553ae8d5520ee392a922a871cf8503fc7a3 100644 (file)
@@ -9435,6 +9435,13 @@ x_top_window_to_frame (struct x_display_info *dpyinfo, int wdesc)
 
 #endif /* USE_X_TOOLKIT || USE_GTK */
 
+static void
+x_clear_dnd_targets (void)
+{
+  if (x_dnd_unwind_flag)
+    x_set_dnd_targets (NULL, 0);
+}
+
 /* This function is defined far away from the rest of the XDND code so
    it can utilize `x_any_window_to_frame'.  */
 
@@ -9479,8 +9486,16 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction,
     }
 
   if (CONSP (local_value))
-    x_own_selection (QXdndSelection,
-                    Fnth (make_fixnum (1), local_value), frame);
+    {
+      ref = SPECPDL_INDEX ();
+
+      record_unwind_protect_void (x_clear_dnd_targets);
+      x_dnd_unwind_flag = true;
+      x_own_selection (QXdndSelection,
+                      Fnth (make_fixnum (1), local_value), frame);
+      x_dnd_unwind_flag = false;
+      unbind_to (ref, Qnil);
+    }
   else
     {
       x_set_dnd_targets (NULL, 0);