Warum funktioniert das 256-Farben-Display nicht mit der Linux-Konsole und nicht mit dem Bildschirm?

1181
philipp

Ich arbeite an einem Python-Programm mit einer auf Urwid basierenden Textmodus-Benutzeroberfläche. urwid ist eine Bibliothek zum Erstellen von Programmen im Ncurses-Stil mit Python.

Betriebssystem ist CentOS 7.

Unter "normalen" Bedingungen (X-Server, Terminalfenster) funktioniert alles einwandfrei. Auf einer Linux-Konsole ohne X-Server wechselt urwid jedoch in einen Low-Color-Modus. (Mit falschen Farbcodes auf bestimmten Maschinen bekomme ich ärgerlich blinkenden Text als)

Der lustige Punkt ist, dass ich immer noch Linux Console benutze, ich muss nur den Bildschirm als Workaround starten. Im Bildschirm ist alles wieder in Ordnung. Ohne besondere Konfiguration für den Bildschirm.

Ich habe bereits versucht, viele Umgebungsinformationen zwischen der reinen Texthülle und der Bildschirmshell zu vergleichen, aber das hat nicht geholfen. Das Gebietsschema ist beispielsweise identisch, die Pythons sys.stdout.encoding sind die gleichen und machen ": runtime syntax / colortest.vim" in vim in beiden Fällen korrekt und farbenfroh.

1

1 Antwort auf die Frage

2
grawity

Das ist normal. Dies geschieht einfach deshalb, weil die Linux-Kernel-Konsole den 256-Farben-Modus nicht unterstützt . Es wurde nicht geschrieben, um 256 Farben zu verwenden, da dies im VGA-Textmodus einfach nicht möglich ist. (Im Framebuffer-Modus ist dies möglich, aber der Code hat immer noch die gleichen Einschränkungen.) GNU Screen weiß dies und übersetzt automatisch von der 256-Farben-Palette in die nächste 16-Farben-Palette.

Nur sehr aktuelle Linux - Versionen (3.13 und höher) begonnen zu erkennen, den Escape - Codes mit 256 Farben, aber auch dann noch er ordnet sich die 16-Farben - Palette wie Bildschirm würde.

Es gibt Framebuffer-basierte Terminal-Emulatoren wie kmscon oder fbterm, die ihr eigenes Rendering implementieren und alles über KMS zeichnen. Verwenden Sie diese, wenn Sie ein fähiges Terminal benötigen, das X11 vermeidet.


Blinkender Text tritt auf, weil die 256-Farben-Codes die 16-Farben sehr leicht verwechseln. Zum Beispiel ESC [38;5;35mkann als den 256-Farben - Code oder drei ANSI (16 Farben) Codes interpretiert werden.

  • Die Linux-Konsole weiß nicht, was sie 38bedeutet, und interpretiert sie 5wie 35gewohnt als "Enable Blink" und als "Vordergrundfarbe # 5 (Magenta)".
    (Siehe zum Beispiel diese Tabelle unter "SGR".)

  • Währenddessen erkennen Ihre X11-Terminals 38den magischen Code für "Vordergrund - zusätzliche Farben", so dass sie 5als "256-Farbpalette verwenden" und 35als "Farbe # 35 (Cyan) verwenden" interpretiert werden .
    (Es gibt auch einen 24-Bit-RGB-Modus als ESC [38;2;<r>;<g>;<b>m.)