emacs-diffs
[Top][All Lists]
Advanced

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

master 293eb32: Improved mouse rectangle selection robustness (bug#38013


From: Mattias Engdegård
Subject: master 293eb32: Improved mouse rectangle selection robustness (bug#38013)
Date: Sat, 30 Nov 2019 16:43:10 -0500 (EST)

branch: master
commit 293eb3259883c0b8465926a850b9ca7131e70074
Author: Mattias Engdegård <address@hidden>
Commit: Mattias Engdegård <address@hidden>

    Improved mouse rectangle selection robustness (bug#38013)
    
    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 | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/lisp/mouse.el b/lisp/mouse.el
index f076e90..bc05a35 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -1964,6 +1964,10 @@ When there is no region, this function does nothing."
     (move-overlay mouse-secondary-overlay (region-beginning) (region-end))))
 
 
+(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



reply via email to

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