emacs-devel
[Top][All Lists]
Advanced

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

Re: address@hidden: Re: scroll-bar face gets changed in a new frame]


From: Chong Yidong
Subject: Re: address@hidden: Re: scroll-bar face gets changed in a new frame]
Date: Sat, 03 Feb 2007 19:35:15 -0500
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.93 (gnu/linux)

Richard Stallman <address@hidden> writes:

> Would someone please investigate this and DTRT?

The problem is in face-set-after-frame-default.  The function merges
in the X resources, then initializes attributes from frame parameters.
However, if there is a scroll-bar X resource present, the call to
make-face-x-resource-internal will chang the scroll-bar-* frame
parameters in the process of changing the scroll-bar face.  Therefore,
any previously-applied frame parameters are lost.

I think one fix is for face-set-after-frame-default to first construct
a list of frame parameters to be applied (based on the new frame's
frame-parameters and/or the face's value for new frames), then wait
until after the call to make-face-x-resource-internal before applying
these changes.  See the attached patch.

By the way, the symbol inhibit-default-face-x-resources seems to be a
no-op; it is called as

 (when (not (equal face 'default))
   ...
   (when (and (memq window-system '(x w32 mac))
     (or (not (boundp 'inhibit-default-face-x-resources))
         (not (eq face 'default))))
     (make-face-x-resource-internal face frame)))

However, since face is never `default' inside the `when' form, the
enclosing `or' statement is always t, regardless of whether or not
inhibit-default-face-x-resources is bound.  I think this symbol was
introduced to solve a similar problem, and it can be removed if the
proposed fix is applied.

*** emacs/lisp/faces.el.~1.362.~        2007-02-02 11:55:30.000000000 -0500
--- emacs/lisp/faces.el 2007-02-03 19:28:18.000000000 -0500
***************
*** 1754,1788 ****
                          (face-attribute 'default :weight t))
        (set-face-attribute 'default frame :width
                          (face-attribute 'default :width t))))
!   (dolist (face (face-list))
!     ;; Don't let frame creation fail because of an invalid face spec.
!     (condition-case ()
!       (when (not (equal face 'default))
!         (face-spec-set face (face-user-default-spec face) frame)
!         (internal-merge-in-global-face face frame)
!         (when (and (memq window-system '(x w32 mac))
!                    (or (not (boundp 'inhibit-default-face-x-resources))
!                        (not (eq face 'default))))
!           (make-face-x-resource-internal face frame)))
!       (error nil)))
!   ;; Initialize attributes from frame parameters.
    (let ((params '((foreground-color default :foreground)
                  (background-color default :background)
                  (border-color border :background)
                  (cursor-color cursor :background)
                  (scroll-bar-foreground scroll-bar :foreground)
                  (scroll-bar-background scroll-bar :background)
!                 (mouse-color mouse :background))))
      (dolist (param params)
!       (let ((frame-param (frame-parameter frame (nth 0 param)))
!           (face (nth 1 param))
!           (attr (nth 2 param)))
!       (when (and frame-param
!                  ;; Don't override face attributes explicitly
!                  ;; specified for new frames.
!                  (eq (face-attribute face attr t) 'unspecified))
!         (set-face-attribute face frame attr frame-param))))))
! 
  
  (defun tty-handle-reverse-video (frame parameters)
    "Handle the reverse-video frame parameter for terminal frames."
--- 1754,1790 ----
                          (face-attribute 'default :weight t))
        (set-face-attribute 'default frame :width
                          (face-attribute 'default :width t))))
!   ;; Find attributes that should be initialized from frame parameters.
    (let ((params '((foreground-color default :foreground)
                  (background-color default :background)
                  (border-color border :background)
                  (cursor-color cursor :background)
                  (scroll-bar-foreground scroll-bar :foreground)
                  (scroll-bar-background scroll-bar :background)
!                 (mouse-color mouse :background)))
!       apply-params)
      (dolist (param params)
!       (let* ((value (frame-parameter frame (nth 0 param)))
!            (face (nth 1 param))
!            (attr (nth 2 param))
!            (default (face-attribute face attr t)))
!       ;; Don't set the attributes yet, since the call to
!       ;; make-face-x-resource-internal may change frame parameters.
!       (if (eq default 'unspecified)
!           (if value
!               (push (list face frame attr value) apply-params))
!         (push (list face frame attr default) apply-params))))
!     (dolist (face (delq 'default (face-list)))
!       ;; Don't let frame creation fail because of an invalid face spec.
!       (condition-case ()
!         (progn
!           (face-spec-set face (face-user-default-spec face) frame)
!           (internal-merge-in-global-face face frame)
!           (when (memq window-system '(x w32 mac))
!             (make-face-x-resource-internal face frame)))
!       (error nil)))
!     (dolist (param apply-params)
!       (apply 'set-face-attribute param))))
  
  (defun tty-handle-reverse-video (frame parameters)
    "Handle the reverse-video frame parameter for terminal frames."




reply via email to

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