Domanda

Questa è una storia di due script ed è correlata a una domanda precedente .

I due script sono disponibili all'indirizzo http://gist.github.com/50692 . Lo script ansi.rb mostra tutti i 256 colori su tutti i 256 colori di sfondo. Lo script ncurses.rb mostra tutti i 256 colori di primo piano, ma lo sfondo mostra i 16 di base e quindi sembra scorrere vari attributi come lampeggiante e video inverso.

Quindi cosa dà? È questo il bug in ncurses che utilizza un numero intero con segno per le coppie di colori? (vale a dire "colori di tput" dice 256 ma "coppie di tput" dice 32767 invece 65536) Sembra che in tal caso la prima metà delle coppie di colori verrebbe visualizzata correttamente, ma la seconda metà si ripeterebbe o entrerebbe negli attributi come int impacchi.

È stato utile?

Soluzione

Il motivo è che ncurses pre ABI 6, che include la versione corrente utilizzata dalla maggior parte delle distribuzioni tra cui Debian e Amazon AMI, COLOR_PAIR (n) non può fare riferimento a coppie definite superiori a 256. Questo perché l'argomento di COLOR_PAIR (n) è di tipo cchar_t . Gli 8 bit inferiori scelgono la coppia di colori e gli altri vengono trattati come bitflags OR inseriti per specifici attributi del terminale. Questo è il motivo per cui vedi lampeggio, inverso, sottolineato, ecc. Quando tenti di superare la coppia numero 255 nel tuo codice di esempio.

Questo è piuttosto sfortunato, e ho intenzione di usare una coda nel mio programma per definire i colori al volo usando init_pair () e semplicemente sovrascrivere le coppie usate meno di recente come compromesso. Ho scritto Thomas Dickey, il manutentore di ncurses, chiedendo se esiste un modo per uscire temporaneamente da ncurses per scrivere codici terminali grezzi e poi tornare a ncurses. Questa è stata la sua risposta:

  

In sostanza dovresti dimenticare l'ottimizzazione dello schermo e basta   il tuo disegno usando le funzioni elencate in terminfo (3), ad es.   tigetstr, mvcur, tputs.

     

È possibile uscire temporaneamente da ncurses, ma è necessario ridipingere il file   schermo. Altrimenti ncurses sarà confuso su ciò che è sullo schermo   e dove si trova il cursore.

Questa soluzione sembra presentare troppe insidie, ma se hai assolutamente bisogno di più di 256 coppie simultanee in un programma ncurses (senza contare le coppie potresti falsificare con l'attributo inverso), allora questo è ciò che dovrai fare.

Altri suggerimenti

Non conosco affatto Ruby, quindi non posso fornire un esempio funzionante, ma lo script ncurses.rb dovrebbe dirti qualcosa in quanto è molto più breve dello script ansi.rb.

Non stai impostando i colori, quindi esegui semplicemente il loop della tavolozza di 16 colori predefinita con variazioni fornite dagli attributi come sottolineatura, grassetto, ecc.

Devi usare int init_color (colore corto, corto r, corto g, corto b) per inizializzare un indice di colore con i valori RGB (0 - 1000) e quindi impostare le coppie di colori su utilizzare per la visualizzazione con int init_pair (coppia corta, short f, short b) prima di chiamare COLOR_PAIR (n) .

Per la portabilità è necessario selezionare bool has_colors (void) e bool can_change_color (void)

Sul mio sistema le pagine man di ncurses sono preziose.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top