Commit f9d2fdc4 authored by Eli Zaretskii's avatar Eli Zaretskii

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.
parent e19539f1
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
......
......@@ -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)
......
No preview for this file type
......@@ -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)
......
......@@ -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"));
}
}
......
......@@ -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]);
}
......
......@@ -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);
......
......@@ -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);
}
......
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment