aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/ruler-mode.el75
1 files changed, 18 insertions, 57 deletions
diff --git a/lisp/ruler-mode.el b/lisp/ruler-mode.el
index 83b9d2e7548..9d86074a0f0 100644
--- a/lisp/ruler-mode.el
+++ b/lisp/ruler-mode.el
@@ -5,7 +5,7 @@
5;; Author: David Ponce <david@dponce.com> 5;; Author: David Ponce <david@dponce.com>
6;; Maintainer: David Ponce <david@dponce.com> 6;; Maintainer: David Ponce <david@dponce.com>
7;; Created: 24 Mar 2001 7;; Created: 24 Mar 2001
8;; Version: 1.3.1 8;; Version: 1.4
9;; Keywords: environment 9;; Keywords: environment
10 10
11;; This file is part of GNU Emacs. 11;; This file is part of GNU Emacs.
@@ -438,75 +438,36 @@ C-mouse-2: hide tabs"
438 "Right margin %S" 438 "Right margin %S"
439 "Help string shown when mouse is over the right margin area.") 439 "Help string shown when mouse is over the right margin area.")
440 440
441(defvar ruler-mode-left-fringe-cols nil 441(defun ruler-mode-extra-left-cols ()
442 "Hold last result of function `ruler-mode-left-fringe-cols'. 442 "Return number of extra columns on the left side of selected frame.
443This cache is local to each frame.") 443That is the number of columns occupied by the left fringe area and
444(make-variable-frame-local 'ruler-mode-left-fringe-cols) 444vertical scrollbar on the left side of the selected frame."
445 445 (let ((w (frame-first-window))
446(defun ruler-mode-left-fringe-cols (&optional check) 446 (xy (cons 0 0)))
447 "Return the character width of fringe and left vertical scrollbar. 447 (with-current-buffer (window-buffer w)
448That is a pair (FRINGE-COLS . VSCROLLBAR-COLS) where: 448 (let (header-line-format)
449 449 (while (not (listp (coordinates-in-window-p xy w)))
450- - FRINGE-COLS is the number of columns occupied by a fringe area. 450 (setcar xy (1+ (car xy))))
451 451 (car xy)))))
452- - VSCROLLBAR-COLS is the number of columns occupied by the left
453 vertical scrollbar or 0 if there is no vertical scrollbar on the
454 left side.
455
456The first time this function is called its result is saved in a frame
457local cache and then returned on next calls. If optional argument
458CHECK is non-nil or if the frame 'vertical-scroll-bars parameter has
459been changed the function re-computes the result."
460 (let* ((f (selected-frame))
461 (vsb (frame-parameter f 'vertical-scroll-bars))
462 (lfc (frame-parameter f 'ruler-mode-left-fringe-cols)))
463 (if (or check (not (eq (cdr lfc) vsb)))
464 (let* ((w (frame-first-window f))
465 (sbw (frame-pixel-width f))
466 (chw (frame-char-width f))
467 (chx (/ 1.0 (float chw)))
468 (pos (cons 0.0 0))
469 (lfw 0.0)
470 coord)
471 (if vsb
472 (modify-frame-parameters
473 f '((vertical-scroll-bars . nil))))
474 (setq coord (coordinates-in-window-p pos w))
475 (while (not (memq coord '(left-fringe mode-line)))
476 (setcdr pos (1+ (cdr pos)))
477 (setq coord (coordinates-in-window-p pos w)))
478 (while (eq coord 'left-fringe)
479 (setcar pos (+ (car pos) chx))
480 (setq lfw (+ lfw chx)
481 coord (coordinates-in-window-p pos w)))
482 (or vsb
483 (modify-frame-parameters
484 f '((vertical-scroll-bars . right))))
485 (setq sbw (/ (abs (- sbw (frame-pixel-width f))) chw)
486 lfw (floor lfw))
487 (setq lfc (cons (cons lfw (if (eq vsb 'left) sbw 0)) vsb))
488 (modify-frame-parameters
489 f (list (cons 'vertical-scroll-bars vsb)
490 (cons 'ruler-mode-left-fringe-cols lfc)))))
491 (car lfc)))
492 452
493(defun ruler-mode-ruler () 453(defun ruler-mode-ruler ()
494 "Return a string ruler." 454 "Return a string ruler."
495 (if ruler-mode 455 (if ruler-mode
496 (let* ((lfr (ruler-mode-left-fringe-cols)) 456 (let* ((j (ruler-mode-extra-left-cols))
497 (w (+ (window-width) 1 (cdr lfr))) 457 (k (/ (or (frame-parameter nil 'right-fringe) 0)
458 (frame-char-width)))
459 (w (+ (window-width) j))
498 (m (window-margins)) 460 (m (window-margins))
499 (l (or (car m) 0)) 461 (l (or (car m) 0))
500 (r (or (cdr m) 0)) 462 (r (or (cdr m) 0))
501 (j (+ (car lfr) (cdr lfr)))
502 (o (- (window-hscroll) l j)) 463 (o (- (window-hscroll) l j))
503 (i 0) 464 (i 0)
504 (ruler (concat 465 (ruler (concat
505 ;; unit graduations 466 ;; unit graduations
506 (make-string w ruler-mode-basic-graduation-char) 467 (make-string w ruler-mode-basic-graduation-char)
507 ;; extra space to fill the header line 468 ;; extra space to fill the header line
508 (make-string j ?\ ))) 469 (make-string k ?\ )))
509 c k) 470 c)
510 471
511 ;; Setup default face and help echo. 472 ;; Setup default face and help echo.
512 (put-text-property 0 (length ruler) 473 (put-text-property 0 (length ruler)