ICFS - Beschreibung der Schnittstelle 13.06.1994 Der ICFS legt einen Cookie namens ICFS an. Der Wert dieses Cookies ist die Adresse einer Funktion, ber die Programme den ICFS aufrufen k”nnen. Die folgende Beschreibung erfolgt in C-Syntax (genauer: Pure C). Fr andere Sprachen seien daher folgende Angaben gemacht: Ein "int" ist eine vorzeichenbehaftete 16-Bit-Zahl, ein "unsigned int" entsprechend ohne Vorzeichen. Ein "*" (bzw. "&") vor einem Variablennamen kennzeichnet einen Zeiger, d.h. statt des Werts der Variablen wird deren Adresse bergeben. Alle Parameter werden ber den Stack bergeben. Dabei werden die Parameter beim Aufruf in der Reihenfolge von links nach rechts auf dem Stack abgelegt (der am weitesten rechts stehende Parameter liegt also zum Schluž obenauf). C erlaubt Funktionen, bei denen die Zahl und Art der Parameter variieren k”nnen, davon wird hier Gebrauch gemacht. Fr andere Sprachen muž man daher ggfs. fr jede Subfunktion ein eigenes Binding erstellen. Der aktuelle Server hat die Versionsnummer 0.11. Er kennt folgende Subfunktionsnummern (ein "0x" kennzeichnet eine Hex-Zahl): #define ICF_GETSIZE 0x0000 #define ICF_GETPOS 0x0001 #define ICF_FREEPOS 0x0002 #define ICF_FREEALL 0x0100 #define ICF_INFO 0x0200 #define ICF_CONFIG 0x0201 #define ICF_SETSIZE 0x0202 #define ICF_SETSPACE 0x0203 In C definiert man am besten int cdecl (*server)(int f,...); server=get_cookie('ICFS'); Die Funktionen im einzelnen: ICF_GETSIZE: Aufruf in C: version=(*server)(ICF_GETSIZE,&w,&h); int version, *w, *h; w und h sind Zeiger auf ints. Der Server liefert die aktuelle Gr”že eines ikonifizierten Fensters (w: Breite, h: H”he) sowie die Versions- Nummer des ICFS zurck. ICF_GETPOS: Aufruf in C: posnr=(*server)(ICF_GETPOS,&x,&y,&w,&h); int posnr; int *x, *y, *w, *h; Der Server liefert eine Fensterposition (in x und y) und die aktuelle Gr”že eines ikonifizierten Fensters (in w und h) zurck. Diese Position ist nun belegt und muž mit ICF_FREEPOS wieder freigegeben werden, wenn sie nicht mehr ben”tigt wird. posnr ist die Nummer dieser Position. ICF_FREEPOS: Aufruf in C: (*server)(ICF_FREEPOS,posnr); int posnr; Gibt das Fenster posnr (Nummer der Fensterposition wie von ICF_GETPOS geliefert) wieder frei. ICF_FREEALL: Aufruf in C: (*server)(ICF_FREEALL); Gibt alle belegten Fensterpositionen frei. Gedacht ist dies haupt- s„chlich um von abgestrzten Programmen nicht mehr freigegebene Positionen wieder nutzbar zu machen. Diese Funktion sollte nicht automatisch, sondern nur vom Anwender ausgel”st werden k”nnen. ICF_INFO: Aufruf in C: realsize=(*server)(ICF_INFO,&conf,size); ICFSCONFIG *conf; int realsize, size; conf ist ein Zeiger auf eine Struktur vom Typ ICFSCONFIG, die wie folgt definiert ist: struct _config { unsigned reserved : 13; /* unbenutzt, sollte 0 sein */ unsigned yfirst : 1; /* Bit 2: 1=zuerst in y-Richtung */ unsigned right : 1; /* Bit 1: 1=rechts anfangen */ unsigned top : 1; /* Bit 0: 1=oben anfangen */ }; typedef struct { unsigned int version; /* Versionsnummer als BCD */ struct _config config; /* Config., siehe oben */ int xsize, ysize, /* Breite, H”he des Fensters, default=72 */ xspace, yspace; /* Abstand zwischen Fenstern, default=0 */ } ICFSCONFIG; In der Struktur steht als erstes die Versionsnummer als BCD (d.h. 0x0010 fr Version 0.10), dann folgt ein Bitfeld, d.h. ein 16-Bit- Wort, dessen einzelne Bits die angegebene Bedeutung haben (siehe auch ICF_CONFIG). Anschliežend stehen noch die aktuelle Breite und H”he eines ikonifzierten Fensters sowie der Abstand zwischen zwei solchen Fenstern. Durch diesen Aufruf hat man Zugriff auf alle wichtigen Informationen der aktuellen Konfiguration. Beim Aufruf wird ein Zeiger auf einen Speicherbereich im Anwenderprogramm(!) bergeben, den der ICFS dann mit den Werten fllt. In size wird die Gr”že dieses Bereichs ber- geben, als Rckgabewert erh„lt man (als Information) die tats„chliche Gr”že der Struktur. Sp„tere ICFS-Versionen k”nnen u.U. eine gr”žere Struktur verwenden, durch den Parameter size kopiert der ICFS aber immer nur soviele Daten, wie der Aufrufer kennt. Da die Struktur in den Speicherbereich des Anwenderprogramms kopiert wird, ist ein Ver„ndern der Werte natrlich ohne Wirkung. Dafr gibt es die folgendenen Funktionen. ICF_CONFIG: Aufruf in C: (*server)(ICF_CONFIG,config); unsigned int config; Hiermit kann die Art und Weise eingestellt werden, wie die Fenster auf dem Bildschirm plaziert werden k”nnen. Bit 0: 0 = unten anfangen 1 = oben anfangen Bit 1: 0 = links anfangen 1 = rechts anfangen Bit 2: 0 = erst in x-, dann y-Richtung belegen 1 = erst in y-, dann x-Richtung Die MTOS-Methode (unten links beginnen, in x-Richtung weiter) w„re also 0, oben rechts beginnend in y-Richtung (nach unten) w„re 7. Die anderen Bits werden z.Z. nicht verwendet und sollten 0 sein. ICF_SETSIZE: Aufruf in C: ret=(*server)(ICF_SETSIZE,nw,nh); int ret, nw, nh; Setzt eine neue Breite (nw) und H”he (nh) fr Fenster fest. Sind noch Fensterpositionen belegt, so wird diese Angabe erst bernommen, wenn einmal alle Positionen frei sind (ICF_GETSIZE und ICF_GETPOS liefern solange auch noch die alte Gr”ženangabe). ret liefert 0, wenn die Gr”že gleich gesetzt werden konnte. Sind noch Fenster offen, dann wird eine 1 zurckgegeben. Atari empfiehlt, in ein ikonifiziertes Fenster ein Icon zu zeichnen. Geht man von einem normalgrožen Icon aus (32x32 Pixel mit Text darunter), dann erscheint eine Fenstergr”že von weniger als 64x64 Pixel nicht sinnvoll (64x64 sind die Auženmaže). ICF_SETSPACE: Aufruf in C: ret=(*server)(ICF_SETSPACE,nx,ny); int ret, nx, ny; Setzt den Abstand zwischen zwei ICFS-Fenstern fest, getrennt nach x- und y-Abstand (nx bzw. ny). Sind noch Fensterpositionen belegt, so werden diese Angaben erst bernommen, wenn einmal alle Positionen frei sind (ICF_INFO liefert solange noch die alten Werte). ret liefert 0, wenn die Abst„nde gleich gesetzt werden konnten. Sind noch Fenster offen, dann wird eine 1 zurckgegeben. Alle Funktionen geben (im Register D0) einen int als Fehlercode zurck. 0 bedeutet "kein Fehler", eine negative Zahl steht fr einen Fehler. Ungltige Funktionsnummern werden mit -32 (Gemdos-Fehler- meldung EINVFN, "Invalid function number") quittiert. Die Funktionen ICF_FREEALL, ICF_CONFIG, ICF_SETSIZE und ICF_SETSPACE sollten von einem normalen Anwenderprogramm nicht aufgerufen werden. Hierfr existiert das ICFS.CPX von John McLoud, mit dem alle diese Einstellungen bequem vorgenommen werden k”nnen. Ein Programm, das Iconify ohne MultiTOS untersttzen will, braucht eigentlich nur die Funktionen ICF_GETPOS und ICF_FREEPOS zu unter- sttzen. Anmerkungen Der ICFS kann das MultiTOS-Iconify nicht nachbilden. Dies w„re nur durch tiefe Eingriffe in die AES zu erreichen. Die einzige Aufgabe des ICFS ist, die Belegung der Icon-Positionen zwischen verschiedenen Programmen abzustimmen. Fr das eigentliche Iconify ist jedes Programm selbst zust„ndig. Zur Zeit besteht ein direkter Zusammenhang zwischen der zurckgegebenen Positionsnummer und der tats„chlichen Position auf dem Bildschirm. Dies kann (und wird) sich in sp„teren Versionen des ICFS „ndern! Bekannte Probleme: Der ICFS kann z.Z. nur ein Feld von 32x32 Iconfenstern verwalten, was bei virtuellen Aufl”sungen u.U. nicht ausreichend ist. Die Idee zum Iconify ohne MultiTOS stammt von Rosin Datentechnik Reiner Rosin Peter-Spahn-Str. 4 D-65375 Oestrich-Winkel Telefon 06723 4978 Fax 7190 email Reiner Rosin @ WI2 (MausNet) / Reiner_Rosin@wi2.maus.de Der ICFS und dieser Text sind von Dirk Haun Europastr. 8 D-64569 Nauheim e-mail: Dirk Haun @ WI2 (MausNet)