Changes for separate unspecified foreground and background colors

on character terminals:

* dispextern.h (FACE_TTY_DEFAULT_FG_COLOR)
(FACE_TTY_DEFAULT_BG_COLOR):  New macros.

* xfaces.c (Qunspecified_fg, Qunspecified_bg): New variables.
(syms_of_xfaces): Initialize and staticpro them.
(tty_defined_color): If the color name is unspecified-fg or
unspecified-bg, return FACE_TTY_DEFAULT_FG_COLOR and
FACE_TTY_DEFAULT_BG_COLOR, respectively, as the pixel value.
(tty_color_name): If the color pixel value is either
FACE_TTY_DEFAULT_FG_COLOR or FACE_TTY_DEFAULT_BG_COLOR, return
Qunspecified_fg or Qunspecified_bg, respectively.
(Finternal_set_lisp_face_attribute): Allow values Qunspecified_fg
and Qunspecified_bg for foreground and background colors.
(realize_default_face): If the foreground and background colors
are not specified, default to Qunspecified_fg and Qunspecified_bg.
(realize_tty_face): By default, set the face colors to
FACE_TTY_DEFAULT_FG_COLOR and FACE_TTY_DEFAULT_BG_COLOR.
[MSDOS]: Handle FACE_TTY_DEFAULT_FG_COLOR and
FACE_TTY_DEFAULT_BG_COLOR when face colors are not defined.
Reverse the colors if the default colors were reversed.

* dispnew.c (init_display): Initialize the frame pixels of the
initial frame to FACE_TTY_DEFAULT_FG_COLOR and
FACE_TTY_DEFAULT_BG_COLOR.

* term.c (turn_on_face): If the default fore- and background
colors are reversed, enter inverse video mode.  Don't send color
escape sequences for unspecified foreground and background colors.
(turn_off_face): Handle unspecified-fg and unspecified-bg colors.

* dosfns.c (unspecified_colors): New variable.
(msdos_stdcolor_idx): Handle unspecified-fg and unspecified-bg
color names, return FACE_TTY_DEFAULT_FG_COLOR and
FACE_TTY_DEFAULT_BG_COLOR, respectively.
(msdos_stdcolor_name): Handle FACE_TTY_DEFAULT_FG_COLOR and
FACE_TTY_DEFAULT_BG_COLOR, return Qunspecified_fg and
Qunspecified_bg, respectively.

* msdos.c (IT_set_face): Support FACE_TTY_DEFAULT_FG_COLOR and
FACE_TTY_DEFAULT_BG_COLOR as pixel values.

* faces.el (face-read-integer, read-face-attribute)
(color-defined-p, color-values): Allow color values unspecified-fg
and unspecified-bg, handle them as unspecified.
This commit is contained in:
Eli Zaretskii 1999-12-15 13:14:38 +00:00
parent e19539f184
commit f9d2fdc464
9 changed files with 167 additions and 37 deletions

View file

@ -1,3 +1,9 @@
1999-12-15 Eli Zaretskii <eliz@is.elta.co.il>
* faces.el (face-read-integer, read-face-attribute)
(color-defined-p, color-values): Allow color values unspecified-fg
and unspecified-bg, handle them as unspecified.
1999-12-15 Kenichi Handa <handa@etl.go.jp>
The following changes are for the new composition mechanism. We

View file

