]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix closing displays when preserving selections is enabled
authorPo Lu <luangruo@yahoo.com>
Wed, 13 Jul 2022 03:01:59 +0000 (11:01 +0800)
committerPo Lu <luangruo@yahoo.com>
Wed, 13 Jul 2022 03:01:59 +0000 (11:01 +0800)
* src/frame.c (delete_frame): Bind `x-auto-preserve-selections'
to nil if deleting display.
* src/xselect.c (x_clear_frame_selections): Pass original frame
to that function.
* src/xterm.c (x_preserve_selections): Fix determining the new
owner.
(syms_of_xterm): New defsym `x-auto-preserve-selections'.
* src/xterm.h: Update prototypes.

src/frame.c
src/xselect.c
src/xterm.c
src/xterm.h

index 923ef2d609ab60d68c89655a284d78a199b79acf..a39e1c4944f11d18cbc8664289213634fdf5cd51 100644 (file)
@@ -1933,6 +1933,9 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
   int is_tooltip_frame;
   bool nochild = !FRAME_PARENT_FRAME (f);
   Lisp_Object minibuffer_child_frame = Qnil;
+#ifdef HAVE_X_WINDOWS
+  specpdl_ref ref;
+#endif
 
   if (!FRAME_LIVE_P (f))
     return Qnil;
@@ -2116,7 +2119,18 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
   /* Clear any X selections for this frame.  */
 #ifdef HAVE_X_WINDOWS
   if (FRAME_X_P (f))
-    x_clear_frame_selections (f);
+    {
+      /* Don't preserve selections when a display is going away, since
+        that sends stuff down the wire.  */
+
+      ref = SPECPDL_INDEX ();
+
+      if (EQ (force, Qnoelisp))
+       specbind (Qx_auto_preserve_selections, Qnil);
+
+      x_clear_frame_selections (f);
+      unbind_to (ref, Qnil);
+    }
 #endif
 
 #ifdef HAVE_PGTK
index baab2c5c18fbf27cbda4b63565c410e1be3f094a..1750cfb8bd887bfd0f3b214db52b53e43e03b312 100644 (file)
@@ -1128,7 +1128,7 @@ x_clear_frame_selections (struct frame *f)
       }
 
   if (x_auto_preserve_selections)
-    x_preserve_selections (dpyinfo, lost);
+    x_preserve_selections (dpyinfo, lost, frame);
 }
 \f
 /* True if any properties for DISPLAY and WINDOW
index 6e3a941719d3b64e628d1fbb230ce927ac845fe7..fa54d5c9e28c31a4e13a19a066623156e440bed1 100644 (file)
@@ -27956,7 +27956,8 @@ x_uncatch_errors_for_lisp (struct x_display_info *dpyinfo)
    being deleted.  */
 
 void
-x_preserve_selections (struct x_display_info *dpyinfo, Lisp_Object lost)
+x_preserve_selections (struct x_display_info *dpyinfo, Lisp_Object lost,
+                      Lisp_Object current_owner)
 {
   Lisp_Object tail, frame, new_owner, tem;
   Time timestamp;
@@ -27975,6 +27976,7 @@ x_preserve_selections (struct x_display_info *dpyinfo, Lisp_Object lost)
   FOR_EACH_FRAME (tail, frame)
     {
       if (FRAME_X_P (XFRAME (frame))
+         && !EQ (frame, current_owner)
          && FRAME_DISPLAY_INFO (XFRAME (frame)) == dpyinfo)
        {
          new_owner = frame;
@@ -28105,6 +28107,7 @@ syms_of_xterm (void)
   DEFSYM (Qlatin_1, "latin-1");
   DEFSYM (Qnow, "now");
   DEFSYM (Qx_dnd_targets_list, "x-dnd-targets-list");
+  DEFSYM (Qx_auto_preserve_selections, "x-auto-preserve-selections");
 
 #ifdef USE_GTK
   xg_default_icon_file = build_pure_c_string ("icons/hicolor/scalable/apps/emacs.svg");
index 9b91ee45569705353eb2014246d0f3cc77e29739..6afd08eab2b09ce1ce92fad0a403d50fa251a692 100644 (file)
@@ -1643,7 +1643,8 @@ extern void xic_set_statusarea (struct frame *);
 extern void xic_set_xfontset (struct frame *, const char *);
 extern bool x_defined_color (struct frame *, const char *, Emacs_Color *,
                              bool, bool);
-extern void x_preserve_selections (struct x_display_info *, Lisp_Object);
+extern void x_preserve_selections (struct x_display_info *, Lisp_Object,
+                                  Lisp_Object);
 #ifdef HAVE_X_I18N
 extern void free_frame_xic (struct frame *);
 # if defined HAVE_X_WINDOWS && defined USE_X_TOOLKIT