emacs-devel
[Top][All Lists]
Advanced

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

Re: Background mode


From: Juri Linkov
Subject: Re: Background mode
Date: Mon, 27 Jun 2005 03:03:48 +0300
User-agent: Gnus/5.110004 (No Gnus v0.4) Emacs/22.0.50 (gnu/linux)

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





reply via email to

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