]> git.eshelyaron.com Git - emacs.git/commitdiff
Make DND from other GTK programs work on Wayland
authorPo Lu <luangruo@yahoo.com>
Thu, 23 Jun 2022 05:57:23 +0000 (13:57 +0800)
committerPo Lu <luangruo@yahoo.com>
Thu, 23 Jun 2022 05:58:38 +0000 (13:58 +0800)
* lisp/pgtk-dnd.el (pgtk-dnd-handle-gdk): Try to keep the
selection contents in extra-data during a motion event.

lisp/pgtk-dnd.el

index 2aaf4c4e977320b2273220f468738c4ca3fd0055..df267549d7c1ea5dd5384f30c2233fafa7049c0c 100644 (file)
@@ -373,15 +373,27 @@ message."
              (time (nth 2 client-message))
              (action-type (pgtk-dnd-maybe-call-test-function window
                                                              action)))
+        ;; Get the selection contents now.  GdkWaylandSelection
+        ;; becomes unavailable immediately after `drag-drop' is sent.
+        (let* ((current-type (pgtk-dnd-current-type window))
+               (current-action-type (car-safe (aref state 6))))
+          (when (and current-type
+                     (not (equal current-action-type action-type)))
+            (aset state 6 (cons action-type
+                                (pgtk-get-selection-internal
+                                 (nth 1 client-message)
+                                 (intern current-type))))))
         (pgtk-update-drop-status (car action-type) time)
         (dnd-handle-movement (event-start event)))))
    ((eq (car client-message) 'quote) ; drag-drop
-    (let* ((timestamp (nth 2 client-message))
+    (let* ((state (pgtk-dnd-get-state-for-frame frame))
+           (timestamp (nth 2 client-message))
            (value (and (pgtk-dnd-current-type window)
-                       (pgtk-get-selection-internal
-                        (nth 1 client-message)
-                        (intern (pgtk-dnd-current-type window))
-                        timestamp)))
+                       (or (cdr-safe (aref state 6))
+                           (pgtk-get-selection-internal
+                            (nth 1 client-message)
+                            (intern (pgtk-dnd-current-type window))
+                            timestamp))))
            action)
       (unwind-protect
           (setq action (when value