Commit 8bd201d6 authored by Gerd Moellmann's avatar Gerd Moellmann
Browse files

(recompute_basic_faces): Clear face cache.

(Finternal_set_lisp_face_attribute): Modify frame parameters
if attributes of certain faces are changed.
(update_face_from_frame_parameter): New.
(realize_basic_faces): Realize new basic faces.
(Qscroll_bar, Qcursor, Qborder, Qmouse): New.
(syms_of_xfaces): Intialize new symbols.
(Qfringe): Replaces Qmargin.
parent cfa22082
...@@ -280,8 +280,13 @@ Lisp_Object Qx_charset_registry; ...@@ -280,8 +280,13 @@ Lisp_Object Qx_charset_registry;
/* Names of basic faces. */ /* Names of basic faces. */
Lisp_Object Qdefault, Qmodeline, Qtool_bar, Qregion, Qmargin; Lisp_Object Qdefault, Qmodeline, Qtool_bar, Qregion, Qfringe;
Lisp_Object Qheader_line; Lisp_Object Qheader_line, Qscroll_bar, Qcursor, Qborder, Qmouse;;
/* Names of frame parameters related to faces. */
extern Lisp_Object Qscroll_bar_foreground, Qscroll_bar_background;
extern Lisp_Object Qborder_color, Qcursor_color, Qmouse_color;
/* Default stipple pattern used on monochrome displays. This stipple /* Default stipple pattern used on monochrome displays. This stipple
pattern is used on monochrome displays instead of shades of gray pattern is used on monochrome displays instead of shades of gray
...@@ -708,9 +713,10 @@ free_frame_faces (f) ...@@ -708,9 +713,10 @@ free_frame_faces (f)
} }
/* Recompute basic faces for frame F. Call this after changing frame /* Clear face caches, and recompute basic faces for frame F. Call
parameters on which those faces depend, or when realized faces have this after changing frame parameters on which those faces depend,
been freed due to changing attributes of named faces. */ or when realized faces have been freed due to changing attributes
of named faces. */
void void
recompute_basic_faces (f) recompute_basic_faces (f)
...@@ -718,7 +724,9 @@ recompute_basic_faces (f) ...@@ -718,7 +724,9 @@ recompute_basic_faces (f)
{ {
if (FRAME_FACE_CACHE (f)) if (FRAME_FACE_CACHE (f))
{ {
int realized_p = realize_basic_faces (f); int realized_p;
clear_face_cache (0);
realized_p = realize_basic_faces (f);
xassert (realized_p); xassert (realized_p);
} }
} }
...@@ -3421,14 +3429,61 @@ frame.") ...@@ -3421,14 +3429,61 @@ frame.")
} }
#ifdef HAVE_X_WINDOWS #ifdef HAVE_X_WINDOWS
/* Changed font-related attributes of the `default' face are
reflected in changed `font' frame parameters. */ if (!EQ (frame, Qt)
if (EQ (face, Qdefault) && !UNSPECIFIEDP (value)
&& !EQ (frame, Qt)
&& font_related_attr_p
&& lface_fully_specified_p (XVECTOR (lface)->contents)
&& NILP (Fequal (old_value, value))) && NILP (Fequal (old_value, value)))
set_font_frame_param (frame, lface); {
Lisp_Object param;
param = Qnil;
if (EQ (face, Qdefault))
{
/* Changed font-related attributes of the `default' face are
reflected in changed `font' frame parameters. */
if (font_related_attr_p
&& lface_fully_specified_p (XVECTOR (lface)->contents))
set_font_frame_param (frame, lface);
else if (EQ (attr, QCforeground))
param = Qforeground_color;
else if (EQ (attr, QCbackground))
param = Qbackground_color;
}
else if (EQ (face, Qscroll_bar))
{
/* Changing the colors of `scroll-bar' sets frame parameters
`scroll-bar-foreground' and `scroll-bar-background'. */
if (EQ (attr, QCforeground))
param = Qscroll_bar_foreground;
else if (EQ (attr, QCbackground))
param = Qscroll_bar_background;
}
else if (EQ (face, Qborder))
{
/* Changing background color of `border' sets frame parameter
`border-color'. */
if (EQ (attr, QCbackground))
param = Qborder_color;
}
else if (EQ (face, Qcursor))
{
/* Changing background color of `cursor' sets frame parameter
`cursor-color'. */
if (EQ (attr, QCbackground))
param = Qcursor_color;
}
else if (EQ (face, Qmouse))
{
/* Changing background color of `mouse' sets frame parameter
`mouse-color'. */
if (EQ (attr, QCbackground))
param = Qmouse_color;
}
if (SYMBOLP (param))
Fmodify_frame_parameters (frame, Fcons (Fcons (param, value), Qnil));
}
#endif /* HAVE_X_WINDOWS */ #endif /* HAVE_X_WINDOWS */
...@@ -3490,6 +3545,57 @@ set_font_frame_param (frame, lface) ...@@ -3490,6 +3545,57 @@ set_font_frame_param (frame, lface)
} }
/* Update the corresponding face when frame parameter PARAM on frame F
has been assigned the value NEW_VALUE. */
void
update_face_from_frame_parameter (f, param, new_value)
struct frame *f;
Lisp_Object param, new_value;
{
Lisp_Object lface;
/* If there are no faces yet, give up. This is the case when called
from Fx_create_frame, and we do the necessary things later in
face-set-after-frame-defaults. */
if (NILP (f->face_alist))
return;
if (EQ (param, Qforeground_color))
{
lface = lface_from_face_name (f, Qdefault, 1);
LFACE_FOREGROUND (lface) = (STRINGP (new_value)
? new_value : Qunspecified);
realize_basic_faces (f);
}
else if (EQ (param, Qbackground_color))
{
lface = lface_from_face_name (f, Qdefault, 1);
LFACE_BACKGROUND (lface) = (STRINGP (new_value)
? new_value : Qunspecified);
realize_basic_faces (f);
}
if (EQ (param, Qborder_color))
{
lface = lface_from_face_name (f, Qborder, 1);
LFACE_BACKGROUND (lface) = (STRINGP (new_value)
? new_value : Qunspecified);
}
else if (EQ (param, Qcursor_color))
{
lface = lface_from_face_name (f, Qcursor, 1);
LFACE_BACKGROUND (lface) = (STRINGP (new_value)
? new_value : Qunspecified);
}
else if (EQ (param, Qmouse_color))
{
lface = lface_from_face_name (f, Qmouse, 1);
LFACE_BACKGROUND (lface) = (STRINGP (new_value)
? new_value : Qunspecified);
}
}
/* Get the value of X resource RESOURCE, class CLASS for the display /* Get the value of X resource RESOURCE, class CLASS for the display
of frame FRAME. This is here because ordinary `x-get-resource' of frame FRAME. This is here because ordinary `x-get-resource'
doesn't take a frame argument. */ doesn't take a frame argument. */
...@@ -5131,8 +5237,12 @@ realize_basic_faces (f) ...@@ -5131,8 +5237,12 @@ realize_basic_faces (f)
{ {
realize_named_face (f, Qmodeline, MODE_LINE_FACE_ID); realize_named_face (f, Qmodeline, MODE_LINE_FACE_ID);
realize_named_face (f, Qtool_bar, TOOL_BAR_FACE_ID); realize_named_face (f, Qtool_bar, TOOL_BAR_FACE_ID);
realize_named_face (f, Qmargin, BITMAP_AREA_FACE_ID); realize_named_face (f, Qfringe, BITMAP_AREA_FACE_ID);
realize_named_face (f, Qheader_line, HEADER_LINE_FACE_ID); realize_named_face (f, Qheader_line, HEADER_LINE_FACE_ID);
realize_named_face (f, Qscroll_bar, SCROLL_BAR_FACE_ID);
realize_named_face (f, Qborder, BORDER_FACE_ID);
realize_named_face (f, Qcursor, CURSOR_FACE_ID);
realize_named_face (f, Qmouse, MOUSE_FACE_ID);
success_p = 1; success_p = 1;
} }
...@@ -6246,10 +6356,18 @@ syms_of_xfaces () ...@@ -6246,10 +6356,18 @@ syms_of_xfaces ()
staticpro (&Qtool_bar); staticpro (&Qtool_bar);
Qregion = intern ("region"); Qregion = intern ("region");
staticpro (&Qregion); staticpro (&Qregion);
Qmargin = intern ("margin"); Qfringe = intern ("fringe");
staticpro (&Qmargin); staticpro (&Qfringe);
Qheader_line = intern ("header-line"); Qheader_line = intern ("header-line");
staticpro (&Qheader_line); staticpro (&Qheader_line);
Qscroll_bar = intern ("scroll-bar");
staticpro (&Qscroll_bar);
Qcursor = intern ("cursor");
staticpro (&Qcursor);
Qborder = intern ("border");
staticpro (&Qborder);
Qmouse = intern ("mouse");
staticpro (&Qmouse);
defsubr (&Sinternal_make_lisp_face); defsubr (&Sinternal_make_lisp_face);
defsubr (&Sinternal_lisp_face_p); defsubr (&Sinternal_lisp_face_p);
......
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