Subject: Re: bug#4381: 23.1.50; Cocoa Emacs: face background for 'region set in ns-win.el after .emacs

From: Erik Charlebois <[email-masked]>
Date: Sun, 13 Sep 2009 23:07:19 -0700

I did a deep dive and figured out exactly what is going on.

The (set-face-background 'region "ns_selection_color") that gets run  
in ns-win.el adds an entry to face-new-frame-defaults for 'region with  
"ns_selection_color" in the background slot. This gets persisted to  
the temacs-generated image.

In startup.el after (command-line) (and therefore, after .emacs runs),  
there's a call to frame-notice-user-settings. Because the background- 
color has been changed, a call to face-set-after-frame-default is  
made. This is turn calls internal-merge-in-global-face. This function  
overrides local settings with the global ones in face-new-frame- 
defaults, which clobbers the face setting.

The reason using set-face-attribute in .emacs works and custom-set- 
faces doesn't is because set-face-attribute (with nil frame) sets the  
value in face-new-frame-defaults.

Those are the gory details. I'm not sure what the right fix is.

Erik Charlebois
[email-masked]

On 2009-09-13, at 6:09 PM, Glenn Morris wrote:

> Erik Charlebois wrote:
>
>> The minimal .emacs that shows the problem (extracted by digging into
>> the color-themes package):
>>
>> (setq default-frame-alist '((background-color . "white")))
>> (custom-set-faces '(region ((t (:background "red")))))
>>
>> The face setting is not honoured (reverts to ns_selection_color).
>>
>> If I do...
>> (set-face-attribute 'region nil :background "red")
>> instead of custom-set-faces, it works fine (but color-theme uses
>> custom-set-faces).
>
> Your problem sounds like this one:
>
> http://debbugs.gnu.org/cgi/bugreport.cgi?bug=2868
>
> (which unfortunately split into many different bugs rather than being
> all in the same one)
>
> I think the underlying problem is that ns-win is doing a slightly odd
> thing by calling set-face-background, and it does not play well with
> customize. See also bug #3408.
>
> The solution may be to change ns-win to use a more customize-friendly
> method of changing the face, if it really needs to do that.