[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Faces applies to new frames
From: |
Chong Yidong |
Subject: |
Re: Faces applies to new frames |
Date: |
Fri, 27 Jun 2008 13:32:39 -0400 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (gnu/linux) |
Stefan Monnier <address@hidden> writes:
>> Maybe there's more than one bug here. When set-face-attribute is called
>> with a nil FRAME argument, that changes the face for all frames, and
>> this is done via frame parameters and not by changing the defface spec.
>> I don't think face-set-after-frame-default is even relevant to this
>> case.
>
> Indeed, there's also the distinction between face changes made via
> customize and those made by direct calls to set-face-attribute.
>
> The more I look at it, the mor it seems obvious that we cannot fix it
> by looking at individual events, but we need to first figure out it
> currently (fails to) work overall, and then design a way to make it
> work in an overall consistent way.
This is how information is currently saved for future frames. In
addition to the defface spec, which stores information in the Lisp
symbol of the face name, there are two relevant variables:
default-frame-alist, which stores frame parameters for future frames,
and face-new-frame-defaults, which stores the default face definitions.
Finternal_set_lisp_face_attribute (called by set-face-attribute) is
supposed to do two things: changes the face on existing frames, and (if
passed an integer FRAME argument) change the defaults for future frames.
Currently, the latter is accomplished for only certain attributes: the
(default) foreground and background color, the default font, and the
colors for the border, cursor, scroll-bar, and mouse. These are saved
by modifying default-frame-alist. It does NOT modify
face-new-frame-defaults.
When a new frame is created, the faces are initialized using
face-set-after-frame-default. This does a few things:
1. Set the default face based on face-new-frame-defaults, via
face-attribute with a t FRAME argument. (It only does this if
inhibit-face-set-after-frame-default is nil, which may be bogus,
since that variable is only bound when doing set-face-attribute,
which does not create frames.)
2. Walk through (face-list), applying defface specs to the rest of the
faces for this frame.
3. Walk through (face-list), applying X resource settings to the rest
of the faces for this frame.
4. Apply the frame parameter based face attributes describe above
(foreground and background color, the default font, and the colors
for the border, cursor, scroll-bar, and mouse).
As a result, set-face-attribute does not seem to change attributes on
future frames, other than the foreground and background color, contrary
to the description of internal-set-lisp-face-attribute.
How about this: change internal-set-lisp-face-attribute so that its only
role is to change the faces on existing frames, leaving the frame
parameters alone. Then, handle the "saving for future frames" part in
the Lisp function set-face-attribute. Maybe it should do this by
modifying face-new-frame-defaults and/or the defface spec.
Re: Faces applies to new frames, Robert J. Chassell, 2008/06/27
Re: Faces applies to new frames, Robert J. Chassell, 2008/06/27
Re: Faces applies to new frames, Chong Yidong, 2008/06/28
- Re: Faces applies to new frames, Stefan Monnier, 2008/06/28
- Re: Faces applies to new frames, Chong Yidong, 2008/06/28
- Re: Faces applies to new frames, Stefan Monnier, 2008/06/28
- Re: Faces applies to new frames, Miles Bader, 2008/06/28
- Re: Faces applies to new frames, Stefan Monnier, 2008/06/29