X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/608d30f7bedb5ff889b0df623a8e70549e503645..797d92ed1f986579ab155e1f2df346eb31cc4085:/lisp/fringe.el diff --git a/lisp/fringe.el b/lisp/fringe.el index 8ec6d14207..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) @@ -83,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 @@ -95,7 +150,7 @@ 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)) @@ -106,8 +161,9 @@ you can use the interactive function `toggle-fringe'" (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) @@ -118,7 +174,10 @@ 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") ("minimal")) nil t)))) @@ -138,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', `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)))) + (provide 'fringe) +;;; arch-tag: 6611ef60-0869-47ed-8b93-587ee7d3ff5d ;;; fringe.el ends here