emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/tab-bar-events 56d567a 2/3: Bind [drag-mouse-1] to tab-bar-mouse


From: Juri Linkov
Subject: feature/tab-bar-events 56d567a 2/3: Bind [drag-mouse-1] to tab-bar-mouse-move-tab on tab-bar-map
Date: Wed, 18 Aug 2021 14:08:33 -0400 (EDT)

branch: feature/tab-bar-events
commit 56d567acb6eae72352e39acf4f206f7cb3195900
Author: Juri Linkov <juri@linkov.net>
Commit: Juri Linkov <juri@linkov.net>

    Bind [drag-mouse-1] to tab-bar-mouse-move-tab on tab-bar-map
    
    * lisp/tab-bar.el (tab-bar-mouse-move-tab): New command.
    (tab-bar-map): Bind [drag-mouse-1] to tab-bar-mouse-move-tab.
    (tab-bar-select-tab): Zero or nil arg means the current tab.
    
    * src/xdisp.c (handle_tab_bar_click): Remove restriction
    to allow dragging the tab to another tab.
---
 etc/NEWS        |  3 ++-
 lisp/tab-bar.el | 17 +++++++++++++++--
 src/xdisp.c     |  5 +----
 3 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index cb500dd..fb553e8 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -750,7 +750,8 @@ 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.
+with items that operate on the clicked tab.  Dragging the tab with
+'mouse-1' moves it to another position on the tab bar.
 
 *** 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
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 91d22b4..68de770 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -285,6 +285,16 @@ on a console which has no window system but does have a 
mouse."
 
     (popup-menu menu event)))
 
+(defun tab-bar-mouse-move-tab (event)
+  (interactive "e")
+  (let* ((caption (car (posn-string (event-start event))))
+         (item (and caption (get-text-property 0 'menu-item caption)))
+         (from (tab--key-to-number (nth 0 item)))
+         (caption (car (posn-string (event-end event))))
+         (item (and caption (get-text-property 0 'menu-item caption)))
+         (to (tab--key-to-number (nth 0 item))))
+    (tab-bar-move-tab-to to from)))
+
 (defun toggle-tab-bar-mode-from-frame (&optional arg)
   "Toggle tab bar on or off, based on the status of the current frame.
 Used in the Show/Hide menu, to have the toggle reflect the current frame.
@@ -311,6 +321,7 @@ new frame when the global `tab-bar-mode' is enabled, by 
using
 (defvar tab-bar-map
   (let ((map (make-sparse-keymap)))
     (define-key map [down-mouse-1] 'tab-bar-mouse-select-tab)
+    (define-key map [drag-mouse-1] 'tab-bar-mouse-move-tab)
     (define-key map [mouse-1] 'ignore)
     (define-key map [down-mouse-2] 'tab-bar-mouse-close-tab)
     (define-key map [mouse-2] 'ignore)
@@ -894,11 +905,13 @@ ARG counts from 1.  Negative ARG counts tabs from the end 
of the tab bar."
     (let ((key (event-basic-type last-command-event)))
       (setq arg (if (and (characterp key) (>= key ?1) (<= key ?9))
                     (- key ?0)
-                  1))))
+                  0))))
 
   (let* ((tabs (funcall tab-bar-tabs-function))
          (from-index (tab-bar--current-tab-index tabs))
-         (to-index (if (< arg 0) (+ (length tabs) (1+ arg)) arg))
+         (to-index (cond ((< arg 0) (+ (length tabs) (1+ arg)))
+                         ((zerop arg) (1+ from-index))
+                         (t arg)))
          (to-index (1- (max 1 (min to-index (length tabs))))))
 
     (unless (eq from-index to-index)
diff --git a/src/xdisp.c b/src/xdisp.c
index 1a4efba..4a5ab17 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -13759,10 +13759,7 @@ handle_tab_bar_click (struct frame *f, int x, int y, 
bool down_p,
 
   frame_to_window_pixel_xy (w, &x, &y);
   ts = get_tab_bar_item (f, x, y, &glyph, &hpos, &vpos, &prop_idx, &close_p);
-  if (ts == -1
-      /* If the button is released on a tab other than the one where
-        it was pressed, don't generate the tab-bar button click event.  */
-      || (ts != 0 && !down_p))
+  if (ts == -1)
     return Qnil;
 
   /* If item is disabled, do nothing.  */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]