The doc for posn-window is incomplete. posn-set-point does not handle drag events whose end point argument is a frame, rather than a window.
This patch fixes both of these. Read the code of posn-set-point to ensure the logic is right in terms of using frame-selected-window.
This diff is against subr.el in Emacs 25.3 but I see none of this has yet changed in Emacs 26 either, so it is still applicable.
*** subr.el.gz 2017-09-27 11:50:06.000000000 -0400
--- subr-new.el.gz 2017-09-27 11:50:06.000000000 -0400
***************
*** 1090,1096 ****
The following accessor functions are used to access the elements
of the position:
! `posn-window': The window the event is in.
`posn-area': A symbol identifying the area the event occurred in,
or nil if the event occurred in the text area.
`posn-point': The buffer position of the event.
--- 1090,1096 ----
The following accessor functions are used to access the elements
of the position:
! `posn-window': The window or frame of the event end.
`posn-area': A symbol identifying the area the event occurred in,
or nil if the event occurred in the text area.
`posn-point': The buffer position of the event.
***************
*** 1141,1148 ****
(defsubst posn-window (position)
"Return the window in POSITION.
! POSITION should be a list of the form returned by the `event-start'
! and `event-end' functions."
(nth 0 position))
(defsubst posn-area (position)
--- 1141,1149 ----
(defsubst posn-window (position)
"Return the window in POSITION.
! If POSITION is outside the frame where the event was initiated, return
! that frame instead. POSITION should be a list of the form returned by
! the `event-start' and `event-end' functions."
(nth 0 position))
(defsubst posn-area (position)
***************
*** 1169,1177 ****
(defun posn-set-point (position)
"Move point to POSITION.
Select the corresponding window as well."
! (if (not (windowp (posn-window position)))
! (error "Position not in text area of window"))
! (select-window (posn-window position))
(if (numberp (posn-point position))
(goto-char (posn-point position))))
--- 1170,1182 ----
(defun posn-set-point (position)
"Move point to POSITION.
Select the corresponding window as well."
! (if (framep (posn-window position))
! (progn (if (not (windowp (frame-selected-window (posn-window position))))
! (error "Position not in text area of window"))
! (select-window (frame-selected-window (posn-window position))))
! (if (not (windowp (posn-window position)))
! (error "Position not in text area of window"))
! (select-window (posn-window position)))
(if (numberp (posn-point position))
(goto-char (posn-point position))))