>>> I see there is a bug not caused by my patch: >>> >>> emacs -q -nw -rv >>> >>> sets the background mode to light on xterm. But since -rv switches >>> foreground and background, it should switch the background mode too >>> from light to dark on xterm. >> >> I think this is a bug. > > There are also other ways to reproduce this bug, for example, running > Emacs without -rv option on xterm and evaluating (invert-face 'default). > Every time it evaluated, it switches the background mode to a > reversed value: with real black background it sets the light > background mode; with white background - to dark mode. That's because > xterm presence is checked only once in startup.el (with setting the > mode to light), but any subsequent call of `frame-set-background-mode' > ignores the fact that Emacs runs on xterm. On rxvt (invert-face 'default) > doesn't change the background mode at all because rxvt.el sets the > value of `frame-background-mode' permanently.
Below is the patch that fixes this problem. It adds a new internal variable for the default background mode for terminals. Index: lisp/faces.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/faces.el,v retrieving revision 1.324 diff -u -r1.324 faces.el --- lisp/faces.el 23 Jun 2005 21:24:58 -0000 1.324 +++ lisp/faces.el 27 Jun 2005 00:00:55 -0000 @@ -1572,6 +1572,12 @@ (choice-item light) (choice-item :tag "default" nil))) +(defvar default-frame-background-mode nil + "Internal variable for the default brightness of the background. +The default `nil' means `dark'. If Emacs runs in non-windowed mode +from `xterm' or a similar terminal emulator, the value is `light'. +On rxvt terminal, the value depends on the environment variable +COLORFGBG.") (defun frame-set-background-mode (frame) "Set up display-dependent faces on FRAME. @@ -1587,13 +1593,13 @@ (intern (downcase bg-resource))) ((and (null window-system) (null bg-color)) ;; No way to determine this automatically (?). - 'dark) + (or default-frame-background-mode 'dark)) ;; Unspecified frame background color can only happen ;; on tty's. ((member bg-color '(unspecified "unspecified-bg")) - 'dark) + (or default-frame-background-mode 'dark)) ((equal bg-color "unspecified-fg") ; inverted colors - 'light) + (if (eq default-frame-background-mode 'light) 'dark 'light)) ((>= (apply '+ (x-color-values bg-color frame)) ;; Just looking at the screen, colors whose ;; values add up to .6 of the white total Index: lisp/startup.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/startup.el,v retrieving revision 1.359 diff -u -r1.359 startup.el --- lisp/startup.el 17 Jun 2005 15:34:39 -0000 1.359 +++ lisp/startup.el 27 Jun 2005 00:00:22 -0000 @@ -444,24 +444,25 @@ ;; frame-notice-user-settings didn't (such as on a tty). ;; frame-set-background-mode is idempotent, so it won't ;; cause any harm if it's already been done. - (let ((frame-background-mode frame-background-mode) - (frame (selected-frame)) + (let ((frame (selected-frame)) term) (when (and (null window-system) ;; Don't override a possibly customized value. (null frame-background-mode) - ;; Don't override user specifications. - (null (frame-parameter frame 'reverse)) + ;; Don't override a default set by terminal. + (null default-frame-background-mode) (let ((bg (frame-parameter frame 'background-color))) (or (null bg) - (member bg '(unspecified "unspecified-bg"))))) + (member bg '(unspecified "unspecified-bg" + "unspecified-fg"))))) + (setq term (getenv "TERM")) ;; Some files in lisp/term do a better job with the ;; background mode, but we leave this here anyway, in ;; case they remove those files. (if (string-match "^\\(xterm\\|rxvt\\|dtterm\\|eterm\\)" term) - (setq frame-background-mode 'light))) + (setq default-frame-background-mode 'light))) (frame-set-background-mode (selected-frame))))) ;; Now we know the user's default font, so add it to the menu. Index: lisp/term/xterm.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/term/xterm.el,v retrieving revision 1.16 diff -u -r1.16 xterm.el --- lisp/term/xterm.el 12 May 2005 01:35:20 -0000 1.16 +++ lisp/term/xterm.el 27 Jun 2005 00:00:33 -0000 @@ -366,7 +366,7 @@ "Set background mode as appropriate for the default rxvt colors." (let ((fgbg (getenv "COLORFGBG")) bg rgb) - (setq frame-background-mode 'light) ; default + (setq default-frame-background-mode 'light) (when (and fgbg (string-match ".*;\\([0-9][0-9]?\\)\\'" fgbg)) (setq bg (string-to-number (substring fgbg (match-beginning 1)))) @@ -379,7 +379,7 @@ ;; The following line assumes that white is the 15th ;; color in xterm-standard-colors. (* (apply '+ (car (cddr (nth 15 xterm-standard-colors)))) 0.6)) - (setq frame-background-mode 'dark))) + (setq default-frame-background-mode 'dark))) (frame-set-background-mode (selected-frame)))) ;; Do it! Index: lisp/term/rxvt.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/term/rxvt.el,v retrieving revision 1.4 diff -u -r1.4 rxvt.el --- lisp/term/rxvt.el 1 Sep 2003 15:45:36 -0000 1.4 +++ lisp/term/rxvt.el 27 Jun 2005 00:00:33 -0000 @@ -150,7 +150,7 @@ "Set background mode as appropriate for the default rxvt colors." (let ((fgbg (getenv "COLORFGBG")) bg rgb) - (setq frame-background-mode 'light) ; default + (setq default-frame-background-mode 'light) (when (and fgbg (string-match ".*;\\([0-9][0-9]?\\)\\'" fgbg)) (setq bg (string-to-number (substring fgbg (match-beginning 1)))) @@ -163,7 +163,7 @@ ;; The following line assumes that white is the 15th ;; color in rxvt-standard-colors. (* (apply '+ (car (cddr (nth 15 rxvt-standard-colors)))) 0.6)) - (setq frame-background-mode 'dark))) + (setq default-frame-background-mode 'dark))) (frame-set-background-mode (selected-frame)))) ;; Do it! -- Juri Linkov http://www.jurta.org/emacs/ _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel