#### # # ##### #### ###### #### # # # # # # # # # # # # # # #### ##### #### # # # ##### # # # # # # # # # # # # # # #### #### # # #### ###### #### Curses ------ Ein Unterprogrammpaket fuer eine guenstige Terminalprogrammierung ----------------------------------------------------------------- Inhalt : -------- 1. Cursesinitialisierung und -beendigung 1.1 Compilieren und Linken 2. Windowmanagement 2.1 Windowdefinition 2.2 Window loeschen 2.3 Window aktualisieren 2.4 Cursorverarbeitung in einem Window 2.5 Scrollmechanismus in einem Window 3. Zeichenausgabe 4. Zeicheneingabe in einem Window 5. Loeschen innerhalb eines Windows 6. Windowmanipulation 7. Menuegestaltung 8. Videoattribute 9. Terminalsteuerung 9.1 Terminalmodi 9.2 Zeicheneingabe 10. Termcapmodifikation 10.1 neue Termcapentries 10.2 Termcapentries die unbedingt vorhanden sein sollten 11. Weitere Unterprogramme 12. Moeglichkeiten der Nutzung von Curses aus Pascal 1. Cursesinitialisierung und -beendigung ----------------------------------------- 1.1 Compilieren und Linken -------------------------- Beispielprogramm : % vi test.c #include /* enthaelt saemtliche Curses Definitionen */ main () { initscr() ; /* Curses Initialisierung */ : endwin () ; /* Curses Beendigung */ } % cc test.c -lcurses -ltermlib % a.out - initscr () Dieser Programmruf initialisiert den Curses - Manager, wertet die Termcap aus, loescht den Bildschirm, belegt die globalen Variablen und muss deshalb vor Benutzung anderer Curses - Funktionen gegeben werden. Ausserdem wird ein Standardwindow curscr definiert, das ein genaues Abbild des Bildschirms enthaelt und bei der Funktion "wrefresh(...)" ( --> ) zur Optimierung der Zeichenausgabe benutzt wird. - endwin () Durch diesen Unterprogrammruf werden die Curses - Funktionen geschlossen und der belegete Speicher freigegeben. Weiterhin wird das Terminal in seinem urspruenglichen Zustand versetzt (z.B. cooked Mode und Echo). 2. Windowmanagement ------------------- 2.1 Windowdefinition --------------------- - WINDOW *newwin (lines, cols, begin_y, begin_x) int lines, cols, begin_y, begin_x ; Die Funktion "newwin" generiert ein Window das aus "lines" Zeilen und "cols" Spalten besteht. Wird dieses Window sichtbar (durch die Procedure "wrefresh") gemacht, dann ist seine Bildschirmposition die "begin_y" -te Zeile und "begin_x" -te Spalte. Als Funktionswert liefert "newwin" einen Pointer auf das definierte Window oder den Wert ERR , der in curses.ext definiert ist. 2.2 Window loeschen ------------------- - delwin (window) WINDOW *window ; Diese Funktion loescht ein mit "newwin(...)" definiertes Window und gibt saemtliche durch das Window belegte Ressourcen frei. 2.3 Window aktualisieren ------------------------ - wrefresh (window) WINDOW *window ; Erst durch diese Funktion wird der Inhalt des Windows auf dem Bildschirm dargestellt. Dabei werden mehrere Optimierungen wirksam. Die 2 wichtigsten sollen hier kurz erlaeutert werden. 1. Fuer jede Zeile eines Windows existieren 2 Variablen, die aussagen ob bzw. zwischen welchen Spalten dieser Zeile sich der Inhalt veraendert hat. Diese Variablen bezeichnen also first_change und last_change einer Zeile. Bei "wrefresh(...)" laeuft ein aeusserer Zyklus ueber alle Zeilen des Windows und testet dabei first_change und last_change. Nur wenn diese Variablen entsprechend gesetzt sind, wird auch der 2. oder innerre Zyklus durchlaufen. 2. Dieser innere Zyklus laeuft nun ueber eine Zeile von Spalte first_change bis Spalte last_change. Dabei wird noch ein Vergleich des aktuellen Zeichens dieser Zeile mit dem entsprechenden Zeichen im curscr (--> "initscr(...)" ) durchgefuehrt. Nur wenn sich diese Zeichen unterscheiden wird das Zeichen aus dem Window in den curscr uebernommen und auf dem Bild- schirm dargestellt. Als Funktionswert liefert "wrefresh(...)" OK bzw. ERR wenn das Window window nicht sichtbar ist. s.a. wvisual(..) , initscr(..) - wrefresh_all() Diese Funktion realisiert einen zyklischen Aufruf von "wrefresh(...)" fuer alle definierten Windows, die nicht mit der Funktion "wnovisual(...)" unsichtbar gemacht wurden. Dabei wird "wrefresh(...)" fuer die einzelnen Windows in der Reihenfolge aufgerufen, wie sie mittels der Funktionen "menue(...)" oder "newwin(...)" definiert wurden. Diese Funktion ist wichtig, wenn z.B. Systemfunktionen angestossen werden, die einen grossen Output haben. Dieser Output sollte moeglichst nicht in Windows dargestellt werden, da das dann notwendige Scrollen im Window sehr zeitintensiv ist. Eine bessere Loesung soll im folgende Beispiel gegeben werden. Beispielprogramm: #include main() {initscr() ; . . _puts(CL) ; /* clear the screen */ system("more a.b") ; wrefresh_all() ; . . endwin () ; } - touchwin (window) WINDOW *window ; Durch diese Funktion werden die Variablen first_change und last_change ( --> "wrefresh(...)" ) fuer jede Zeile des Windows window auf 0 bzw. die rechte Grenze gesetzt . Die Anwendung dieser Funktion ist notwendig wenn - ein Window durch ein zweites Window voellig oder teilweise ueberlagert wurde, - dieser ueberlagerte Teil des Windows auf dem Bildschirm wieder sichtbar werden soll, - sich am Inhalt des Windows aber nichts geaendert hat. Bei diesen Bedingungen sind first_change und last_change nicht gesetzt und bei einem "wrefresh(...)" wuerde durch die erste Optimierung ( --> "wrefresh(...)" ) der verdeckte Teil des Windows nicht wieder sichtbar. - touchline (window, line, start, end ) WINDOW *window ; int line, start, end ; Die Funktion "touchline(...)" setzt die Variablen first_change und last_change fuer die Zeile line des Windows window auf start bzw. end . 2.4 Cursorverarbeitung in einem Window -------------------------------------- - wmove (window, y_koordinate, x_koordinate) WINDOW *window ; int y_koordinate , x_koordinate; Der interne Cursur des angegebenen Windows window wird auf die neuen Koordinaten y_koordinate,x_koordinate gesetzt. Die naechste I/O Anforderung von diesem Window wird ab dieser Position realisiert. z.B. wmove (win_output, 5,6 ) waddstr_r (win_output, " Text1 ") ; "wmove(...)" liefert den return-Wert ERR wenn die Koordinaten ausserhalb des Windows liegen. Ansonsten OK . - getyx(window, y_koordinate, x_koordinate) /* Macro */ WINDOW *window ; int y_koordinate, x_koordinate ; Dieses Macro liefert die aktuelle Position des Cursors des angegebenen Windows window. Rueckgabeparameter sind y_koordinate und x_koordinate. !! Der folgende Aufruf ist falsch da es sich bei getyx() um ein Macro handelt. Es darf kein Adressoperator vor zeile und spalte stehen. . int zeile,spalte ; . . getyx(test_window,&zeile,&spalte) ; . . - mvwin (window,y_koordinate, x_koordinate) WINDOW *window ; int y_koordinate, x_koordinate ; "mvwin(...)" verschiebt das angegebene Window window auf die Position y_koordinate (Zeile) , x_koordinate (Spalte), wobei y_koordinate,x_koordinate die Position der linken oberen Ecke beschreiben. Der Inhalt des Windows bleibt unveraendert. Die Verschiebung wird nicht ausgefuehrt, wenn die Summe von neuer Zeilenposition und Zeilenanzahl des Windows bzw. die Summe von neuer Spaltenposition und Spaltenanzahl des Windows groesser ist als die Zeilenanzahl bzw. die Spaltenanzahl des Bildschirms. (Return-Wert = ERR) Sofern das zu verschiebende Window sichtbar ist, wird es auf dem Bildschirm geloescht. 2.5 Scrollmechanismus in einem Window ------------------------------------- - scrollok(window, boolf) /* Macro */ WINDOW *window ; int boolf ; "scrollok(...)" ist ein Macro, welches ein scroll-Flag in der Windowstruktur setzt. Nur wenn dieses Flag gesetzt ist, ist es moeglich im Window zu scrollen. - scroll (window) WINDOW *window ; Diese Funktion scrollt den Inhalt des Windows eine Zeile nach oben. Der Aufruf dieser Fumktion erfolgt z.B. in "waddch(...)", und sollte vom Nutzer nicht explizit verwendet werden. s.a. scrollok(...) 3. Zeichenausgabe ----------------- - waddch (window, chr) WINDOW *window ; char chr ; "waddch(...)" fuegt das Zeichen chr an der aktuellen Cursor- position des Windows window ein. Wenn das Zeichen ein newline ('\n') ist, wird die Zeile bis zum Ende geloescht und der interne Cursor wird auf den Anfang der naechsten Zeile gestellt. Tabulatorzeichen werden in Leerzeichen umgewandelt. Bei Erreichen der letzten Spalte wird auto- matisch auf die naechste Zeile uebergegangen. Falls die letzte Spalte in der letzten Zeile erreicht ist und scrollok gesetzt wurde, wird der Inhalt eine Zeile nach oben gescrollt und der Cursor auf den Zeilenanfang posi- tioniert. "waddch(...)" liefert ERR , wenn die letzte Spalte der letzten Zeile erreicht ist und das scroll-Flag nicht gesetzt ist ( s.a. "scrollok(...)" ) . - waddstr (window, string) - waddstr_r (window, string) - waddstr_video (window, string, videoattribut) - waddstr_video_r (window, string, videoattribut) WINDOW *window ; char *string ; int videoattribut ; Diese Funktionen fuegen ab der aktuellen Cursorposition strings in das Window ein, wobei zyklisch die Funktion "waddch(...)" gerufen wird. "waddstr_r(...)" fuehrt nach dem eintragen des strings noch ein "wrefresh(...)" durch. "waddstr_video(...)" schreibt den string mit dem angegebenen videoattribut in das Window. "waddstr_video_r(...)" entspricht "waddstr_video(...)" mit einem angefuegten "wrefresh(...)" . Da diese Funktionen alle "waddch(...)" benutzen ergibt sich das gleiche Fehlerverhalten. - winsch (window, chr) WINDOW *window ; char chr ; "winsch(...)" fuegt an der aktuellen Cursorposition das angegebene Zeichen chr ein, wobei die rechts stehenden Zeichen um eine Position nach rechts ruecken und das letzte Zeichen verloren geht. "winsch(...)" liefert ERR , wenn auf die letzte Spalte der letzten Zeile geschrieben werden soll und das scroll-Flag nicht gesetzt ist. - winsertln (window) WINDOW *window ; "winsertln(...)" fuegt vor der aktuellen Zeile eine Leerzeile ein. Dabei werden die unteren Zeilen um eine Position nach unten verschoben und die letzte Zeile geht verloren. Die Cursorposition bleibt unveraendert. - mvwaddch(window,y,x,ch) /* Macro */ - mvwaddstr(window,y,x,str) /* Macro */ Diese Macros realisieren eine Kombination von "wmove(...)" und "waddch(...)" bzw. "waddstr(...)" . 4. Zeicheneingabe in einem Window --------------------------------- - char wgetch (window) WINDOW *window ; "wgetch(...)" wartet auf die Eingabe eines Zeichens ueber die Tastatur. In Abhaengigkeit davon ob "echo()" oder "noecho()" gesetzt wurde, wird das Zeichen auf dem Bildschirm ange- zeigt oder nicht. "wgetch(...)" liefert den Wert ERR , wenn - der interne Cursor auf der letzten Position des Windows steht und das scroll-Flag nicht gesetzt ist, oder - das angegebene Window nicht sichtbar ist. - wgetstr (window, string) WINDOW *window ; char *string ; Die Funktion "wgetstr(...)" realisiert eine Stringeingabe ueber das spezifizierte Window. Durch die Eingabe eines newline wird diese Funktion beendet. "wgetstr(...)" hat das gleiche Fehlerverhalten wie "wgetch(...)" . - wgetline(window, string, anzahl) WINDOW *window ; char *string ; int anzahl ; Die Funktion "wgetline(..)" arbeitet im wesentlichen wie die Funktion "wgetstr(...)" besitzt aber noch eine weiter Abbruch- bedingung. Der Parameter "anzahl" beschreibt die Laenge des Strings. Die Funktion gibt das Zeichen newline nicht als gelesenes Zeichen zurueck ! - wgetline_m(window, string, anzahl) WINDOW *window ; char *string ; int anzahl ; Die Funktion "wgetline_m(..)" gibt vor der Zeicheneingabe eine Eingabemaske aus. Dann wird die Funktion "wgetline(...)" aufgerufen. - mvwgetch(window,y,x) /* Macro */ Dieser Macro relisiert eine Kombination von "wmove(...)" und "wgetch(...)". - mvwgetstr(window,y,x,str) /* Macro */ Dieser Macro relisiert eine Kombination von "wmove(...)" und "wgetstr(...)". - winch (window) WINDOW *window ; Diese Funktion gibt das Zeichen von der aktuellen x,y Koordinate als Ergebnis zurueck. Das Window wird dabei nicht modifiziert. 5. Loeschen innerhalb eines Windows ----------------------------------- - werase (window) WINDOW *window ; Das angegebene Window wird mit Leerzeichen gefuellt. Ein in "werase(...)" enthaltenes "wrefresh(...)" transpor- tiert die Leerzeichen sofort auf den Bildschirm. "werase(...)" zerstoert die Box nicht. Die interne Cursorposition wird auf (0,0) bzw. (1,1) gesetzt, wenn eine Box vorhanden ist. - wclrtobot (window) WINDOW *window ; Diese Funktion loescht den Inhalt des Windows ab der aktuellen Cursorposition. Die Cursorposition bleibt unveraendert. - wclrtoeol (window) WINDOW *window ; "wclrtoeol(...)" loescht den Rest der aktuellen Zeile. - wdelch (window) WINDOW *window ; "wdelch(...)" loescht das Zeichen auf der aktuellen Cursorposition und verschiebt die restlichen um eine Stelle nach links. Am Ende wird ein Leerzeichen angehangen. Die Cursorposition bleibt unveraendert. - wdeleteln (window) WINDOW *window ; "wdeleteln(...)" loescht die gerade aktuelle Zeile, wobei alle folgendem um eine Position nach oben rutschen. Am Ende wird eine Leerzeile eingefuegt. 6. Windowmanipulation --------------------- - box (window, vert_char, hor_char) WINDOW *window char vert_char, hor_char Die Funktion "box(...)" belegt den Rand eines Windows mit den angegebenen Zeichen vert_char und hor_char. Falls vert_char und hor_char gleich 0 sind werden entsprechende Eintraege aus der Termcap fuer das Erstellen der Box verwendet . ( s. 9.1 ) - label_box(window, string, video_attribut) WINDOW *window ; char *string ; int video_attribut ; "label_box(...)" versieht das Window window mit einem Namen und traegt diesen auf dem oberen Rahmen des Windows mit dem angegebenen video_attribut ein. Diese Funktion kann auch mehrmals verwendet werden, um das Window umzubenennen. - wchange_label_att(window,video_attribut) WINDOW *window ; int video_attribut ; Mit dieser Funktion ist es moeglich das video_attribut des Windownamens nachtraeglich zu aendern. - wvisual (window) WINDOW *window ; "wvisual(...)" setzt ein Visual-flag in der Windowstruktur und visualisiert das Window mittels "wrefresh(...)" . - wnovisual (window) WINDOW *window ; "wnovisual(...)" ist das Gegenstueck von "wvisual(...)". Diese Funktion setzt das Visual-flag zurueck, loescht das Window window auf dem Bildschirm und stellt den Inhalt der anderen sichtbaren Windows wieder her. 7. Menuegestaltung ------------------- - menue(window,menue_strings,menue_pos,wpy,wpx,vert,hor,label,attribut) WINDOW **window ; char **menue_strings ; int *menue_pos ; int wpy,wpx ; char vert, hor ; char *label ; int attribut ; "menue(...)" ist eine universelle Funktion, die es auf einfache Art gestattet Menue-Windows zu erzeugen. Diese koennen dann mit der Funktion get_menue_cmd benutzt werden. "menue(...)" beinhaltet die Funktionsaufrufe von "newwin(..)" , "box(..)", "label_box(..)" und "wvisual(..)" . Durch "menue(...)" koennen 3 Arten von Menue_Windows erzeugt werden. Die Art des erzeugten Windows wird durch den Parameter menue_pos bestimmt. Die 3 Arten werden nach folgenden Regeln gebildet: 1. Standardmenue - Zur Erzeugung eines solchen Menues muss menue_pos ein Pointer auf eine -1 sein. - Das Standardmenue wird so aufgebaut, dass sich die Zeilenanzahl aus der Anzahl der Substrings in menue_strings und die Spaltenanzahl nach max(strlen(menue_strings[..])) + 5 ergibt. - Die Substrings werden innerhalb des Menue-Windows untereinander angeordnet. 2. Menue mit Positionierung - menue_pos enthaelt fuer jeden Substring aus menue_strings die Position im Window (Zeile,Spalte). - Die Funktion "menue(...)" berechnet aus den Positionen der Substrings und deren Laengen automatisch die Windowgroesse. 3. Menue mit Positionierung und frei waehlbaren Windowgrenzen - Der Unterschied zwischen Menueart 2 und 3 besteht darin, dass bei der Art 2 die ersten beiden Elemente von menue_pos gleich 0 sein muessen, waehrend diese bei Menueart 3 die absolute Groesse des Windows spezifizieren. - Bei dieser Art Menue hat der Nutzer selbst dafuer zu sorgen, dass das Window gross genug ist, um alle Substrings aufnehmen zu koennen. Zu den einzelnen Parametern einige Bemerkungen: - window: Adresse eines Pointers auf eine Window- struktur. Der Inhalt dieses Pointers muss beim ersten Aufruf von "menue(...)" den Wert 0 haben. - menue_strings: Feld von strings variabler Laenge, wobei das letzte Element eine 0 sein muss !!! - wpy,wpx: Position der linken oberen Ecke des Windows. - vert, hor: Parameter fuer die Funktion box . - label, attribut: Parameter fuer die Funktion label_box . Bei Benutzung von "menue(...)" zur Erzeugung von Submenues realisiert diese Funktion, dass das Label und der selektierte Substring mit dem Videoattribut _UNDERLINE dargestellt werden. - int get_menue_cmd (window,ch) WINDOW *window ; char *ch ; Die Funktion "get_menue_cmd(...)" gestattet es dem Benutzer aus einem mit der Funktion "menue(...)" definierten Window ein Kommando zu lesen. Dabei akzeptiert "get_menue_cmd(...)" nur folgende Tasten: - Richtungstaste unten - Richtungstaste oben - return-Taste - Leertaste als Kommandobestaetigung sowie - die Anfangsbuchstaben der Substrings. Bei mehreren Substrings mit gleichem Anfangsbuchstaben wird immer der erste Substrings ausgewaehlt. Es werden 2 Ergebnisse geliefert: 1. der Funktionswert als Index des selektierten Substrings ( Zaehlung beginnt bei 1 !! ) und 2. der Anfangsbuchstabe des Substrings ( als Gross- buchstabe !! ) . Diese Funktion realisiert auch das markieren der aktuellen Position innerhalb des Menues durch Darstellung mittels inversen Balkens. - leave_submenue(window1,window2,message) WINDOW *window1, *window2 ; char *message ; "leave_submenue(...)" raelisiert die ordnungsgemaesse Rueckkehr aus einem durch die Funktion "menue(...)" erzeugten Submenue. Dabei wird das zu verlassende Menue-Window window1 auf dem Bildschirm geloescht und das vorhergehende Window als aktives Window markiert, d.h. das Label des Windows wird mit dem Videoattribut dargestellt, das beim Uebergang in das Submenue aktiv war. Gleichzeitig wird der Substring, der zur Aktivierung des Submenues fuehrte, wieder invers dargestellt. window2 gibt ein Window an, in welchem die Mitteilung message ausgegeben werden kann. message kann aber auch ein leerer String sein. !!!! Zur Beachtung !!!! Die Funktionen "menue(...)" und "leave_submenue(...)" muessen immer paarweise benutzt werden. "leave_submenue(...)" liefert den return-Wert ERR , wenn die Aufrufreihenfolge ( "menue(...)" ... "leave_submenue(...)" ) nicht eingehalten wurde . Beispiel: --------- #include WINDOW *w1 = 0 ; WINDOW *w2 = 0 ; WINDOW *w3 = 0 ; char *m1[] = {"komm1","komm2","quit",0} ; char *m2[] = {"a2","b2","quit",0} ; char *m3[] = {"a3","b3","quit",0} ; int ind ; int a1[] = {-1} ; int a2[] = {0,0, 1,1, 2,10, 5,30} ; int a3[] = {10,45, 8,20, 3,5, 5,35} ; main() { char ch1 ; initscr() ; menue(&w1,m1,a1,0,0,0,0," Window1 ",_REVERSE) ; /* Standardmenue auf Position (0,0) mit Standardbox */ for (;;) { ind = get_menue_cmd(w1,&ch1) ; if ( ch1 == 'Q') break ; switch (ind) { case 1: {open_menue2() ; break ; } case 2: {open_menue3() ; break ; } case 3: {endwin() ; return ; } } } endwin() ; } open_menue2() { char ch2 ; menue(&w2,m2,a2,10,15,'%',':'," Window2",_BLINK) ; /* Menue mit Positionierung auf Position (10,15) . Positionen der Substrings in a2 */ ind = get_menue_cmd(w2,&ch2) ; if (ch2 == 'A') ..... if (ch2 == 'B') ..... if (ch2 == 'Q') { leave_submenue(w2,w1,"") ; return ; } } open_menue3() { menue(&w3,m3,a3,5,20,0,0," Window3 ", (_REVERSE | _BLINK)) ; /* Menue mit Positionierung und frei waehlbaren Windowgrenzen auf Position (5,20) . Positionen der Substrings in a3 */ . . } 8 . Videoattribute ------------------ _REVERSE _BLINK _BOLD _UNDERLINE - wstandout (window) WINDOW *window ; "wstandout(...)" leitet die Ausgabe von strings mit dem Videoattribut _REVERSE ein. Es ist ein Spezialfall der Funktion "wset_video(...)" ( --> ). Das eingestellte Videoattribut ist solange gueltig, bis es durch einen Funktionsaufruf von "wstandend(...)" oder "wset_video(...)" aufgehoben wird. - wstandend (window) WINDOW *window ; "wstandend(...)" beendet das Ausgeben mit Videoattribut. Alle folgenden Ausgabe erfolgen im normalen Terminalmode. - wset_video(window,video_attribut) WINDOW *window ; int video_attribut ; "wset_video(...)" leitet die Ausgabe von strings mit dem angegebenen Videoattribut ein. Die Wirkung des angegebenen Videoattributs wird durch "wstandend(...)" , "wstandout(...)" oder ein erneutes "wset_video(...)" aufgehoben. 9. Terminalsteuerung -------------------- 9.1 Terminalmodi ---------------- - cbreak() - nocbreak() Das Terminal wird in den "cbreak mode" versetzt oder mit "nocbreak()" aus diesem in den Standardmodus (cooked) zu- rueckversetzt. Im "cbreak mode" werden die Zeichen und nicht behandelt. Jedes Zeichen wird sofort zum "read" weitergereicht. - raw() - noraw() Das Terminal wir in den "raw mode" versetzt. Im "raw mode" werden die Zeichen , , , und nicht behandelt. Der Befehl "noraw()" versetzt das Terminal in seinen Standardmodus (cooked). 9.2 Zeicheneingabe ------------------ - nl() Die Zeichen als auch sind als - Zeichen erlaubt. In beiden Faellen wird + als Echo ausgegeben. - nonl() Nur (line feed) wird als akzeptiert. - echo() Jedes normale eingegebene Zeichen soll vom Rechner mit einem Echo beantwortet werden (Standardfall). - noecho() Hebt das Echo fuer das Terminal auf. 10. Termcapmodifikation ----------------------- 10.1 neue Termcapentries ----------------------- AR : Binaerkombination fuer ein Bildschirmrefresh (z.B. P8 - AR#3 d.h. CTRL\C fuer ein Bildschirmrefresh) CI : Curses Init.Sequence (activate Special Character Set) NK : Anzahl der Bytes die bei Betaetigung einer Richtungstaste gesendet werden (z.B P8-NK#1 , PV-NK#3) KD : Cursor down (Dezimalwert P8- KD#10) KU : Cursor up (Dezimalwert P8- KU#11) VD : Videoattribute fuer Bold Vb : Videoattribute fuer Blinking VE : Videoendsequence VR : Videoattribute fuer Reverse VU : Videoattribute fuer Underline V1 : Videoattribute fuer Reverse + Blinking V2 : Videoattribute fuer Reverse + Bold V3 : Videoattribute fuer Underline + Bold V4 : Specialcharacter fuer left upper corner V5 : Specialcharacter fuer right upper corner V6 : Specialcharacter fuer left down corner V7 : Specialcharacter fuer right down corner V8 : Specialcharacter fuer horizontal character V9 : Specialcharacter fuer vertical character 10.2 Termcapentries die unbedingt vorhanden sein sollten ------------------------------------------------------- al : Zeile einfuegen cm : Cursor motion - Programmieranweisung ca : cursor adressable ce : loeschen bis Zeilenende cl : Bildschirm loeschen co : Anzahl der Zeilen dl : Zeile loeschen ho : Cursor home kd : Cursorbewegung unten kl : Cursorbewegung links kr : Cursorbewegung rechts ku : Cursorbewegung hoch li : Anzahl der Spalten se : standend d.h Videoattribute ausschalten sg : Anzahl der Zeichen fuer Videoattribute auf dem Bildschirm so : standout (Videoattr. fuer Reverse) up : Cursor eine Zeile nach oben us : Videoattribut fuer Unterstreichung einschalten ue : Videoattribut fuer Unterstreichung ausschalten 11. Weitere Unterprogramme -------------------------- - wsystem(window,string) WINDOW *window ; char *string ; "wsystem(...)" ist eine Funktion die den UNIX-Ruf system nutzt und in string das Kommando uebergibt. Dabei erfolgt eine Umlenkung der moeglichen Fehlerausschriften und eine Ausgabe der Fehlernachrichten im Window window. 12. Moeglichkeiten der Nutzung von Curses aus Pascal ---------------------------------------------------- program cursestest(input,output); const REVERSE = 136 ; BLINK = 129 ; UNDERLINE = 132 ; BOLD = 130 ; type string = packed array [1..80] of char ; var win,win1,i : integer ; str : string ; (******************************************************************************* * * * Definition der externen Curses - Funktionen * *) (* 1. Windowmanagemant *) procedure initscr ;extern; procedure endwin ;extern; function newwin (i1,i2,i3,i4:integer) : integer ;extern; procedure delwin (window : integer) ;extern; (* 2. Windows aktualisieren *) procedure wrefrall ;extern; procedure wrefresh (window :integer) ;extern; procedure mvwin (window, ypos , xpos :integer) ;extern; procedure wvisual (window :integer) ;extern; procedure wnovisual (window :integer) ;extern; procedure wmove (window, ypos , xpos :integer) ;extern; procedure touchline (window ,line,startl, endl :integer) ;extern; procedure touchwin (window :integer) ;extern; (* 3. Loeschen im Window *) procedure werase (window :integer) ;extern; procedure wclrtobot (window :integer) ;extern; procedure wclrtoeol (window :integer) ;extern; procedure wdelch (window :integer) ;extern; procedure wdeleteln (window :integer) ;extern; (* 4. Boxmanipulation *) procedure box (window, horizontal, vertical:integer ) ;extern; procedure labelbox (window :integer; str :string ; video:integer) ;extern; (* 5. Window Output Funktionen *) procedure waddstr (window :integer; str : string) ;extern; procedure waddstrr (window :integer; str : string) ;extern; procedure waddstrv (window :integer; str :string ; video:integer) ;extern; procedure waddstvr (window :integer; str :string ; video:integer) ;extern; procedure waddch (window :integer; chr : char) ;extern; procedure winsch (window :integer; chr : char) ;extern; procedure winsertln (window :integer) ;extern; (* 6. Window Input Funktionen *) procedure wgetstr (window :integer; var str: string) ;extern; function wgetch (window :integer) : char ;extern; function winch (window :integer) : char ;extern; procedure wgetline (window :integer; var str: string; limit: integer);extern; procedure wgetlinm (window :integer; var str: string; limit: integer);extern; (* 7. Menue - Funktionen *) function getmencd (window :integer; var ch1 :char) : integer ;extern; (* 8. Videoattribute *) procedure wstandout (window :integer) ;extern; procedure wstandend (window :integer) ;extern; procedure setvideo (window ,video :integer) ;extern; (******************************************************************************) procedure sleep (time : integer) ;extern; begin initscr; (* Cursesinitialisierung *) win:=newwin (12,55,10,0) ; box(win,0,0) ; labelbox (win, ' Pascal Windowtest ', REVERSE) ; win1 :=newwin (12,55,10,0) ; box(win1 ,0,0) ; labelbox (win1, ' Window 2 ', REVERSE) ; wrefresh (win) ; waddstrr (win ,' Das Window wird auf novisual gestzt .'); sleep(2) ; wnovisual(win) ; wvisual(win) ; werase (win) ; wmove (win , 5,1) ; waddstr (win, ' Bitte Textkette eingeben :') ; wgetlinm (win, str , 20) ; waddstr (win, ' Eingegebene Zeichenkette =') ; waddstvr (win, str , UNDERLINE) ; wmove (win, 8,1) ; wstandout(win) ; waddstr (win,' Das Window wird jetzt verschoben !') ; wstandend(win) ; wrefresh (win) ; mvwin (win, 6,10) ; wrefresh (win) ; for i:=1 to 11 do begin wmove (win,i,1) ; waddstrr (win,' Windowtest 1 ') ; end; wrefresh (win1) ; for i:=1 to 11 do begin wmove (win1,i,1) ; waddstrr (win1,' Windowtest2 ') ; end; sleep(3); endwin; end.