0. INHALT: ============ I. Allgemeine Hinweise 1. šbersetzung der Library mit Pure C, GNU-C und Lattice C a. Pure C b. GNU-C/Lattice C 2. Nutzung der Library mit Pure C, GNU-C und Lattice C II. Neue M”glichkeiten in Eingabefeldern III. erweiterte Objekt-Typen sowie Resource-Aufbau 1. Debugging 2. Highbyte des Objekt-Typs IV. Globale Variablen der Library V. Funktionen, Strukturen und Konstanten der Library 1. Routinen zur Verwaltung des Cookie-Jars 2. Routinen zur Verwaltung des Environments 3. Erweiterte Objekt-Routinen (u.a. kompatibel zum PC-GEM 2.0) 4. Erweiterte Rechteck-Routinen (u.a. kompatibel zum PC-GEM 2.0) 5. VDI-Attribut- und Clipping-Funktionen 6. Erweiterte Scrap-Directory-Routinen 7. Erweiterte Grafik-Routinen 8. Men-Funktionen 9. Dialog-Optionen und -optik setzen 10. Bibliothek (AES,VDI) sowie Resource (de-) initialisieren 11. Resource- und Objekt-Initialisierung 12. Ereignis-Auswertung 13. Dialog-Funktionen 14. Fenster-Funktionen 15. Popup-Funktion 16. XAcc-2- und AV-Protokoll-Funktionen 17. Drag & Drop-Funktionen 18. Auskunftsfunktionen 19. Datei-/Pfadfunktionen 20. Verschiedene Funktionen 21. Definitionen h„ufig ben”tigter (Protokoll-) Konstanten I. Allgemeine Hinweise: ========================= 1. šbersetzung der Library mit Pure C, GNU-C und Lattice C ------------------------------------------------------- WICHTIG: Bei der šbersetzung der Library darf keine Stack-šberprfung aktiviert sein, da einige Library-Funktionen (z.B. benutzerdefinierte Objekte) vom AES aufgerufen werden und somit den AES-Stack verwenden. Light-Version: -------------- Wird die Library mit definiertem Konstanten-Makro 'SMALL_EGEM' (s.a. Projekt-Datei 'EGEMLGHT.PRJ' bzw. 'EGEMMNTL.PRJ') bersetzt, so sind keine Eingaben in Dialogen (Edit-Felder) m”glich und die Funktionen ob_clear_edit() sowie ascii_box() stehen nicht zur Verfgung. Aužer- dem sind bei den erweiterten Objekttypen weniger Images vorhanden. Sinn und Zweck ist, daž dadurch der Overhead durch die Library geringer wird (u.a. bei Programmen, die z.B. nur erweiterte Alertboxen nutzen) a. Pure C EnhancedGEM l„žt sich sowohl mit den Pure-C-Libraries als auch mit den MiNT-Libraries ab Patchlevel 30 compilieren. Hierzu muž jedoch im Header-File AESBIND.H der MiNT-Libraries die Zeile __EXTERN int evnt_timer __PROTO((unsigned long Interval)); in __EXTERN int evnt_timer __PROTO((int Int_locount,int Int_hicount)); ge„ndert werden. Weiterhin muž das Makro __MINT_LIB__ definiert werden (s. E_GEMMNT.PRJ) b. GNU-C/Lattice C Ebenfalls l„žt sich EnhancedGEM mit GNU-C und Lattice C bersetzen, wobei allerdings die MiNT-Library sowie die entsprechenden Makefiles (Makefile.GCC bzw. Makefile.LCC) benutzt werden mssen. Eventuell auf- tretende Warnungen bei der šbersetzung sind (hoffentlich) bedeutungslos. 2. Nutzung der Library mit Pure C, GNU-C und Lattice C ------------------------------------------------------- a. Wurde EnhancedGEM mit Hilfe der MiNT-Libraries bersetzt, so MšSSEN die MiNT-Libraries und die dazugeh”rigen Header-Dateien auch benutzt wer- den. Ansonsten sind die Reaktionen nicht vorhersehbar, aber h”chstwahr- scheinlich resultieren daraus Fehlfunktionen (aužer evtl. bei GNU-C). b. Die Funktionen evnt_multi, EvntMulti (Pure C) sowie evnt_mesag des AES sollten nicht mehr benutzt werden! Stattdessen sollte immer die Funktion Event_Multi benutzt werden! Weitere Details zur Ereignisver- arbeitung s. Funktionen Event_Multi() und Event_Handler(). c. Alle internen, modulbergreifenden globalen Variablen und Funktionen der Library beginnen mit einem Unterstrich '_', so daž es zu keinen šberschneidungen kommen sollte. II. Neue M”glichkeiten in Eingabefeldern: =========================================== - zus„tzliche Gltigkeitsmasken: 'c','C': Ziffern "0-9", Komma ".,", Rechenzeichen "+-*/^", Klammern "(){}[]" 'l','L': LED-Ziffern "0-9" '': Ziffer='0'-'9', alle Ziffern von '0' bis , z.B. '1': Bin„rziffern '01' '7': Oktalziffernn '01234567' '9': Dezimalziffern '0123456789' 'h','H': Hexadezimalziffern "0-9A-F", Umwandlung in Klein/Grožbuchstaben 'u','U': ASCII 32-127, Umwandlung in Klein-/Grožbuchstaben 'v','V': ASCII 32-255, Umwandlung in Klein-/Grožbuchstaben 'w','W': ASCII 32-127 'y','Y': ASCII 32-255 - kleiner/grožer System-Font k”nnen in Eingabefeldern benutzt werden. Untersttzt das AES auch nicht-proportionale GDOS-Fonts, so k”nnen diese ebenfalls in Eingabefeldern verwendet werden. - ein Eingabefeld darf maximal MAX_EDIT-Zeichen lang werden (ansonsten muž die Konstante bei Bedarf in der Datei 'E_GEM.H' ge„ndert und die Library neu bersetzt werden) - Eingabefelder drfen einen Klammeraffen '@' am Anfang besitzen III. erweiterte Objekt-Typen sowie Resource-Aufbau: ===================================================== 1. Debugging: ------------- Wird die Library mit definiertem Konstanten-Makro 'DEBUG' (s.a. Projekt-Datei 'E_GEM.PRJ' bzw. 'E_GEMMNT.PRJ') bersetzt, so gibt die Library Fehlermeldungen (Alert-Boxen) aus, wenn Fehler im Resource- Aufbau gefunden wurden (z.B. doppelt vergebene Hotkeys, mehr als ein Help-/Undo-/Default-Button usw.). Dabei werden die Art des Fehlers und die Nummer des fehlerhaften Objekts ausgegeben. 2. Highbyte des Objekt-Typs (s.a. STARTUP.RSC): ----------------------------------------------- TriState-Checkboxen: -------------------- Ist das Flag TOUCHEXIT bei einer Checkbox gesetzt, so kann die Checkbox noch einen dritten Zustand (neben selektiert und nicht selektiert) annehmen, bei dem das Innere der Checkbox mit einem grauen Muster gezeichnet wird. In diesem Zustand ist der Status CHECKED gesetzt. #define CHECKBOX 1 /* Check-Box */ #define HEADER 2 /* šberschrift */ #define RADIO 3 /* Radio-Button */ #define UNDERLINE 4 /* Unterstrich */ #define HOTKEY 5 /* Hotkey-Objekt */ #define CHKHOTKEY 6 /* Check-Box mit Hotkey */ #define RBHOTKEY 7 /* Radio-Button mit Hotkey */ #define INDHOTKEY 8 /* Hotkey-Objekt einer Check-Box oder eines Radio-Buttons */ #define FLYDIAL 9 /* Flugecke */ #define TXTDEFAULT 10 /* Status des DEFAULT-Objekts ist von diesem Text-Objekt abh„ngig */ #define USERFLY 11 /* beliebiges Flugobjekt */ #define HELP_BTN 12 /* Help-Button */ GDOS-Fonts: ----------- Der erweiterte Objekttyp 'ATTR_TEXT' untersttzt auch die Ausgabe von beliebigen, u.a. proportinalen GDOS-Fonts unabh„ngig vom AES! Dabei mssen die Felder 'te_fontid', 'te_fontsize' der TEDINFO-Struktur auf die ID und die Gr”že in Punkt des Fonts ge- setzt werden. Aužerdem muž das Feld 'te_font' auf eine der fol- genden Konstanten gesetzt werden: #define GDOS_PROP 0 /* Speedo GDOS font */ #define GDOS_MONO 1 /* Speedo GDOS font, monospace */ #define GDOS_BITM 2 /* GDOS bit map font */ Nach dem Initialisieren der Objekte durch fix_objects(), rsrc_calc() oder rsrc_init() ist der Objekttyp auf 'G_XTEXT' gesetzt und die Variable 'ob_spec' der OBJECT-Struktur zeigt auf einen benutzer- definierten Block USERBLK, dessen Parameter 'ub_parm' auf folgende Struktur zeigt, welche mit den Werten aus der Resource-Datei initia- lisiert ist (ein evtl. vorhandenes EDITABLE-Flag wird gel”scht!): X_TEXT-Struktur: ---------------- typedef struct { /* Zeiger auf Text (sollte nur mit ob_get_text()/ob_set_text() gesetzt oder ermittelt werden) */ char *string; /* Font-ID, -h”he (<0: in Punkt, >0: in Pixel) */ int font_id,font_size; /* Farbe (0-15, kann nachtr„glich auf beliebige VDI-Farbe gesetzt werden) */ int color; /* Zentrierung des Textes (TE_LEFT,TE_CNTR,TE_RIGHT) */ int center; /* Schreibmodus (MD_REPLACE,MD_TRANS,MD_XOR,MD_ERASE) */ int mode; /* Alle weiteren Variablen dieser Struktur sind fr interne Zwecke reserviert! */ } X_TEXT; #define ATTR_TEXT 13 /* Text mit Attributen */ #define CYCLE_BUTTON 14 /* Cycle-Button */ #define ARROW_LEFT 15 /* Pfeil links */ #define ARROW_RIGHT 16 /* Pfeil rechts */ #define ARROW_UP 17 /* Pfeil hoch */ #define ARROW_DOWN 18 /* Pfeil runter */ #define UNDO_BTN 19 /* Undo-Button */ Jedem Objekt k”nnen die erweiterten Typen UNDO_BTN, HELP_BTN, HEADER und USERFLY zugeordnet werden. Bei ATTR_TEXT sowie TXTDEFAULT muž es sich um ein Text-Objekt (auch G_STRING), bei UNDERLINE sollte es sich um den Typ G_BOX handeln. Alle anderen erweiterten Typen sollten (mssen aber nicht) dem Typ G_BOXCHAR zugeordnet werden. #define G_UNMODAL 0x4000 /* unmodales Objekt */ #define G_MODAL 0x8000 /* modales Objekt */ Zus„tzlich k”nnen alle (!) Objekte durch Setzen von Bit 14 (G_UNMODAL) bzw. Bit 15 (G_MODAL) im Objekt-Typ (erweiterter Objekttyp mit 64 bzw. 128 verodern) zu einem unmodalen oder modalen Objekt deklariert werden, welches nur in unmodalen bzw. modalen Dialogen erscheint. WICHTIG: -------- Will man den Objekttyp ermitteln, so sollte man die Variable 'ob_type' der OBJECT-Struktur mit der Konstante G_TYPE maskieren! Nach dem Initialisieren der Resource durch die Library werden der Objekttyp und teilweise das obere Byte des Objektstatus der erweiterten Objekte ver„ndert. Ebenso zeigt 'ob_spec' meistens auf den USERBLK des Objekts. Daher sollte man auf diese Variablen nicht mehr zugreifen, sofern die Žnderungen nicht dokumentiert sind (wie z.B. bei ATTR_TEXT) Weitere (Kombinations-) M”glichkeiten s.a. Beispielprogramm sowie Startup-Resource (STARTUP.RSC). WICHTIG: -------- Werden die Funktionen rsrc_calc() oder rsrc_init() mit der Gr”že des Entwurfsfonts aufgerufen, so SOLLTEN nur Pull-Down-Mens G_TITLE- Objekte enthalten. Ansonsten wird der Dialog normal vom AES an die Gr”že des System-Fonts skaliert. IV. Globale Variablen der Library: ==================================== int _app; -> Programm wurde als Applikation (_app!=0) oder Accessory (_app==0) gestartet int ap_id: -> Applikationsidentifikation (Rckgabewert von appl_init()) oder negativer Wert, wenn AES-Initialisierung nicht erfolg- reich war int menu_id: -> Nummer des Eintrags im Accessory-Men oder negativer Wert int grhandle: -> Handle der AES-Workstation (Rckgabewert von graf_handle) int x_handle: -> Handle der Library-Workstation int gr_cw,gr_ch: -> Breite/H”he des System-Zeichensatzes (IBM) in Pixel int gr_bw,gr_bh: -> Breite/H”he eines Rechtecks, das jedes einzelne Zeichen des System-Zeichensatzes (IBM) vollst„ndig umgibt. int gr_sw,gr_sh: -> Breite/H”he des kleinen System-Zeichensatzes (SMALL) in Pixel int ibm_font,ibm_font_id; -> H”he des System-Zeichensatzes (IBM) in Punkt sowie Font-ID int small_font,small_font_id; -> H”he des kleinen System-Zeichensatzes (SMALL) in Punkt sowie Font-ID int fonts_loaded; -> GDOS-Fonts wurden geladen (werden die GDOS-Fonts von der Anwendung geladen, so muž diese Variable auf einen Wert un- gleich Null gesetzt oder die Fonts selbst„ndig entfernt werden) int max_w,max_h: -> Breite/H”he des Bildschirms in Pixel int planes, colors: -> Anzahl der Farbebenen sowie gleichzeitig darstellbaren Farben int colors_available; -> Anzahl der Farbabstufungen der Farbpalette (2: monochrom, 0: mehr als 32767 Farben) MFDB *screen; -> Memory Form Definition Block des Bildschirms GRECT desk; VRECT clip; -> Ausmaže des Desktop-Fensters als GRECT bzw. VRECT int aes_version: -> AES-Versionsnummer int magx: -> Versionsnummer von MagiC ab Version 2.00 int winx: -> Versionsnummer von Winx ab Version 2.10 int mint: -> MiNT-Versionsnummer int multi: -> AES-Multitasking-Betriebssystem vorhanden int search: -> appl_search()-Funktion vorhanden int AvServer; -> Applikations-ID des AV-Protokoll-Servers oder negativer Wert int menu_available; -> Anwendung darf eigene Drop-Down-Menleiste anmelden (menu_available!=0) OBJECT *iconified; -> Zeiger auf Objektbaum, der fr die Darstellung von ikonifizierten Fenstern benutzt wird (ansonsten weižer Hintergrund des Fensters, falls Zeiger nicht gesetzt wurde) V. Funktionen, Strukturen und Konstanten der Library: ======================================================= 1. Routinen zur Verwaltung des Cookie-Jars --------------------------------------- COOKIE-Struktur: ---------------- typedef struct { long cookie_id; /* ID des Cookies */ long cookie_value; /* Wert des Cookies */ } COOKIE; void create_cookie(COOKIE *cookie,long id,long value); -> Cookie 'cookie' wird mit der Identifikation 'id' und dem Wert 'value' initialisiert boolean new_cookie(COOKIE *cookie); -> Cookie 'cookie' in Cookie-Jar einfgen (Rckgabewert gleich FALSE, falls Cookie-Jar nicht existiert oder keine freien Eintr„ge mehr vorhanden sind) boolean get_cookie(long id,long *value); -> Cookie mit der Identifikation 'id' im Cookie-Jar suchen und Wert gegebenenfalls in der Variable '*value' sichern (sofern value!=NULL) -> Rckgabewert ungleich FALSE, wenn Cookie gefunden wurde void remove_cookie(long id); -> Cookie mit der Identifikation 'id' aus dem Cookie-Jar entfernen void move_cookiejar(long *new_cookie_jar,long size); -> neuen Cookie-Jar 'new_cookie_jar' mit Platz fr 'size' Eintr„ge anlegen und alten Cookie-Jar gegebenfalls kopieren -> neuer Cookie-Jar muž mindestens so viele Eintr„ge wie der alte Cookie-Jar haben long cookie_size(void); -> Anzahl der maximalen Eintr„ge im Cookie-Jar ermitteln 2. Routinen zur Verwaltung des Environments ---------------------------------------- char *getenv(const char *entry); -> Variable 'entry' im Environment suchen und im Erfolgsfall Zeiger auf Wert der Variable zurckgeben (ansonsten NULL) int putenv(const char *entry); -> Zeichenkette 'entry' ins Environment einfgen -> Rckgabewert ungleich Null im Erfolgsfall 3. Erweiterte Objekt-Routinen (u.a. kompatibel zum PC-GEM 2.0) ----------------------------------------------------------- void ob_dostate(OBJECT *tree,int object,int masc); -> einzelne Bits 'masc' des Objektstatus des Objekts 'object' im Baum 'tree' durch Veroderung setzen void ob_undostate(OBJECT *tree,int object,int masc); -> einzelne Bits 'masc' des Objektstatus des Objekts 'object' im Baum 'tree' durch Maskierung l”schen int ob_isstate(OBJECT *tree,int object,int masc); -> Bits 'masc' im Objektstatus des Objekts 'object' im Baum 'tree' testen -> Rckgabewert: TRUE (1): alle Bits gesetzt FALSE (0): Bits (teilweise) nicht gesetzt void ob_setstate(OBJECT *tree,int object,int state); -> Objektstatus des Objekts 'object' im Baum 'tree' auf den Wert 'state' setzen void ob_select(DIAINFO *info,OBJECT *tree,int object,int select, int draw) -> Objekt 'object' im Baum 'tree' in Abh„ngigkeit des Parameters 'select' (de-) selektieren und evtl. neuzeichnen (draw!=0). Geh”rt der Objektbaum zu einem ge”ffneten Dialog, so sollte ein Zeiger auf die DIAINFO-Struktur des Dialogs bergeben werden, damit gegebenenfalls der Ausgabebereich korrekt berechnet werden kann. -> Bedeutung des Parameters 'select': /* Status setzen (=selektieren) */ #define SET_STATE 1 /* Status l”schen (=deselektieren) */ #define CLEAR_STATE 0 /* Status invertieren */ #define FLIP_STATE -1 void ob_disable(DIAINFO *info,OBJECT *tree,int object,int disable, int draw) -> Objekt 'object' im Baum 'tree' in Abh„ngigkeit des Parameters 'disable' dis-/enablen und evtl. neuzeichnen (draw!=0). Parameter und Aufruf s. Funktion ob_select() void ob_doflag(OBJECT *tree,int object,int masc); -> einzelne Bits 'masc' der Objektflags des Objekts 'object' im Baum 'tree' durch Veroderung setzen void ob_undoflag(OBJECT *tree,int object,int masc); -> einzelne Bits 'masc' der Objektflags des Objekts 'object' im Baum 'tree' durch Maskierung l”schen int ob_isflag(OBJECT *tree,int object,int masc); -> Bits 'masc' der Objektflags des Objekts 'object' im Baum 'tree' testen -> Rckgabewert: TRUE (1): alle Bits gesetzt FALSE (0): Bits (teilweise) nicht gesetzt void ob_setflags(OBJECT *tree,int object,int flags); -> Objektflags des Objekts 'object' im Baum 'tree' auf den Wert 'flags' setzen void ob_xywh(OBJECT *tree,int object,GRECT *rect); -> Ausmaže und Koordinaten (relativ zur linken oberen Ecke des bergeordneten Objekts) des Objekts 'object' im Baum 'tree' ermitteln und in der GRECT-Struktur 'rect' sichern char *ob_get_text(OBJECT *tree,int object,int clear); -> Zeiger auf den Text des Objekts 'object' im Baum 'tree' ermitteln und Text l”schen, sofern 'clear' ungleich Null (Funktion beachtet erweiterte Objekttypen (Attribut-Text)) -> Rckgabewert gleich NULL, wenn es sich um kein Text-Objekt handelt void ob_set_text(OBJECT *tree,int object,char *text); -> Text des Objekts 'object' im Baum 'tree' auf 'text' setzen (Funktion beachtet erweiterte Objekttypen (Attribut-Text)) void ob_clear_edit(OBJECT *tree) -> Text in allen Eingabefeldern des Baums 'tree' l”schen (Funktion nur verfgbar, wenn Library nicht als Light- Version bersetzt wurde) int ob_set_hotkey(OBJECT *tree,int object,char hotkey); -> Hotkey des Objekts 'object' im Baum 'tree' auf den Buchstaben 'hotkey' setzen (Hotkey-Unterstrich wird automatisch angepažt) -> Rckgabewert ungleich FALSE -> Hotkey konnte gesetzt werden char ob_get_hotkey(OBJECT *tree,int object); -> Hotkey des Objekts 'object' im Baum 'tree' ermitteln -> Rckgabewert gleich Null, wenn kein Hotkey gesetzt war int ob_draw_chg(DIAINFO *info,int object,GRECT *area, int new_state,boolean top); -> Objekt 'object' (und untergeordnete Objekte) des Dialogs 'info' darstellen und gegebenenfalls Objektstatus „ndern (new_state>=0, s. objc_change) -> Begrenzung des Ausgabebereichs auf das Reckteck 'area' oder auf die Ausmaže des Dialogs (area==NULL) -> Ist der Dialog 'info' der oberste Dialog bzw. im obersten Fenster, so kann die Ausgabe durch Setzen des Parameters 'top' auf einen Wert ungleich Null beschleunigt werden -> Rckgabewert: TRUE: Okay FALSE: Objekt konnte nicht ausgegeben werden FAIL: Objekt-Status konnte nicht gesetzt werden int ob_draw(DIAINFO *info,int object) -> Objekt 'object' (und untergeordnete Objekte) des Dialogs 'info' darstellen (verkrzter Aufruf von ob_draw_chg(info,object,NULL,FAIL,FALSE)) int ob_draw_list(DIAINFO *info,int *objects,GRECT *area); -> Liste von Objekten 'objects' (und untergeordnete Objekte) des Dialogs 'info' darstellen (Abbruch der Liste mit negativem Wert oder Null) -> Begrenzung des Ausgabebereichs auf das Reckteck 'area' oder auf die Ausmaže des Dialogs (area==NULL) -> Diese Funktion ist schneller als die einzelne Ausgabe von mehreren Objekten ber ob_draw_chg() -> Rckgabewert: TRUE: Okay FALSE: Objekte konnten nicht ausgegeben werden void ob_draw_dialog(OBJECT *tree,int x,int y,int w,int h); -> Dialog 'tree' zentrieren, Bildschirmbereich reservieren, eine sich ”ffnende Box von der Dialogmitte zu den Koordinaten (x,y,w,h) zeichnen (sofern Parameter x,y,w,h gr”žer als Null sind) und Dialog darstellen void ob_undraw_dialog(OBJECT *tree,int x,int y,int w,int h); -> Eine sich schliežende Box von den Koordinaten (x,y,w,h) zur Dialogmitte zeichnen (sofern Parameter x,y,w,h gr”žer als Null sind) und Bildschirmbereich freigeben int ob_radio(OBJECT *tree,int parent,int object) -> Radio-Buttons innerhalb des bergeordneten Objekts 'parent' im Baum 'tree' auf neues Objekt 'object' (Index des Radio-Buttons, nicht Objekt-Nummer!) setzen bzw. aktuell gesetztes Objekt ermitteln (object<0) -> Rckgabewert: Gesetztes Objekt int ob_get_parent(OBJECT *tree,int object); -> Elternobjekt des Objekts 'object' im Baum 'tree' ermitteln 4. Erweiterte Rechteck-Routinen (u.a. kompatibel zum PC-GEM 2.0) ------------------------------------------------------------- void rc_grect_to_array(GRECT *rect,int *array); -> Reckteck 'rect' in Koordinaten-Feld 'array' wandeln void rc_array_to_grect(int *array,GRECT *rect); -> Koordianten-Feld 'array' in Rechteck 'rect' wandeln int rc_copy(GRECT *src,GRECT *dst); -> Rechteck 'src' nach Rechteck 'dst' kopieren -> Rckgabewert ist immer Null int rc_equal(GRECT *rect1,GRECT *rect1); -> Testet die Rechtecke 'rect1' und 'rect2' auf Gleichheit (Rckgabewert ungleich Null) int rc_intersect(GRECT *src,GRECT *dst); -> schneidet das Rechteck 'src' mit dem Rechteck 'dst' und gibt den gemeinsamen Bereich in 'dst' zurck -> Rckgabewert gleich Null, sofern die Rechtecke keinen gemeinsamen Bereich besitzen int rc_inside(int x,int y,GRECT *rect); -> Testet, ob die Koordinaten (x,y) im Rechteck 'rect' liegen (Rckgabewert ungleich Null) WICHTIG: Alle rc_sc_()-Funktionen schalten weder die Maus an/aus noch setzen sie den wind_update()-Status! RC_RECT-Struktur: ----------------- typedef struct { /* Rechteck-Struktur gltig? (valid!=0) */ int valid; /* Koordinaten des ursprnglichen Bildschirmrechtecks */ GRECT area; /* alle weiteren Variablen dieser Struktur sind nur fr INTERNE Zwecke */ } RC_RECT; int rc_sc_save(GRECT *area,RC_RECT *rc) -> Bildschirmbereich 'area' in Rechteck-Struktur 'rc' sichern -> Rckgabewert: (entsprechend rc->valid) TRUE: Bereich konnte gesichert werden FALSE: Nicht gengend Speicher oder Bereich teilweise aužerhalb des Bildschirms int rc_sc_freshen(int sx,int sy,RC_RECT *rc) -> Rechteck-Struktur 'rc' erneuern, d.h. Bildschirmbereich an den Koordinaten (sx,sy) in Puffer kopieren -> Rckgabewert: TRUE: Bereich konnte gesichert werden FALSE: Rechteck-Struktur nicht gltig oder Bereich teilweise aužerhalb des Bildschirms int rc_sc_restore(int dx,int dy,RC_RECT *rc,int mode) -> Rechteck-Struktur 'rc' freigeben und/oder an Position (dx,dy) zurckkopieren -> Parameter 'mode': TRUE: Bereich zurckkopieren und Speicher freigeben FALSE: Bereich nur zurckkopieren FAIL: Nur Speicher freigeben -> Rckgabewert: TRUE: Alles in Ordnung FALSE: Rechteck-Struktur ungltig void rc_sc_copy(GRECT *src,int x,int y,int mode); -> Kopiert den Bildschirmbereich 'src' zu den Koordinaten (x,y) (Kopiermodus 'mode' s. vro_cpyfm) void rc_sc_clear(GRECT *rect); -> L”scht den Bildschirmbereich 'rect' void rc_sc_invert(GRECT *rect); -> Invertiert den Bildschirmbereich 'rect' int rc_sc_scroll(GRECT *in_out,int dist_x,int dist_y,GRECT *out2) -> Rechteck 'in_out' um Distanz (dist_x,dist_y) verschieben und neuzuzeichnende Rechtecke in 'in_out' und 'out2' zurckgeben. Dabei wird automatisch der Bereich auf den Bildschirm beschr„nkt. (diese Funktion ist die Grundlage der Funktion scroll_window()) -> Rckgabewerte: 0 - kein Redraw n”tig 1 - Rechteck 'in_out' muž neugezeichnet werden 2 - Rechteche 'in_out' und 'out2' mssen neugezeichnet werden (nur bei diagonalem Scrolling) 5. VDI-Attribut- und Clipping-Funktionen ------------------------------------- Hinweis: -------- Das Clipping der internen Workstation ist normalerweise auf das Desktopfenster oder w„hrend eines Redraws auf Bereiche der Rechteckliste eines Fensters gesetzt. Grunds„tzlich ist der Ausgabebereich aber INNERHALB des Bildschirms! void vsf_aespattern(int handle, int x, int y, int pattern) -> an die Koordinaten (x,y) angepažtes AES-Fllmuster 'pattern' (0-7) berechnen und als neues Fllmuster der Workstation 'handle' setzen void vs_attr(void); -> wurden die Attribute der internen VDI-Workstation x_handle nicht ber Library-Funktionen ver„ndert, so muž diese Funktion sofort danach aufgerufen werden, um dies der Library kenntlich zu machen void v_set_text(int font,int height,int color,int out[4]) -> VDI-Text-Attribute der internen Workstation x_handle setzen: font: Font-ID height: H”he in Pixel (>0) oder in Punkt (<0) color: Text-Farbe out: Array fr Rckgabewerte von vst_height/vst_point oder NULL void v_set_mode(int mode); -> Grafikmodus der internen Workstation x_handle auf den Wert 'mode' (0-3) setzen void v_set_line(int color,int width); -> VDI-Linien-Attribute der internen Workstation x_handle setzen: (neg. Wert -> keine Ver„nderung) color: Linien-Farbe width: Linien-Dicke void v_set_fill(int color,int interior,int style); -> VDI-Fllmuster-Attribute der internen Workstation x_handle setzen: (neg. Wert -> keine Ver„nderung) color: Fllmuster-Farbe vsf_interior: Fllmuster-Typ (0-4) vsf_style: Fllmuster-Stil void v_aespattern(int x,int y,int pattern); -> an die Koordinaten (x,y) angepažtes AES-Fllmuster 'pattern' (0-7) berechnen und als neues Fllmuster der internen Workstation x_handle setzen void save_clipping(int *array); -> aktuellen Clipping-Bereich im Koordinaten-Feld 'array' sichern void restore_clipping(int *array); -> Clipping-Bereich auf Koordinaten-Feld 'array' setzen HINWEIS: Wird die interne VDI-Workstation benutzt, so muž sichergestellt sein, daž entweder Library-Funktionen benutzt oder die Attribute in ihren ursprnglichen Zustand zurckgesetzt werden. Ist dies nicht der Fall, muž sofort nach Ver„nderung der Attribute die Funktion vs_attr() aufgerufen werden. Allerdings darf auf keinen Fall der Clipping-Bereich ver„ndert werden, d.h. er ist mit save_clipping()/restore_clipping wiederherzustellen. 6. Erweiterte Scrap-Directory-Routinen ----------------------------------- int scrp_path(char *path,char *file) -> vollst„ndigen Zugriffspfad der Clipboard-Datei 'file' (sofern file!=NULL) ermitteln. Wird fr den Parameter 'file' NULL bergeben, so wird nur der Clipboard-Pfad ermittelt. -> Rckgabewert: TRUE: Alles in Ordnung FALSE: Kein Clipboard-Pfad gesetzt void scrp_clear(int all); -> Alle Dateien (all!=0) oder nur die 'SCRAP.*'-Dateien im Scrap-Directory l”schen long scrp_length(void); -> Berechnung der L„nge des Inhalts des Scrap-Directories int scrp_find(char *extensions,char *filename); -> Scrap-Directory (Clipboard) nach Scrap-Datei mit einer der durch Komma, Punkt oder Leerzeichen getrennten Erweiterungen 'extensions' durchsuchen, z.B. scrp_find("img.txt.asc.ps",scrap). Dabei wird die Liste von links nach rechts abgearbeitet. -> String 'filename' enth„lt im Erfolgsfall (Rckgabewert ungleich Null) den kompletten Pfad der gefundenen Datei void scrp_changed(int format,long best_ext); -> Clipboard-Inhalt wurde ver„ndert (SC_CHANGED-Nachricht wird (per XAccBroadCast) an alle Applikationen sowie AV_PATH_UPDATE an den AV-Server gesendet), wobei nach dem L”schen des Clipboards scrp_changed(SCF_INDEF,0l) aufgerufen werden sollte. -> format: Bitmap des Dateiformats #define SCF_INDEF 0x0000 /* undefiniert */ #define SCF_DBASE 0x0001 /* Datenbank */ #define SCF_TEXT 0x0002 /* Text */ #define SCF_VECTOR 0x0004 /* Vektor-Grafik */ #define SCF_RASTER 0x0008 /* Raster-Grafik */ #define SCF_SHEET 0x0010 /* Tabellen-Kalkulation */ #define SCF_SOUND 0x0020 /* Sound */ -> best_ext: 4 Zeichen (z.B. ".RTF") fr die "beste" der abgespeicherten Dateien 7. Erweiterte Grafik-Routinen -------------------------- void graf_busy_mouse(void); -> Maus als rotierende Scheibe darstellen void graf_set_slider(SLINFO *slider,OBJECT *tree,int mode); -> Elemente des Sliders 'slider' im Baum 'tree' anhand der Werte der SLINFO-Struktur initialisieren und gegebenenfalls neuzeichnen -> mode: Bitmap der Initialisierung #define GRAF_SET_ARROWS 1 -> Slider-Pfeile setzen #define GRAF_SET_SIZE_POS 2 -> Gr”že/Position des Schiebers berechnen und setzen #define GRAF_SET 3 -> wie GRAF_SET_ARROWS und GRAF_SET_SIZE_POS #define GRAF_DRAW_SLIDER 4 -> Slider-Elemente zeichnen #define GRAF_DRAW 7 -> wie GRAF_SET und GRAF_DRAW_SLIDER void graf_arrows(SLINFO *slider,OBJECT *tree,int draw); -> Pfeile des Sliders 'slider' im Baum 'tree' initialisieren und gegebenenfalls neuzeichnen (draw!=0) void graf_rt_slidebox(SLINFO *slider,int object,int double_click); -> Echtzeitslider auswerten und darstellen (diese Routine wird intern automatisch aufgerufen, wenn die SLINFO-Strukturen bei open_dialog() bergeben wurden) -> Parameter: slider: Zeiger auf SLINFO-Struktur des Sliders #define HOR_SLIDER 0 /* horizontaler Slider */ #define VERT_SLIDER 1 /* vertikaler Slider */ #define SL_STEP 0 /* Einzelschritt */ #define SL_LINEAR 1 /* linear */ #define SL_LOG 2 /* logarithmisch */ #define SL_EXP 3 /* exponential */ typedef struct { /* Scan-Code des Ereignisses (Highbyte: Scan-Code, Low-Byte: ASCII-Code oder Null) */ int scan; /* Sondertastenstatus */ int state; /* Slider-Kommando (s. Beschreibung des Parameters 'object') int cmd; } SLKEY; typedef struct { /* Zeiger auf DIAINFO-Struktur des Dialogs */ DIAINFO *sl_info; /* Nummer des Elternobjekts */ int sl_parent; /* Objektnummer des Schiebers */ int sl_slider; /* Objektnummern der Pfeile oder negative Werte */ int sl_dec,sl_inc; /* Position, Seitenl„nge und Maximalwert des Schiebers */ int sl_pos,sl_page,sl_max; /* Richtung des Sliders: */ char sl_vh; /* HOR_SLIDER,VERT_SLIDER */ /* Wiederholungs-Modus der Pfeile */ char sl_mode; /* SL_STEP,SL_LINEAR,SL_LOG,SL_EXP */ /* Verz”gerungsdauer in Milisekunden vor und w„hrend der Wiederholung */ int sl_delay,sl_speed; /* Zeiger auf Routine (oder NULL), welche nach jeder Ver„nderung des Sliderwerts 'sl_pos' aufgerufen wird */ void (*sl_do)(OBJECT *obj,int pos,int prev, int max_pos,int top); /* obj: Zeiger auf das Slider-Objekt pos: aktuelle Position des Schiebers prev: vorherige Position des Schiebers max_pos: maximale Position des Schiebers top: Dialog ist im Vordergrund */ /* Zeiger auf Feld mit Slider-Hotkeys oder NULL (wird nur ausgewertet, wenn die SLINFO-Struktur bei open_dialog() bergeben wurde) */ SLKEY *sl_keys; /* Anzahl der Hotkeys im Feld 'sl_keys' */ int sl_keys_cnt; } SLINFO; object: angeklicktes Objekt oder eines der folgenden Kommandos: #define SL_UP -1 /* Zeile hoch */ #define SL_DOWN -2 /* Zeile runter */ #define SL_PG_UP -3 /* Seite hoch */ #define SL_PG_DN -4 /* Seite runter */ #define SL_START -5 /* Slider-Anfang */ #define SL_END -6 /* Slider-Ende */ double_click: Objekt wurde per Doppelklick angeklickt int graf_rt_rubberbox(int s_x,int s_y,GRECT *rect,int *w,int *h, void(*box_do)(int *array)); -> Echtzeitgummiband innerhalb des Rechtecks 'rect' mit den Start-Koordinaten (s_x,s_y) auswerten und darstellen -> Im Erfolgsfall (Rckgabewert!=0) enthalten die Variablen '*w' und '*h' die Breite und H”he des Rechtecks -> 'box_do' enth„lt einen Zeiger auf eine Funktion (oder NULL), welche nach jeder Ver„nderung des Rechtecks mit einem Zeiger auf das Koordinaten-Array 'array' des Rechtecks aufgerufen wird 8. Men-Funktionen --------------- WICHTIG: -------- Alle Men-Funktionen, bei denen kein Zeiger auf den Objektbaum bergeben wird, funktionieren nur, wenn vorher eine Men-Leiste per menu_install() angemeldet wurde! Ansonsten mssen die entsprechenden AES-Funktionen benutzt oder die Objekt-Attribute direkt manipuliert werden. Unter MultiTasking wird beachtet, welcher Applikation die Men- leiste geh”rt, um unn”tige Prozežumschaltungen zu verhindern. int menu_install(OBJECT *menu,int show); -> Men-Leiste 'menu' darstellen (show!=0) oder l”schen (show==0). Diese Funktion bercksichtigt, ob gegebenenfalls auch ein Accessory eine Men-Leiste besitzen darf und ini- tialisiert die Men-Punkte 'Fenster wechseln' und 'Fenster schliežen' -> Rckgabewert wie bei 'menu_bar' void menu_enable(boolean enable); -> Men-Leiste aktivieren (enable==TRUE) bzw. deaktivieren (enable==FALSE) und neuzeichnen. void menu_item_enable(int object,int enable) -> Men-Eintrag 'object' aktivieren (enable!=0) oder deaktivieren (enable==0) void menu_select(int title,int select) -> Men-Titel 'title' normal (select==0) oder invers (select!=0) darstellen boolean menu_dropped(); -> Testen, ob ein Drop-Down-Men der Menleiste heruntergeklappt ist 9. Dialog-Optionen und -optik setzen --------------------------------- void dial_colors(int dialog_pattern,int dialog_color, int cycle_button,int hotkey,int check_box, int radio_button,int arrow,int alert) -> Dialog-Optik setzen: dialog_pattern: Hintergrundmuster des Dialogs (0-7) dialog_color: Hintergrundfarbe des Dialogs (0-15) cycle_button: Cycle-Button-Farbe (0-15) check_box: Checkbox-Farbe (0-15) radio_button: Radio-Button-Farbe (0-15) arrow: Slider-Arrow-Farbe (0-15) alert: Farbe des Alert-Icons (0-15) void dial_options(boolean round,boolean title_frame, boolean title_small,boolean niceline, boolean return_default,boolean background, boolean nonselectable,boolean always_keys, boolean toMouse); -> verschiedene Optionen setzen: round: Dialogpositionen und Fensterpositionen auf Bytegrenzen (aus Geschwindigkeits- grnden) runden title_frame: šberschriften umrahmen title_small: Kleine Schrift (SMALL) fr šberschriften niceline: Niceline fr Trennstriche in Mens/Popups return_default: TRUE: Return selektiert Default-Objekt FALSE: Return springt zum n„chsten Eingabefeld FAIL: Return selektiert Default-Objekt beim letzten Eingabefeld (ansonsten wie FALSE) background: Fensterdialoge (sowie mit open_window() ge- ”ffnete Fenster) k”nnen im Hintergrund wie normale Dialoge bedient werden nonselectable: Fliegende Dialoge fliegen auch beim Anklicken von nicht-selektierbaren/editierbaren Objekten always_keys: Tastendrcke werden auch bei fliegenden oder modalen Dialogen an die Anwendung weitergegeben toMouse: Tastendrcke an Fensterdialog unter Maus- zeiger senden, sofern oberster Dialog weder modal noch fliegend ist -> zusammen mit 'background' ist somit eine vollst„ndige Bedienung von Hintergrund- dialogen m”glich void title_options(boolean mode,int color,int size); -> Unterstrichenen Text einstellen: mode: Strich wird ber die ganze Breite des Dialogs (TRUE) oder ber die im Resource vorgebenen Koordinaten (FALSE) gezeichnet color: Strichfarbe (0-15) size: Strickdicke in Pixel oder Null, wenn der Wert aus der Resource-Struktur entnommen werden soll BUTTON-Struktur: ---------------- typedef struct { /* Zeiger auf monochrome 16x16-Bitmap (32 Bytes) des selektierten und des normalen Buttons im ger„te- abh„ngigen Format */ int *but_on,*but_off; } BUTTON; void radio_image(int index,BUTTON *radiobutton); -> vordefinierte Images (index: 0-7) oder benutzerdefinierten Button 'radiobutton' (radiobutton!=NULL) fr Radio-Buttons ausw„hlen void check_image(int index,BUTTON *checkbox); -> vordefinierte Images (index: 0-5) oder benutzerdefinierten Button 'checkbox' (checkbox!=NULL) fr Check-Box ausw„hlen void cycle_image(int index,BUTTON *cyclebutton); -> vordefinierte Images (index: 0-1) oder benutzerdefinierten Button 'cyclebutton' (cyclebutton!=NULL) fr Cycle-Buttons ausw„hlen void arrow_image(int index,BUTTON *down,BUTTON *up,BUTTON *left, BUTTON *right); -> vordefinierte Images (index: 0-2) oder benutzerdefinierte Buttons 'down', 'up' 'left', 'right' (sofern ungleich NULL) fr Slider-Pfeile ausw„hlen 10. Bibliothek (AES,VDI) sowie Resource (de-) initialisieren -------------------------------------------------------- boolean open_work(int *handle,int *work_out); -> virtuelle Bildschirm-Workstation ”ffnen -> Rckgabewert ungleich FALSE, wenn Workstation ge”ffnet werden konnte -> handle: VDI-Handle im Erfolgsfall work_out: work_out[57]-Feld void close_work(int handle); -> virtuelle Bildschirm-Workstation 'handle' schliežen boolean init_gem(char *m_entry,char *x_name,char *a_name, int av_msgs,int va_msgs,int xacc_msgs) -> Initialisierung der Library - Anmeldung beim AES (appl_init) - Xacc-2/AV-Protokolle initialisieren - interne VDI-Workstation ”ffnen - Scrap-Directory initialisieren - globale Variablen sowie interne Strukturen initialisieren -> Parameter: m_entry: Eintrag im Accessory-Men (als Accessory oder unter MTOS) oder NULL x_name: (erweiterter) XAcc-2-Programmname a_name: AV-Programmname (8 Zeichen wie bei appl_find) av_msgs: Bitmap der untersttzten Nachrichten der Nachricht AV_PROTOKOLL (VA_START wird von der Library immer angegeben und ausgewertet!) #define MSG_SETSTATUS 0x001 /* VA_SETSTATUS */ #define MSG_START 0x002 /* VA_START */ va_msgs: Bitmap der untersttzten Nachrichten der Nachricht VA_PROTOSTATUS (AV_SENDKEY, AV_EXIT, AV_ACCWINDOPEN/AV_ACCWINDCLOSED sowie AV_PATH_UPDATE werden von der Library immer an- gegeben und ausgewertet!) #define MSG_SENDKEY 0x001 /* AV_SENDKEY */ #define MSG_ASKFILEFONT 0x002 /* AV_ASKFILEFONT */ #define MSG_ASKCONFONT 0x004 /* AV_ASKCONFONT, AV_OPENCONSOLE */ #define MSG_ASKOBJECT 0x008 /* AV_ASKOBJECT */ #define MSG_OPENWIND 0x010 /* AV_OPENWIND */ #define MSG_STARTPROG 0x020 /* AV_STARTPROG */ #define MSG_ACCWINDOPEN 0x040 /* AV_ACCWINDOPEN, AV_ACCWINDCLOSED */ #define MSG_STATUS 0x080 /* AV_STATUS, AV_GETSTATUS */ #define MSG_COPY_DRAGGED 0x100 /* AV_COPY_DRAGGED */ #define MSG_PATH_UPDATE 0x200 /* AV_PATH_UPDATE, AV_WHAT_IZIT, AV_DRAG_ON_WINDOW */ #define MSG_EXIT 0x400 /* AV_EXIT */ xacc_msgs: Bitmap der untersttzten ACC-Nachrichten (alle anderen ACC-Nachrichten werden automatisch ausgewertet) #define X_MSG_TEXT 0x001 /* ACC_TEXT */ #define X_MSG_META 0x002 /* ACC_META */ #define X_MSG_IMG 0x004 /* ACC_IMG */ -> Rckgabewert: TRUE: Ok FALSE: Anmeldung beim AES oder ™ffnen der Workstation schlug fehl void exit_gem(int status); -> Deinitialisierung der Library: - Dialoge und Fenster schliežen - Menleiste abmelden - Beenden der XAcc-2-/AV-Protokolle - geladene GDOS-Fonts wieder entfernen - interne VDI-Workstation schliežen - Abmeldung beim AES (appl_exit), sofern Anwendung als Programm gestartet wurde (ansonsten Endlos-Timer) - Programm beenden und Wert 'status' zurckgeben boolean open_rsc((char *rscname,char *m_entry,char *x_name,char *a_name,int av_msgs,int va_msgs,int xacc_msgs) -> Initialisierung der Library (s. init_gem()) sowie Resource 'rscname' laden -> Parameter: s. init_gem() -> Rckgabewert: TRUE: Ok FALSE: Anmeldung beim AES oder ™ffnen der Workstation FAIL: Resource-File konnte nicht geladen werden (Speicher- mangel oder falscher Pfad) void close_rsc(int status); -> Resource-Speicher freigeben und Library deinitialisieren (s. exit_gem()) 11. Resource- und Objekt-Initialisierung ------------------------------------ void fix_objects(OBJECT *tree,int scaling, int orig_cw,int orig_ch); -> erweiterte Objekte des Baums 'tree' initialisieren sowie gegebenenfalls Images/Icons skalieren (scale_image) und ins Ger„teformat konvertieren (trans_image) -> Parameter: orig_cw: Breite des Entwurfsfonts in Pixel (meistens 8) oder negativer Wert fr rsrc_obfix()-kompatible Anpassung orig_ch: H”he des Entwurfsfonts in Pixel (meistens 8 oder 16) oder negativer Wert fr rsrc_obfix()-kompa- tible Anpassung scaling: Bitmap des Skalierungs-Modus #define NO_SCALING 0 /* keine Skalierung */ #define SCALING 1 /* Skalierung */ #define TEST_SCALING 2 /* Testen, ob Skalierung not- wendig ist */ #define DARK_SCALING 4 /* dunkle Skalierung */ Beispiele: /* Nie skalieren */ images = NO_SCALING; /* Immer skalieren */ images = SCALING; /* Bei Bedarf (System-Font kleiner als Entwurfsfont) skalieren */ images = SCALING|TEST_SCALING; /* Bei Bedarf dunkel skalieren */ images = SCALING|TEST_SCALING|DARK_SCALING; void scale_image(OBJECT *object,int scaling, int orig_cw, int orig_ch); -> Image/Icon 'object' skalieren -> Parameter s. fix_objects() void trans_image(OBJECT *object); -> Image/Icon 'object' in Ger„teformat konvertieren void rsrc_calc(OBJECT *tree,int scaling,int orig_cw,int orig_ch); -> Koordinaten und Ausmaže der Objekte des Baums 'tree' an Ausmaže des System-Fonts unter Beachtung der Ausmaže des Fonts, mit welchem die Resource-Datei erstellt wurde, an- passen und anschliežend erweiterte Objekte initialisieren (s. fix_objects()) -> Parameter s. fix_objects() void rsrc_init(int n_tree,int n_obs,int n_frstr,int n_frimg, int scaling,char **rs_strings,long *rs_frstr, BITBLK *rs_bitblk,long *rs_frimg, ICONBLK *rs_iconblk,TEDINFO *rs_tedinfo, OBJECT *rs_object,OBJECT **rs_trindex, RS_IMDOPE *rs_imdope,int orig_cw,int orig_ch) -> in Quelltext eingebundene Resource-Datei (*.RSH) initialisieren -> Parameter: n_tree: Anzahl der B„ume (NUM_TREE) n_obs: Anzahl der Objekte (NUM_OBS) n_frstr: Anzahl der freien Strings (NUM_FRSTR) n_frimg: Anzahl der freien Images (NUM_FRIMG) rs_strings: String-Array (Pointer zeigen auf alle Zeichenketten der Resource-Datei) rs_frstr: Index-Array (Indizes der freien Strings fr das rs_strings-Array) rs_bitblk: BITBLK-Array (enth„lt alle Bit-Bl”cke) rs_frimg: Index-Array (Indizes der freien Images fr das rs_bitblk-Array) rs_iconblk: ICONBLK-Array (enth„lt alle icons) rs_tedinfo: TEDINFO-Array (enth„lt alle TEDINFO-Strukturen) rs_object: OBJECT-Array (enth„lt alle Objekte) rs_trindex: Index-Array (Indizes der Objektb„ume fr das rs_object-Array) rs_imdope: RS_IMDOPE-Array RS_IMDOPE-Struktur: ------------------- typedef struct { int dummy; /* Zeiger auf Bitmap (Image) */ int *image; } RS_IMDOPE; scaling: s. fix_objects() orig_cw: s. fix_objects() orig_ch: s. fix_objects() HINWEIS: An allen Stellen der Resource, an denen normalerweise Pointer vorkommen, muž der Element-Index (Long-Wert) des entsprechenden Arrays stehen. Die Image-Zeiger der Strukturen BITBLK und ICONBLK enthalten den Index des zugeh”rigen RS_IMDOPE-Elements. 12. Ereignis-Auswertung ------------------- XEVENT-Struktur: ---------------- typedef struct { /* PARAMETER: */ /* Bitmap der gewnschten Events: MU_KEYBD: Tastatur-Ereignis MU_MESAG: Nachrichten-Ereignis MU_TIMER1-4: Timer-Ereignis 1-4 MU_BUTTON1/2: Button-Ereignis 1/2 MU_M1-4: Rechteck-Ereignis 1-4 */ int ev_mflags; /* Parameter des 1. Button-Events MU_BUTTON1 */ int ev_mb1clicks,ev_mb1mask,ev_mb1state /* Parameter des 1. Mouse-Event-Rechtecks MU_M1 */ int ev_mm1flags,ev_mm1x,ev_mm1y,ev_mm1width,ev_mm1height, /* Parameter des 2. Mouse-Event-Rechtecks MU_M2 */ int ev_mm2flags,ev_mm2x,ev_mm2y,ev_mm2width,ev_mm2height; /* Parameter des 1. Timer-Events MU_TIMER1 */ unsigned int ev_mtlocount,ev_mthicount; /* RšCKGABEWERTE: */ /* eingetretene Ereignisse */ int ev_mwich; /* Position des Mauszeigers sowie Zustand der Maustasten beim Auftreten des Events */ int ev_mmox,ev_mmoy,ev_mmobutton; /* Zustand der Sondertasten beim Auftreten des Events */ int ev_mmokstate; /* Scancode der gedrckten Taste (High-Byte: Scan-Code, Low-Byte: ASCII-Code oder Null) */ int ev_mkreturn; /* Anzahl der Klicks mit der Maustaste (MU_BUTTON1) */ int ev_mb1return; /* Nachrichten-Puffer */ int ev_mmgpbuf[8]; /* erweiterte PARAMETER: */ /* Parameter des 2. Button-Events MU_BUTTON2 */ int ev_mb2clicks,ev_mb2mask,ev_mb2state; /* Parameter des 3. Mouse-Event-Rechtecks MU_M3 */ int ev_mm3flags,ev_mm3x,ev_mm3y,ev_mm3width,ev_mm3height; /* Parameter des 4. Mouse-Event-Rechtecks MU_M4 */ int ev_mm4flags,ev_mm4x,ev_mm4y,ev_mm4width,ev_mm4height; /* Parameter des 2-4. Timer-Events MU_TIMER2-4 */ long ev_mt2count,ev_mt3count,ev_mt4count; /* Zeitpunkt in Milisekunden des letzten Timer-Events MU_TIMER1-4 oder Null fr aktuelle System-Zeit */ long ev_mt1last,ev_mt2last,ev_mt3last,ev_mt4last; /* Anzahl der Klicks mit der Maustaste (MU_BUTTON2) */ int ev_mb2return; } XEVENT; Kompatibilit„ts-Makros fr EVENT-Struktur und AES-Event-Routinen: ----------------------------------------------------------------- #define ev_mbclicks ev_mb1clicks #define ev_mbmask ev_mb1mask #define ev_bmask ev_mb1mask #define ev_mbstate ev_mb1state #define ev_mbreturn ev_mb1return #define ev_mtlocount ev_mt1locount #define ev_mthicount ev_mt1hicount #define ev_mtlast ev_mt1last #define MU_TIMER1 MU_TIMER #define MU_BUTTON1 MU_BUTTON int Event_Multi(XEVENT *event); -> Auf Ereignis 'event' warten (ben”tigte Parameter der Struktur mssen initialisiert sein, sofern dies nicht die Initialisierungs-Routine von Event_Handler(), s.u., bernimmt). Die Library wertet dabei selbst„ndig Nachrichten der XAcc-2-, AV- und Drag&Drop-Protokolle aus und wandelt diese gegebenenfalls um. Ebenso werden Ereignisse, welche Fenster (-dialoge) bzw. allgemein die Library betreffen, ausgewertet. WICHTIG: Es werden nur Ereignisse zurckgeliefert, welche nicht von der Library oder dem durch die Funktion Event_Handler() definierten Handler ausgewertet wurden! Setzt man die Variable 'ev_mflags' auf Null oder bergibt man den Wert NULL fr den Parameter 'event', so werden KEINE Events zurckgeliefert! Alle Ereignisse mssen dann vom Handler initialisiert und ausgewertet werden! Library-spezifische Nachrichten (s.u.) werden NUR an den Event-Handler geliefert!!! -> Rckgabewert: Bitmap der eingetretenen Ereignisse void Event_Timer(int locount,int hicount) -> Wartet bis die durch lo_count und hi_count in Millisekunden vorgebene Zeit verstrichen ist. Dabei werden allerdings noch Nachrichten durch die Library (der Nachrichtenpuffer wird komplett geleert) sowie Ereignisse durch den Handler ausgewertet, so daž diese Funktion z.B. w„hrend eines rechenintensiven Vorgangs dazu benutzt werden kann, Ereignisse durch einen Aufruf mit kurzer Wartezeit auszu- werten (z.B. Fenster verschieben, neuzeichnen etc...) void Event_Handler(int (*init)(XEVENT *,int,int), int (*handler)(XEVENT *)); -> Routinen zur Ereignisauswertung festlegen, wobei diese Rou- tinen diejenigen Ereignisse auswerten, welche nicht auto- matisch von der Library bearbeitet wurden. Durch šbergabe von NULL k”nnen bereits angemeldete Funktionen einzeln wieder abgemeldet werden. Ebenso kann man die Routinen beliebig oft neu setzen, z.B. fr eine lokale Ereignisauswertung. -> Parameter: int (*init)(XEVENT *event,int available): -> Routine, welche u.a. von X_Form_Do bei jeder Initialisierung eines Dialogs aufgerufen wird. Die Routine gibt eine Bitmap der gewnschten Events zu- rck und initialisiert gegebenenfalls Variablen der bergebenen XEVENT-Struktur 'event'. Angefordert werden k”nnen nur die Events, welche in der Bitmap 'available' gesetzt sind. int (*handler)(XEVENT *event): -> Routine, welche u.a. von X_Form_Do aufgerufen wird und die Ereignisse, welche von der Library nicht ver- arbeitet wurden, auswertet. Zurckgegeben wird eine Bitmap der ausgewerteten Ereignisse. V.a. bei Tasta- tur-Ereignissen, welche nicht ausgewertet wurden, sollte MU_KEYBD nicht gesetzt sein, damit die Library gegebenenfalls den Tastendruck per Xacc-2- oder AV- -Protokoll weiterleiten kann. Dies kann man natrlich unterbinden, indem man st„ndig alle Ereignisse zu- rckgibt. WICHTIG: Diese Routine darf keine Variablen der XEVENT-Struk- tur (abgesehen von den Ausgabewerten) ver„ndern! Library-spezifische Nachrichten (MU_MESAG): ------------------------------------------- -> Eingabefeld wurde ver„ndert: msg[0] = OBJC_EDITED msg[3] = Nummer des aktuellen Eingabeobjekts oder negativer Wert, falls alle Eingabefelder betroffen sind msg[4]/msg[5] = Zeiger auf die DIAINFO-Struktur des Dialogs -> Status eines Objekts (kein EXIT-/TOUCHEXIT-Objekt, bei Slidern nach Positions„nderung das Schieber- Objekt) hat sich ge„ndert: msg[0] = OBJC_CHANGED msg[3] = Nummer des Objekts msg[4]/msg[5] = Zeiger auf die DIAINFO-Struktur des Dialogs -> Gr”že oder Position des Dialogs hat sich ge„ndert, wobei die Ausmaže des Wurzelobjekts bereits angepažt wurden msg[0] = OBJC_SIZED msg[4]/msg[5] = Zeiger auf die DIAINFO-Struktur des Dialogs -> Daten wurden an Applikation per Drag&Drop bergeben msg[0] = OBJC_DRAGGED msg[4]/msg[5] = Zeiger auf DRAG_DROP-Struktur -> Applikation hat sich per XAcc-2- oder AV-Protokoll angemeldet msg[0] = XACC_AV_INIT msg[3] = Applikations-ID msg[4]/msg[5] = Zeiger auf XAcc-Struktur -> Applikation hat sich per XAcc-2- oder AV-Protokoll abgemeldet msg[0] = XACC_AV_EXIT msg[3] = Applikations-ID msg[4]/msg[5] = Zeiger auf XAcc-Struktur (Struktur ist nach vollst„ndiger Abmeldung nicht mehr gltig (Struktur-Variable id<0) -> Status eines Fenster hat sich ge„ndert (z.B. wurde das Fenster ikonifiziert/deikonifiziert). U.a. kann sich auch das Fenster-Handle „ndern! msg[0] = WIN_CHANGED msg[4]/msg[5] = Zeiger auf die WIN-Struktur des Fensters oder NULL, falls alle Fenster betroffen sind -> Scrollposition eines Fensters wurde ge„ndert msg[0] = WIN_SCROLLED msg[4]/msg[5] = Zeiger auf die WIN-Struktur des Fensters msg[6] = alte horizontale Position (hpos) msg[7] = alte vertikale Position (vpos) 13. Dialog-Funktionen ----------------- DIAINFO-Struktur: ----------------- typedef struct { /* Dialog-Typ CLOSED -> geschlossen OPENED -> normaler Dialog FLYING -> fliegender Dialog WINDOW -> Fenster-Dialog WIN_MODAL -> modaler Fenster-Dialog */ DIALMODE di_flag; /* Zeiger auf Objektbaum */ OBJECT *di_tree; /* Zeiger auf Fenster-Struktur */ WIN *di_win; /* alle weiteren Variablen dieser Struktur sind nur fr INTERNE Zwecke */ } DIAINFO; boolean open_dialog(OBJECT *tree,DIAINFO *info,char *title, char *icon_title, OBJECT *icon, boolean center, boolean grow_box,int dialog_mode,int edit, SLINFO **slider); -> Dialog ”ffnen (Rckgabewert ungleich Null, wenn Dialog ge- ”ffnet wurde) -> Parameter: tree: -> Zeiger auf Objektbaum info: -> Zeiger auf DIAINFO-Struktur (wird von dieser Funktion initialisiert) title: -> Zeiger auf Fenster-Titel fr Fensterdialoge icon_title: -> Zeiger auf Fenstertitel im ikonifizierten Zustand oder NULL icon: -> Zeiger auf Objektbaum, der fr die ikonifizierte Darstellung benutzt wird, oder NULL (in diesem Fall wird der globale Objektbaum 'iconified' benutzt) center: TRUE -> Dialog um Mauszeiger zentrieren FALSE -> Dialog in Bildschirmmitte zentrieren (sichtbarer Ausschnitt des Bildschirms wird beachtet) FAIL -> Dialog an letzter Position ”ffnen (beim ersten ™ffnen analog wie FALSE) grow_box: -> sich vergr”žernder Rechtecke zeichnen dialog_mode: -> Bitmap des Dialogtyps: /* fliegender Dialog */ #define FLY_DIAL 1 /* Fenster-Dialog */ #define WIN_DIAL 2 /* Fenster-Dialog, sofern Fenster ge”ffnet werden kann, ansonsten fliegender Dialog #define AUTO_DIAL (FLY_DIAL|WIN_DIAL) /* modaler Fensterdialog */ #define MODAL 4 /* Fenster-Dialog mit Rahmen */ #define FRAME 8 /* Fenster-Dialog kann nicht ikonifiziert werden */ #define NO_ICONIFY 16 /* Die folgenden Elemente des Dialogfensters mssen von der Anwendung ausgewertet u. gesetzt werden! Dabei wird die Gr”že des Fensters automatisch gesetzt, wenn WD_SET_SIZE bergeben wird. An- sonsten darf die Gr”že NICHT ver„ndert werden! */ /* Fenster-Dialog mit horizontalem Slider (Slider,Pfeile rechts/links) */ #define WD_HSLIDER 256 /* Fenster-Dialog mit vertikalem Slider (Slider,Pfeile hoch/runter) */ #define WD_VSLIDER 512 /* Fenster-Dialog mit Sizer */ #define WD_SIZER 1024 /* Fenster-Dialog mit Fuller */ #define WD_FULLER 2048 /* Fenster-Dialog mit Info-Zeile */ #define WD_INFO 4096 /* Gr”že bei WM_FULLED/WM_SIZED automatisch an- passen (Nachricht OBJC_SIZED wird anschliežend an Anwendung geschickt) */ #define WD_SET_SIZE 8192 edit: -> Objektnummer des Eingabefeldes, in welchem sich der Cursor befinden soll (oder negativer Wert) slider: -> Zeiger auf Liste mit Adressen der SLINFO-Strukturen (letzter Listen-Eintrag gleich NULL) der Slider des Dialogs oder NULL, wenn die Slider nicht automatisch verwaltet werden sollen void close_dialog(DIAINFO *dialog,boolean shrink_box); -> Dialog 'dialog' schliežen und gegebenenfalls sich verkleinernde Rechtecke zeichnen (shrink_box!=0) void close_all_dialogs(void) -> alle ge”ffneten Dialoge schliežen int X_Form_Do(DIAINFO **dialog) -> Bearbeitung der ge”ffneten Dialoge -> Zurckgegeben wird die Nummer des angew„hlten Exit-Objekts (bei Doppelklick ist Bit 15 (0x8000) gesetzt) oder die Werte W_ABANDON -> Abbruch der Dialogbearbeitung, alle Dialoge wurden geschlossen (z.B. durch AC_CLOSE) bzw. beim Aufruf der Funktion waren keine Dialoge ge”ffnet W_CLOSED -> Fensterdialog wurde geschlossen -> '*dialog' enth„lt (sofern ungleich NULL) einen Zeiger auf die DIAINFO-Struktur des aktuellen Dialogs int xdialog(OBJECT *tree,char *title,char *icon_title,OBJECT *icon, boolean center,boolean grow_box,int dialog_mode); -> komplette Dialogbearbeitung (Dialog ”ffnen, bearbeiten und schliežen), wobei diese Funktion nur verwendet werden sollte, wenn sonst kein Dialog ge”ffnet ist oder ein modaler oder fliegender Dialog ge”ffnet wird (z.B. um auf eine Benutzer- eingabe zu warten) -> Parameter und Rckgabewerte s. open_dialog() sowie X_Form_Do() int xalert(int default,int undo,int icon,BITBLK *user_icon, int modal,int center,int width, char *title,char *text,char *buttons) -> erweiterte Alertbox darstellen (zurckgeliefert wird der Index des ausgew„hlten Buttons oder FAIL im Fehlerfall) -> default: Index des DEFAULT-Buttons oder negativer Wert undo: Index des UNDO-Buttons oder negativer Wert icon: Nummer des Icons oder negativer Wert X_ICN_NONE: /* kein Icon */ X_ICN_MAX: /* maximale Icon-Nummer */ X_ICN_STOP: /* Stop-Schild (Hinweis) */ X_ICN_QUESTION: /* Fragezeichen (Nachfrage) */ X_ICN_ALERT: /* Ausrufezeichen (Warnung) */ X_ICN_DISC_ERR: /* Disketten-I/O-Fehler */ X_ICN_ERROR: /* Bomben-Fehler */ X_ICN_FLOPPY: /* Disketten-Station */ X_ICN_DISC: /* Diskette */ X_ICN_INFO: /* Informations-Zeichen */ X_ICN_PRT_ERR: /* Drucker-I/O-Fehler */ user_icon: Zeiger auf benutzerdefiniertes Icon oder NULL modal: System-/Applikations-modale Alert-Box #define SYS_MODAL 0 /* System-Modal */ #define APPL_MODAL 1 /* Applikations-Modal */ center: Ausrichtung der Buttons #define BUTTONS_CENTERED 0 /* zentriert */ #define BUTTONS_LEFT 1 /* linksbndig */ #define BUTTONS_RIGHT 2 /* rechtsbndig */ width: einheitliche Breite der Buttons (width!=0) title: Zeiger auf Fenster-Titel bei applikationsmodalen bzw. šberschrift bei systemmodalen Dialogen text: Zeiger auf Text (maximale 16 Zeilen getrennt durch '|'). Die Textattribute k”nnen durch die folgenden Zeichen (in beliebiger Reihenfolge) am ANFANG einer Textzeile gesetzt werden: Fett = '!' Unterstrichen = '_' Kursiv = '/' Hell = '~' Umrandet = '#' Schattiert = '@' buttons: Button-Text (maximal 6 Buttons getrennt durch '|', Hotkeymarkierung durch '[') char ascii_box(char *title) -> Sonderzeicheneingabebox ”ffnen (Parameter s. open_dialog()) (Funktion nur verfgbar, wenn Library nicht als Light- Version bersetzt wurde) -> Rckgabewert: ausgew„hltes Zeichen 14. Fenster-Funktionen ------------------ WIN-Struktur: ------------- typedef struct { /* Handle des Fensters (handle>0, falls Fenster ge”ffnet) */ int handle; /* VDI-Handle der zum Fenster geh”renden VDI-Workstation (nach Aufruf von open_window() ist die Library-Workstation 'x_handle' als VDI-Workstation gesetzt) int vdi_handle; /* Bitmap der Fensterelemente (s. wind_create) */ int gadgets; /* Bitmap des Fenster-Status */ char iconified; #define ICONIFIED 1 /* Fenster ikonifiziert (MTOS) */ #define SHADE 2 /* Fenster eingeklappt (Winx 2.3) */ #define ICFS 4 /* Fenster ikonifiziert (ICFS) */ /* Fenster hat maximale Ausmaže */ char fulled; /* Position des Mauszeigers beim letzten Aufruf von window_mouse() oder window_set_mouse() (Variable ist ungltig bei Fensterdialogen!) */ int inside; FAIL: Fenster ist im Hintergrund FALSE: Mauszeiger aužerhalb des Arbeitsbereiches TRUE: Mauszeiger innerhalb des Arbeitsbereiches /* Gr”že (1-1000)/Position (0-1000) des horiz. Sliders */ int sl_hpos,sl_hsize; /* Gr”že (1-1000)/Position (0-1000) des vert. Sliders */ int sl_vpos,sl_vsize; /* Zeiger auf SCROLL-Struktur oder NULL */ SCROLL *scroll; /* Zeiger auf Fenster-Titel oder NULL */ char *name; /* Zeiger auf Titel im ikonifizierten Zustand oder NULL */ char *icon_name; /* minimale Fensterbreite/-h”he */ int min_w,min_h; /* maximale Fensterausmaže */ GRECT max; /* Die folgenden Variablen beziehen sich IMMER auf den nicht ikonifizierten Zustand des Fensters! */ /* aktuelle Fensterausmaže */ GRECT curr; /* vorherige Fensterausmaže */ GRECT prev; /* Fensterarbeitsbereich */ GRECT work; /* alle weiteren Variablen dieser Struktur sind fr INTERNE Zwecke reserviert */ } WIN; SCROLL-Struktur: ---------------- typedef struct { /* automatisches Scrolling (scroll!=0) oder nur Slider setzen und neue Werte der SCROLL-Struktur berechnen (scroll==0) */ int scroll; /* Index des Objekts, welches beim automatische Scrolling (scroll!=0) eines Dialogs neugezeichnet werden soll. Hier kann natrlich immer das Wurzelobjekt angegeben werden (Clipping wird von der Library durchgefhrt), aber aus Ge- schwindigkeitsgrnden sollte man nur das betreffende Objekt angeben */ int obj; /* Breite des Bereichs am linken/rechten Rand, der nicht verschoben werden darf (z.B. eine Toolbar). Diese Werte werden auch fr die Berechnung der Sliderposition/-gr”že ben”tigt */ int tbar_l,tbar_r; /* Breite des Bereichs am oberen/unteren Rand, der nicht verschoben werden darf (z.B. eine Toolbar) Diese Werte werden auch fr die Berechnung der Sliderposition/-gr”že ben”tigt */ int tbar_u,tbar_d; /* Breite/H”he einer Spalte/Zeile (z.B. bei Textfenstern die Fontgr”že, bei Grafikfenstern meistens 1) */ int px_hline,px_vline; /* Horizontale/vertikale Position des Fensterinhalts (in Spalten/Zeilen) */ int hpos,vpos; /* Horizontale/vertikale Fenstergr”že (in Spalten/Zeilen) */ int hsize,vsize; /* Horizontale/vertikale Seitengr”že (in Spalten/Zeilen) (diese Variablen drfen nicht ver„ndert werden bzw. werden von der Library gesetzt!) */ int hpage,vpage; /* Horizontale/vertikale Schrittweite (in Spalten/Zeilen) */ int hscroll,vscroll; /* alle weiteren Variablen dieser Struktur sind fr INTERNE Zwecke reserviert */ } SCROLL; WICHTIG: Es drfen nur noch diejenigen AES-Fensterroutinen verwendet werden, deren Funktionalit„t nicht von einer „quivalenten Library-Routine angeboten wird bzw. wenn das Fenster nicht von der Library verwaltet wird (Fenster 0 (Desktop) oder Fenster anderer Applikationen), drfen alle AES-wind-Funktionen verwendet werden. Bei ge”ffneten systemmodalen Dialogen oder Popups werden Nach- richten und zu setzende Werte automatisch bis zum Schliežen der der Dialoge/Popups gepuffert und dann an die Ereignisverwaltung weitergeleitet. WIN *open_window(char *title,char *icon_title,char *info, OBJECT *icon,int gadgets,int box, int min_w,int min_h, GRECT *max,GRECT *curr,SCROLL *scroll, void (*redraw)(WIN *,GRECT *)) -> Fenster ”ffnen und bei einem evtl. vorhandenen AV-Server anmelden (AV_ACCWINDOPEN) sowie egebenenfalls die Hinter- grundbedienung aktivieren -> Parameter: title: Zeiger auf Fenstertitel oder NULL icon_title: Zeiger auf Fenstertitel im ikonifizierten Zu- stand oder NULL info: Zeiger auf Infozeile oder NULL gadgets: Bitmap der Fensterelemente wie bei wind_create() icon: Zeiger auf Objektbaum, der fr die ikonifizierte Darstellung benutzt wird, oder NULL (in diesem Fall wird der globale Objektbaum 'iconified' benutzt) box: sich vergr”žernde Rechtecke zeichnen (box!=0) min_w: minimale Fensterbreite min_h: minimale Fensterh”he max: maximale Fensterausmaže max->g_x/g_y: minimale linke, obere Fenster- koordinaten (normalerweise die entsprechenden Koordinaten des Desktopfensters 'desk') max->g_w/g_h: maximale Fensterbreite/-h”he curr: Fensterausmaže scroll: Zeiger auf initialisierte SCROLL-Struktur fr automatisches Scrolling oder NULL. Wurde die Scroll-Position ge„ndert, so wird eine Nachricht WIN_SCROLLED verschickt. U.a. werden von der Library in diesem Fall auch Slidergr”že und -position automatisch gesetzt. redraw: Routine, die den Fenster-Redraw bernimmt. Dabei muž weder das bergebene Rechteck mit der Recht- liste geschnitten noch das Clipping der VDI- Workstation gesetzt werden! (VDI-Handle der WIN-Struktur nach Aufruf von open_window() gegebenenfalls auf anderen Wert als die globale Library-Workstation 'x_handle' setzen) Wird fr 'redraw' NULL bergeben, so wird die Nachricht WM_REDRAW (wie blich) weiterge- leitet. -> Rckgabewert: Zeiger auf WIN-Struktur oder NULL void window_reinit(WIN *win,char *title,char *icon_title, char *info,int home) -> Fenster 'win' reinitialisieren und neuzeichnen. U.a. wird gegebenenfalls die SCROLL-Struktur auf gltige Werte gesetzt und die Gr”že des Fensters an die maximalen bzw. minimalen Ausmaže angepažt. -> Parameter: title: Zeiger auf Fenstertitel oder NULL icon_title: Zeiger auf Fenstertitel im ikonifizierten Zu- stand oder NULL info: Zeiger auf Infozeile oder NULL home: Scroll-Position in linke obere Ecke (home!=0) int close_window(WIN *window,int box) -> Fenster 'window' schliežen und gegebenenfalls (box!=0) sich verkleinernde Rechtecke zeichnen. Aužerdem wird das Fenster bei einem evtl. vorhandenem AV-Server abgemeldet -> Rckgabewert gleich Null, wenn ein Fehler auftrat void close_all_windows(void) -> Alle ge”ffneten Fenster schliežen. Sind vorher noch Dialoge ge”ffnet, so werden diese ebenfalls geschlossen. void redraw_window(WIN *win,GRECT *area) -> L”st einen Redraw ber das Rechteck 'area' (area!=NULL) des Fensters 'win' oder den gesamten Fensterbereich (area==NULL) aus. Wurde fr das Fenster kein Redraw-Handler angemeldet, so wird eine WM_REDRAW-Nachricht verschickt. void window_scroll_slider(WIN *win,int vh) -> horizontalen (vh==HOR_SLIDER) oder vertikalen (vh==VERT_SLIDER) Slider des Fensters 'win' anhand der Werte der Scroll-Struktur setzen void scroll_window(WIN *win,int mode,GRECT *area) -> Fensterinhalt des Fensters 'win' in Abh„ngigkeit vom Para- meter 'mode' scrollen (Fenster muž ber eine SCROLL-Struktur verfgen!), wobei sowohl Slidergr”že als auch -position automatisch angepažt werden. -> Parameter: area: Bereich des Fensters oder NULL fr gesamtes Fenster abzglich der in der SCROLL-Struktur angegebenen Toolbar-Bereiche mode: /* an Anfang/Ende der Zeile */ LINE_START,LINE_END /* an Anfang/Ende des Fensterinhalts */ WIN_START,WIN_END /* Position (hpos,vpos) bereits gesetzt (wird automatisch an gltigen Bereich angepažt) */ WIN_SCROLL /* Seite nach links/oben/rechts/unten */ PAGE_LEFT,PAGE_UP,PAGE_RIGHT,PAGE_DOWN /* Zeile/Spalte nach links/oben/rechts/unten */ LINE_LEFT,LINE_UP,LINE_RIGHT,LINE_DOWN WIN *get_window(int handle) -> WIN-Struktur zum Fenster 'handle' ermitteln -> Rckgabewert gleich NULL, falls Struktur nicht gefunden werden konnte WIN *get_top_window(void) -> WIN-Struktur zum obersten Fenster ermitteln -> Rckgabewert gleich NULL, falls Struktur nicht gefunden werden konnte (Fenster geh”rt anderer Applikation oder kein Fenster ge”ffnet) int window_first(WIN *win,GRECT *rect); int window_next(WIN *win,GRECT *rect); -> Verkrzte Aufrufe von wind_xget(handle,WF_FIRSTXYWH,...) bzw. wind_xget(handle,WF_NEXTXYWH,...). -> Rckgabewert s. wind_xget() void window_size(WIN *win,GRECT *size) -> Ausmaže des Fensters 'win' auf 'size' setzen (im ikonifizierten Zustand wird die Gr”že erst nach der Deikonifizierung gesetzt) -> Wurde eine SCROLL-Struktur beim ™ffnen des Fenster bergeben, so werden von dieser Funktion auch Slidergr”že und -position automatisch gesetzt, wobei evtl. der Fenster- inhalt verschoben wird. void window_slider(WIN *win,int vh,int pos,int size) -> Vertikalen (vh==VERT_SLIDER) oder horizontalen (vh==HOR_SLIDER) Slider des Fensters 'win' setzen (im ikonifizierten Zustand werden die Werte erst nach der Deikonifizierung gesetzt) -> Parameter: pos: Position des Sliders (0-1000) oder FAIL size: Gr”že des Sliders (1-1000) oder FAIL void window_set_mouse(WIN *win,int in,int out, MFORM *in_form,MFORM *out_form) -> Form des Mauszeigers innerhalb und aužerhalb des Arbeits- bereiches des Fensters 'win' festlegen und setzen. Der Mauszeiger wird i.A. automatisch verwaltet, wobei das Verlassen/Betreten des Arbeitsbereiches von der Anwendung berwacht werden muž (s. Beispielquelltext 'WINVIEW.C'). Der Arbeitsbereich selber umfažt dabei den Arbeitsbereich des Fensters abzglich der evtl. angegebenen Ausmaže von "Toolbars". Diese Funktion hat keine Auswirkung auf Fensterdialoge! -> Parameter: in, in_form: Mausform innerhalb des Arbeitsbereichs (Bedeutung s. graf_mouse()). Wird fr den Parameter 'in' ein negativer Wert bergeben, so wird die Mausform nicht gesetzt (dies ist voreingestellt) out, out_form: Mausform aužerhalb des Arbeitsbereichs, Be- deutung s.o. void window_mouse(WIN *win) -> Mauszeiger des Fensters 'win' entsprechend den durch window_set_mouse() getroffenen Einstellungen setzen void window_name(WIN *win,char *title,char *icon_title) -> Titel des Fensters 'win' setzen -> Parameter: title: Zeiger auf Fenstertitel oder NULL icon_title: Zeiger auf Fenstertitel im ikonifizierten Zu- stand oder NULL void window_info(WIN *win,char *info) -> Info-Zeile des Fensters 'win' setzen (im ikonifizierten Zustand wird die Info-Zeile erst nach der Deikonifizierung gesetzt) -> Parameter: info: Zeiger auf Infozeile oder NULL void window_top(WIN *win) -> Fenster 'win' nach oben bringen (entspricht wind_set(handle,WF_TOP)) void window_bottom(WIN *win) -> Fenster 'win' nach unten legen (entspricht wind_set(handle,WF_BOTTOM)) WIN *window_find(int x,int y) -> WIN-Struktur des Fensters an den Koordinaten (x,y) ermitteln -> Rckgabewert gleich NULL, falls Struktur nicht gefunden werden konnte void window_calc(int wctype,int kind,GRECT *in,GRECT *out) -> Entspricht von der Funktionalit„t der AES-Funktion wind_calc(), nur daž anstatt einzelner Parameter Zeiger auf GRECT-Strukturen erwartet werden void window_border(int kind,int x,int y,int w,int h,GRECT *out) -> Koordinaten des Randbereichs (WC_BORDER) aus der linken, oberen Ecke (x,y) des Fensters und der Breite/H”he des Arbeitsbereiches (w,h) berechnen und im Recheck 'out' zurckgeben. Dabei wird das Ausgaberechteck automatisch auf den Desktop begrenzt. void CycleCloseWindows(char cycle_hot,char close_hot,int cycle_menu, int close_menu) -> Hotkeys (+Control-Taste) und Menpunkte fr die Funktionen 'Fenster wechseln' sowie 'Fenster schliežen' definieren. Beachtet werden alle Fensterdialoge sowie Fenster, die mit den Funktionen open_window() und close_window() ge”ffnet bzw. geschlossen werden. Der Mentitel wird nur dann deselektiert, wenn der Zeiger auf die Menleiste 'menu' gesetzt ist! -> Parameter: cycle_hot,close_hot: -> Hotkey-Buchstaben oder Null (voreingestellt sind die Zeichen 'W' und 'U') cycle_menu,close_menu: -> Objektnummern der Pulldown-Meneintr„ge oder neg. Werte 15. Popup-Funktion -------------- POPUP-Struktur: --------------- typedef struct { /* Zeiger auf DIAINFO-Struktur des Parent-Dialogs oder NULL */ DIAINFO *p_info; /* Zeiger auf Objektbaum des Popups */ OBJECT *p_menu; /* Objektnummer des Info-Objekts (meistens Text links vom Popup-Button) oder negativer Wert */ int p_parent; /* Objektnummer des Popup-Buttons oder negativer Wert */ int p_button; /* Objektnummer des Cycle-Buttons (dabei muž es sich nicht um den erweiterten Typ CYCLE_BUTTON handeln) oder negativer Wert */ int p_cycle; /* Beim Erreichen des ersten/letzten Eintrags mit den Cur- sor-Tasten Hoch/Runter wird zum letzten/ersten Eintrag gesprungen */ boolean p_wrap; /* Der Text des Popup-Buttons wird automatisch auf den Wert des aktuellen Eintrags gesetzt und nach dem Ende der Popup-Bearbeitung neugezeichnet */ boolean p_set; } POPUP; int Popup(POPUP *popup,int mode,int center,int x,int y, int *index,int select) -> Popup 'popup' ”ffnen, bearbeiten und wieder schliežen -> mode: Popup-Modus #define POPUP_BTN 0 /* Popup-Button wurde angeklickt */ #define POPUP_CYCLE 1 /* Cycle-Button wurde angeklickt */ #define POPUP_CHECK 2 /* H„kchen vor aktuellem Eintrag */ #define POPUP_BTN_CHK (POPUP_BTN|POPUP_CHECK) #define POPUP_CYCLE_CHK (POPUP_CYCLE|POPUP_CHECK) #define POPUP_RADIO POPUP_BTN_CHK #define POPUP_SELECT POPUP_BTN -> center: Position des Popups #define CENTER 1 /* in Bildschirm zentrieren */ #define MOUSEPOS 2 /* um Mauszeiger zentrieren */ #define XPOS 3 /* X-Koordinate x, vertikal um Mauszeiger zentrieren */ #define YPOS 4 /* Horizontal um Mauszeiger zentrieren, Y-Koordinate y */ #define XYPOS 5 /* Koordinaten (x,y) */ #define OBJPOS 6 /* um aktuellen Eintrag zentrieren oder wie XYPOS */ -> select: aktueller Eintrag oder negativer Wert -> zurckgegeben wird die Objektnummer des selektierten Eintrags (oder 0) sowie in '*index' (sofern index!=NULL) der Index des selektierten Eintrags. Ist Bit 15 (0x8000) des Rckgabe- wertes gesetzt, so wurde das Objekt per Doppelklick oder bei gedrckter Shift-Taste ausgew„hlt 16. XAcc-2- und AV-Protokoll-Funktionen ----------------------------------- Die Library verwaltet intern alle An- und Abmeldungen der Proto- kolle XAcc2 und AV selbst„ndig. Ebenso werden die Nachrichten AV_SENDKEY sowie ACC_KEY automatisch in Keyboard-Events umgewandelt bzw. nicht ausgewertete Keyboard- Events werden als AV_SENDKEY bzw. ACC_KEY an den AV-Server oder die Hauptapplikation geschickt. Die Nachricht AV_PATH_UPDATE wird u.a. automatisch beim Aufruf der Funktion scrp_changed verschickt und sollte ansonsten nicht ver- schickt werden. Die Nachrichten VA_START und VA_DRAGACCWIND werden automatisch ausgewertet und in eine ARGS_DRAG-Nachricht umgewandelt. Weiterhin werden nicht untersttzte XAcc2-Nachrichten mit einer ACC_ACK-FALSE-Nachricht beantwortet und per ACC_TEXT empfangene Texte werden im das aktuelle Eingabefeld im obersten Dialog einge- fgt. Ist das oberste Fenster kein Dialog, so wird die Nachricht an die Applikation weitergeleitet, sofern diese Nachricht unter- sttzt wird. Alle Fensterdialoge sowie Fenster, die mit den Funktionen open_window() und close_window() ge”ffnet bzw. geschlossen werden (abgesehen von applikationsmodalen Alertboxen), werden bei einem eventuell vorhandenen AV-Server an- bzw. abgemeldet. #define XACC 1 /* XAcc-Protokoll */ #define AV 2 /* AV-Protokoll */ XAcc-Struktur: -------------- typedef struct { /* untersttzte Protokolle (Bit 0: XAcc, Bit 1: AV) */ int flag; /* XACC/AV */ /* Applikations-Identifikation */ int id; /* XAcc/AV-Protokoll */ /* Bitmap der untersttzten AV/VA-Nachrichten (Format s. Funktion init_gem()) int av_msgs,va_msgs; /* nur AV-Protokoll */ /* Highbyte: Programmversionsnummer Lowbyte: untersttzte Nachrichtengruppen */ int version; /* nur XAcc-Protokoll */ /* ID des Meneintrags im Accessory-Men */ int menu_id; /* nur XAcc-Protokoll */ /* AV-Programmname (8 Zeichen) fr appl_find */ char name[]; /* nur AV-Protokoll */ /* (erweiterter) XAcc2-Programmname oder NULL */ char *xname; /* nur XAcc-Protokoll */ /* Zeiger auf 'XDSC'-Informationen oder NULL */ char *xdsc; /* nur XAcc-Protokoll */ } XAcc; void XAccBroadCast(int msg[8]) -> Nachrichtenpuffer 'msg' an alle erreichbaren Applikationen verschicken int XAccSendAck(int sendto, int answer) -> ACC_ACK-Rckmeldung 'answer' an Applikation 'sendto' senden (OK: answer!=0, Fehler: answer==0) -> Rckgabewert: TRUE: Okay FALSE: Fehler int XAccSendKey(int sendto, int scan, int state) -> Tasten-Druck (Scancode 'scan', Status der Umschalttasten 'state') an Applikation 'sendto' senden -> Rckgabewert: TRUE: Okay FALSE: Fehler FAIL: Timeout (keine Best„tigung des Empf„ngers) int XAccSendText(int sendto, char *txt) -> Zeichenkette 'txt' an Applikation 'sendto' senden -> Rckgabewert: TRUE: Okay FALSE: Fehler FAIL: Timeout (keine Best„tigung des Empf„ngers) int XAccSendMeta(int sendto, int last, char *data, long len) -> Metafile-Block 'data' der L„nge 'len' an Applikation 'sendto' senden (last!=0 -> letzter Datenblock) -> Rckgabewert: TRUE: Okay FALSE: Fehler FAIL: Timeout (keine Best„tigung des Empf„ngers) int XAccSendImg(int sendto, int last, char *data, long len) -> GEM-Image-Block 'data' der L„nge 'len' an Applikation 'sendto' senden (last!=0 -> letzter Datenblock) -> Rckgabewert: TRUE: Okay FALSE: Fehler FAIL: Timeout (keine Best„tigung des Empf„ngers) int AvSendMsg(int sendto,int msg_id,int msg[8]) -> (AV-) Nachricht 'msg_id' an Applikation 'sendto' senden (Message-Puffer msg[3]-msg[7] enth„lt gegebenenfalls weitere Daten) -> Rckgabewert: TRUE: Okay FALSE: Fehler XAcc *find_xacc_xdsc(int app_id,char *xdsc) -> erweiterten XAcc-Programmnamen der Applikation 'app_id' nach Zeichenkette 'xdsc' durchsuchen (app<0 -> alle XAcc-Appli- kationen durchsuchen) -> Rckgabewert enth„lt Zeiger auf XAcc-Struktur der Applikation, deren XAcc-Programmname die Zeichenkette ent- h„lt, oder NULL, wenn die Zeichenkette nicht gefunden wurde XAcc *find_id(int app_id) -> XAcc-Struktur der Applikation 'app_id' ermitteln oder NULL, wenn es sich um keine XAcc-Applikation handelt XAcc *find_app(int first) -> XAcc-Struktur der ersten (first!=0) oder der n„chsten (first==0) angemeldeten Applikation ermitteln (Rckgabewert gleich NULL, wenn keine weitere Applikation gefunden wurde) int AppLoaded(char *name) -> Ermittelt die Applikations-ID der Anwendung mit dem Dateinamen 'name', welcher auch Pfad- und Laufwerksangaben enthalten darf. -> Rckgabewert: Applikations-ID oder negativer Wert 17. Drag & Drop-Funktionen ---------------------- DRAG_DROP-Struktur: ------------------- typedef struct { /* Art der Parameterbergabe */ int dd_type; #define AV_DRAG 0 /* AV/Gemini-Drag&Drop */ #define AV_START 1 /* VA_START-Nachricht */ #define MINT_DRAG 2 /* MTOS-Drag&Drop */ /* Applikations-ID des Senders */ int dd_originator; /* Mausposition (oder negative Werte, falls nicht vom Benutzer verursacht bzw. Hintergrundfenster betroffen) */ int dd_mx,dd_my; /* Status der Umschalttasten */ int dd_kstate; /* Zeiger auf (Datei-) Namen oder NULL */ char *dd_name; /* Zeiger auf Argumente (z.B. Kommandozeile) oder NULL. Die einzelnen Argumente/Dateinamen sind durch Leerzeichen ge- trennt, wobei Argumente, die Leerzeichen enthalten, inner- halb von Hochkommatas stehen (z.B. 'meine Datei'). Doppelte Hochkommatas stehen dann fr ein einzelnes Hochkommata (z.B. 'Christian''s Datei') */ char *dd_args; /* Zeiger auf bergebene Daten oder NULL (dieser Speicher- bereich darf NICHT zur weiteren Verwendung benutzt wer- den, d.h. wird wieder freigegeben!) */ char *dd_mem; /* L„nge der in 'dd_mem' bergebenen Daten oder Null */ long dd_size; /* Extension der in 'dd_mem' bergebenen Daten oder Leer- string "" char dd_ext[4]; /* Zeiger auf WIN-Struktur des Fensters, auf das die Daten gezogen wurden, oder NULL, falls Hintergrund bzw. nicht vom Benutzer verursacht */ WIN *dd_win; } DRAG_DROP; WICHTIG: -------- Per Drag&Drop k”nnen nur dann Daten empfangen werden, wenn mit Hilfe der Funktion Event_Handler() ein Ereignis-Handler angemeldet wurde, der die Drag&Drop-Nachricht 'OBJC_DRAGGED' auswertet. void SetDragDrop(int any_extension,char *exts) -> gewnschte/bevorzugte Dateierweiterungen fr das Drag&Drop- Protokoll festlegen. Dabei zeigt 'exts' auf eine Zeichen- kette mit DD_EXTSIZE Zeichen (mit Nullbytes auffllen), die die gewnschten Erweiterungen (z.B. ".TXT.ASC.ARGS") ent- h„lt, wobei die Erweiterungen jeweils 4 Zeichen umfassen mssen und 'ARGS' fr Argumente steht. Wird fr den Parameter 'any_extension' TRUE bergeben, so wird jede Erweiterung akzeptiert. (voreingestellt ist, daž nur Argu- mente entgegengenommen werden.) int SendDragDrop(int msx,int msy,int kstate,char *name, char *ext,long size,char *data) -> Daten per Drag&Drop-Protokoll an die Applikation senden, der das Fenster unter dem Mauszeiger geh”rt -> Parameter: msx,msy: Mauskoordinaten kstate: Status der Umschalttasten name: Zeiger auf (Datei-) Namen der Daten oder NULL ext[4]: Zeiger auf Zeichenkette, die die Erweiterung bzw. den Typ der Daten enth„lt size: L„nge der Daten data: Adresse der Daten -> Rckgabewert: NO_RECEIVER: Fenster oder Empf„nger nicht gefunden bzw. applikationseigenes Fenster NO_DD: Drag&Drop-Pipe konnte nicht angelegt werden (Betriebssystem untersttzt kein Drag&Drop!) DD_NAK: Empf„nger untersttzt kein Drag&Drop DD_EXT: Empf„nger kann Daten nicht empfangen (z.B. unbekanntes Format) DD_LEN: Nicht alle Daten konnten bermittelt werden oder zuwenig Speicher DD_OK: Alles in Ordnung 18. Auskunftsfunktionen ------------------- int appl_xgetinfo(int type,int *out1,int *out2,int *out3,int *out4); -> erweiterte appl_getinfo()-Routine, welche die Existenz von appl_getinfo() selbst„ndig ermittelt -> Rckgabewerte wie bei appl_getinfo() int appl_getfontinfo(int font_type,int *height,int *id,int *type) -> Informationen ber grožen (font_type=0) oder kleinen System-Font (font_type=1) ermitteln -> Rckgabewerte: height: Font-H”he in Punkt id: Font-ID type: 0 - System-Font 1 - FSM-Font int wind_xget(int w_handle, int w_field, int *w1, int *w2, int *w3,int *w4); -> korrigierte wind_get()-Funktion fr erweiterte Aufrufe unter Winx sowie MTOS und zuknftigen Erweiterungen (die in der Pure C-GEM-Library bis V1.1 enthaltene, optimierte Routine funktioniert nicht mit neueren Aufrufen) int get_dialog_info(int *fly_dials,int *win_dials,int *wins, DIAINFO **top); -> Informationen ber ge”ffnete Dialoge und Fenster ermitteln -> Rckgabewert: TRUE: Ausgabe in beliebiges Fenster m”glich FALSE: Ausgabe nur in obersten Dialog 'top' FAIL: Keine Ausgabe m”glich (z.B. Drop-Down- Men heruntergeklappt oder Popup ge- ”ffnet) *fly_dials: Anzahl der ge”ffneten (fliegenden) Dialoge (sofern fly_dials!=NULL) *win_dials: Anzahl der ge”ffneten Fenster-Dialoge (sofern win_dials!=NULL) *wins: Anzahl der ge”ffneten Fenster (sofern wins!=NULL) inklusive der Fensterdialoge *top: Zeiger auf obersten Dialog, falls Rckgabewert gleich FALSE (sofern top!=NULL) 19. Datei-/Pfadfunktionen --------------------- void drive_changed(int drive) -> Inhalt des Laufwerks 'drive' (0=A,1=B,2=C,...,-1=alle Lauf- werke) wurde ver„ndert (SH_WDRAW-Nachricht wird (per XAccBroadCast) an alle Applikationen gesendet) char *GetFilename(char *path) -> Zeiger auf Dateiname des Pfades 'path' ermitteln. Enth„lt der Pfad keinen Dateinamen, so zeigt der Rckgabewert auf das Ende (Nullbyte) des Pfades char *GetExtension(char *path) -> Zeiger auf Erweiterungs des Dateinamens des Pfades 'path' ermitteln. Enth„lt der Pfad keinen Dateinamen oder keine Erweiterung, so zeigt der Rckgabewert auf das Ende (Nullbyte) des Pfades char *GetPath(char *path) -> Dateiname des Pfades 'path' wird entfernt und ein Zeiger auf das Ende des Pfades (Nullbyte) zurckgegeben int GetDrive(char *path) -> Laufwerk des Pfades 'path' ermitteln -> Rckgabewert: 0=A,1=B,2=C,... void MakeFullpath(char *dest,char *path,char *file) -> kompletten Pfadnamen aus Pfad 'path' (sofern path!=NULL, wobei der Pfad keinen abschlieženden Backslash enthalten muž) und Datei 'file' erstellen und im String 'dest' zurck- geben. Wird fr den Pfad 'path' NULL bergeben, so muž sich der Pfad bereits in 'dest' befinden! int FileSelect(char *title,char *path,char *fname,char *sel, int no_insel) -> Dateiselector aufrufen, wobei diese Funktion automatisch erkennt, ob ein erweiterter Fileselector vorliegt. -> Parameter: title: Titel des Fileselectors path: Pfad (sowohl Ein- als auch Ausgabeparameter) fname: vorgegebene Datei (Eingabe) bzw. ausgew„hlte Datei (Ausgabe) sel: Dateimaske oder NULL (in diesem Fall wird "*.*" genommen) no_insel: keine vorgegebene Datei (no_insel!=0) -> Rckgabewert: TRUE: Datei wurde ausgew„hlt FALSE: Keine Datei ausgew„hlt oder Fehler aufgetreten 20. Verschiedene Funktionen ----------------------- void MouseOn(void); void MouseOff(void); -> Mauszeiger an/-ausschalten. Diese Funktionen merken sich intern, ob der Mauszeiger bereits an- oder ausgeschaltet ist. void MouseArrow(void); void MouseCursor(void); void MouseBee(void); void MouseHourGlass(void); void MousePointHand(void); void MouseFlatHand(void); void MouseThinCross(void); void MouseThickCross(void); void MouseOutlineCross(void); -> Mausform einstellen int sl_key(int scan,int ascii) -> Aus Scan-Code 'scan' und ASCII-Code 'ascii' Tastencode fr SLKEY-Struktur berechnen (bisher reines Ersetzungs- Makro) int scan_2_ascii(int scan,int state); -> Grožbuchstabe eines Tastendrucks aus Scan-Code 'scan' und Status der Umschalttasten 'state' ermitteln int min(int val1,int val2); -> Minimum der Werte 'val1' und 'val2' berechnen und zurck- geben int max(int val1,int val2); -> Maximum der Werte 'val1' und 'val2' berechnen und zurck- geben void Min(int *var,int val); -> Minimum von der Variablen '*var' und dem Wert 'val' berechnen und in der Variablen '*var' speichern void Max(int *var,int val); -> Maximum von der Variablen '*var' und dem Wert 'val' berechnen und in der Variablen '*var' speichern void mfdb(MFDB *mfdb,int *bitmap,int width,int height, int standard,int planes) -> Memory form definition block 'mfdb' initialisieren -> bitmap: Zeiger auf Start der Bitmap width,height: Breite/H”he der Bitmap in Pixeln standard: Standardformat (1) oder ger„teabh„ngiges Format planes: Anzahl der Farbebenen der Bitmap long mfdb_size(MFDB *mfdb); -> Speicherbedarf der Bitmap des Memory form definition block 'mfdb' berechnen char LowerChar(char ch) char UpperChar(char ch) -> Zeichen 'ch' in Klein-/Grožbuchstaben umwandeln, wobei auch Umlaute beachtet werden void *GetMsgBuffer(long size) -> globalen Speicher (u.a. fr XAcc-2/AV-Kommunikation) der Gr”že 'size' anfordern -> Rckgabewert wie bei Malloc() 21. Definitionen h„ufig ben”tigter (Protokoll-) Konstanten ------------------------------------------------------ XAcc-2-Protokoll: ----------------- (genaue Bedeutung s. XAcc-2-Dokumentation) #define ACC_ID 0x400 #define ACC_OPEN 0x401 #define ACC_CLOSE 0x402 #define ACC_ACC 0x403 #define ACC_EXIT 0x404 #define ACC_ACK 0x500 #define ACC_TEXT 0x501 #define ACC_KEY 0x502 #define ACC_META 0x503 #define ACC_IMG 0x504 AV-Protokoll: ------------- (genaue Bedeutung s. AV-Dokumentation 'VA_PROTO.H') #define AV_PROTOKOLL 0x4700 #define AV_GETSTATUS 0x4703 #define AV_STATUS 0x4704 #define AV_SENDKEY 0x4710 #define AV_ASKFILEFONT 0x4712 #define AV_ASKCONFONT 0x4714 #define AV_ASKOBJECT 0x4716 #define AV_OPENCONSOLE 0x4718 #define AV_OPENWIND 0x4720 #define AV_STARTPROG 0x4722 #define AV_ACCWINDOPEN 0x4724 #define AV_ACCWINDCLOSED 0x4726 #define AV_COPY_DRAGGED 0x4728 #define AV_PATH_UPDATE 0x4730 #define AV_WHAT_IZIT 0x4732 #define AV_DRAG_ON_WINDOW 0x4734 #define AV_EXIT 0x4736 #define VA_PROTOSTATUS 0x4701 #define VA_SETSTATUS 0x4705 #define VA_START 0x4711 #define VA_FILEFONT 0x4713 #define VA_CONFONT 0x4715 #define VA_OBJECT 0x4717 #define VA_CONSOLEOPEN 0x4719 #define VA_WINDOPEN 0x4721 #define VA_PROGSTART 0x4723 #define VA_DRAGACCWIND 0x4725 #define VA_COPY_COMPLETE 0x4729 #define VA_THAT_IZIT 0x4733 #define VA_DRAG_COMPLETE 0x4735 #define VA_OB_UNKNOWN 0 #define VA_OB_TRASHCAN 1 #define VA_OB_SHREDDER 2 #define VA_OB_CLIPBOARD 3 #define VA_OB_FILE 4 #define VA_OB_FOLDER 5 #define VA_OB_DRIVE 6 #define VA_OB_WINDOW 7 MTOS-Drag&Drop-Protokoll: ------------------------- (genaue Bedeutung s. MTOS-Entwickler-Dokumentation) #define AP_DRAGDROP 63 #define DD_OK 0 #define DD_NAK 1 #define DD_EXT 2 #define DD_LEN 3 #define DD_TRASH 4 #define DD_PRINTER 5 #define DD_CLIPBOARD 6 #define DD_TIMEOUT 4000 #define DD_NUMEXTS 8 #define DD_EXTSIZE 32L #define DD_NAMEMAX 128 #define DD_HDRMAX (8+DD_NAMEMAX) Men-Protokoll: --------------- #define WM_CLOSED 0x0016 ^U #define WM_FULLED 0x0017 ^#* ('*' auf Ziffernblock) #define WM_SAVE 0x1000 ^S #define WM_SAVEAS 0x1001 ^M #define WM_PRINT 0x1002 ^P #define WM_UNDO 0x1003 Undo #define WM_CUT 0x1004 ^X #define WM_COPY 0x1005 ^C #define WM_PASTE 0x1006 ^V #define WM_SELECTALL 0x1007 ^A #define WM_FIND 0x1008 ^F #define WM_REPLACE 0x1009 ^R #define WM_FINDNEXT 0x100a ^G #define WM_HELP 0x100b Help #define WM_DELETE 0x100c Delete View-Protokoll: --------------- (genaue Bedeutung s. View-Dokumentation V1.04) #define VIEW_FILE 0x5600 #define VIEW_FAILED 0x5601 #define VIEW_OPEN 0x5602 #define VIEW_CLOSED 0x5603 #define VIEW_DATA 0x5604 #define VIEW_GETMFDB 0x5610 #define VIEW_SETMFDB 0x5611 #define VIEW_MFDB 0x5612 #define VIEWERR_ERROR 0 #define VIEWERR_SIZE 1 #define VIEWERR_COLOR 2 #define VIEWERR_WID 3 #define VIEWERR_MEM 4 Clipboard-Protokoll: -------------------- (s.a. Beschreibung der Funktion scrp_changed()) Aufbau der Nachricht: msg[0] = SC_CHANGED (80) msg[1] = apID msg[2] = 0 msg[3] = Bitmap des Dateiformats (Parameter 'format' von scrp_changed()) msg[4],msg[5] = 4 Zeichen fr die "beste" der abgespeicherten Dateien (z.B. ".RTF"), damit beim Lesen m”g- lichst wenig Information verloren geht (Parameter 'best_ext' von scrp_changed()) msg[6],msg[7] = reserviert (auf Null setzen!) Scan-Codes: ----------- #define SCANESC 1 /* Esc */ #define SCANTAB 15 /* Tab */ #define SCANRET 28 /* Return */ #define SCANDEL 83 /* Delete */ #define SCANBS 14 /* Backspace */ #define SCANENTER 114 /* Enter */ #define SCANHELP 98 /* Help */ #define SCANUNDO 97 /* Undo */ #define SCANINS 82 /* Insert */ #define SCANHOME 71 /* Clr/Home */ #define SCANUP 72 /* Up */ #define SCANDOWN 80 /* Down */ #define SCANLEFT 75 /* Left */ #define SCANRIGHT 77 /* Right */ #define CTRLLEFT 115 /* Ctrl-Left */ #define CTRLRIGHT 116 /* Ctrl-Right */ #define SCANF1 59 /* F1 - F10 */ ... #define SCANF10 68 #define CTRLF1 84 /* CTRL-F1 - CTRL-F10 */ ... #define CTRLF10 93