ncurses(3X) | Apeluri de bibliotecă | ncurses(3X) |
NUME
ncurses - interfață terminal caracter-celulă cu ieșire optimizată
SINOPSIS
#include <curses.h>
DESCRIERE
Biblioteca „new curses” oferă programatorului un mijloc independent de terminal de a citi intrările tastaturii și ale mouse-ului și de a actualiza terminalele cu celule de caractere cu ieșire optimizată pentru a minimiza actualizările ecranului. ncurses înlocuiește bibliotecile curses din System V Release 4 Unix „SVr4”și 4.4BSD Unix, a căror dezvoltare a încetat în anii 1990. Acest document descrie ncurses versiunea 6.5 (patch 20240427).
\ncurses permite controlul conținutului ecranului terminalului; abstractizarea și subdivizarea acestuia cu windows și pads; citirea datelor de intrare ale terminalului; controlul opțiunilor de intrare și ieșire ale terminalului; rutine de interogare a mediului; manipularea culorilor; definirea și utilizarea tastelor soft label; accesul la capacitățile terminfo; o interfață de compatibilitate termcap; și o abstractizare a API a sistemului pentru manipularea terminalului (cum ar fi termios(3)).
ncurses implementează interfața descrisă de Curses X/Open ediția 7. În multe detalii comportamentale care nu sunt standardizate de X/Open, ncurses emulează biblioteca curses din SVr4 și oferă numeroase extensii utile.
Paginile de manual 0urses utilizează mai multe secțiuni pentru a clarifica aspecte legate de utilizare și interoperabilitate cu alte implementări curses.
- Secțiunea «NOTE» descrie problemele și avertismentele de care orice utilizator al API-ului ncurses ar trebui să fie conștient, cum ar fi limitările privind dimensiunea unui tip integral subiacent sau disponibilitatea unei macroinstrucțiuni de preprocesor exclusiv din definiția unei funcții (care împiedică preluarea adresei sale). Această secțiune descrie, de asemenea, detalii de implementare care vor fi semnificative pentru programator, dar care nu sunt standardizate.
- Secțiunea «EXTENSII» prezintă inovațiile ncurses care depășesc standardul Curses X/Open și/sau implementarea curses SVr4. Acestea sunt denumite extensions (extensii) pentru a indica faptul că nu pot fi implementate numai prin utilizarea API-ului bibliotecii, ci necesită acces la starea internă a bibliotecii.
- Secțiunea «PORTABILITATE» abordează aspecte (dincolo de exercitarea extensiilor) care ar trebui luate în considerare atunci când se scrie pentru un standard curses, sau pentru implementări multiple.
- Secțiunea «ISTORIA» examinează punctele de detaliu din ncurses și alte implementări curses de-a lungul deceniilor de dezvoltare a acestora, în special acolo unde precedentul sau inerția au împiedicat o mai bună proiectare (și, în câteva cazuri, unde o astfel de inerție a fost depășită).
O aplicație curses trebuie legată cu biblioteca; utilizați opțiunea -lncurses a compilatorului sau editorului de legături. Este posibil să fie disponibilă o versiune de depanare a bibliotecii; în acest caz, faceți legătura cu aceasta folosind -lncurses_g; (ste posibil ca integratorul sistemului dumneavoastră să fi instalat aceste biblioteci astfel încât să puteți utiliza opțiunile -lcurses și, respectiv, -lcurses_g). Biblioteca ncurses_g generează jurnale de urmărire (într-un fișier numit trace în directorul curent) care descriu acțiunile ncurses. A se vedea secțiunea «CONFIGURAȚII ALTERNATIVE\[u00BB] de mai jos.
Structura aplicației
O aplicație curses utilizează informații din configurația regională a sistemului; setlocale(3) o pregătește pentru apelurile bibliotecii curses.
setlocale(LC_ALL, "");
Dacă configurația regională nu este astfel inițializată, biblioteca presupune că toate caracterele sunt imprimabile ca în ISO 8859-1, pentru a funcționa cu anumite programe vechi. Ar trebui să inițializați configurația regională; nu vă așteptați la un comportament consecvent din partea bibliotecii atunci când parametrii regionali nu au fost configurați.
initscr(3X) sau newterm(3X) trebuie să fie apelate pentru a inițializa curses înainte de utilizarea oricărei funcții care se ocupă de ferestre și ecrane.
Pentru a obține o intrare caracter cu caracter fără ecou, majoritatea programelor interactive, orientate pe ecran, doresc să utilizeze următoarea secvență.
initscr(); cbreak(); noecho();
Majoritatea aplicațiilor efectuează configurarea următoare după cum se indică mai jos.
intrflush(stdscr, FALSE); keypad(stdscr, TRUE);
Un program curses intră apoi adesea într-o buclă de evenimente de un anumit tip. Apelați endwin(3X) înainte de a ieși.
Prezentare generală
O bibliotecă curses abstractizează ecranul terminalului prin reprezentarea totală sau parțială a acestuia ca o structură de date WINDOW. O window (fereastră) este o grilă dreptunghiulară de celule de caractere, adresate prin coordonate de linie și coloană (y, x), cu colțul din stânga sus ca (0, 0). O fereastră numită stdscr, de aceeași dimensiune ca ecranul terminalului, este întotdeauna disponibilă. Creați altele cu newwin(3X).
O bibliotecă curses nu gestionează ferestrele care se suprapun (dar a se vedea mai jos). Puteți fie să utilizați stdscr pentru a gestiona o singură fereastră care umple ecranul, fie să împărțiți ecranul în ferestre care nu se suprapun și să nu utilizați deloc stdscr. Amestecarea celor două abordări va duce la efecte imprevizibile și nedorite.
Funcțiile permit manipularea unei ferestre și a cursorului care identifică celula din cadrul acesteia în care va avea loc următoarea operație de ieșire. Printre acestea, cele mai de bază sunt move(3X) și addch(3X): acestea plasează cursorul și, respectiv, scriu un caracter în stdscr.
Modificările frecvente ale ecranului terminalului pot provoca pâlpâiri neplăcute sau utilizarea ineficientă a canalului de comunicare cu dispozitivul, astfel încât biblioteca nu îl actualizează în general în mod automat. Prin urmare, după utilizarea funcțiilor curses pentru a acumula un set de actualizări dorite care au sens să fie prezentate împreună, apelați refresh(3X) pentru a spune bibliotecii să facă ecranul utilizatorului să arate ca stdscr. Biblioteca optimizează rezultatul său prin calcularea unui număr minim de operații pentru a muta ecranul de la starea sa de la actualizarea anterioară la cea nouă. O optimizare eficientă necesită informații precise despre dispozitivul terminal: gestionarea acestor informații este de competența API-ului terminfo(3X), o caracteristică a fiecărei implementări curses standard.
De asemenea, pot fi manipulate ferestre speciale numite pads. Acestea sunt ferestre care nu sunt constrânse la dimensiunea ecranului terminalului și al căror conținut nu trebuie să fie afișat complet. Consultați curs_pad(3X).
În plus față de desenarea caracterelor pe ecran, pot fi acceptate atribute de redare și culori, ceea ce face ca caracterele să apară în moduri cum ar fi subliniat, în video invers sau în culori pe terminalele care acceptă astfel de îmbunătățiri ale afișării. A se vedea curs_attr(3X).
curses predefinește constante pentru un mic set de grafice de desenare a formularelor corespunzătoare DEC Alternate Character Set (ACS), o caracteristică a VT100 și a altor terminale. A se vedea waddch(3X).
curses este implementat utilizând controlorul de terminal al sistemului de operare; evenimentele de apăsare a tastelor nu sunt recepționate sub formă de coduri de scanare, ci sub formă de secvențe de octeți. Tastele grafice (tastele alfanumerice și de punctuație, precum și spațiul) apar ca atare. Orice altceva, inclusiv tastele tab, enter/return, tastatura numerică, tastele săgeată și tastele de funcție, apar ca un caracter de control sau ca o secvență de eludare multi-octe. curses le traduce în coduri unice key codes. Consultați getch(3X).
ncurses oferă reimplementări ale bibliotecilor SVr4 panel(3X), form(3X) și menu(3X) pentru a facilita construirea de interfețe cu utilizatorul folosind curses.
Inițializare
Selectarea unei valori adecvate a TERM în mediul procesului este esențială pentru funcționarea corectă a bibliotecilor curses și terminfo. Un sistem bine configurat selectează automat o valoare TERM corectă; tset(1) poate ajuta la depanarea situațiilor exotice.
Dacă schimbați tipul de terminal, exportați variabila de mediu TERM în shell, apoi executați tset(1) sau comanda «tput init». Consultați subsecțiunea «Tabulatoare și inițializare» din terminfo(5).
Dacă variabilele de mediu LINES și COLUMNS sunt definite sau dacă programul curses se execută într-un mediu de ferestre grafice, informațiile astfel obținute le înlocuiesc pe cele obținute prin terminfo. O extensie ncurses acceptă terminale redimensionabile; a se vedea wresize(3X).
Dacă variabila de mediu TERMINFO este definită, un program curses verifică mai întâi dacă există o descriere a tipului de terminal în locația pe care o identifică. TERMINFO este utilă pentru dezvoltarea descrierilor de tip experimentale sau atunci când permisiunea de scriere la /usr/share/terminfo nu este disponibilă.
A se vedea secțiunea «MEDIU» de mai jos.
Convenții de denumire
curses oferă multe funcții în forme variate folosind un set regulat de alternative la numele uneia elementare. Cele cu prefixul „w” necesită un argument de indicator WINDOW; cele cu prefixul „mv” efectuează mai întâi mișcarea cursorului folosind wmove(3X); prefixul „mvw” indică ambele. Funcția „w” este de obicei cea elementară; eliminarea acestui prefix indică de obicei operarea cu stdscr.
Patru funcții prefixate cu „p” necesită un argument pad; a se vedea mai jos.
În sinopsisurile funcțiilor, paginile de manual ncurses aplică următoarele denumiri parametrilor.
bf | boolean (TRUE sau FALSE) |
c | un caracter sau un nr. întreg |
ch | un chtype |
wc | un wchar_t sau wint_t |
wch | un cchar_t |
win | indicator către o fereastră WINDOW |
pad | indicator către o fereastră WINDOW care este un pad (fereastră de dimensiuni reduse) |
Configurații de caractere late și nelate
Această pagină de manual descrie funcțiile care apar în orice configurație a bibliotecii. Există două configurații comune; consultați secțiunea «CONFIGURAȚII ALTERNATIVE» de mai jos.
- ncurses
- este biblioteca în configurația sa „non-wide” (normală), care gestionează numai caractere pe opt biți. Aceasta stochează un caracter combinat cu atribute într-o dată chtype, care este adesea un alias al lui int.
- Atributele singure (fără caracterul corespunzător) pot fi stocate în variabile de tip chtype sau attr_t. În ambele cazuri, acestea sunt reprezentate ca o mască integrală de biți.
- Fiecare celulă a unei WINDOW este stocată ca un chtype.
- ncursesw
- este biblioteca în configurația sa „wide” (de caractere late), care gestionează codurile de caractere care necesită un tip de date mai mare decât poate reprezenta char (un tip de dimensiunea octetului). Aceasta adaugă aproximativ o treime mai multe apeluri utilizând tipuri de date suplimentare care pot stoca astfel de caractere multi-octet.
- cchar_t
- corespunde chtype din configurația „non-wide” (normală). Este întotdeauna un tip de structură, deoarece stochează mai multe date decât încape într-un tip scalar standard. Este posibil ca un cod de caractere să nu poată fi reprezentat ca un char și, în plus, mai multe caractere pot ocupa o celulă (ca în cazul semnelor de accent și al altor diacritice). Fiecare caracter este de tipul wchar_t; un caracter complex conține un caracter de spațiere și zero sau mai multe caractere de nespațiere (a se vedea mai jos). Atributele și datele de culoare sunt stocate în câmpuri separate ale structurii, nu combinate ca în chtype.
Fiecare celulă a unei WINDOW este stocată ca un cchar_t.
setcchar(3X) și getcchar(3X) stochează și extrag date cchar_t. API-ul de bibliotecă lat al ncurses depinde de două tipuri de date standardizate de ISO C95.
- wchar_t
- stochează un caracter lat. Ca și chtype, acesta poate fi un alias al lui int. În funcție de codificarea caracterelor, un caracter lat poate fi spacing, ceea ce înseamnă că ocupă singur o celulă de caractere și însoțește de obicei avansarea cursorului, sau non-spacing, ceea ce înseamnă că ocupă aceeași celulă ca un caracter de spațiere, este adesea considerat un „modificator” al glifului de bază cu care se combină și de obicei nu avansează cursorul.
- wint_t
- poate stoca un wchar_t sau constanta WEOF, în mod analog cu funcțiile de manipulare a caracterelor de dimensiunea int din ISO C și constanta sa EOF.
- Biblioteca „wide” oferă funcții suplimentare care le completează pe cele din biblioteca „non-wide” atunci când dimensiunea tipului de caracter subiacent este semnificativă. O convenție de denumire oarecum regulată leagă multe dintre variantele „wide” de omologii lor „non-wide”; atunci când un nume de funcție „non-wide” conține «ch» sau «str», prefixați-l cu «_w» pentru a obține omologul „wide”. De exemplu, waddch devine wadd_wch. (Excepțiile care adaugă doar «w includ addwstr, inwstr și variantele lor).
- Această convenție este inaplicabilă pentru unele nume de funcții „non-wide”, astfel încât sunt utilizate alte transformări pentru configurația „wide”: funcția de gestionare a fundalului ferestrei «bkgd» devine «bkgrnd»; funcțiile de desenare și ștergere a marginilor ferestrei sunt sufixate cu «_set»; iar funcțiile de manipulare a atributelor caracterelor precum «attron» devin «attr_on».
Indexare după numele funcției
Tabelul următor enumeră funcțiile curses furnizate în API-urile „non-wide” și „wide” și paginile de manual corespunzătoare care le descriu. Cele marcate cu «*\[u00BB] sunt specifice ncurses, nu sunt descrise de Curses X/Open și nici prezente în SVr4.
Extensia screen-pointer extension a ncurses adaugă funcții suplimentare corespunzătoare multora dintre cele de mai sus, fiecare cu un sufix „_sp”; a se vedea curs_sp_funcs(3X).
Disponibilitatea unor extensii este configurabilă atunci când ncurses este compilat; consultați secțiunile «CONFIGURAȚII ALTERNATIVE» și «EXTENSII» de mai jos.
VALOAREA RETURNATĂ
Dacă nu se specifică altfel, funcțiile care returnează un număr întreg returnează OK în caz de succes și ERR în caz de eșec. Funcțiile care returnează indicatori returnează NULL în caz de eșec. De obicei, ncurses tratează un indicator nul transmis ca parametru al unei funcții ca un eșec. Funcțiile prefixate cu „mv” efectuează mai întâi mișcarea cursorului și eșuează dacă poziția (y, x) este în afara limitelor ferestrei.
MEDIU
Următoarele simboluri din mediul procesului personalizează comportamentul aplicațiilor ncurses în timpul rulării. Biblioteca poate fi configurată să nu ia în considerare variabilele TERMINFO, TERMINFO_DIRS, TERMPATH și HOME, dacă utilizatorul este superutilizator (root) sau dacă aplicația utilizează setuid(2) sau setgid(2).
BAUDRATE
Biblioteca de depanare verifică această variabilă atunci când aplicația a redirecționat ieșirea către un fișier. Valoarea sa integrală este utilizată pentru viteza de baud. Dacă această valoare este absentă sau nu este validă, ncurses utilizează 9600. Această caracteristică permite verificatorilor să construiască cazuri de testare repetabile care iau în considerare deciziile de optimizare care depind de viteza de baud.
CC (caracter de comandă)
Atunci când este definită, valoarea capacității command_character (cmdch) a intrărilor terminfo încărcate se modifică la valoarea acestei variabile. Foarte puține intrări terminfo oferă această caracteristică.
Deoarece acest nume este utilizat și în mediile de dezvoltare pentru a reprezenta numele compilatorului C, ncurses ignoră valoarea sa dacă nu are un singur caracter.
COLUMNS
Această variabilă specifică lățimea ecranului în caractere. Aplicațiile care rulează într-un mediu cu ferestre sunt de obicei capabile să obțină lățimea ferestrei în care se execută. Dacă COLUMNS nu este definită și dimensiunea ecranului terminalului nu este disponibilă de la controlorul terminalului, ncurses utilizează dimensiunea specificată de capacitatea columns (cols) din intrarea tipului de terminal în baza de date terminfo, dacă există.
Este important ca aplicația dumneavoastră să utilizeze dimensiunea corectă a ecranului. Detectarea automată a acesteia nu este întotdeauna posibilă, deoarece o aplicație poate rula pe o gazdă care nu respectă NAWS (Negociations About Window Size) sau cu un ID de utilizator diferit de cel al proprietarului fișierului dispozitivului terminal. Definirea COLUMNS și/sau LINES prevalează asupra utilizării de către bibliotecă a dimensiunii ecranului obținute de la sistemul de operare.
Variabilele COLUMNS și LINES pot fi specificate independent. Această proprietate este utilă pentru a evita caracteristicile eronate ale descrierilor tipurilor de terminale moștenite; descrierile xterm(1) care specifică 65 de linii au fost odată notorii. Pentru rezultate optime, evitați specificarea codurilor de capacitate cols și lines în descrierile terminfo ale emulatoarelor de terminale.
use_env(3X) poate dezactiva utilizarea mediului procesului în determinarea dimensiunii ecranului. use_tioctl(3X) poate actualiza COLUMNS și LINES pentru a corespunde dimensiunii ecranului obținute din apelurile sistemului sau din baza de date a terminalului.
ESCDELAY
Pentru ca curses să distingă caracterul ESC care rezultă din apăsarea de către utilizator a tastei «Escape» de pe dispozitivul de intrare de cel care începe o secvență escape (așa cum este produs de obicei de tastele funcționale), acesta așteaptă după primirea caracterului de eludare pentru a vedea dacă sunt disponibile alte caractere în fluxul de intrare într-un interval scurt. O variabilă globală ESCDELAY stochează acest interval în milisecunde. Valoarea implicită de 1000 (o secundă) este adecvată pentru majoritatea utilizărilor. Această variabilă de mediu o suprascrie.
Cel mai frecvent caz în care doriți să modificați această valoare este acela de a lucra cu o gazdă la distanță pe un canal de comunicare lent. Dacă gazda care rulează o aplicație curses nu primește în timp util caracterele unei secvențe de scăpare, biblioteca le poate interpreta ca evenimente de apăsare a mai multor taste.
Evenimentele de mouse xterm(1) sunt o formă de secvență de eludare; prin urmare, dacă aplicația dvs. utilizează în mare măsură clicuri multiple, este posibil să doriți să prelungiți valoarea implicită, deoarece întârzierea se aplică evenimentului compozit de clicuri multiple, precum și clicurilor individuale.
Aplicațiile portabile nu ar trebui să se bazeze pe prezența ESCDELAY în niciuna dintre forme, dar definirea variabilei de mediu în locul variabilei globale nu creează probleme la compilarea unei aplicații.
Dacă keypad(3X) este dezactivată pentru fereastra curses care primește intrarea, un program trebuie să dezambiguizeze singur secvențele de eludare.
HOME
ncurses poate citi și scrie descrieri auxiliare ale terminalelor în fișierele .termcap și .terminfo din directorul personal al utilizatorului.
LINES
Această contraparte la COLUMNS specifică înălțimea ecranului în caractere. Capacitatea și codul terminfo corespunzător este lines. A se vedea descrierea variabilei COLUMNS de mai sus.
MOUSE_BUTTONS_123
(Numai adaptarea pentru OS/2 EMX) OS/2 numerotează un mouse cu trei butoane în mod inconsecvent față de alte platforme, astfel încât 1 este butonul din stânga, 2 cel din dreapta și 3 cel din mijloc. Această variabilă personalizează numerotarea butoanelor mouse-ului. Valoarea sa trebuie să fie trei cifre 1-3 în orice ordine. În mod implicit, ncurses presupune o numerotare de „132”.
NCURSES_ASSUMED_COLORS
Dacă este definită, această variabilă înlocuiește presupunerea compilată a bibliotecii ncurses conform căreia culorile implicite ale terminalului sunt alb pe negru; consultați default_colors(3X). Definiți valorile culorilor de prim-plan și de fundal cu această variabilă de mediu atribuindu-i două valori întregi separate prin virgulă, indicând numerele culorilor de prim-plan și, respectiv, de fundal.
De exemplu, pentru a-i spune lui ncurses să nu presupună nimic cu privire la culori, utilizați o valoare de „-1,-1”. Pentru a face schema de culori implicită verde pe negru, utilizați „2,0”. ncurses acceptă valori integrale de la -1 până la valoarea capacității terminfo max_colors (colors).
NCURSES_CONSOLE2
(Numai pentru adaptarea din MinGW) Programul Console2 gestionează în mod defectuos apelul Microsoft Console API CreateConsoleScreenBuffer. Aplicațiile care îl utilizează se vor bloca. Cu toate acestea, este posibil să se simuleze acțiunea acestui apel prin atribuirea coordonatelor, salvarea explicită și restaurarea conținutului original al ecranului. Definirea variabilei de mediu NCGDB are același efect.
NCURSES_GPM_TERMS
(Numai în Linux) Atunci când ncurses este configurat pentru a utiliza interfața GPM, această variabilă poate enumera unul sau mai multe nume de terminale cu care este comparată variabila TERM (a se vedea mai jos). O valoare goală dezactivează interfața GPM, folosind în schimb suportul integrat al ncurses pentru protocoalele de mouse xterm(1). Dacă variabila este absentă, ncurses încearcă să deschidă GPM dacă TERM conține „linux”.
NCURSES_NO_HARD_TABS
ncurses poate utiliza caractere de tabulare în optimizarea mișcării cursorului. În unele cazuri, este posibil ca controlorul terminalului dvs. să nu le gestioneze corespunzător. Definiți această variabilă de mediu la orice valoare pentru a dezactiva caracteristica. De asemenea, puteți ajusta parametrii stty(1) pentru a evita problema.
NCURSES_NO_MAGIC_COOKIE
Multe terminale stochează atributele video ca o proprietate a unei celule de caractere, așa cum face curses. Din punct de vedere istoric, unele înregistrau modificările atributelor video ca date care ocupă logic celulele de caractere de pe afișaj, activând sau dezactivând atributele, în mod similar cu etichetele dintr-un limbaj de marcare; acestea sunt denumite „magic cookies”, și trebuie să fie ulterior supra-imprimate. Dacă intrarea terminfo pentru tipul dvs. de terminal nu descrie în mod adecvat modul de gestionare a cookie-urilor magice, definiți această variabilă la orice valoare pentru a instrui ncurses să dezactiveze complet atributele.
NCURSES_NO_PADDING
Majoritatea descrierilor tipurilor de terminale din baza de date terminfo detaliază dispozitivele hardware. Multe persoane utilizează aplicații bazate pe curses în programe emulatoare de terminale care rulează într-un mediu cu ferestre. Aceste programe pot reproduce toate caracteristicile importante ale unui terminal hardware, dar adesea lipsesc limitările acestora. Principala problemă a acestor dezavantaje absente este gestionarea fluxului de date, adică limitarea vitezei de comunicare la ceea ce hardware-ul poate gestiona. Cu excepția cazului în care un terminal hardware este interfațat cu un concentrator de terminale (care efectuează controlul fluxului), o aplicație trebuie să gestioneze singură controlul fluxului pentru a preveni depășirile și pierderea datelor.
O soluție care nu implică costuri hardware este ca o aplicație să facă o pauză după ce solicită unui terminal să execute o operație pe care o efectuează lent, cum ar fi ștergerea ecranului. Multe descrieri ale tipurilor de terminale, inclusiv cea pentru VT100, includ specificații de întârziere în capacități. Este posibil să doriți să utilizați aceste descrieri de terminale fără a suferi pierderi de performanță. Definiți NCURSES_NO_PADDING la orice valoare pentru a dezactiva toate umpluturile, cu excepția celor obligatorii. Umplerea obligatorie este utilizată de capacități de terminal precum flash_screen (flash).
NCURSES_NO_SETBUF
(Obsoletă ) Înainte de modificările interne dezvoltate în ncurses 5.9 (plasturii 20120825 până la 20130126), biblioteca folosea setbuf(3) pentru a activa ieșirea stocată complet în tampon la inițializarea terminalului. Acest lucru a fost făcut, precum în SVr4 curses, pentru a crește performanța. În scopuri de testare, atât a ncurses, cât și a anumitor aplicații, această caracteristică a fost făcută opțională. Definirea acestei variabile a dezactivat stocarea în tampon a ieșirii, lăsând fluxul de ieșire în modul original (de obicei, stocarea în tampon de linie).
În prezent, ncurses realizează propria sa stocare în tampon și nu necesită această soluție; nu modifică stocarea în tampon a fluxului de ieșire standard. Această abordare face ca gestionarea semnalelor, precum cea a întreruperilor, să fie mai robustă. Un dezavantaj este că anumite programe neconvenționale amestecau apelurile stdio(3) cu apelurile ncurses și (de obicei) obțineau comportamentul așteptat. Acesta nu mai este cazul; \%ncurses nu scrie în descriptorul de fișier de ieșire standard printr-un flux cu tampon stdio.
Ca un caz special, apelurile API de nivel scăzut precum putp(3X) utilizează în continuare fluxul de ieșire standard. Apelurile curses de nivel înalt precum printw(3X) nu o fac.
NCURSES_NO_UTF8_ACS
La inițializare, ncurses inspectează variabila de mediu TERM pentru cazurile speciale în care se știe că anumite caractere VT100 (și capacitățile corespunzătoare ale setului de caractere alternative terminfo) nu sunt acceptate de tipurile de terminale care pretind compatibilitatea VT100. Mai exact, atunci când rulează într-o configurație regională UTF-8, dispozitivul de consolă virtuală Linux și programul GNU screen(1) le ignoră. Definiți această variabilă la o valoare diferită de zero pentru a instrui ncurses că suportul ACS al terminalului este deteriorat; biblioteca emite apoi puncte de cod Unicode care corespund caracterelor de desenare a formatelor. Definiți-o la zero (sau un număr neîntreg) pentru a dezactiva verificarea specială a numelor tipurilor de terminale care se potrivesc cu «linux» sau «screen», determinând ncurses să presupună că funcția ACS funcționează dacă descrierea tipului de terminal o anunță.
Ca alternativă la utilizarea acestei variabile, ncurses verifică o capacitate numerică extinsă terminfo U8 care poate fi compilată utilizând „tic -x”. Urmăriți exemplele.
# consola linux, dacă i s-au aplicat corecții pentru a oferi # funcționarea VT100 shift-in/shift-out, cu fontul corespunzător. linux-vt100|linux console with VT100 line-graphics, U8#0, use=linux, # uxterm cu resursa vt100Graphics definită la „false” xterm-utf8|xterm relying on UTF-8 line-graphics, U8#1, use=xterm,
Numele de două caractere „U8” a fost ales pentru a permite utilizarea sa prin interfața termcap a ncurses.
NCURSES_TRACE
La inițializare, ncurses (în configurația sa de depanare) verifică prezența acestei variabile. Dacă este definită cu o valoare integrală, biblioteca apelează curses_trace(3X) cu acea valoare ca argument.
TERM
Variabila TERM denotă tipul terminalului. Fiecare este distinct, deși multe sunt similare. Este de obicei definită de emulatoarele de terminale pentru a ajuta aplicațiile să găsească o descriere acceptabilă a terminalului. Unele aleg o aproximare populară, cum ar fi „ansi”, „vt100” sau „xterm”, în loc de o potrivire exactă a capacităților lor. Nu de puține ori, o aplicație va avea probleme cu această abordare; de exemplu, o apăsare de tastă poate să nu funcționeze corect sau să nu producă niciun efect, ci doar caractere aparent de gunoi pe ecran.
Definirea TERM nu are niciun efect asupra funcționării hardware; aceasta afectează modul în care aplicațiile comunică cu terminalul. De asemenea, ca regulă generală (xterm(1) fiind o excepție rară), emulatoarele de terminale care vă permit să specificați TERM ca parametru sau valoare de configurare nu își modifică comportamentul pentru a corespunde acestei valori.
TERMCAP
Dacă ncurses este configurat cu suport termcap, acesta verifică o descriere a tipului de terminal în format termcap dacă nu este disponibilă una în format terminfo. Definirea acestei variabile determină ncurses să ignore locația obișnuită a bazei de date termcap, /etc/termcap; consultați TERMPATH mai jos. TERMCAP trebuie să conțină fie o descriere a terminalului (fără linii noi), fie un nume de fișier care să indice unde sunt stocate informațiile solicitate de variabila de mediu TERM.
TERMINFO
ncurses poate fi configurat pentru a citi bazele de date de descriere a tipului de terminal în diverse locații, utilizând formate diferite. Această variabilă prevalează asupra locației implicite.
- Descrierile în format terminfo sunt stocate în mod normal într-un arbore de directoare care utilizează subdirectoare denumite după primele litere comune ale tipurilor de terminale denumite în acestea. Aceasta este schema utilizată în System V.
- Dacă ncurses este configurat să utilizeze baze de date rezumate „hashed”, atunci TERMINFO poate numi locația sa, cum ar fi /usr/share/terminfo.db, în loc de /usr/share/terminfo/.
Baza de date rezumată utilizează mai puțin spațiu pe disc și este puțin mai rapidă decât arborele de directoare. Cu toate acestea, unele aplicații presupun existența arborelui de directoare și îl citesc direct în loc să utilizeze API-ul terminfo.
- Dacă ncurses este configurat cu suport termcap, această variabilă poate conține locația unui fișier termcap.
- Dacă valoarea TERMINFO începe cu „hex:” sau „b64:”, ncurses utilizează restul valorii ca o descriere compilată terminfo. Puteți produce formatul base64 utilizând infocmp(1M).
-
TERMINFO=$(infocmp -0 -Q2 -q) export TERMINFO
- Descrierea compilată este utilizată numai dacă corespunde tipului de terminal identificat prin TERM.
Definirea TERMINFO este cea mai simplă, dar nu singura, modalitate de a direcționa ncurses către o bază de date a terminalului. Ruta de căutare este următoarea.
- ultima bază de date a terminalului în care a scris aplicația ncurses, dacă există
- locația specificată de variabila de mediu TERMINFO
- $HOME/.terminfo
- locațiile enumerate în variabila de mediu TERMINFO_DIRS
- location(s) configured and compiled into ncurses
- •
- /usr/share/terminfo
TERMINFO_DIRS
Această variabilă specifică o listă de locații, asemănătoare cu PATH, în care ncurses caută descrierile tipurilor de terminale descrise de TERMINFO mai sus. Elementele listei sunt separate prin două puncte în Unix și punct și virgulă în OS/2 EMX. terminfo System V nu are o funcție corespunzătoare; TERMINFO_DIRS este o extensie ncurses.
TERMPATH
Dacă TERMCAP nu conține o descriere a tipului de terminal sau un nume de fișier, atunci ncurses verifică conținutul TERMPATH, o listă de locații, asemănătoare cu PATH, în care caută descrieri ale tipului de terminal termcap. Elementele listei sunt separate prin două puncte în Unix și punct și virgulă în OS/2 EMX. terminfo System V nu are o funcție corespunzătoare; TERMINFO_DIRS este o extensie ncurses.
Dacă TERMCAP și TERMPATH nu sunt definite sau nu sunt valide, ncurses caută fișierele /etc/termcap, /usr/share/misc/termcap și $HOME/.termcap, în această ordine.
CONFIGURAȚII ALTERNATIVE
Sunt posibile multe configurații ncurses diferite, determinate de opțiunile oferite scriptului configure la crearea bibliotecii. Rulați scriptul cu opțiunea --help pentru a le parcurge pe toate. Câteva sunt deosebit de importante pentru dezvoltatorul de aplicații care utilizează ncurses.
- --disable-overwrite
- Includerea standard pentru ncurses este cea menționată în SINOPSIS:
#include <curses.h>
Această opțiune este utilizată pentru a evita conflictele de nume de fișier atunci când ncurses nu este principala implementare a curses a calculatorului. Dacă ncurses este instalat dezactivând suprascrierea, acesta își pune anteturile într-un subdirector, de exemplu,
#include <ncurses/curses.h>
De asemenea, omite o legătură simbolică care v-ar permite să utilizați -lcurses pentru a construi executabile.
- --enable-widec
- Scriptul de configurare redenumește biblioteca și (dacă se utilizează opțiunea --disable-overwrite) pune fișierele de antet într-un alt subdirector. Toate numele bibliotecilor au un „w” adăugat la ele, adică în loc de
-lncurses
legați cu
-lncursesw
De asemenea, trebuie să activați caracteristicile caracterului lat în fișierul antet atunci când compilați pentru biblioteca caracterului lat pentru a utiliza funcțiile extinse (caracter lat). Simbolul care activează aceste funcții s-a schimbat de la Curses X/Open, ediția 4:
- Inițial, caracteristica de caractere late necesita simbolul _XOPEN_SOURCE_EXTENDED, dar acesta era valabil numai pentru XPG4 (1996).
- Ulterior, acest lucru a fost considerat conflictual cu _XOPEN_SOURCE definit la 500.
- De la mijlocul anului 2018, niciuna dintre caracteristicile din această implementare nu necesită o caracteristică _XOPEN_SOURCE mai mare de 600. Cu toate acestea, Curses X/Open, ediția 7 (2009) recomandă definirea acesteia la 700.
- Alternativ, puteți activa caracteristica prin definirea NCURSES_WIDECHAR cu avertismentul că un alt fișier antet decât curses.h poate necesita o valoare specifică pentru _XOPEN_SOURCE (sau un simbol specific sistemului).
Fișierul de antet curses.h instalat pentru biblioteca de caractere late este conceput pentru a fi compatibil cu antetul bibliotecii „non-wide”. Doar dimensiunea structurii WINDOW diferă; puține aplicații necesită mai mult decât indicatori la WINDOW-uri.
Dacă antetele sunt instalate permițând suprascrierea, antetele bibliotecii de caractere late ar trebui să fie instalate ultimele, pentru a permite construirea de aplicații folosind ambele biblioteci din același set de antete.
- --with-pthread
- Scriptul de configurare redenumește biblioteca. Toate numele bibliotecilor au un „t” adăugat la ele (înainte de orice „w” adăugat de --enable-widec).
- Variabilele globale precum LINES sunt înlocuite cu macroinstrucțiuni pentru a permite accesul numai la citire. În același timp, sunt furnizate funcții de configurare (setter-functions) pentru a defini aceste valori. Unele aplicații (foarte puține) pot necesita modificări pentru a funcționa cu această convenție.
- --with-shared
-
- --with-normal
-
- --with-debug
-
- --with-profile Numele bibliotecilor partajate și normale (statice) diferă
- prin sufixele lor, de exemplu, libncurses.so și libncurses.a. Bibliotecile de depanare și de profilare adaugă un „_g” și respectiv un „_p” la numele rădăcinii, adică libncurses_g.a și libncurses_p.a.
- --with-termlib
- Funcțiile de nivel scăzut, care nu depind de faptul că biblioteca acceptă sau nu caractere late, sunt furnizate în biblioteca tinfo.
- Astfel, este posibilă partajarea bibliotecii tinfo între configurațiile late/normale, precum și reducerea dimensiunii bibliotecii atunci când sunt necesare doar funcții de nivel scăzut.
- Aceste funcții sunt descrise în aceste pagini:
- curs_extend(3X) - extensii diverse curses
- curs_inopts(3X) - opțiuni de intrare curses
- curs_kernel(3X) - rutine curses de nivel redus
- curs_termattrs(3X) - rutine de interogare a mediului curses
- curs_termcap(3X) - emularea curses a termcap
- curs_terminfo(3X) - interfața curses cu baza de date terminfo
- curs_util(3X) - diverse rutine utilitare curses
- --with-trace
- Funcția trace se află în mod normal în biblioteca de depanare, dar uneori este util să configurați această funcție în biblioteca partajată. Scripturile de configurare ar trebui să verifice existența funcției în loc să presupună că aceasta se află întotdeauna în biblioteca de depanare.
FIȘIERE
- /usr/share/tabset
- baza de date de inițializare oprire a tabulatorului
- /usr/share/terminfo
- baza de date compilată privind capacitatea terminalelor
NOTE
Curses X/Open permite ca majoritatea funcțiilor pe care le specifică să fie disponibile și ca macroinstrucțiuni. ncurses face acest lucru
- pentru funcțiile care returnează valori prin intermediul parametrilor lor,
- pentru a oferi suport pentru caracteristici învechite,
- pentru reutilizarea funcțiilor (de exemplu, cele care mută cursorul înainte de o altă operație), și
- în câteva cazuri speciale.
Dacă descriptorul de fișier al ieșirii standard al unui program ncurses este redirecționat către ceva care nu este un dispozitiv de terminal, biblioteca scrie actualizările ecranului în descriptorul de fișier al ieșirii de eroare standard. Aceasta a fost o caracteristică nedocumentată a SVr3 curses.
Consultați subsecțiunea «Fișiere antet» de mai jos privind simbolurile expuse prin includerea lui curses.h.
EXTENSII
ncurses permite unei aplicații să capteze evenimentele mouse-ului pe anumite terminale, inclusiv xterm(1); consultați curs_mouse(3X).
ncurses oferă un mijloc de a răspunde evenimentelor de redimensionare a ferestrei, ca atunci când rulează într-o aplicație emulator de terminal GUI, cum ar fi xterm; consultați resizeterm(3X) și wresize(3X).
ncurses permite unei aplicații să solicite terminalului prezența unei mari varietăți de taste speciale; consultați has_key(3X).
ncurses extinde setul fix de capacități ale tastelor funcționale specificate de Curses X/Open permițând programatorului de aplicații să definească evenimente suplimentare ale tastelor în timpul execuției; consultați define_key(3X), key_defined(3X), keybound(3X) și keyok(3X).
ncurses poate exploata capacitățile terminalelor care implementează secvențele ISO 6429/ECMA-48 SGR 39 și SGR 49, care permit unei aplicații să readucă terminalul la culorile inițiale de prim-plan și de fundal. Din punctul de vedere al utilizatorului, aplicația este capabilă să deseneze text colorat pe un fundal a cărui culoare este stabilită independent, oferind un control mai bun asupra contrastelor de culoare. A se vedea default_colors(3X).
O aplicație ncurses poate evita cunoașterea structurii interne WINDOW, folosind în schimb funcții de accesare precum is_scrollok(3X).
ncurses permite unei aplicații să direcționeze ieșirea aplicației către o imprimantă atașată la dispozitivul de terminal; consultați curs_print(3X).
ncurses oferă slk_attr(3X) ca o variantă contrară a attr_get(3X) pentru liniile de taste cu etichetă software și extended_slk_color(3X) ca o formă a slk_color(3X) care poate colecta informații despre culoare de la acestea atunci când sunt acceptate mai multe culori.
Unele extensii sunt disponibile numai dacă ncurses permite modificarea comportamentului lui unctrl(3X); consultați use_legacy_coding(3X). ncurses este compilat pentru a le accepta; secțiunea «CONFIGURAȚII ALTERNATIVE» descrie cum.
- Poate fi disponibil un suport rudimentar pentru aplicațiile multi-fir; consultați curs_threads(3X).
- Funcțiile care facilitează gestionarea ecranelor multiple pot fi expuse; a se vedea curs_sp_funcs(3X).
- Pentru a ajuta aplicațiile să își depaneze utilizarea memoriei, ncurses oferă opțional funcții pentru a elibera mai agresiv memoria pe care o alocă dinamic; a se vedea curs_memleaks(3X).
- Biblioteca facilitează auditarea și depanarea comportamentului său; a se vedea curs_trace(3X).
- Opțiunea de compilare -DUSE_GETCAP face ca biblioteca să revină la citirea /etc/termcap dacă codul de configurare a terminalului nu poate găsi o intrare terminfo corespunzătoare lui TERM. Utilizarea acestei funcții nu este recomandată, deoarece include, în esență, un întreg compilator termcap în codul de pornire ncurses, cu un cost în ceea ce privește utilizarea memoriei și latența lansării aplicației.
PDCurses și curses NetBSD includ unele extensii ncurses. Paginile de manual individuale indică unde acesta este cazul.
PORTABILITATE
Curses X/Open definește două niveluri de conformitate, „base” și „enhanced”. Acesta din urmă include câteva caracteristici suplimentare, cum ar fi suportul pentru caractere late și culori. ncurses intenționează conformitatea la nivel de bază cu Curses X/Open, și acceptă toate caracteristicile nivelului său îmbunătățit, cu excepția utilitarului untic.
Diferențele dintre Curses X/Open și ncurses sunt documentate în secțiunile «PORTABILITATE» din paginile de manual aplicabile.
Verificarea erorilor
În multe cazuri, Curses X/Open este vag cu privire la condițiile de eroare, omițând o parte din documentația SVr4.
Spre deosebire de alte implementări, ncurses verifică parametrii de tip indicator, cum ar fi cei pentru structurile WINDOW, pentru a se asigura că nu sunt nule. Acest lucru se face în primul rând pentru a proteja împotriva erorilor programatorului. Interfața standard nu prevede o modalitate prin care biblioteca să indice unei aplicații care dintre mai multe erori posibile a avut loc. Bazarea pe această extensie (sau pe alta) afectează în mod negativ portabilitatea aplicațiilor curses.
Diferențe de umplere
În implementările istorice ale curses, întârzierile încorporate în capacitățile terminfo carriage_return (cr), scroll_forward (ind), cursor_left (cub1), form_feed (ff) și tab (ht) activau biții de întârziere corespunzători în controlorul de terminal Unix. ncurses efectuează toată umplerea prin trimiterea de octeți NUL către dispozitiv. Această metodă este puțin mai costisitoare, dar restrânge semnificativ interfața cu nucleul Unix și crește corespunzător portabilitatea pachetului.
Fișiere antet
Fișierul de antet curses.h include fișierele de antet stdio.h și unctrl.h.
Curses X/Open are mai multe de spus,
Includerea curses.h poate face vizibile toate simbolurile din antetele stdio.h, term.h, termios.h și wchar.h.
dar nu încheie povestea. Urmează o relatare mai completă.
- •
- Începând cu 4BSD curses (1980), toate implementările au furnizat un fișier curses.h.
- Codul curses BSD includea curses.h și unctrl.h dintr-un fișier de antet intern curses.ext, unde „ext” abrevia „externs”.
- Implementările printw și scanw au utilizat funcții interne nedocumentate ale bibliotecii de In/Ieș standard (_doprnt și _doscan), dar nimic în curses.h nu s-a bazat pe stdio.h.
- •
- curses SVr2 a adăugat newterm, care se bazează pe stdio.h deoarece prototipul funcției sale utilizează tipul FILE.
- curses SVr4 a adăugat putwin și getwin, care utilizează și stdio.h.
- Curses X/Open specifică toate aceste trei funcții.
- curses SVr4 și Curses X/Open nu solicită dezvoltatorului să includă stdio.h înainte de curses.h. Ambele documentează utilizarea curses ca necesitând doar curses.h.
- Ca urmare, standardul curses.h include întotdeauna stdio.h.
- •
- Curses X/Open și curses SVr4 nu sunt compatibile cu unctrl.h.
- După cum se menționează în curs_util(3X), ncurses include unctrl.h din curses.h (așa cum face SVr4).
- •
- Comentariile din Curses X/Open despre term.h și termios.h se pot referi la HP-UX și AIX.
- curses HP-UX include term.h din curses.h pentru a declara setupterm în curses.h, dar ncurses și curses Solaris nu.
- curses AIX include term.h și termios.h. Din nou, ncurses și curses Solaris nu.
- •
- Curses X/Open spune că curses.h poate include term.h, dar nu îi cere să facă acest lucru.
- Unele programe utilizează funcții declarate atât în curses.h, cât și în term.h, și trebuie să includă ambele fișiere de antet în același modul. Versiunile foarte vechi ale curses AIX impuneau includerea curses.h înaintea term.h.
- Fișierele de antet furnizate de ncurses includ antetele bibliotecii standard necesare pentru declarațiile sale, astfel încât propriile fișiere de antet ale ncurses pot fi incluse în orice ordine. Dar pentru portabilitate, ar trebui să includeți curses.h înainte de term.h.
- •
- Curses X/Open spune „poate face vizibile” deoarece includerea unui fișier antet nu face neapărat vizibile toate simbolurile din acesta (luați în considerare #ifdef și altele similare).
- De exemplu, ncurses's curses.h may include wchar.h dacă simbolul corespunzător este definit și dacă ncurses este configurat pentru suportul caracterelor late. Dacă wchar.h este inclus, simbolurile sale pot fi făcute vizibile în funcție de valoarea macroinstrucțiunii de testare a caracteristicilor _XOPEN_SOURCE.
- •
- Curses X/Open impune includerea de către o aplicație a unui antet de bibliotecă C standard într-un caz special: stdarg.h înainte de curses.h pentru a prototipa funcțiile vw_printw și vw_scanw (precum și învechitele vwprintw și vwscanw). Fiecare dintre acestea ia o listă de argumente variadice, un parametru va_list, precum cel al printf(3).
- curses SVr3 a introdus două funcții învechite, iar Curses X/Open pe celelalte. Între timp, curses SVr4 a prevăzut posibilitatea ca o aplicație să includă fie varargs.h, fie stdarg.h. Acestea reprezentau abordări contrastante pentru gestionarea listelor de argumente variadice. Interfața mai veche, varargs.h, folosea un indicator către char pentru parametrul va_list al funcțiilor variadice. Ulterior, lista și-a dobândit propriul tip de date standard, va_list, definit în stdarg.h, permițând compilatorului să verifice tipurile parametrilor reali ai unui apel de funcție în raport cu cele formale declarate în prototipul său.
- Nicio implementare conformă a Curses X/Open nu solicită unei aplicații să includă stdarg.h înaintea curses.h, deoarece fie au permis pentru un tip special, fie, precum ncurses, includ ele însele stdarg.h pentru a oferi o interfață portabilă.
AUTORI
Zeyd M. Ben-Halim, Eric S. Raymond, Thomas E. Dickey. Bazat pe pcurses de Pavel Curtis.
CONSULTAȚI ȘI
TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.
27 aprilie 2024 | ncurses 6.5 |