emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] externals/nlinum fbe07f1 09/20: * nlinum.el (nlinum--setup-window


From: Stefan Monnier
Subject: [elpa] externals/nlinum fbe07f1 09/20: * nlinum.el (nlinum--setup-window): Better preserve margin settings
Date: Sat, 28 Nov 2020 18:42:23 -0500 (EST)

branch: externals/nlinum
commit fbe07f183320e50cc24cf75a1fc94bf4e17b2a76
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    * nlinum.el (nlinum--setup-window): Better preserve margin settings
    
    (bug#20674)
---
 nlinum.el | 42 ++++++++++++++++++++++++++++++------------
 1 file changed, 30 insertions(+), 12 deletions(-)

diff --git a/nlinum.el b/nlinum.el
index 2505c98..98c9cbc 100644
--- a/nlinum.el
+++ b/nlinum.el
@@ -82,18 +82,36 @@ Linum mode is a buffer-local minor mode."
           width)))))
 
 (defun nlinum--setup-window ()
-  (let ((width (if (display-graphic-p)
-                   (ceiling
-                    (let ((width (nlinum--face-width 'linum)))
-                      (if width
-                          (/ (* nlinum--width 1.0 width)
-                             (frame-char-width))
-                        (/ (* nlinum--width 1.0
-                              (nlinum--face-height 'linum))
-                           (frame-char-height)))))
-                 nlinum--width)))
-    (set-window-margins nil (if nlinum-mode width)
-                        (cdr (window-margins)))))
+  ;; FIXME: The interaction between different uses of the margin is
+  ;; problematic.  We should have a way for different packages to indicate (and
+  ;; change) their preference independently.
+  (let* ((width (if (display-graphic-p)
+                    (ceiling
+                     (let ((width (nlinum--face-width 'linum)))
+                       (if width
+                           (/ (* nlinum--width 1.0 width)
+                              (frame-char-width))
+                         (/ (* nlinum--width 1.0
+                               (nlinum--face-height 'linum))
+                            (frame-char-height)))))
+                  nlinum--width))
+         (cur-margins (window-margins))
+         (cur-margin (car cur-margins))
+         ;; (EXT . OURS) keeps track of the size of the margin, where EXT is 
the
+         ;; size chosen by external code and OURS is the size we last set.
+         ;; OURS is used to detect when someone else modifies the margin.
+         (margin-settings (window-parameter nil 'linum--margin)))
+    (if margin-settings
+        (unless (eq (cdr margin-settings) cur-margin)
+          ;; Damn!  The margin is not what it used to be!  => Update EXT!
+          (setcar margin-settings cur-margin))
+      (set-window-parameter nil 'linum--margin
+                            (setq margin-settings (list cur-margin))))
+    (and (car margin-settings) width
+         (setq width (max width (car margin-settings))))
+    (setcdr margin-settings width)
+    (set-window-margins nil (if nlinum-mode width (car margin-settings))
+                        (cdr cur-margins))))
 
 (defun nlinum--setup-windows ()
   (dolist (win (get-buffer-window-list nil nil t))



reply via email to

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