Ich entwickle eine Ncurses-Anwendung, die ihre eigene Palette über init_color()
verwendet (unter der Annahme, dass can_change_colors()
nicht null zurückgibt). Wenn COLORS
kleiner als 256 ist, modifiziere ich nur die ersten 8 Farben (angenommen COLORS
ist mindestens 8). Ansonsten ändere ich bis zu den ersten 256.
Die ncurses
-Dokumentation behauptet, dass das Aufrufen von endwin()
auf stdscr
die Palette zurücksetzt. Im Gnome-Terminal sehe ich jedoch nicht die von Ncurses wiederhergestellte Palette. Stattdessen wird die Palette, die ich zuletzt benutzt habe, über meine Anwendung hinaus getragen. Meine erste Frage ist deshalb, warum die Palette nicht richtig wiederhergestellt wird (alles andere - Cursorposition, Bildschirmtext, usw.).
Ich könnte das umgehen (ich weiß, das ist schon fragwürdig), indem ich die Palette beim Start erhalte und sie manuell wiederherstelle. Ich versuche dies mit einer color_content()
Schleife nach einem erfolgreichen Aufruf von start_color()
zu tun. Leider scheint dies die standardmäßige ncurses-Palette zurückzugeben, nicht die Palette, die tatsächlich verwendet wird (getestet mit der Standardpalette von Gnome-terminal und einer konfigurierten Solarized-Palette). Ich habe dies verifiziert, indem ich gegen die Werte in ncurses/base/lib_color.c
von Debians ncurses-5.9 Quellen geprüft habe.
Also:
Warum wird die Palette nicht durch einen erfolgreichen Aufruf von endwin(stdscr)
?
Wie kann ich die "wahre" Palette beim Start erhalten? Ncurses wird bevorzugt, aber Unix- oder sogar Linux-spezifische ioctl()
s usw. würden vorerst ausreichen.
Relevanter Code kann auf Github gefunden werden. Was dort momentan ist, stimmt vielleicht nicht genau mit dem überein, was ich oben beschrieben habe, da ich mit verschiedenen Techniken ohne Erfolg experimentiert habe.
Also, mit dem Kopfgeld, das heute ausläuft, habe ich ein paar gründliche Tauchgänge gemacht. Ich glaube, ich habe die (eher entmutigenden) Antworten:
(1) endwin () setzt die Palette zurück, aber sie scheint sie aus der terminfo-Konfiguration für den TERM-Wert auf die Definition zurückzusetzen. Palettenänderungen von jeder Anwendung werden nicht portabel in die terminfo-Datenbank (offensichtlich) oder Kontext (eher leider) geschrieben und sind somit für ncurses über Anwendungen hinweg nicht verfügbar.
(2) Es gibt keinen allgemeinen Weg, dies zu tun. der Beweis ist im Widerspruch und folgt direkt aus (1).
ach, armer Yorick! ein Kerl des unendlichen Scherzes.
es sei denn, jemand zeigt mir, dass ich verrückt bin. Ich denke, diese Frage ist gelöst.
Tags und Links user-interface ncurses unix