Subject: bug#29473: 25.3; 'background-mode is 'light on console with black background

From: Tim Landscheidt <[email-masked]>
Date: Sat, 09 Dec 2017 05:35:30 +0000

Noam Postavsky <[email-masked]> wrote:

>> In newsticker tree view on a Linux console with black back-
>> ground (both KDE's konsole application and "native" console
>> (Alt-Ctrl-F2), all under Fedora),

>> (frame-parameter nil 'background-mode) returns 'light.  This
>> also happens with Emacs' current master branch.

>> After glancing at the manual, I'm unclear whether:

>> 1. Emacs should set 'background-mode correctly by itself
>>    (and thus there is an error in the detection mechanism),

>> 2. it is my duty to explicitly set background-mode (via
>>    initial-frame-alist?) when using Emacs on a console, or

> I'm pretty sure it's #1, the manual explains that background-mode nil
> should use automatic detection, and it sounds like that detection is
> going wrong.

> I don't see anything in lisp/term/linux.el that sets the background mode
> at all.  What does running 'echo $TERM' in a shell give you?

> Looking at lisp/term/konsole.el, it looks like it uses the xterm
> functions for everything.  Could you try stepping through/adding
> 'message' calls in terminal-init-xterm and see if/where it goes wrong?

(For the moment, I retract my claim that this also happens
on a "native" (Alt-Ctrl-F2) console because I can no longer
reproduce it and cannot remember my test setup, so the fol-
lowing is limited to konsole in Fedora 25.)

In konsole, $TERM is set to "xterm-256color":

| [tim@passepartout ~/src/emacs]$ echo $TERM
| xterm-256color
| [tim@passepartout ~/src/emacs]$

With interspersed message calls, I could find out that kon-
sole's response to the "Secondary Device Attributes (DA)"
query in terminal-init-xterm ("\e[>0c") is "^[[>0;115;0c":

| [tim@passepartout ~/src/emacs]$ perl -we 'print "\e[>0c";'; sleep 1; echo
| ^[[>0;115;0c
| [tim@passepartout ~/src/emacs]$

This version number (115) falls short of the test
"(>= version 242)" which would cause the background colour
to be queried, and rightly so, because konsole does not re-
spond to the query "\e]11;?\e\\":

| [tim@passepartout ~/src/emacs]$ perl -we 'print "\e]11;?\e\\";'; sleep 1; echo

| [tim@passepartout ~/src/emacs]$

(Sidenote: gnome-terminal reports back "^[[>1;4603;0c" and
"^[]11;rgb:2323/2727/2929^[\" but the latter is never que-
ried due to NUMBER1 being 1 and NUMBER2 being greater than
2000, so background-mode stills end up as 'light with gnome-
terminal.)

So then I tried to track down where background-mode's 'light
is actually coming from, and it seems to originate in
frame-set-background-mode's:

|            (default-bg-mode
|              (if (or (window-system frame)
|                      (and tty-type
|                           (string-match "^\\(xterm\\|\\rxvt\\|dtterm\\|eterm\\)"
|                                         tty-type)))
|                  'light
|                'dark))

with tty-type being "xterm-256color".  This logic was first
introduced in:

| commit 5ebc02b3656890d1d110c671129c64547bdbcdd6
| Author: Eli Zaretskii <[email-masked]>
| Date:   Sat Oct 28 18:48:08 2000 +0000

|     (normal-top-level): If the value of $TERM indicates that
|     we are running from xterm or one of its work-alikes, default to a
|     light background mode.

Curious, I installed xterm and indeed it has black fore-
ground on white background which I had not only forgotten
about, but also for example Wikipedia uses a black back-
ground xterm to illustrate its article
(https://en.wikipedia.org/wiki/Xterm).  D'oh.

My assumption now is that Emacs's detection mechanism cannot
be "fixed" for konsole in Fedora 25 and I should manually
set frame-background-mode to 'dark.

But: In Fedora 26, konsole 17.04.1 (in contrast to Fedora
25's konsole 16.12.3) still returns "^[[>0;115;0c" as
version number, /but/ "\^[]11;rgb:0000/0000/0000^G" for the
background colour.

So one possible improvement could be to query the background
colour either unconditionally or also on "(= version 115)".
This would increase the start-up time by (at most) two se-
conds (xterm-query-timeout) for terminals that do not sup-
port this query AFAIUI.

(So that I don't forget: I used:

| [tim@passepartout ~/src/emacs]$ make && ./src/emacs -Q -L $PWD -nw --eval '(switch-to-buffer "*Messages*")'

for testing.)