Fix announcements of XDND mouse rectangles

* lisp/x-dnd.el (x-dnd-handle-xdnd): Use correct meaning of "2",
which isn't well documented.
* src/xterm.c (handle_one_xevent): Likewise.  Also fix unpacking
of mouse rects.
This commit is contained in:
Po Lu 2022-07-05 21:56:50 +08:00
parent 0463368a7b
commit 6230ed6d63
2 changed files with 14 additions and 9 deletions

View file

@ -695,13 +695,13 @@ FORMAT is 32 (not used). MESSAGE is the data part of an XClientMessageEvent."
(list-to-send (list-to-send
(list (string-to-number (list (string-to-number
(frame-parameter frame 'outer-window-id)) (frame-parameter frame 'outer-window-id))
(+ 2 accept) ;; 1 = accept, 0 = reject. 2 = ;; 1 = accept, 0 = reject. 2 = "want position
;; "want position updates". ;; updates even for movement inside the given
(if dnd-indicate-insertion-point 0 ;; widget bounds".
(x-dnd-get-drop-x-y frame window)) (+ (if dnd-indicate-insertion-point 2 0) accept)
(if dnd-indicate-insertion-point 0 (x-dnd-get-drop-x-y frame window)
(x-dnd-get-drop-width-height (x-dnd-get-drop-width-height
frame window (eq accept 1))) frame window (eq accept 1))
;; The no-toolkit Emacs build can actually ;; The no-toolkit Emacs build can actually
;; receive drops from programs that speak ;; receive drops from programs that speak
;; versions of XDND earlier than 3 (such as ;; versions of XDND earlier than 3 (such as

View file

@ -16468,10 +16468,15 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (x_dnd_last_protocol_version != -1 if (x_dnd_last_protocol_version != -1
&& x_dnd_in_progress && x_dnd_in_progress
&& target == x_dnd_last_seen_window && 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]; 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_target = target;
x_dnd_mouse_rect.x = (r1 & 0xffff0000) >> 16; x_dnd_mouse_rect.x = (r1 & 0xffff0000) >> 16;