X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/02f4566a55fa0084b68b829c95387484170b1139..0f0b350b8863bb74455b4e07f4f3372657acd22d:/lisp/fringe.el diff --git a/lisp/fringe.el b/lisp/fringe.el index 67dae5c1b4..a32d6b5902 100644 --- a/lisp/fringe.el +++ b/lisp/fringe.el @@ -1,6 +1,6 @@ ;;; fringe.el --- change fringes appearance in various ways -;; Copyright (C) 2002 Free Software Foundation, Inc. +;; Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ;; Author: Simon Josefsson ;; Maintainer: FSF @@ -20,8 +20,8 @@ ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: @@ -35,6 +35,41 @@ ;;; Code: +(defgroup fringe nil + "Window fringes." + :version "22.1" + :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) @@ -51,7 +86,9 @@ See `fringe-mode' for possible values and their effect." ;; 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) @@ -59,7 +96,9 @@ See `fringe-mode' for possible values and their effect." 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) @@ -79,6 +118,26 @@ See `fringe-mode' for possible values and their effect." 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 @@ -91,18 +150,20 @@ To set this variable in a Lisp program, use `set-fringe-mode' to make it take real effect. Setting the variable with a customization buffer also takes effect. If you only want to modify the appearance of the fringe in one frame, -you can use the interactive function `toggle-fringe'" +you can use the interactive function `set-fringe-style'." :type '(choice (const :tag "Default width" nil) (const :tag "No fringes" 0) (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) @@ -113,15 +174,19 @@ If ALL-FRAMES, the negation of the fringe values in 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): " + (concat + "Select fringe mode for " + (if all-frames "all frames" "selected frame") + " (type ? for list): ") '(("none") ("default") ("left-only") - ("right-only") ("half")) + ("right-only") ("half") ("minimal")) nil t)))) (cond ((eq mode 'none) 0) ((eq mode 'default) nil) ((eq mode 'left-only) '(nil . 0)) ((eq mode 'right-only) '(0 . nil)) ((eq mode 'half) '(5 . 5)) + ((eq mode 'minimal) '(1 . 1)) ((eq mode (intern "")) (if (eq 0 (cdr (assq 'left-fringe (if all-frames @@ -132,34 +197,70 @@ frame parameter is used." ;;;###autoload (defun fringe-mode (&optional mode) - "Toggle appearance of fringes on all frames. -Valid values for MODE include `none', `default', `left-only', -`right-only' 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' 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)))) + (provide 'fringe) +;;; arch-tag: 6611ef60-0869-47ed-8b93-587ee7d3ff5d ;;; fringe.el ends here