Commit 3b620731 authored by Eli Zaretskii's avatar Eli Zaretskii
Browse files

(IT_set_face): Don't swap face colors when highlight or

fp->tty_reverse_p is set, unless the computed colors are identical
to frame colors.  Print both original and computed colors to
termscript file.
(IT_write_glyphs): Track the changes in handling of composite
characters.
(IT_set_frame_parameters): Don't set frame colors from
unspecified-fg and unspecified-bg pseudo-colors.
parent a9c810bf
No preview for this file type
...@@ -679,25 +679,34 @@ IT_set_face (int face) ...@@ -679,25 +679,34 @@ IT_set_face (int face)
fg = fp->foreground; fg = fp->foreground;
bg = fp->background; bg = fp->background;
/* Don't use invalid colors. In particular, a color of -1 means use /* Don't use invalid colors. In particular, FACE_TTY_DEFAULT_*
the colors of the default face, except that if highlight is on, colors mean use the colors of the default face, except that if
invert the foreground and the background. Note that we assume highlight is on, invert the foreground and the background. Note
all 16 colors to be available for the background, since Emacs that we assume all 16 colors to be available for the background,
switches on this mode (and loses the blinking attribute) at since Emacs switches on this mode (and loses the blinking
startup. */ attribute) at startup. */
if (fg == FACE_TTY_DEFAULT_COLOR || fg == FACE_TTY_DEFAULT_FG_COLOR) if (fg == FACE_TTY_DEFAULT_COLOR || fg == FACE_TTY_DEFAULT_FG_COLOR)
fg = highlight || fp->tty_reverse_p ? FRAME_BACKGROUND_PIXEL (sf) fg = FRAME_FOREGROUND_PIXEL (sf);
: FRAME_FOREGROUND_PIXEL (sf);
else if (fg == FACE_TTY_DEFAULT_BG_COLOR) else if (fg == FACE_TTY_DEFAULT_BG_COLOR)
fg = highlight ? FRAME_FOREGROUND_PIXEL (sf) : FRAME_BACKGROUND_PIXEL (sf); fg = FRAME_BACKGROUND_PIXEL (sf);
if (bg == FACE_TTY_DEFAULT_COLOR || fg == FACE_TTY_DEFAULT_BG_COLOR) if (bg == FACE_TTY_DEFAULT_COLOR || bg == FACE_TTY_DEFAULT_BG_COLOR)
bg = highlight || fp->tty_reverse_p ? FRAME_FOREGROUND_PIXEL (sf) bg = FRAME_BACKGROUND_PIXEL (sf);
: FRAME_BACKGROUND_PIXEL (sf);
else if (bg == FACE_TTY_DEFAULT_FG_COLOR) else if (bg == FACE_TTY_DEFAULT_FG_COLOR)
fg = highlight ? FRAME_BACKGROUND_PIXEL (sf) : FRAME_FOREGROUND_PIXEL (sf); bg = FRAME_FOREGROUND_PIXEL (sf);
/* Make sure highlighted lines really stand out, come what may. */
if ((highlight || fp->tty_reverse_p)
&& (fg == FRAME_FOREGROUND_PIXEL (sf)
&& bg == FRAME_BACKGROUND_PIXEL (sf)))
{
unsigned long tem = fg;
fg = bg;
bg = tem;
}
if (termscript) if (termscript)
fprintf (termscript, "<FACE %d%s: %d/%d>", fprintf (termscript, "<FACE %d%s: %d/%d[FG:%d/BG:%d]>", face,
face, highlight ? "H" : "", fp->foreground, fp->background); highlight ? "H" : "", fp->foreground, fp->background, fg, bg);
if (fg >= 0 && fg < 16) if (fg >= 0 && fg < 16)
{ {
ScreenAttrib &= 0xf0; ScreenAttrib &= 0xf0;
...@@ -734,7 +743,7 @@ IT_write_glyphs (struct glyph *str, int str_len) ...@@ -734,7 +743,7 @@ IT_write_glyphs (struct glyph *str, int str_len)
= (NILP (current_buffer->enable_multibyte_characters) = (NILP (current_buffer->enable_multibyte_characters)
&& unibyte_display_via_language_environment); && unibyte_display_via_language_environment);
if (str_len == 0) return; if (str_len <= 0) return;
screen_buf = screen_bp = alloca (str_len * 2); screen_buf = screen_bp = alloca (str_len * 2);
screen_buf_end = screen_buf + str_len * 2; screen_buf_end = screen_buf + str_len * 2;
...@@ -753,7 +762,7 @@ IT_write_glyphs (struct glyph *str, int str_len) ...@@ -753,7 +762,7 @@ IT_write_glyphs (struct glyph *str, int str_len)
while (sl) while (sl)
{ {
int cf, chlen, enclen; int cf, chlen, enclen;
unsigned char workbuf[4], *buf; unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *buf;
unsigned ch; unsigned ch;
register GLYPH g = GLYPH_FROM_CHAR_GLYPH (*str); register GLYPH g = GLYPH_FROM_CHAR_GLYPH (*str);
...@@ -790,14 +799,6 @@ IT_write_glyphs (struct glyph *str, int str_len) ...@@ -790,14 +799,6 @@ IT_write_glyphs (struct glyph *str, int str_len)
: MAKE_GLYPH (sf, '\177', GLYPH_FACE (sf, g)); : MAKE_GLYPH (sf, '\177', GLYPH_FACE (sf, g));
ch = FAST_GLYPH_CHAR (g); ch = FAST_GLYPH_CHAR (g);
} }
if (COMPOSITE_CHAR_P (ch))
{
/* If CH is a composite character, we can display
only the first component. */
g = cmpchar_table[COMPOSITE_CHAR_ID (ch)]->glyph[0],
ch = GLYPH_CHAR (sf, g);
cf = FAST_GLYPH_FACE (g);
}
/* If the face of this glyph is different from the current /* If the face of this glyph is different from the current
screen face, update the screen attribute byte. */ screen face, update the screen attribute byte. */
...@@ -806,8 +807,11 @@ IT_write_glyphs (struct glyph *str, int str_len) ...@@ -806,8 +807,11 @@ IT_write_glyphs (struct glyph *str, int str_len)
IT_set_face (cf); /* handles invalid faces gracefully */ IT_set_face (cf); /* handles invalid faces gracefully */
if (GLYPH_SIMPLE_P (tbase, tlen, g)) if (GLYPH_SIMPLE_P (tbase, tlen, g))
/* We generate the multi-byte form of CH in BUF. */ {
chlen = CHAR_STRING (ch, workbuf, buf); /* We generate the multi-byte form of CH in WORKBUF. */
chlen = CHAR_STRING (ch, workbuf);
buf = workbuf;
}
else else
{ {
/* We have a string in Vglyph_table. */ /* We have a string in Vglyph_table. */
...@@ -1444,7 +1448,9 @@ IT_set_frame_parameters (f, alist) ...@@ -1444,7 +1448,9 @@ IT_set_frame_parameters (f, alist)
unsigned long new_color = load_color (f, NULL, val, reverse unsigned long new_color = load_color (f, NULL, val, reverse
? LFACE_BACKGROUND_INDEX ? LFACE_BACKGROUND_INDEX
: LFACE_FOREGROUND_INDEX); : LFACE_FOREGROUND_INDEX);
if (new_color != ~0) if (new_color != FACE_TTY_DEFAULT_COLOR
&& new_color != FACE_TTY_DEFAULT_FG_COLOR
&& new_color != FACE_TTY_DEFAULT_BG_COLOR)
{ {
if (reverse) if (reverse)
/* FIXME: should the fore-/background of the default /* FIXME: should the fore-/background of the default
...@@ -1463,7 +1469,9 @@ IT_set_frame_parameters (f, alist) ...@@ -1463,7 +1469,9 @@ IT_set_frame_parameters (f, alist)
unsigned long new_color = load_color (f, NULL, val, reverse unsigned long new_color = load_color (f, NULL, val, reverse
? LFACE_FOREGROUND_INDEX ? LFACE_FOREGROUND_INDEX
: LFACE_BACKGROUND_INDEX); : LFACE_BACKGROUND_INDEX);
if (new_color != ~0) if (new_color != FACE_TTY_DEFAULT_COLOR
&& new_color != FACE_TTY_DEFAULT_FG_COLOR
&& new_color != FACE_TTY_DEFAULT_BG_COLOR)
{ {
if (reverse) if (reverse)
FRAME_FOREGROUND_PIXEL (f) = new_color; FRAME_FOREGROUND_PIXEL (f) = new_color;
......
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