From 5cbe50a4fb9e13624ccd7082d20ab069558dca21 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 23 Jun 2022 13:57:23 +0800 Subject: [PATCH] Make DND from other GTK programs work on Wayland * 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 | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/lisp/pgtk-dnd.el b/lisp/pgtk-dnd.el index 2aaf4c4e977..df267549d7c 100644 --- a/lisp/pgtk-dnd.el +++ b/lisp/pgtk-dnd.el @@ -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 -- 2.39.2