emacs-diffs
[Top][All Lists]
Advanced

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

master 1fa5f0428f: Fix selection disowning upon frame deletion on Waylan


From: Po Lu
Subject: master 1fa5f0428f: Fix selection disowning upon frame deletion on Wayland
Date: Thu, 7 Jul 2022 09:15:41 -0400 (EDT)

branch: master
commit 1fa5f0428fc9f141d7ae9973a9cc92c3e6a2b623
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Fix selection disowning upon frame deletion on Wayland
    
    * src/pgtkselect.c (pgtk_clear_frame_selections): Manually
    disown cleared selections.  (bug#56434)
---
 src/pgtkselect.c | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/src/pgtkselect.c b/src/pgtkselect.c
index fff163c92a..e0230003b3 100644
--- a/src/pgtkselect.c
+++ b/src/pgtkselect.c
@@ -790,8 +790,8 @@ pgtk_handle_selection_event (struct selection_input_event 
*event)
 void
 pgtk_clear_frame_selections (struct frame *f)
 {
-  Lisp_Object frame;
-  Lisp_Object rest;
+  Lisp_Object frame, rest, timestamp, symbol;
+  guint32 time;
   struct pgtk_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
   struct terminal *t = dpyinfo->terminal;
 
@@ -801,9 +801,22 @@ pgtk_clear_frame_selections (struct frame *f)
   while (CONSP (t->Vselection_alist)
         && EQ (frame, XCAR (XCDR (XCDR (XCDR (XCAR (t->Vselection_alist)))))))
     {
+      symbol = Fcar (Fcar (t->Vselection_alist));
+
       /* Run the `pgtk-lost-selection-functions' abnormal hook.  */
       CALLN (Frun_hook_with_args, Qpgtk_lost_selection_functions,
-            Fcar (Fcar (t->Vselection_alist)));
+            symbol);
+
+      timestamp = Fcar (Fcdr (Fcdr (Fcar (t->Vselection_alist))));
+      CONS_TO_INTEGER (timestamp, guint32, time);
+
+      /* On Wayland, GDK will still ask the (now non-existent) frame for
+        selection data, even though we no longer think the selection is
+        owned by us.  Manually relinquish ownership of the selection.  */
+      gdk_selection_owner_set_for_display (dpyinfo->display,
+                                          NULL,
+                                          symbol_to_gdk_atom (symbol),
+                                          time, TRUE);
 
       tset_selection_alist (t, XCDR (t->Vselection_alist));
     }
@@ -813,8 +826,18 @@ pgtk_clear_frame_selections (struct frame *f)
     if (CONSP (XCDR (rest))
        && EQ (frame, XCAR (XCDR (XCDR (XCDR (XCAR (XCDR (rest))))))))
       {
+       symbol = XCAR (XCAR (XCDR (rest)));
        CALLN (Frun_hook_with_args, Qpgtk_lost_selection_functions,
-              XCAR (XCAR (XCDR (rest))));
+              symbol);
+
+       timestamp = XCAR (XCDR (XCDR (XCAR (XCDR (rest)))));
+       CONS_TO_INTEGER (timestamp, guint32, time);
+
+       gdk_selection_owner_set_for_display (dpyinfo->display,
+                                            NULL,
+                                            symbol_to_gdk_atom (symbol),
+                                            time, TRUE);
+
        XSETCDR (rest, XCDR (XCDR (rest)));
        break;
       }



reply via email to

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