@ -827,12 +827,14 @@ value to return if no new value is entered. NAME is a descriptive
name of the attribute for prompting. Value is the new attribute value."
(let ((new-value
(face-read-string face
(if (eq default 'unspecified)
'unspecified
(if (memq
default
'(unspecified unspecified-fg unspecified-bg))
default
(int-to-string default))
name
(list (cons "unspecified" 'unspecified)))))
(if (eq new-value 'unspecified)
(if (memq new-value '(unspecified unspecified-fg unspecified-bg))
new-value
(string-to-int new-value))))
@ -862,7 +864,8 @@ of a global face. Value is the new attribute value."
;; in tty-colors.el.
(if (and (memq attribute '(:foreground :background))
(not (memq window-system '(x w32 mac)))
(not (eq new-value 'unspecified)))
(not (memq new-value
'(unspecified unspecified-fg unspecified-bg))))
(setq new-value (car (tty-color-desc new-value))))
(unless (eq new-value 'unspecified)
(setq new-value (cdr (assoc new-value valid)))))
@ -1164,8 +1167,9 @@ If FRAME doesn't support colors, the value is nil."
(defun color-defined-p (color &optional frame)
"Return non-nil if color COLOR is supported on frame FRAME.
If FRAME is omitted or nil, use the selected frame.
If COLOR is the symbol `unspecified', the value is nil."
(if (eq color 'unspecified)
If COLOR is one of the symbols `unspecified', `unspecified-fg', or
`unspecified-bg', the value is nil."
(if (memq color '(unspecified unspecified-bg unspecified-fg))
nil
(if (memq (framep (or frame (selected-frame))) '(x w32))
(xw-color-defined-p color frame)
@ -1179,8 +1183,9 @@ These values appear to range from 0 to 65280 or 65535, depending
on the system; white is \(65280 65280 65280\) or \(65535 65535 65535\).
If FRAME is omitted or nil, use the selected frame.
If FRAME cannot display COLOR, the value is nil.
If COLOR is the symbol `unspecified', the value is nil."
(if (eq color 'unspecified)
If COLOR is one of the symbols `unspecified', `unspecified-fg', or
`unspecified-bg', the value is nil."
(if (memq color '(unspecified unspecified-fg unspecified-bg))
nil
(if (memq (framep (or frame (selected-frame))) '(x w32))
(xw-color-values color frame)

View file

@ -1,3 +1,46 @@
1999-12-15 Eli Zaretskii <eliz@is.elta.co.il>
* dispextern.h (FACE_TTY_DEFAULT_FG_COLOR)
(FACE_TTY_DEFAULT_BG_COLOR): New macros.
* xfaces.c (Qunspecified_fg, Qunspecified_bg): New variables.
(syms_of_xfaces): Initialize and staticpro them.
(tty_defined_color): If the color name is unspecified-fg or
unspecified-bg, return FACE_TTY_DEFAULT_FG_COLOR and
FACE_TTY_DEFAULT_BG_COLOR, respectively, as the pixel value.
(tty_color_name): If the color pixel value is either
FACE_TTY_DEFAULT_FG_COLOR or FACE_TTY_DEFAULT_BG_COLOR, return
Qunspecified_fg or Qunspecified_bg, respectively.
(Finternal_set_lisp_face_attribute): Allow values Qunspecified_fg
and Qunspecified_bg for foreground and background colors.
(realize_default_face): If the foreground and background colors
are not specified, default to Qunspecified_fg and Qunspecified_bg.
(realize_tty_face): By default, set the face colors to
FACE_TTY_DEFAULT_FG_COLOR and FACE_TTY_DEFAULT_BG_COLOR.
[MSDOS]: Handle FACE_TTY_DEFAULT_FG_COLOR and
FACE_TTY_DEFAULT_BG_COLOR when face colors are not defined.
Reverse the colors if the default colors were reversed.
* dispnew.c (init_display): Initialize the frame pixels of the
initial frame to FACE_TTY_DEFAULT_FG_COLOR and
FACE_TTY_DEFAULT_BG_COLOR.
* term.c (turn_on_face): If the default fore- and background
colors are reversed, enter inverse video mode. Don't send color
escape sequences for unspecified foreground and background colors.
(turn_off_face): Handle unspecified-fg and unspecified-bg colors.
* dosfns.c (unspecified_colors): New variable.
(msdos_stdcolor_idx): Handle unspecified-fg and unspecified-bg
color names, return FACE_TTY_DEFAULT_FG_COLOR and
FACE_TTY_DEFAULT_BG_COLOR, respectively.
(msdos_stdcolor_name): Handle FACE_TTY_DEFAULT_FG_COLOR and
FACE_TTY_DEFAULT_BG_COLOR, return Qunspecified_fg and
Qunspecified_bg, respectively.
* msdos.c (IT_set_face): Support FACE_TTY_DEFAULT_FG_COLOR and
FACE_TTY_DEFAULT_BG_COLOR as pixel values.
1999-12-15 Kenichi Handa <handa@etl.go.jp>
* coding.c (code_convert_region): Fix the secoding arg to

View file

@ -1268,6 +1268,14 @@ struct face
#define FACE_TTY_DEFAULT_COLOR ((unsigned long) -1)
/* Color index indicating that face uses an unknown foreground color. */
#define FACE_TTY_DEFAULT_FG_COLOR ((unsigned long) -2)
/* Color index indicating that face uses an unsigned background color. */
#define FACE_TTY_DEFAULT_BG_COLOR ((unsigned long) -3)
/* Non-zero if FACE was realized for unibyte use. */
#define FACE_UNIBYTE_P(FACE) ((FACE)->charset < 0)

View file

@ -5925,8 +5925,8 @@ For types not defined in VMS, use define emacs_term \"TYPE\".\n\
are the foreground and background colors of the terminal. */
struct frame *sf = SELECTED_FRAME();
FRAME_FOREGROUND_PIXEL (sf) = -1;
FRAME_BACKGROUND_PIXEL (sf) = -1;
FRAME_FOREGROUND_PIXEL (sf) = FACE_TTY_DEFAULT_FG_COLOR;
FRAME_BACKGROUND_PIXEL (sf) = FACE_TTY_DEFAULT_BG_COLOR;
call0 (intern ("tty-set-up-initial-frame-faces"));
}
}

View file

@ -409,6 +409,10 @@ static char *vga_colors[16] = {
"lightred", "lightmagenta", "yellow", "white"
};
static char *unspecified_colors[] = {
"unspecified-fg", "unspecified-bg", "unspecified"
};
/* Given a color name, return its index, or -1 if not found. Note
that this only performs case-insensitive comparison against the
standard names. For anything more sophisticated, like matching
@ -424,17 +428,25 @@ msdos_stdcolor_idx (const char *name)
if (strcasecmp (name, vga_colors[i]) == 0)
return i;
return FACE_TTY_DEFAULT_COLOR;
return
strcmp (name, unspecified_colors[0]) == 0 ? FACE_TTY_DEFAULT_FG_COLOR
: strcmp (name, unspecified_colors[1]) == 0 ? FACE_TTY_DEFAULT_BG_COLOR
: FACE_TTY_DEFAULT_COLOR;
}
/* Given a color index, return its standard name. */
Lisp_Object
msdos_stdcolor_name (int idx)
{
extern Lisp_Object Qunspecified;
extern Lisp_Object Qunspecified, Qunspecified_fg, Qunspecified_bg;
if (idx < 0 || idx >= sizeof (vga_colors) / sizeof (vga_colors[0]))
return Qunspecified; /* meaning the default */
{
return
idx == FACE_TTY_DEFAULT_FG_COLOR ? Qunspecified_fg
: idx == FACE_TTY_DEFAULT_BG_COLOR ? Qunspecified_bg
: Qunspecified; /* meaning the default */
}
return build_string (vga_colors[idx]);
}

View file

@ -685,12 +685,16 @@ IT_set_face (int face)
all 16 colors to be available for the background, since Emacs
switches on this mode (and loses the blinking attribute) at
startup. */
if (fg == (unsigned long)-1)
if (fg == FACE_TTY_DEFAULT_COLOR || fg == FACE_TTY_DEFAULT_FG_COLOR)
fg = highlight || fp->tty_reverse_p ? FRAME_BACKGROUND_PIXEL (sf)
: FRAME_FOREGROUND_PIXEL (sf);
if (bg == (unsigned long)-1)
else if (fg == FACE_TTY_DEFAULT_BG_COLOR)
fg = highlight ? FRAME_FOREGROUND_PIXEL (sf) : FRAME_BACKGROUND_PIXEL (sf);
if (bg == FACE_TTY_DEFAULT_COLOR || fg == FACE_TTY_DEFAULT_BG_COLOR)
bg = highlight || fp->tty_reverse_p ? FRAME_FOREGROUND_PIXEL (sf)
: FRAME_BACKGROUND_PIXEL (sf);
else if (bg == FACE_TTY_DEFAULT_FG_COLOR)
fg = highlight ? FRAME_BACKGROUND_PIXEL (sf) : FRAME_FOREGROUND_PIXEL (sf);
if (termscript)
fprintf (termscript, "<FACE %d%s: %d/%d>",
face, highlight ? "H" : "", fp->foreground, fp->background);

View file

@ -1959,7 +1959,9 @@ turn_on_face (f, face_id)
&& TN_magic_cookie_glitch_ul <= 0)
OUTPUT1_IF (TS_enter_underline_mode);
if (face->tty_reverse_p)
if (face->tty_reverse_p
|| face->foreground == FACE_TTY_DEFAULT_BG_COLOR
|| face->background == FACE_TTY_DEFAULT_FG_COLOR)
OUTPUT1_IF (TS_enter_reverse_mode);
if (TN_max_colors > 0)
@ -1967,6 +1969,8 @@ turn_on_face (f, face_id)
char *p;
if (face->foreground != FACE_TTY_DEFAULT_COLOR
&& face->foreground != FACE_TTY_DEFAULT_FG_COLOR
&& face->foreground != FACE_TTY_DEFAULT_BG_COLOR
&& TS_set_foreground)
{
p = tparam (TS_set_foreground, NULL, 0, (int) face->foreground);
@ -1975,6 +1979,8 @@ turn_on_face (f, face_id)
}
if (face->background != FACE_TTY_DEFAULT_COLOR
&& face->background != FACE_TTY_DEFAULT_BG_COLOR
&& face->background != FACE_TTY_DEFAULT_FG_COLOR
&& TS_set_background)
{
p = tparam (TS_set_background, NULL, 0, (int) face->background);
@ -2027,8 +2033,10 @@ turn_off_face (f, face_id)
/* Switch back to default colors. */
if (TN_max_colors > 0
&& (face->foreground != FACE_TTY_DEFAULT_COLOR
|| face->background != FACE_TTY_DEFAULT_COLOR))
&& ((face->foreground != FACE_TTY_DEFAULT_COLOR
&& face->foreground != FACE_TTY_DEFAULT_FG_COLOR)
|| (face->background != FACE_TTY_DEFAULT_COLOR
&& face->background != FACE_TTY_DEFAULT_BG_COLOR)))
OUTPUT1_IF (TS_orig_pair);
}

View file

@ -282,7 +282,7 @@ Lisp_Object Qsemi_condensed, Qsemi_expanded, Qexpanded, Qextra_expanded;
Lisp_Object Qultra_expanded;
Lisp_Object Qreleased_button, Qpressed_button;
Lisp_Object QCstyle, QCcolor, QCline_width;
Lisp_Object Qunspecified;
Lisp_Object Qunspecified, Qunspecified_fg, Qunspecified_bg;
/* The symbol `x-charset-registry'. This property of charsets defines
the X registry and encoding that fonts should have that are used to
@ -1108,6 +1108,14 @@ tty_defined_color (f, color_name, color_def, alloc)
load color" messages in the *Messages* buffer. */
status = 1;
}
if (color_idx == FACE_TTY_DEFAULT_COLOR && *color_name)
{
if (strcmp (color_name, "unspecified-fg") == 0)
color_idx = FACE_TTY_DEFAULT_FG_COLOR;
else if (strcmp (color_name, "unspecified-bg") == 0)
color_idx = FACE_TTY_DEFAULT_BG_COLOR;
}
color_def->pixel = (unsigned long) color_idx;
color_def->red = red;
color_def->green = green;
@ -1179,7 +1187,10 @@ tty_color_name (f, idx)
by index using the default color mapping on a Windows console. */
#endif
return Qunspecified;
return
idx == FACE_TTY_DEFAULT_FG_COLOR ? Qunspecified_fg
: idx == FACE_TTY_DEFAULT_BG_COLOR ? Qunspecified_bg
: Qunspecified;
}
/* Return non-zero if COLOR_NAME is a shade of gray (or white or
@ -3427,7 +3438,8 @@ frame.")
}
else if (EQ (attr, QCforeground))
{
if (!UNSPECIFIEDP (value))
if (!UNSPECIFIEDP (value)
&& !EQ (value, Qunspecified_fg) && !EQ (value, Qunspecified_bg))
{
/* Don't check for valid color names here because it depends
on the frame (display) whether the color will be valid
@ -3441,7 +3453,8 @@ frame.")
}
else if (EQ (attr, QCbackground))
{
if (!UNSPECIFIEDP (value))
if (!UNSPECIFIEDP (value)
&& !EQ (value, Qunspecified_bg) && !EQ (value, Qunspecified_fg))
{
/* Don't check for valid color names here because it depends
on the frame (display) whether the color will be valid
@ -5686,7 +5699,9 @@ realize_default_face (f)
LFACE_FOREGROUND (lface) = XCDR (color);
else if (FRAME_X_P (f))
return 0;
else if (!FRAME_TERMCAP_P (f) && !FRAME_MSDOS_P (f))
else if (FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f))
LFACE_FOREGROUND (lface) = Qunspecified_fg;
else
abort ();
}
@ -5699,7 +5714,9 @@ realize_default_face (f)
LFACE_BACKGROUND (lface) = XCDR (color);
else if (FRAME_X_P (f))
return 0;
else if (!FRAME_TERMCAP_P (f) && !FRAME_MSDOS_P (f))
else if (FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f))
LFACE_BACKGROUND (lface) = Qunspecified_bg;
else
abort ();
}
@ -6072,7 +6089,8 @@ realize_tty_face (c, attrs, charset)
face->tty_reverse_p = 1;
/* Map color names to color indices. */
face->foreground = face->background = FACE_TTY_DEFAULT_COLOR;
face->foreground = FACE_TTY_DEFAULT_FG_COLOR;
face->background = FACE_TTY_DEFAULT_BG_COLOR;
color = attrs[LFACE_FOREGROUND_INDEX];
if (STRINGP (color)
@ -6084,7 +6102,7 @@ realize_tty_face (c, attrs, charset)
(NAME INDEX R G B). We need the INDEX part. */
face->foreground = XINT (XCAR (XCDR (color)));
if (face->foreground == FACE_TTY_DEFAULT_COLOR
if (face->foreground == FACE_TTY_DEFAULT_FG_COLOR
&& STRINGP (attrs[LFACE_FOREGROUND_INDEX]))
{
face->foreground = load_color (c->f, face,
@ -6093,12 +6111,23 @@ realize_tty_face (c, attrs, charset)
#ifdef MSDOS
/* If the foreground of the default face is the default color,
use the foreground color defined by the frame. */
if (FRAME_MSDOS_P (c->f) && face->foreground == FACE_TTY_DEFAULT_COLOR)
if (FRAME_MSDOS_P (c->f))
{
face->foreground = FRAME_FOREGROUND_PIXEL (f);
attrs[LFACE_FOREGROUND_INDEX] =
msdos_stdcolor_name (face->foreground);
face_colors_defaulted = 1;
if (face->foreground == FACE_TTY_DEFAULT_FG_COLOR
|| face->foreground == FACE_TTY_DEFAULT_COLOR)
{
face->foreground = FRAME_FOREGROUND_PIXEL (f);
attrs[LFACE_FOREGROUND_INDEX] =
msdos_stdcolor_name (face->foreground);
face_colors_defaulted = 1;
}
else if (face->foreground == FACE_TTY_DEFAULT_BG_COLOR)
{
face->foreground = FRAME_BACKGROUND_PIXEL (f);
attrs[LFACE_FOREGROUND_INDEX] =
msdos_stdcolor_name (face->foreground);
face_colors_defaulted = 1;
}
}
#endif
}
@ -6113,7 +6142,7 @@ realize_tty_face (c, attrs, charset)
(NAME INDEX R G B). We need the INDEX part. */
face->background = XINT (XCAR (XCDR (color)));
if (face->background == FACE_TTY_DEFAULT_COLOR
if (face->background == FACE_TTY_DEFAULT_BG_COLOR
&& STRINGP (attrs[LFACE_BACKGROUND_INDEX]))
{
face->background = load_color (c->f, face,
@ -6122,12 +6151,23 @@ realize_tty_face (c, attrs, charset)
#ifdef MSDOS
/* If the background of the default face is the default color,
use the background color defined by the frame. */
if (FRAME_MSDOS_P (c->f) && face->background == FACE_TTY_DEFAULT_COLOR)
if (FRAME_MSDOS_P (c->f))
{
face->background = FRAME_BACKGROUND_PIXEL (f);
attrs[LFACE_BACKGROUND_INDEX] =
msdos_stdcolor_name (face->background);
face_colors_defaulted = 1;
if (face->background == FACE_TTY_DEFAULT_BG_COLOR
|| face->background == FACE_TTY_DEFAULT_COLOR)
{
face->background = FRAME_BACKGROUND_PIXEL (f);
attrs[LFACE_BACKGROUND_INDEX] =
msdos_stdcolor_name (face->background);
face_colors_defaulted = 1;
}
else if (face->background == FACE_TTY_DEFAULT_FG_COLOR)
{
face->background = FRAME_FOREGROUND_PIXEL (f);
attrs[LFACE_BACKGROUND_INDEX] =
msdos_stdcolor_name (face->background);
face_colors_defaulted = 1;
}
}
#endif
}
@ -6611,6 +6651,10 @@ syms_of_xfaces ()
staticpro (&Qforeground_color);
Qunspecified = intern ("unspecified");
staticpro (&Qunspecified);
Qunspecified_fg = intern ("unspecified-fg");
staticpro (&Qunspecified_fg);
Qunspecified_bg = intern ("unspecified-bg");
staticpro (&Qunspecified_bg);
Qx_charset_registry = intern ("x-charset-registry");
staticpro (&Qx_charset_registry);