]> git.eshelyaron.com Git - emacs.git/commitdiff
Mouse wheel scrolling on the tab bar
authorJuri Linkov <juri@linkov.net>
Wed, 18 Aug 2021 17:52:32 +0000 (20:52 +0300)
committerJuri Linkov <juri@linkov.net>
Wed, 18 Aug 2021 17:52:32 +0000 (20:52 +0300)
* lisp/tab-bar.el (tab-bar-map): Bind mouse-4/wheel-up/wheel-left
to tab-previous and mouse-5/wheel-down/wheel-right to tab-next.
Bind S-mouse-4/wheel-up/wheel-left to tab-bar-move-tab-backward
and S-mouse-5/wheel-down/wheel-right to tab-bar-move-tab.
(tab-bar-move-tab-backward): New command.
(tab-bar-move-repeat-map): Use tab-bar-move-tab-backward
instead of lambda.

* src/xterm.c (handle_one_xevent): Remove restriction
to allow clicking mouse-4 and mouse-5.

etc/NEWS
lisp/tab-bar.el
src/xterm.c

index fb553e82ff29ad1ed19d6f07de1d7d2136461632..c48e110f9a7b7a9850df7c96e9685861423d4467 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -751,7 +751,9 @@ of the next command to be displayed in a new frame.
 *** The tab bar now supports more mouse commands.
 Clicking 'mouse-2' closes the tab, 'mouse-3' displays the context menu
 with items that operate on the clicked tab.  Dragging the tab with
-'mouse-1' moves it to another position on the tab bar.
+'mouse-1' moves it to another position on the tab bar.  Mouse wheel
+scrolling switches to the previous/next tab, and holding the Shift key
+during scrolling moves the tab to the left/right.
 
 *** The key prefix 'C-x t t' displays next command buffer in a new tab.
 It's bound to the command 'other-tab-prefix' that requests the buffer
index 68de770e060d63e45044dbf604fbbd0ec5a821b8..ef7babb87b141f6b33f24ce770068da66d865ca5 100644 (file)
@@ -327,6 +327,20 @@ new frame when the global `tab-bar-mode' is enabled, by using
     (define-key map [mouse-2] 'ignore)
     (define-key map [down-mouse-3] 'tab-bar-mouse-context-menu)
 
+    (define-key map [mouse-4]     'tab-previous)
+    (define-key map [mouse-5]     'tab-next)
+    (define-key map [wheel-up]    'tab-previous)
+    (define-key map [wheel-down]  'tab-next)
+    (define-key map [wheel-left]  'tab-previous)
+    (define-key map [wheel-right] 'tab-next)
+
+    (define-key map [S-mouse-4]     'tab-bar-move-tab-backward)
+    (define-key map [S-mouse-5]     'tab-bar-move-tab)
+    (define-key map [S-wheel-up]    'tab-bar-move-tab-backward)
+    (define-key map [S-wheel-down]  'tab-bar-move-tab)
+    (define-key map [S-wheel-left]  'tab-bar-move-tab-backward)
+    (define-key map [S-wheel-right] 'tab-bar-move-tab)
+
     map)
   "Keymap for the commands used on the tab bar.")
 
@@ -1055,6 +1069,12 @@ where argument addressing is absolute."
          (to-index (mod (+ from-index arg) (length tabs))))
     (tab-bar-move-tab-to (1+ to-index) (1+ from-index))))
 
+(defun tab-bar-move-tab-backward (&optional arg)
+  "Move the current tab ARG positions to the left.
+Like `tab-bar-move-tab', but moves in the opposite direction."
+  (interactive "p")
+  (tab-bar-move-tab (- (or arg 1))))
+
 (defun tab-bar-move-tab-to-frame (arg &optional from-frame from-index to-frame to-index)
   "Move tab from FROM-INDEX position to new position at TO-INDEX.
 FROM-INDEX defaults to the current tab index.
@@ -2118,11 +2138,8 @@ Used in `repeat-mode'.")
 
 (defvar tab-bar-move-repeat-map
   (let ((map (make-sparse-keymap)))
-    (define-key map "m" 'tab-move)
-    (define-key map "M" (lambda ()
-                          (interactive)
-                          (setq repeat-map 'tab-bar-move-repeat-map)
-                          (tab-move -1)))
+    (define-key map "m" 'tab-bar-move-tab)
+    (define-key map "M" 'tab-bar-move-tab-backward)
     map)
   "Keymap to repeat tab move key sequences `C-x t m m M'.
 Used in `repeat-mode'.")
index 80fa747b97dd3415428647de6064a8743ee30258..57229d3d616f195f1e6dec0148a1d9dee88da54d 100644 (file)
@@ -9215,7 +9215,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                 window = window_from_coordinates (f, x, y, 0, true, true);
                 tab_bar_p = EQ (window, f->tab_bar_window);
 
-                if (tab_bar_p && event->xbutton.button < 4)
+                if (tab_bar_p)
                  tab_bar_key = handle_tab_bar_click
                    (f, x, y, event->xbutton.type == ButtonPress,
                     x_x_to_emacs_modifiers (dpyinfo, event->xbutton.state));