emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 6be201cf51: Fix closing displays when preserving selections is en


From: Po Lu
Subject: master 6be201cf51: Fix closing displays when preserving selections is enabled
Date: Tue, 12 Jul 2022 23:02:11 -0400 (EDT)

branch: master
commit 6be201cf51e0b1c69e713dec318cef18eef4c617
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Fix closing displays when preserving selections is enabled
    
    * 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   | 16 +++++++++++++++-
 src/xselect.c |  2 +-
 src/xterm.c   |  5 ++++-
 src/xterm.h   |  3 ++-
 4 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/src/frame.c b/src/frame.c
index 923ef2d609..a39e1c4944 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -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
diff --git a/src/xselect.c b/src/xselect.c
index baab2c5c18..1750cfb8bd 100644
--- a/src/xselect.c
+++ b/src/xselect.c
@@ -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);
 }
 
 /* True if any properties for DISPLAY and WINDOW
diff --git a/src/xterm.c b/src/xterm.c
index 6e3a941719..fa54d5c9e2 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -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");
diff --git a/src/xterm.h b/src/xterm.h
index 9b91ee4556..6afd08eab2 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]