[TMP] enable load_prefer_newer
[bpt/emacs.git] / lisp / fringe.el
index fa5ebb6..ff60804 100644 (file)
@@ -1,9 +1,9 @@
 ;;; fringe.el --- fringe setup and control  -*- coding: utf-8 -*-
 
-;; Copyright (C) 2002-2011 Free Software Foundation, Inc.
+;; Copyright (C) 2002-2014 Free Software Foundation, Inc.
 
 ;; Author: Simon Josefsson <simon@josefsson.org>
-;; Maintainer: FSF
+;; Maintainer: emacs-devel@gnu.org
 ;; Keywords: frames
 ;; Package: 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
@@ -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)
@@ -141,24 +149,39 @@ See `fringe-mode' for possible values and their effect."
     ("right-only" . (0 . nil))
     ("left-only" . (nil . 0))
     ("half-width" . (4 . 4))
-    ("minimal" . (1 . 1))))
+    ("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).
-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.
-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'."
+  "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
@@ -195,30 +218,31 @@ frame parameter is used."
                  ": ")
                 fringe-styles nil t))
          (style (assoc (downcase mode) fringe-styles)))
-    (if style (cdr style)
-      (if (eq 0 (cdr (assq 'left-fringe
-                           (if all-frames
-                               default-frame-alist
-                             (frame-parameters (selected-frame))))))
-          nil
-        0))))
+    (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
@@ -230,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))