X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/5df4f04cd32af723742c81095b38ae83b3c2b462..4b9ac23960d2998f899287ffcf696ad33b63a69a:/lisp/fringe.el diff --git a/lisp/fringe.el b/lisp/fringe.el index 6b433cc20a..8ac3b6d841 100644 --- a/lisp/fringe.el +++ b/lisp/fringe.el @@ -1,11 +1,11 @@ -;;; fringe.el --- fringe setup and control -*- coding: utf-8 -*- +;;; fringe.el --- fringe setup and control -;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, -;; 2009, 2010, 2011 Free Software Foundation, Inc. +;; Copyright (C) 2002-2016 Free Software Foundation, Inc. ;; Author: Simon Josefsson -;; Maintainer: FSF +;; Maintainer: emacs-devel@gnu.org ;; Keywords: frames +;; Package: emacs ;; This file is part of GNU Emacs. @@ -30,7 +30,7 @@ ;; The code is influenced by scroll-bar.el and avoid.el. The author ;; gratefully acknowledge comments and suggestions made by Miles -;; Bader, Eli Zaretski, Richard Stallman, Pavel Janík and others which +;; Bader, Eli Zaretskii, Richard Stallman, Pavel Janík and others which ;; improved this package. ;;; Code: @@ -43,7 +43,7 @@ ;; Define the built-in fringe bitmaps and setup default mappings (when (boundp 'fringe-bitmaps) - (let ((bitmaps '(question-mark + (let ((bitmaps '(question-mark exclamation-mark left-arrow right-arrow up-arrow down-arrow left-curly-arrow right-curly-arrow left-triangle right-triangle @@ -83,9 +83,9 @@ (hollow-small . hollow-square)))) -(defmacro fringe-bitmap-p (symbol) +(defun fringe-bitmap-p (symbol) "Return non-nil if SYMBOL is a fringe bitmap." - `(get ,symbol 'fringe)) + (get symbol 'fringe)) ;; Control presence of fringes @@ -96,7 +96,7 @@ "Non-nil means `set-fringe-mode' should really do something. This is nil while loading `fringe.el', and t afterward.") -(defun set-fringe-mode-1 (ignore value) +(defun set-fringe-mode-1 (_ignore value) "Call `set-fringe-mode' with VALUE. See `fringe-mode' for valid values and their effect. This is usually invoked when setting `fringe-mode' via customize." @@ -105,8 +105,8 @@ This is usually invoked when setting `fringe-mode' via customize." (defun set-fringe-mode (value) "Set `fringe-mode' to VALUE and put the new value into effect. See `fringe-mode' for possible values and their effect." + (fringe--check-style value) (setq fringe-mode value) - (when fringe-mode-explicit (modify-all-frames-parameters (list (cons 'left-fringe (if (consp fringe-mode) @@ -116,6 +116,14 @@ See `fringe-mode' for possible values and their effect." (cdr fringe-mode) fringe-mode)))))) +(defun fringe--check-style (style) + (or (null style) + (integerp style) + (and (consp style) + (or (null (car style)) (integerp (car style))) + (or (null (cdr style)) (integerp (cdr style)))) + (error "Invalid fringe style `%s'" style))) + ;; For initialization of fringe-mode, take account of changes ;; made explicitly to default-frame-alist. (defun fringe-mode-initialize (symbol value) @@ -135,29 +143,58 @@ See `fringe-mode' for possible values and their effect." ;; Otherwise impose the user-specified value of fringe-mode. (custom-initialize-reset symbol value)))) +(defconst fringe-styles + '(("default" . nil) + ("no-fringes" . 0) + ("right-only" . (0 . nil)) + ("left-only" . (nil . 0)) + ("half-width" . (4 . 4)) + ("minimal" . (1 . 1))) + "Alist mapping fringe mode names to fringe widths. +Each list element has the form (NAME . WIDTH), where NAME is a +mnemonic fringe mode name and WIDTH is one of the following: +- nil, which means the default width (8 pixels). +- a cons cell (LEFT . RIGHT), where LEFT and RIGHT are + respectively the left and right fringe widths in pixels, or + nil (meaning the default width). +- a single integer, which specifies the pixel widths of both + fringes.") + (defcustom fringe-mode nil - "Specify appearance of fringes on all frames. -This variable can be nil (the default) meaning the fringes should have -the default width (8 pixels), it can be an integer value specifying -the width of both left and right fringe (where 0 means no fringe), or -a cons cell where car indicates width of left fringe and cdr indicates -width of right fringe (where again 0 can be used to indicate no -fringe). -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 `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"))) + "Default appearance of fringes on all frames. +The Lisp value should be one of the following: +- nil, which means the default width (8 pixels). +- a cons cell (LEFT . RIGHT), where LEFT and RIGHT are + respectively the left and right fringe widths in pixels, or + nil (meaning the default width). +- a single integer, which specifies the pixel widths of both + fringes. +Note that the actual width may be rounded up to ensure that the +sum of the width of the left and right fringes is a multiple of +the frame's character width. However, a fringe width of 0 is +never rounded. + +When setting this variable from Customize, the user can choose +from the mnemonic fringe mode names defined in `fringe-styles'. + +When setting this variable in a Lisp program, call +`set-fringe-mode' afterward to make it take real effect. + +To modify the appearance of the fringe in a specific frame, use +the interactive function `set-fringe-style'." + :type `(choice + ,@ (mapcar (lambda (style) + (let ((name + (replace-regexp-in-string "-" " " (car style)))) + `(const :tag + ,(concat (capitalize (substring name 0 1)) + (substring name 1)) + ,(cdr style)))) + fringe-styles) + (integer :tag "Specific width") + (cons :tag "Different left/right sizes" + (integer :tag "Left width") + (integer :tag "Right width"))) :group 'fringe :require 'fringe :initialize 'fringe-mode-initialize @@ -174,44 +211,38 @@ If ALL-FRAMES, the negation of the fringe values in `default-frame-alist' is used when user enters the empty string. Otherwise the negation of the fringe value in the currently selected frame parameter is used." - (let ((mode (intern (completing-read - (concat - "Select fringe mode for " - (if all-frames "all frames" "selected frame") - " (type ? for list): ") - '(("none") ("default") ("left-only") - ("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 - default-frame-alist - (frame-parameters (selected-frame)))))) - nil - 0))))) + (let* ((mode (completing-read + (concat + "Select fringe mode for " + (if all-frames "all frames" "selected frame") + ": ") + fringe-styles nil t)) + (style (assoc (downcase mode) fringe-styles))) + (cond + (style + (cdr style)) + ((not (eq 0 (cdr (assq 'left-fringe + (if all-frames + default-frame-alist + (frame-parameters)))))) + 0)))) (defun fringe-mode (&optional mode) "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. +When called interactively, query the user for MODE; valid values +are `no-fringes', `default', `left-only', `right-only', `minimal' +and `half-width'. See `fringe-styles'. + +When used in a Lisp program, MODE should be one of these: +- nil, which means the default width (8 pixels). +- a cons cell (LEFT . RIGHT), where LEFT and RIGHT are + respectively the left and right fringe widths in pixels, or + nil (meaning the default width). +- a single integer, which specifies the pixel widths of both + fringes. +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 @@ -223,26 +254,27 @@ frame only, see the command `set-fringe-style'." (defun set-fringe-style (&optional 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. +When called interactively, query the user for MODE; valid values +are `no-fringes', `default', `left-only', `right-only', `minimal' +and `half-width'. See `fringe-styles'. + +When used in a Lisp program, MODE should be one of these: +- nil, which means the default width (8 pixels). +- a cons cell (LEFT . RIGHT), where LEFT and RIGHT are + respectively the left and right fringe widths in pixels, or + nil (meaning the default width). +- a single integer, which specifies the pixel widths of both + fringes. +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))) + (fringe--check-style mode) (modify-frame-parameters (selected-frame) (list (cons 'left-fringe (if (consp mode) (car mode) mode)) @@ -261,5 +293,4 @@ SIDE must be the symbol `left' or `right'." (provide 'fringe) -;; arch-tag: 6611ef60-0869-47ed-8b93-587ee7d3ff5d ;;; fringe.el ends here