emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Faces applies to new frames


From: Stefan Monnier
Subject: Re: Faces applies to new frames
Date: Fri, 27 Jun 2008 13:52:50 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (gnu/linux)

That's helpful, thanks.  We need to put this info somewhere in the the
CVS, as near the source as possible, but since the corresponding source
code is scattered, we may as well put it elsewhere (and refer to it from
the various relevant code sections).

> 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.

Hopefully Custom never calls it with an integer frame argument.

> 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.

Why doesn't change face-new-frame-defaults?  Who does?

>  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.)

Yes, my recent change to fix the inf-recursion should make this
variable useless.

>  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).

But this #4 seems wrong: if set-face-attribute stores global settings in
those variables, then it means that step #4 will apply those global
settings over the defface settings, which are per-terminal.

> 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.

Sounds like you're right ;-)

> 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.

Given that those settings are used/applied by Elisp code (in
face-set-after-frame-default), I guess it makes sense to move that
C code to Elisp code as you suggest: this will bring the producer and
consumer into the same file, which can only be beneficial).

> Maybe it should do this by
> modifying face-new-frame-defaults and/or the defface spec.

Updating the defface specs directly sounds attractive, but it might turn
out to be difficult to do it right.


        Stefan




reply via email to

[Prev in Thread] Current Thread [Next in Thread]