]> code.delx.au - gnu-emacs/blobdiff - lisp/facemenu.el
Much whitespace and capitalization change.
[gnu-emacs] / lisp / facemenu.el
index 37399e0d90165b51c6e9dfe3d49d523b7189f55a..c6cce457fe6ae183c330e8e0dc69def19891f70e 100644 (file)
@@ -38,7 +38,7 @@
 ;; insertion.  It will be forgotten if you move point or make other
 ;; modifications before inserting or typing anything.
 ;;
-;; Faces can be selected from the keyboard as well.  
+;; Faces can be selected from the keyboard as well.
 ;; The standard keybindings are M-g (or ESC g) + letter:
 ;; M-g i = "set italic",  M-g b = "set bold", etc.
 
 
 ;;; Code:
 
-(eval-when-compile 
+(eval-when-compile
   (require 'help)
   (require 'button))
 
 ;;; Provide some binding for startup:
 ;;;###autoload (define-key global-map "\M-g" 'facemenu-keymap)
 ;;;###autoload (autoload 'facemenu-keymap "facemenu" "Keymap for face-changing commands." t 'keymap)
-  
+
 ;; Global bindings:
 (define-key global-map [C-down-mouse-2] 'facemenu-menu)
 (define-key global-map "\M-g" 'facemenu-keymap)
@@ -116,7 +116,7 @@ the binding is made in `facemenu-keymap'.
 
 The faces specifically mentioned in this list are put at the top of
 the menu, in the order specified.  All other faces which are defined,
-except for those in `facemenu-unlisted-faces', are listed after them, 
+except for those in `facemenu-unlisted-faces', are listed after them,
 but get no keyboard equivalents.
 
 If you change this variable after loading facemenu.el, you will need to call
@@ -164,7 +164,7 @@ when they are created."
 (defalias 'facemenu-face-menu facemenu-face-menu)
 
 ;;;###autoload
-(defvar facemenu-foreground-menu 
+(defvar facemenu-foreground-menu
   (let ((map (make-sparse-keymap "Foreground Color")))
     (define-key map "o" (cons "Other..." 'facemenu-set-foreground))
     map)
@@ -182,7 +182,7 @@ when they are created."
 (defalias 'facemenu-background-menu facemenu-background-menu)
 
 ;;;###autoload
-(defvar facemenu-special-menu 
+(defvar facemenu-special-menu
   (let ((map (make-sparse-keymap "Special")))
     (define-key map [?s] (cons (purecopy "Remove Special")
                               'facemenu-remove-special))
@@ -213,7 +213,7 @@ when they are created."
 ;;;###autoload
 (defvar facemenu-indentation-menu
   (let ((map (make-sparse-keymap "Indentation")))
-    (define-key map [decrease-right-margin] 
+    (define-key map [decrease-right-margin]
       (cons (purecopy "Indent Right Less") 'decrease-right-margin))
     (define-key map [increase-right-margin]
       (cons (purecopy "Indent Right More") 'increase-right-margin))
@@ -245,23 +245,23 @@ when they are created."
   (define-key map [s1] (list (purecopy "--"))))
 ;;;###autoload
 (let ((map facemenu-menu))
-  (define-key map [in] (cons (purecopy "Indentation") 
+  (define-key map [in] (cons (purecopy "Indentation")
                             'facemenu-indentation-menu))
   (define-key map [ju] (cons (purecopy "Justification")
                             'facemenu-justification-menu))
   (define-key map [s2] (list (purecopy "--")))
-  (define-key map [sp] (cons (purecopy "Special Properties") 
+  (define-key map [sp] (cons (purecopy "Special Properties")
                             'facemenu-special-menu))
-  (define-key map [bg] (cons (purecopy "Background Color") 
+  (define-key map [bg] (cons (purecopy "Background Color")
                             'facemenu-background-menu))
-  (define-key map [fg] (cons (purecopy "Foreground Color") 
+  (define-key map [fg] (cons (purecopy "Foreground Color")
                             'facemenu-foreground-menu))
-  (define-key map [fc] (cons (purecopy "Face") 
+  (define-key map [fc] (cons (purecopy "Face")
                             'facemenu-face-menu)))
 ;;;###autoload
 (defalias 'facemenu-menu facemenu-menu)
 
-(defvar facemenu-keymap 
+(defvar facemenu-keymap
   (let ((map (make-sparse-keymap "Set face")))
     (define-key map "o" (cons (purecopy "Other...") 'facemenu-set-face))
     map)
@@ -328,7 +328,7 @@ requested face.
 
 Otherwise, this command specifies the face for the next character
 inserted.  Moving point or switching buffers before
-typing a character to insert cancels the specification." 
+typing a character to insert cancels the specification."
   (interactive (list (progn
                       (barf-if-buffer-read-only)
                       (read-face-name "Use face"))
@@ -350,7 +350,7 @@ requested face.
 
 Otherwise, this command specifies the face for the next character
 inserted.  Moving point or switching buffers before
-typing a character to insert cancels the specification." 
+typing a character to insert cancels the specification."
   (interactive (list (progn
                       (barf-if-buffer-read-only)
                       (facemenu-read-color "Foreground color: "))
@@ -374,7 +374,7 @@ requested face.
 
 Otherwise, this command specifies the face for the next character
 inserted.  Moving point or switching buffers before
-typing a character to insert cancels the specification." 
+typing a character to insert cancels the specification."
   (interactive (list (progn
                       (barf-if-buffer-read-only)
                       (facemenu-read-color "Background color: "))
@@ -399,7 +399,7 @@ requested face.
 
 Otherwise, this command specifies the face for the next character
 inserted.  Moving point or switching buffers before
-typing a character to insert cancels the specification." 
+typing a character to insert cancels the specification."
   (interactive (list last-command-event
                     (if (and mark-active (not current-prefix-arg))
                         (region-beginning))
@@ -407,7 +407,7 @@ typing a character to insert cancels the specification."
                         (region-end))))
   (barf-if-buffer-read-only)
   (facemenu-get-face face)
-  (if start 
+  (if start
       (facemenu-add-face face start end)
     (facemenu-add-face face)))
 
@@ -440,7 +440,7 @@ This sets the `read-only' text property; it can be undone with
   "Remove `face' and `mouse-face' text properties."
   (interactive "*r") ; error if buffer is read-only despite the next line.
   (let ((inhibit-read-only t))
-    (remove-text-properties 
+    (remove-text-properties
      start end '(face nil mouse-face nil))))
 
 ;;;###autoload
@@ -456,13 +456,13 @@ This sets the `read-only' text property; it can be undone with
 These special properties include `invisible', `intangible' and `read-only'."
   (interactive "*r") ; error if buffer is read-only despite the next line.
   (let ((inhibit-read-only t))
-    (remove-text-properties 
+    (remove-text-properties
      start end '(invisible nil intangible nil read-only nil))))
 \f
 ;;;###autoload
 (defun facemenu-read-color (&optional prompt)
   "Read a color using the minibuffer."
-  (let ((col (completing-read (or prompt "Color: ") 
+  (let ((col (completing-read (or prompt "Color: ")
                              (or facemenu-color-alist
                                  (defined-colors))
                              nil t)))
@@ -480,9 +480,19 @@ of colors that the current display can handle."
   (when (and (null list) (> (display-color-cells) 0))
     (setq list (defined-colors))
     ;; Delete duplicate colors.
+
+    ;; Identify duplicate colors by the name rather than the color
+    ;; value.  For example, on MS-Windows, logical colors are added to
+    ;; the list that might have the same value but have different
+    ;; names and meanings.  For example, `SystemMenuText' (the color
+    ;; w32 uses for the text in menu entries) and `SystemWindowText'
+    ;; (the default color w32 uses for the text in windows and
+    ;; dialogs) may be the same display color and be adjacent in the
+    ;; list.  Detecting duplicates by name insures that both of these
+    ;; colors remain despite identical color values.
     (let ((l list))
       (while (cdr l)
-       (if (facemenu-color-equal (car l) (car (cdr l)))
+       (if (facemenu-color-name-equal (car l) (car (cdr l)))
            (setcdr l (cdr (cdr l)))
          (setq l (cdr l)))))
     (when (memq (display-visual-class) '(gray-scale pseudo-color direct-color))
@@ -498,11 +508,11 @@ of colors that the current display can handle."
          (setq s (point))
          (insert (car list))
          (indent-to 20)
-         (put-text-property s (point) 'face 
+         (put-text-property s (point) 'face
                             (cons 'background-color (car list)))
          (setq s (point))
          (insert "  " (car list) "\n")
-         (put-text-property s (point) 'face 
+         (put-text-property s (point) 'face
                             (cons 'foreground-color (car list)))
          (setq list (cdr list)))))))
 
@@ -515,6 +525,22 @@ determine the correct answer."
   (cond ((equal a b) t)
        ((equal (color-values a) (color-values b)))))
 
+(defun facemenu-color-name-equal (a b)
+  "Return t if colors A and B are the same color.
+A and B should be strings naming colors.  These names are
+downcased, stripped of spaces and the string `grey' is turned
+into `gray'.  This accommodates alternative spellings of colors
+found commonly in the list.  It returns nil if the colors differ."
+  (progn
+    (setq a (replace-regexp-in-string "grey" "gray"
+            (replace-regexp-in-string " " ""
+             (downcase a)))
+         b (replace-regexp-in-string "grey" "gray"
+            (replace-regexp-in-string " " ""
+             (downcase b))))
+
+    (equal a b)))
+
 (defun facemenu-add-face (face &optional start end)
   "Add FACE to text between START and END.
 If START is nil or START to END is empty, add FACE to next typed character
@@ -591,7 +617,7 @@ use the selected frame.  If t, then the global, non-frame faces are used."
                       (check-face (car face-list)))))
                (i mask-len)
                (useful nil))
-           (while (> (setq i (1- i)) 1)
+           (while (>= (setq i (1- i)) 0)
              (and (not (memq (aref face-atts i) '(nil unspecified)))
                   (memq (aref mask-atts i) '(nil unspecified))
                   (aset mask-atts i (setq useful t))))
@@ -652,7 +678,7 @@ This is called whenever you create a new face."
           (define-key 'facemenu-keymap key (cons name function))
           (define-key menu key (cons name function)))
          ((facemenu-iterate ; check if equivalent face is already in the menu
-           (lambda (m) (and (listp m) 
+           (lambda (m) (and (listp m)
                             (symbolp (car m))
                             (face-equal (car m) symbol)))
            (cdr (symbol-function menu))))
@@ -693,7 +719,7 @@ This is called whenever you use a new color."
                 (format "Select background color %s for subsequent insertion."
                         name))))
     (cond ((facemenu-iterate ; check if equivalent face is already in the menu
-           (lambda (m) (and (listp m) 
+           (lambda (m) (and (listp m)
                             (symbolp (car m))
                             (stringp (cadr m))
                             (string-equal (cadr m) color)))
@@ -711,13 +737,13 @@ This is called whenever you use a new color."
 
 (defun facemenu-complete-face-list (&optional oldlist)
   "Return list of all faces that look different.
-Starts with given ALIST of faces, and adds elements only if they display 
+Starts with given ALIST of faces, and adds elements only if they display
 differently from any face already on the list.
-The faces on ALIST will end up at the end of the returned list, in reverse 
+The faces on ALIST will end up at the end of the returned list, in reverse
 order."
   (let ((list (nreverse (mapcar 'car oldlist))))
-    (facemenu-iterate 
-     (lambda (new-face) 
+    (facemenu-iterate
+     (lambda (new-face)
        (if (not (memq new-face list))
           (setq list (cons new-face list)))
        nil)
@@ -734,4 +760,6 @@ Returns the non-nil value it found, or nil if all were nil."
 (facemenu-update)
 
 (provide 'facemenu)
+
+;;; arch-tag: 85f6d02b-9085-420e-b651-0678f0e9c7eb
 ;;; facemenu.el ends here