Subject: Re: bug#51794: 29.0.50; invalid input events generated from a mouse click for the tab bar

From: martin rudalics <[email-masked]>
Date: Sat, 20 Nov 2021 10:56:13 +0100

> If you have problems, please post the patch and I will install it.

Attached.  ChangeLog would go as:

Report mouse events on tab or tool bar when 'track-mouse' is t (Bug#51794)

* lisp/mouse.el (mouse-drag-track)
* lisp/mouse-drag.el (mouse-drag-drag): Set 'track-mouse' to some
value neither t nor nil (Bug#51794).
* src/keyboard.c (make_lispy_position): If track_mouse is Qt,
report event on tool or tab bar (Bug#51794).

Please fix everything as you see fit.

Thanks, martin

diff --git a/lisp/mouse-drag.el b/lisp/mouse-drag.el
index ecfb359b36..0cdba6b4d0 100644
--- a/lisp/mouse-drag.el
+++ b/lisp/mouse-drag.el
@@ -282,6 +282,8 @@ mouse-drag-drag
     (setq window-last-row (- (window-height) 2)
 	  window-last-col (- (window-width) 2))
     (track-mouse
+      ;; Set 'track-mouse' to something neither nil nor t (Bug#51794).
+      (setq track-mouse 'drag-dragging)
       (while (progn
 	       (setq event (read--potential-mouse-event)
 		     end (event-end event)
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 7bac6dd07b..8497c50363 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -1615,7 +1615,8 @@ mouse-drag-track
       (goto-char (nth 1 range)))

     (setf (terminal-parameter nil 'mouse-drag-start) start-event)
-    (setq track-mouse t)
+    ;; Set 'track-mouse' to something neither nil nor t (Bug#51794).
+    (setq track-mouse 'drag-tracking)
     (setq auto-hscroll-mode nil)

     (set-transient-map
diff --git a/src/keyboard.c b/src/keyboard.c
index a99d14cb4c..451863a28a 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -5124,19 +5124,20 @@ make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y,
 #endif
       )
     {
-      /* FIXME: While track_mouse is non-nil, we do not report this
+      /* While 'track-mouse' is neither nil nor t, do not report this
 	 event as something that happened on the tool or tab bar since
-	 that would break mouse dragging operations that originate from
-	 an ordinary window beneath and expect the window to auto-scroll
-	 as soon as the mouse cursor appears above or beneath it
-	 (Bug#50993).  Since this "fix" might break track_mouse based
-	 operations originating from the tool or tab bar itself, such
-	 operations should set track_mouse to some special value that
-	 would be recognized by the following check.
-
-	 This issue should be properly handled by 'mouse-drag-track' and
-	 friends, so the below is only a temporary workaround.  */
-      if (NILP (track_mouse))
+	 that would break mouse drag operations that originate from an
+	 ordinary window beneath that bar and expect the window to
+	 auto-scroll as soon as the mouse cursor appears above or
+	 beneath it (Bug#50993).  We do allow reports for t, because
+	 applications may have set 'track-mouse' to t and still expect a
+	 click on the tool or tab bar to get through (Bug#51794).
+
+	 FIXME: This is a preliminary fix for the bugs cited above and
+	 awaits a solution that includes a convention for all special
+	 values of 'track-mouse' and their documentation in the Elisp
+	 manual.  */
+      if (NILP (track_mouse) || EQ (track_mouse, Qt))
 	posn = EQ (window_or_frame, f->tab_bar_window) ? Qtab_bar : Qtool_bar;
       /* Kludge alert: for mouse events on the tab bar and tool bar,
 	 keyboard.c wants the frame, not the special-purpose window