Frage

Dies ist eine Geschichte von zwei Skripte und ist mit einer vorherigen Frage im Zusammenhang .

Die beiden Skripte sind unter http://gist.github.com/50692 . Das ansi.rb Skript zeigt alle 256 Farben auf allen 256 Hintergrundfarben. Das ncurses.rb Skript zeigt all 256 Vordergrundfarben aber der Hintergrund zeigt die grundlegenden 16 und scheint dann, um durch verschiedene Attribute wie zu blinken und Video umkehren.

Also, was soll das? Ist dies der Fehler in ncurses, dass es eine ganze Zahl mit Vorzeichen für Farbpaare verwendet? (Dh ‚tput Farben‘, sagt 256, sondern ‚tput Paare‘, sagt 32767 statt 65536) Es scheint, als wenn das der Fall wäre die erste Hälfte der Farben Paare würde richtig angezeigt, aber die zweite Hälfte würde wiederholen oder sich in die Attribute als int Wraps.

War es hilfreich?

Lösung

Der Grund ist, weil ncurses ABI pre 6, die die aktuelle Version enthält, die die meisten Distributionen einschließlich Debian und Amazon AMI Gebrauch COLOR_PAIR(n) keine definierte Paare oberhalb 256. referenzieren Dies ist, weil das Argument vom Typ COLOR_PAIR(n) cchar_t ist. Die unteren 8 Bits wählen die Farbe Paar, und der Rest als bitflags ORed in für spezielle Endgeräte Attribute behandelt. Aus diesem Grund Sie blinken sehen, invers, unterstrichen, usw., wenn Sie über Paarnummer 255 in Ihrem Beispielcode zu gehen versuchen.

Das ist ziemlich bedauerlich, und ich plane, eine Schlange in meinem Programm zu verwenden, um Farben on the fly definieren init_pair() verwenden und nur die zuletzt verwendeten Paare als Kompromiss überschreibt. Ich schrieb den ncurses Betreuer Thomas Dickey zu fragen, ob es eine Möglichkeit, außerhalb von ncurses zu Schritt vorübergehend roh Terminal-Codes zu schreiben und dann wieder auf ncurses. Das war seine Antwort:

  

Im Grunde müßten Sie über Bildschirm-Optimierung vergessen und nur das tun,   Ihre eigene Zeichnung, welche die Funktionen aufgelistet in term (3) unter Verwendung von, zum Beispiel,   tigetstr, mvcur, tputs.

     

Sie können beenden vorübergehend von ncurses, aber dann neu streichen müssen die   Bildschirm. Sonst wird ncurses über verwirrt sein, was auf dem Bildschirm ist   und wo der Cursor steht.

Diese Lösung scheint zu viele Fallen zu präsentieren, aber wenn Sie absolut mehr als 256 in einem ncurses Programm gleichzeitige Paare müssen (nicht Paare Zählen Sie fälschen mit dem inversen Attribute könnten), dann ist das, was Sie zu tun haben.

Andere Tipps

Ich weiß, Rubin überhaupt nicht, so ein funktionierendes Beispiel nicht zur Verfügung stellen kann, aber das ncurses.rb Skript sollten Sie in etwas sagen, dass es so viel kürzer als die ansi.rb Skript.

Sie richten nicht die Farben auf, so dass es Looping nur die Standard-16-Farbpalette mit Variationen durch die Attribute wie Blink unterstreicht vorgesehen, Fett, etc.

Sie müssen int init_color(short color, short r, short g, short b) verwenden, um einen Farbindex mit den RGB-Werten (0 - 1000) zu initialisieren. Und dann die Farbpaare für die Anzeige vor dem Aufruf int init_pair(short pair, short f, short b) mit COLOR_PAIR(n) zu verwenden, setzen

Für Portabilität sollten Sie überprüfen, bool has_colors(void) und bool can_change_color(void)

Auf meinem System sind die Manpages für ncurses von unschätzbarem Wert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top