# HG changeset patch # User Gerd Moellmann # Date 936715739 0 # Node ID c6be980d15a6704ebcdaf6594b1f4cbfad4a19e4 # Parent d58d733a75d689c068b63cfe869545c45d91cbce (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. diff -r d58d733a75d6 -r c6be980d15a6 src/xfaces.c --- a/src/xfaces.c Tue Sep 07 14:48:56 1999 +0000 +++ b/src/xfaces.c Tue Sep 07 14:48:59 1999 +0000 @@ -280,8 +280,13 @@ /* Names of basic faces. */ -Lisp_Object Qdefault, Qmodeline, Qtool_bar, Qregion, Qmargin; -Lisp_Object Qheader_line; +Lisp_Object Qdefault, Qmodeline, Qtool_bar, Qregion, Qfringe; +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 pattern is used on monochrome displays instead of shades of gray @@ -708,9 +713,10 @@ } -/* Recompute basic faces for frame F. Call this after changing frame - parameters on which those faces depend, or when realized faces have - been freed due to changing attributes of named faces. */ +/* Clear face caches, and recompute basic faces for frame F. Call + this after changing frame parameters on which those faces depend, + or when realized faces have been freed due to changing attributes + of named faces. */ void recompute_basic_faces (f) @@ -718,7 +724,9 @@ { 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); } } @@ -3421,14 +3429,61 @@ } #ifdef HAVE_X_WINDOWS - /* Changed font-related attributes of the `default' face are - reflected in changed `font' frame parameters. */ - if (EQ (face, Qdefault) - && !EQ (frame, Qt) - && font_related_attr_p - && lface_fully_specified_p (XVECTOR (lface)->contents) + + if (!EQ (frame, Qt) + && !UNSPECIFIEDP (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 */ @@ -3490,6 +3545,57 @@ } +/* 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 of frame FRAME. This is here because ordinary `x-get-resource' doesn't take a frame argument. */ @@ -5131,8 +5237,12 @@ { realize_named_face (f, Qmodeline, MODE_LINE_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, 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; } @@ -6246,10 +6356,18 @@ staticpro (&Qtool_bar); Qregion = intern ("region"); staticpro (&Qregion); - Qmargin = intern ("margin"); - staticpro (&Qmargin); + Qfringe = intern ("fringe"); + staticpro (&Qfringe); Qheader_line = intern ("header-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_lisp_face_p);