bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#33799: 27.0.50; set-foreground-color completion shows background col


From: Glenn Morris
Subject: bug#33799: 27.0.50; set-foreground-color completion shows background colors
Date: Wed, 19 Dec 2018 13:51:59 -0500
User-agent: Gnus (www.gnus.org), GNU Emacs (www.gnu.org/software/emacs/)

Juri Linkov wrote:

> 0. emacs -Q
>
> 1. M-x set-foreground-color RET TAB
>
> shows a completion list of colors with different backgrounds, not
> foregrounds as it would be natural to expect

Very lightly tested:


--- i/lisp/faces.el
+++ w/lisp/faces.el
@@ -1838,18 +1838,21 @@ defined-colors
     (mapcar 'car (tty-color-alist frame))))
 (defalias 'x-defined-colors 'defined-colors)
 
-(defun defined-colors-with-face-attributes (&optional frame)
+(defun defined-colors-with-face-attributes (&optional frame foreground)
   "Return a list of colors supported for a particular frame.
 See `defined-colors' for arguments and return value. In contrast
 to `define-colors' the elements of the returned list are color
 strings with text properties, that make the color names render
-with the color they represent as background color."
+with the color they represent as background (or foreground if
+optional argument FOREGROUND is no-nil) color. "
   (mapcar
    (lambda (color-name)
-     (let ((foreground (readable-foreground-color color-name))
-          (color      (copy-sequence color-name)))
-       (propertize color 'face (list :foreground foreground
-                                    :background color))))
+     (let ((readable (readable-foreground-color color-name))
+          (color (copy-sequence color-name)))
+       (propertize color 'face
+                  (if foreground
+                      (list :foreground color)
+                    (list :foreground readable :background color)))))
    (defined-colors frame)))
 
 (defun readable-foreground-color (color)
@@ -1935,7 +1938,8 @@ display-grayscale-p
      (t
       (> (tty-color-gray-shades display) 2)))))
 
-(defun read-color (&optional prompt convert-to-RGB allow-empty-name msg)
+(defun read-color (&optional prompt convert-to-RGB allow-empty-name msg
+                            foreground)
   "Read a color name or RGB triplet.
 Completion is available for color names, but not for RGB triplets.
 
@@ -1962,14 +1966,19 @@ read-color
 to enter an empty color name (the empty string).
 
 Interactively, or with optional arg MSG non-nil, print the
-resulting color name in the echo area."
+resulting color name in the echo area.
+
+Interactively, displays a list of colored completions.  If optional
+argument FOREGROUND is non-nil, shows them as foregrounds, otherwise
+as backgrounds."
   (interactive "i\np\ni\np")    ; Always convert to RGB interactively.
   (let* ((completion-ignore-case t)
         (colors (or facemenu-color-alist
                     (append '("foreground at point" "background at point")
                             (if allow-empty-name '(""))
                              (if (display-color-p)
-                                 (defined-colors-with-face-attributes)
+                                 (defined-colors-with-face-attributes
+                                  nil foreground)
                                (defined-colors)))))
         (color (completing-read
                 (or prompt "Color (name or #RGB triplet): ")
diff --git i/lisp/frame.el w/lisp/frame.el
index 56b8c54..f056b6d 100644
--- i/lisp/frame.el
+++ w/lisp/frame.el
@@ -1335,7 +1335,7 @@ set-foreground-color
   "Set the foreground color of the selected frame to COLOR-NAME.
 When called interactively, prompt for the name of the color to use.
 To get the frame's current foreground color, use `frame-parameters'."
-  (interactive (list (read-color "Foreground color: ")))
+  (interactive (list (read-color "Foreground color: " nil nil nil t)))
   (modify-frame-parameters (selected-frame)
                           (list (cons 'foreground-color color-name)))
   (or window-system





reply via email to

[Prev in Thread] Current Thread [Next in Thread]