I’m working on a small “in mode-line” scroll bar, and have implemented mouse events for it, which are working well.  When I interact using the mouse with the mode line of a non-selected window, I need to have that window temporarily selected, so I can calculate its line offsets and move within it.  But (just as for regular scrollbars), I’d like to retain the originally active window afterwards.

Strangely, using `with-selected-window’, which seems like the obvious solution, leaves the mode line face and cursor in a spurious selected state (dark, and filled, respectively).  This is despite the fact that the original window is in fact re-selected after you leave the form.  This leads to two mode lines on the same frame with active mode line face (see below; notice the frame title)!

Wrapping the code in (select-window win)… (select-window old) instead of using `with-selected-window` solves this spurious "double-active" issue, but causes the mode-line to flash “active” while interacting.  Is there a way to select a window but NOT update the window’s mode line face and cursor “active” indicators?

Mouse handler below (attached via keymap text property only to the scroll bar at right).  GNU Emacs 27.2 (build 1, x86_64-apple-darwin18.7.0, Carbon Version 158 AppKit 1671.6) of 2021-03-27.

++++

(defun mlscroll-mouse (start-event)
  "Handle click and drag mouse events on the mode line scroll bar."
  (interactive "e")
  (let* ((start-posn (event-start start-event))
(start-win (posn-window start-posn))
(lcr (cdr-safe (posn-object start-posn)))
(x (car (posn-object-x-y start-posn)))
(xstart-abs (car (posn-x-y start-posn)))
(mouse-fine-grained-tracking t)
(old-selected-window (selected-window))
xstart event end xnew)
    (select-window start-win)
    (setq xstart (mlscroll-scroll-to x lcr)) 
    (track-mouse
      (setq track-mouse 'dragging)
      (while (progn (setq event (read-event))
   (mouse-movement-p event))
(setq end (event-end event)
     xnew (+ xstart (- (car (posn-x-y end)) xstart-abs)))
(when (and
      (>= xnew 0)
      (<= xnew (- mlscroll-width mlscroll-border))
      (eq start-win (posn-window end)))
 (mlscroll-scroll-to xnew))))
    (select-window old-selected-window)))