Qual è l'API grafica del terminale?


8

In che modo alcuni programmi possono impostare i colori di sfondo e dei caratteri, scrivere i caratteri nella stessa posizione sullo schermo (ad esempio nella terza riga, quinta colonna) più di una volta?

Alcuni esempi sono la barra di avanzamento visualizzata da curl google.com > a, alcune schermate di installazione e quasi tutti gli editor di testo.

Risposte:


5

Quello che stai chiedendo non è in realtà un'API grafica, ma solo caratteri di controllo del terminale.

C'è un sacco di storia alle spalle, ma i terminali ai tempi erano macchine del tipo di telefono . Fondamentalmente una macchina da scrivere con carta alimentata su binario collegata al computer con una connessione seriale. La digitazione di un carattere invierebbe quel valore binario al computer (oltre a scriverlo sulla pagina). Il computer stampa i caratteri come output di qualsiasi cosa tu abbia richiesto.

Sono stati usati caratteri speciali per controllare il terminale (che è da dove viene la chiave di controllo, era per produrre quei caratteri). Ad esempio, ^Ho ^?sarebbe un backspace, ^Mè un ritorno a ^Jcapo (sposta il cursore all'inizio della riga) ed è un avanzamento riga (sposta la pagina in alto di una riga). Alcuni codici di controllo hanno una sequenza di escape in C (che è condivisa da quasi tutti i linguaggi di programmazione) per generare i caratteri di controllo. I controlli elencati in precedenza sarebbero \b, \r, \nrispettivamente.

L' emulatore di terminale che usi oggi è proprio quello che sembra, è un software che finge di essere una vecchia macchina del teletipo. In un certo senso, è quasi come se Unix pensasse ancora che stai usando una macchina da scrivere per comunicare con esso.

Nel caso di curl, scrive un'intera riga, quindi invia \r(ritorno a capo) portando il cursore all'inizio della riga, quindi scrive un'altra riga. Poiché un feed di riga non viene inviato, continua a scrivere sulla stessa riga sullo schermo.

Ecco qualcosa che puoi provare a dimostrare questo:

echo -n  "First" ; sleep 5 ; echo -en "\rSecond\n"

Vedrai la parola "Prima" stampata (ma non viene inviata alcuna nuova riga). 5 secondi dopo verrà sostituito con la parola "Secondo" e verrà inviata una nuova riga. Puoi ripetere questo schema indefinitamente. Prova ad aggiungere "Terzo" da solo, vedrai qualcosa che probabilmente non ti aspettavi ;-)

Per ulteriori informazioni su questi e altri caratteri di controllo, consultare il ascii(7)manuale.



1

Questa domanda è in realtà una serie di domande e "personaggi di controllo" si rivolge solo a una piccola parte di essa, ad esempio la barra di avanzamento curl. Più in generale, queste sono le caratteristiche comuni dei terminali (e degli emulatori di terminali).

La maggior parte di queste funzioni comuni sono standardizzate in ECMA-48: Funzioni di controllo per set di caratteri codificati . Tuttavia, altre funzionalità non lo sono . Sono definiti dall'implementazione.

ECMA-48 si riferisce alle funzioni di controllo . Ciò include i caratteri di controllo e le sequenze di controllo (spesso indicate come sequenze di escape, sequenze ANSI, ecc.).

Alcuni caratteri di controllo vengono utilizzati per operazioni semplici , ad es.

  • sposta il cursore sulla colonna precedente sulla stessa riga
  • sposta il cursore sulla prima colonna sulla stessa riga
  • sposta il cursore sul tab stop successivo sulla stessa riga
  • sposta il cursore sulla riga successiva (e scorri la schermata se è già sull'ultima riga)

La barra di avanzamento per curlviene creata utilizzando queste semplici operazioni. Ma i personaggi di controllo possono fare solo così tanto, non di più. Le sequenze di controllo fanno di più, ad es.

  • sposta il cursore su qualsiasi riga / colonna sullo schermo
  • sposta il cursore su qualsiasi riga nella stessa colonna sullo schermo
  • sposta il cursore su qualsiasi colonna della stessa riga sullo schermo
  • imposta i punti di tabulazione in qualsiasi colonna dello schermo
  • sposta il cursore sulla riga precedente
  • fai scorrere lo schermo verso l'alto o verso il basso senza spostare il cursore

Questo per quanto riguarda i parallelismi tra semplici / complessi. Le sequenze di controllo vengono inoltre utilizzate per modificare il colore del testo e dello sfondo, cancellare il testo dallo schermo, mostrare il testo in video inverso (o grassetto, sottolineato, lampeggiante).

I programmi che disegnano una barra di avanzamento del video inverso (o colorato) usano sequenze di controllo .

Sebbene le sequenze di controllo possano fare di più, possono fare solo cose specifiche. Metterli insieme per creare editor di testo, schermate di installazione (e programmi che disegnano barre di avanzamento colorate) diventa complicato. Parte di questo è reso più semplice usando librerie che conoscono queste cose. Inizialmente, avevamo termcap (e un database di alcune centinaia di tipi di terminali), esteso a terminfo (e un database di circa mille tipi di terminali).

Anche con la standardizzazione, ci sono dozzine di descrizioni di terminali che è possibile utilizzare . Quindi continuiamo a usare le librerie per tutte tranne la più banale di queste applicazioni. Uno è ncurses ("new-curses"), un altro è slang (tecnicamente "S-Lang").

Ulteriori letture:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.