]> git.eshelyaron.com Git - emacs.git/commitdiff
Improved mouse rectangle selection robustness (bug#38013)
authorMattias Engdegård <mattiase@acm.org>
Sat, 30 Nov 2019 10:37:04 +0000 (11:37 +0100)
committerMattias Engdegård <mattiase@acm.org>
Sat, 30 Nov 2019 21:43:00 +0000 (22:43 +0100)
Make the rectangular selection work better with
display-line-numbers-mode and side-by-side windows.
Also make the mouse track the text cursor in a consistent way.

* lisp/mouse.el (mouse--rectangle-track-cursor): Added constant.
(mouse-drag-region-rectangle): Take the line-number width into
account, and use window-relative columns.  Track either the cursor or
rectangle corner with more care.

lisp/mouse.el

index f076e90bd93543eddfbc8913082ecc425c003bef..bc05a35009e3f0d56abfe5777b1824e7294d8a98 100644 (file)
@@ -1964,6 +1964,10 @@ When there is no region, this function does nothing."
     (move-overlay mouse-secondary-overlay (region-beginning) (region-end))))
 
 \f
+(defconst mouse--rectangle-track-cursor t
+  "Whether the mouse tracks the cursor when selecting a rectangle.
+If nil, the mouse tracks the rectangle corner instead.")
+
 (defun mouse-drag-region-rectangle (start-event)
   "Set the region to the rectangle that the mouse is dragged over.
 This must be bound to a button-down mouse event."
@@ -1980,6 +1984,7 @@ This must be bound to a button-down mouse event."
          (bottom (if (window-minibuffer-p start-window)
                      (nth 3 bounds)
                    (1- (nth 3 bounds))))
+         (extra-margin (round (line-number-display-width 'columns)))
          (dragged nil)
          (old-track-mouse track-mouse)
          (old-mouse-fine-grained-tracking mouse-fine-grained-tracking)
@@ -1988,8 +1993,9 @@ This must be bound to a button-down mouse event."
          (adjusted-col (lambda (col)
                          (if (eq (current-bidi-paragraph-direction)
                                  'right-to-left)
-                             (- (frame-text-cols) col -1)
-                           col)))
+                             (- (window-width) col extra-margin
+                                (if mouse--rectangle-track-cursor 1 -1))
+                           (- col extra-margin))))
          (map (make-sparse-keymap)))
     (define-key map [switch-frame] #'ignore)
     (define-key map [select-window] #'ignore)
@@ -2018,13 +2024,15 @@ This must be bound to a button-down mouse event."
                (hscroll (if (window-live-p window)
                             (window-hscroll window)
                           0))
-               (mouse-pos (mouse-position))
-               (mouse-col (+ (cadr mouse-pos) hscroll))
-               (mouse-row (cddr mouse-pos))
+               (mouse-row (cddr (mouse-position)))
+               (mouse-col (+ (car (posn-col-row posn)) hscroll
+                             (if mouse--rectangle-track-cursor 0 1)))
                (set-col (lambda ()
                           (if (or (eolp) (eq (following-char) ?\t))
                               (rectangle--col-pos
                                (funcall adjusted-col mouse-col) 'point)
+                            (unless mouse--rectangle-track-cursor
+                              (forward-char))
                             (rectangle--reset-point-crutches)))))
           (if (and (eq window start-window)
                    mouse-row