;;; fringe.el --- change fringes appearance in various ways
-;; Copyright (C) 2002 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org>
;; Maintainer: FSF
;;; Code:
+(defgroup fringe nil
+ "Window fringes."
+ :version "21.4"
+ :group 'frames)
+
+;; Standard fringe bitmaps
+
+(defmacro fringe-bitmap-p (symbol)
+ "Return non-nil if SYMBOL is a fringe bitmap."
+ `(get ,symbol 'fringe))
+
+(defvar fringe-bitmaps)
+
+(unless (or (not (boundp 'fringe-bitmaps))
+ (get 'left-truncation 'fringe))
+ (let ((bitmaps '(left-truncation right-truncation
+ up-arrow down-arrow
+ continued-line continuation-line
+ overlay-arrow
+ top-left-angle top-right-angle
+ bottom-left-angle bottom-right-angle
+ left-bracket right-bracket
+ filled-box-cursor hollow-box-cursor hollow-square
+ bar-cursor hbar-cursor
+ empty-line))
+ (bn 2))
+ (while bitmaps
+ (push (car bitmaps) fringe-bitmaps)
+ (put (car bitmaps) 'fringe bn)
+ (setq bitmaps (cdr bitmaps)
+ bn (1+ bn)))))
+
+
+;; Control presence of fringes
+
(defvar fringe-mode)
(defun set-fringe-mode-1 (ignore value)
;; Apply it to default-frame-alist.
(let ((parameter (assq 'left-fringe default-frame-alist)))
(if (consp parameter)
- (setcdr parameter fringe-mode)
+ (setcdr parameter (if (consp fringe-mode)
+ (car fringe-mode)
+ fringe-mode))
(setq default-frame-alist
(cons (cons 'left-fringe (if (consp fringe-mode)
(car fringe-mode)
default-frame-alist))))
(let ((parameter (assq 'right-fringe default-frame-alist)))
(if (consp parameter)
- (setcdr parameter fringe-mode)
+ (setcdr parameter (if (consp fringe-mode)
+ (cdr fringe-mode)
+ fringe-mode))
(setq default-frame-alist
(cons (cons 'right-fringe (if (consp fringe-mode)
(cdr fringe-mode)
fringe-mode))))
(setq frames (cdr frames)))))
+;; For initialization of fringe-mode, take account of changes
+;; made explicitly to default-frame-alist.
+(defun fringe-mode-initialize (symbol value)
+ (let* ((left-pair (assq 'left-fringe default-frame-alist))
+ (right-pair (assq 'right-fringe default-frame-alist))
+ (left (cdr left-pair))
+ (right (cdr right-pair)))
+ (if (or left-pair right-pair)
+ ;; If there's something in default-frame-alist for fringes,
+ ;; don't change it, but reflect that into the value of fringe-mode.
+ (progn
+ (setq fringe-mode (cons left right))
+ (if (equal fringe-mode '(nil . nil))
+ (setq fringe-mode nil))
+ (if (equal fringe-mode '(0 . 0))
+ (setq fringe-mode 0)))
+ ;; Otherwise impose the user-specified value of fringe-mode.
+ (custom-initialize-reset symbol value))))
+
+;;;###autoload
(defcustom fringe-mode nil
"*Specify appearance of fringes on all frames.
This variable can be nil (the default) meaning the fringes should have
(const :tag "Only right" (0 . nil))
(const :tag "Only left" (nil . 0))
(const :tag "Half width" (5 . 5))
+ (const :tag "Minimal" (1 . 1))
(integer :tag "Specific width")
(cons :tag "Different left/right sizes"
(integer :tag "Left width")
(integer :tag "Right width")))
- :group 'frames
+ :group 'fringe
:require 'fringe
+ :initialize 'fringe-mode-initialize
:set 'set-fringe-mode-1)
(defun fringe-query-style (&optional all-frames)
Otherwise the negation of the fringe value in the currently selected
frame parameter is used."
(let ((mode (intern (completing-read
- "Select fringe mode for all frames (SPACE for list): "
+ "Select fringe mode for all frames (type ? for list): "
'(("none") ("default") ("left-only")
("right-only") ("half") ("minimal"))
nil t))))
;;;###autoload
(defun fringe-mode (&optional mode)
- "Toggle appearance of fringes on all frames.
-Valid values for MODE include `none', `default', `left-only',
-`right-only', `minimal' and `half'. MODE can also be a cons cell
-where the integer in car will be used as left fringe width and the
-integer in cdr will be used as right fringe width. If MODE is not
-specified, the user is queried.
-It applies to all frames that exist and frames to be created in the
-future.
-If you want to set appearance of fringes on the selected frame only,
-see `set-fringe-style'."
+ "Set the default appearance of fringes on all frames.
+
+When called interactively, query the user for MODE. Valid values
+for MODE include `none', `default', `left-only', `right-only',
+`minimal' and `half'.
+
+When used in a Lisp program, MODE can be a cons cell where the
+integer in car specifies the left fringe width and the integer in
+cdr specifies the right fringe width. MODE can also be a single
+integer that specifies both the left and the right fringe width.
+If a fringe width specification is nil, that means to use the
+default width (8 pixels). This command may round up the left and
+right width specifications to ensure that their sum is a multiple
+of the character width of a frame. It never rounds up a fringe
+width of 0.
+
+Fringe widths set by `set-window-fringes' override the default
+fringe widths set by this command. This command applies to all
+frames that exist and frames to be created in the future. If you
+want to set the default appearance of fringes on the selected
+frame only, see the command `set-fringe-style'."
(interactive (list (fringe-query-style 'all-frames)))
(set-fringe-mode mode))
;;;###autoload
(defun set-fringe-style (&optional mode)
- "Set appearance of fringes on selected frame.
-Valid values for MODE include `none', `default', `left-only',
-`right-only', `minimal' and `half'. MODE can also be a cons cell
-where the integer in car will be used as left fringe width and the
-integer in cdr will be used as right fringe width. If MODE is not
-specified, the user is queried.
-If you want to set appearance of fringes on all frames, see `fringe-mode'."
+ "Set the default appearance of fringes on the selected frame.
+
+When called interactively, query the user for MODE. Valid values
+for MODE include `none', `default', `left-only', `right-only',
+`minimal' and `half'.
+
+When used in a Lisp program, MODE can be a cons cell where the
+integer in car specifies the left fringe width and the integer in
+cdr specifies the right fringe width. MODE can also be a single
+integer that specifies both the left and the right fringe width.
+If a fringe width specification is nil, that means to use the
+default width (8 pixels). This command may round up the left and
+right width specifications to ensure that their sum is a multiple
+of the character width of a frame. It never rounds up a fringe
+width of 0.
+
+Fringe widths set by `set-window-fringes' override the default
+fringe widths set by this command. If you want to set the
+default appearance of fringes on all frames, see the command
+`fringe-mode'."
(interactive (list (fringe-query-style)))
(modify-frame-parameters
(selected-frame)
(list (cons 'left-fringe (if (consp mode) (car mode) mode))
(cons 'right-fringe (if (consp mode) (cdr mode) mode)))))
+(defsubst fringe-columns (side &optional real)
+ "Return the width, measured in columns, of the fringe area on SIDE.
+If optional argument REAL is non-nil, return a real floating point
+number instead of a rounded integer value.
+SIDE must be the symbol `left' or `right'."
+ (funcall (if real '/ 'ceiling)
+ (or (funcall (if (eq side 'left) 'car 'cadr)
+ (window-fringes))
+ 0)
+ (float (frame-char-width))))
+
+;; Fake defvar. Real definition using defcustom is below. The fake
+;; defvar is necessary because `fringe-indicators' and
+;; `set-fringe-indicators-1' mutually use each other.
+(defvar fringe-indicators)
+
+(defun set-fringe-indicators-1 (ignore value)
+ "Set fringe indicators according to VALUE.
+This is usually invoked when setting `fringe-indicators' via customize."
+ (setq fringe-indicators value)
+ (setq default-indicate-empty-lines nil)
+ (setq default-indicate-buffer-boundaries
+ (cond
+ ((memq value '(left right t))
+ value)
+ ((eq value 'box)
+ '((top . left) (bottom . right)))
+ ((eq value 'mixed)
+ '((top . left) (t . right)))
+ ((eq value 'empty)
+ (setq default-indicate-empty-lines t)
+ nil)
+ (t nil))))
+
+;;;###autoload
+(defcustom fringe-indicators nil
+ "Visually indicate buffer boundaries and scrolling.
+Setting this variable, changes `default-indicate-buffer-boundaries'."
+ :type '(choice (const :tag "No indicators" nil)
+ (const :tag "On left" left)
+ (const :tag "On right" right)
+ (const :tag "Opposite, no arrows" box)
+ (const :tag "Opposite, arrows right" mixed)
+ (const :tag "Empty lines" empty))
+ :group 'fringe
+ :require 'fringe
+ :set 'set-fringe-indicators-1)
+
(provide 'fringe)
+;;; arch-tag: 6611ef60-0869-47ed-8b93-587ee7d3ff5d
;;; fringe.el ends here