diff --git a/lisp/x-dnd.el b/lisp/x-dnd.el index 9c1c98a1bf5..92899e7a0c6 100644 --- a/lisp/x-dnd.el +++ b/lisp/x-dnd.el @@ -695,13 +695,13 @@ FORMAT is 32 (not used). MESSAGE is the data part of an XClientMessageEvent." (list-to-send (list (string-to-number (frame-parameter frame 'outer-window-id)) - (+ 2 accept) ;; 1 = accept, 0 = reject. 2 = - ;; "want position updates". - (if dnd-indicate-insertion-point 0 - (x-dnd-get-drop-x-y frame window)) - (if dnd-indicate-insertion-point 0 - (x-dnd-get-drop-width-height - frame window (eq accept 1))) + ;; 1 = accept, 0 = reject. 2 = "want position + ;; updates even for movement inside the given + ;; widget bounds". + (+ (if dnd-indicate-insertion-point 2 0) accept) + (x-dnd-get-drop-x-y frame window) + (x-dnd-get-drop-width-height + frame window (eq accept 1)) ;; The no-toolkit Emacs build can actually ;; receive drops from programs that speak ;; versions of XDND earlier than 3 (such as diff --git a/src/xterm.c b/src/xterm.c index 4a47fdfd450..8373222cfc3 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -16468,10 +16468,15 @@ handle_one_xevent (struct x_display_info *dpyinfo, if (x_dnd_last_protocol_version != -1 && x_dnd_in_progress && target == x_dnd_last_seen_window - && event->xclient.data.l[1] & 2) + /* The XDND documentation is not very clearly worded. + But this should be the correct behavior, since + "kDNDStatusSendHereFlag" in the reference + implementation is 2, and means the mouse rect + should be ignored. */ + && !(event->xclient.data.l[1] & 2)) { r1 = event->xclient.data.l[2]; - r2 = event->xclient.data.l[2]; + r2 = event->xclient.data.l[3]; x_dnd_mouse_rect_target = target; x_dnd_mouse_rect.x = (r1 & 0xffff0000) >> 16;