home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
M.u.C.S. Disc 2000
/
MUCS2000.iso
/
anwend
/
bkite213
/
develop_
/
boxprog.doc
next >
Wrap
Text File
|
1999-02-15
|
33KB
|
835 lines
BoxKite V 2.13
==============
---- Just another file selector ----
Programmierdokumentation
------------------------
Traps und Cookies
-----------------
BoxKite verbiegt die Vektoren für Trap #2 (GEM) und Trap #13 (BIOS).
Die XBRA-Kennung ist 'HBFS'.
BoxKite legt die folgenden Cookies an:
a) 'FSEL'
Über den 'FSEL'-Cookie wird eine Teilmenge der inzwischen
wohlbekannten Selectric┐-Programmierschnittstelle realisiert.
b) 'HBFS'
Der Wert des 'HBFS'-Cookies ist, wie schoon in früheren Versionen, die
Einsprungadresse des Trap-2-Handlers von BoxKite. In Version 2.00
zeigt dieser Cookie auf die folgende Struktur (in C-Notation):
typedef struct
{ unsigned int branch; /* Sprungbefehl um den struct herum */
unsigned long magic; /* Wert immer 'BxKt' */
unsigned int version; /* Versionsnummer: 0x200 für 2.00 */
long resvd1; /* reserviert */
long resvd2; /* reserviert */
long resvd3; /* reserviert */
long resvd4; /* reserviert */
}
BXKT_STR;
In zukünftigen Versionen wird diese Struktur möglicherweise erweitert;
die Versionsnummer wird das Vorhandensein solcher Erweiterungen
signalisieren.
c) '_IDT'
Der '_IDT'-Cookie definiert das Format der Datums- und
Uhrzeitdarstellung übergreifend für alle Anwendungsprogramme. BoxKite
legt diesen Cookie, falls er noch nicht im System vorhanden ist, und
initialisiert ihn mit den für Deutschland üblichen Einstellungen.
Wenn der Cookie bereits vorhanden ist, bleibt er unverändert.
Wenn beim Start von BoxKite der Cookie 'FSEL' oder 'HBFS' schon
existiert, wird BoxKite nicht installiert, da in diesem Fall zu
vermuten ist, da₧ schon ein anderer residenter Fileselector
installiert ist (der Klügere gibt nach).
Der Aufruf von BoxKite über 'fsel_exinput()' braucht nicht in
'wind_update()'-Aufrufe geklammert zu werden. Die nötigen Semaphoren
werden automatisch gesetzt. Die Verwendung von
'wind_update(BEG_UPDATE)' ist aber unschädlich, da BoxKite diesen
Semaphoren im Fensterbetrieb selbsttätig wieder zurücksetzt.
'wind_update(BEG_MCTRL)' sollte dagegen gemieden werden, da BoxKite
ansonsten davon ausgeht, von einem modalen Dialog aus aufgerufen
worden zu sein. Damit wird der Fensterbetrieb wirksam unterbunden.
Die folgenden Abschnitte erläutern zunächst den Aufruf von BoxKite
über die Selectric-Schnittstelle und anschlie₧en den Aufruf über die
FSLX-Schnittstelle. Die hier in Prosa beschriebenen Techniken werden
in den Beispielprogrammen 'BSP_FSEL.C' bzw. BSP_FSLX.C' illustriert.
Aufruf über das Selectric-Protokoll
-----------------------------------
Auch auf die Gefahr hin, bereits Bekanntes zu wiederholen, möchte ich
hier die Funktionsweise der Selectric┐-Schnittstelle beschreiben,
soweit sie auf BoxKite zutrifft. Der Wert des 'FSEL'-Cookies ist die
Adresse einer Datenstruktur, über die der Datenaustausch zwischen dem
Anwendungsprogramm und dem Fileselector erfolgt. Unter MiNT-Versionen
mit Speicherschutz ist diese Datenstruktur für Anwendungsprogramme nur
im Supervisor-Mode zugänglich. Die Datenstruktur wird in C
folgenderma₧en deklariert:
typedef struct
{ unsigned long id; /* ID (`SLCT') */
unsigned int version; /* Version (BCD-Format) */
struct
{ unsigned : 8; /* reserviert */
unsigned pthsav : 1;
unsigned stdest : 1;
unsigned : 1;
unsigned numsrt : 1; /* numerisches Sortieren */
unsigned lower : 1;
unsigned dclick : 1; /* Ordner mit Doppelklick */
unsigned hidden : 1; /* versteckte Dateien */
unsigned onoff : 1; /* Fileselector AN/AUS */
} config;
int sort; /* Sortiermodus */
int num_ext; /* Anzahl Extensions */
char *(*ext)[]; /* Standard-Extensions */
int num_paths; /* Anzahl Pfade */
char *(*paths)[]; /* Standard-Pfade */
int comm; /* communication word */
int in_count; /* input counter */
void *in_ptr; /* input pointer */
int out_count; /* output counter */
void *out_ptr; /* output pointer */
int cdecl (*get_first)(XDTA *dta, int attrib);
int cdecl (*get_next)(XDTA *dta);
int cdecl (*release_dir)(void);
}
SLCT_STR;
Die Felder 'in_count' und 'in_ptr' sind weder in Selectric noch in
BoxKite benutzt. Die Felder 'pthsav', 'stdest' und 'lower' haben für
Selectric eine Bedeutung, sind aber unter BoxKite als reserviert
anzusehen.
Alle Strings, von denen in diesem Abschnitt die Rede ist, sind
selbstredend nullterminiert. Die Felder im Einzelnen:
- 'id': Dieses Langwort mu₧ den Inhalt 'SLCT' haben.
Andernfalls wurde der 'FSEL'-Cookie von einem Fileselector
installiert, der das Selectric-Protokoll nicht versteht.
Bevor Sie das Selectric-Protokoll verwenden, müssen Sie also
dieses Feld testen.
- 'version': Hier steht die Versionsnummer des
Selectric-Protokolls im BCD-Format, also 0x100 für 1.0.
BoxKite trägt die Nummer 1.02 ein.
- 'config': Die einzelenen Bits in diesem Wort schalten
bestimme Features von BoxKite bzw. Selectric ein oder aus.
Die folgenden Bits sind für BoxKite relevant:
onoff steht dieses Bit auf 0, so wird die
GEM-Dateiauswahl anstelle von Selectric bzw.
BoxKite benutzt.
hidden Gibt an, ob versteckte Dateien angezeigt werden
sollen.
dclick Ordner erst auf Doppelklick öffnen.
numsrt Schaltet die numerische Sortierung ein.
- 'sort': Konfiguriert das Sortierkriterium, dabei gelten
folgende Werte:
1 Sortiert nach dem Namen
2 nach Datum
3 nach Grö₧e
4 nach Typ bzw. Extension
5 unsortiert
Negative Werte werden von BoxKite ignoriert.
- 'num_ext', 'ext': Über diese beiden Felder kann die
Anwendung an BoxKite eine Liste von Dateitypen übergeben.
Dazu mu₧ sie in 'num_ext' die Anzahl der Typstrings
eintragen, in 'ext' die Adresse eines Arrays von Zeigern
auf die fraglichen Strings. Wenn BoxKite die Liste
übernommen hat, wird 'ext' wieder auf die BoxKite-eigene
Liste zurückgebogen. Die Applikation mu₧ diese Felder also
vor jedem fsel_input() bzw. fsel_exinput() einstellen.
- 'num_paths', 'paths': Mit diesen Feldern kann die
Applikation BoxKite eine neue Liste von Pfaden übergeben.
Das Verfahren ist dasselbe wie oben. Auch diese Felder
müssen vor jedem Aufruf eingestellt werden.
Die Pfade und Suchmasken, die über diese Schnittstelle
übergeben werden, erscheinen nicht in der History des
Pfadfeldes oder in den Maskenknöpfen, sondern immer nur im
Popup hinter der übergebenen Maske (oberster Maskenknopf).
Wenn der Anwender "Arbeit sichern" betätigt, werden die von
BoxKite selbst gespeicherten Pfade und Typen gesichert,
NICHT die von der Applikation festgelegten.
- 'comm', 'out_count', 'out_ptr', 'get_first', 'get_next',
'release_dir': Diese Felder werden benötigt, um die
Rückgabe von mehreren Dateinamen an die Hauptanwendung zu
realisieren. Näheres im folgenden Abschnitt.
Wie geht man nun vor, um eine Mehrfachauswahl von Dateien zu
realisieren? Hier sieht das Selectric-Protokoll 3 Möglichkeiten vor.
Allen ist gemeinsam, da₧ vor dem Aufruf von BoxKite das Bit 0 im Wort
'comm' auf 1 gesetzt werden mu₧. Die Nutzung der weiteren Felder
hängt von der vorgesehenen Variante ab. Es sind dies die folgenden:
a) Rückgabe über ein Zeigerarray
Um diese Rückgabemethode anzufordern, setzt die Anwendung das Feld
'comm' auf den Wert 1 (also Bit 0 auf 1 und alle anderen auf 0). Nach
'out_count' schreibt sie die Anzahl der Dateien, die sie höchstens
erwartet. Nach 'out_ptr' gehört dann die Adresse eines Arrays von
Zeigern interpretiert, von denen jeder auf den Speicher für einen
Dateinamen verweist. Es müssen mindestens so viele gültige Zeiger
vorhanden sein, wie 'out_count' angibt, und jeder Zeiger mu₧ auf
einen hinreichend gro₧en freien Speicherblock verweisen. ACHTUNG: 13
Bytes (incl. terminierender 0) sind NICHT genug, 256 Bytes kommen der
Sache schon näher.
b) Rückgabe über eine Kommandozeile
Um diese Rückgabemethode anzufordern, setzt die Anwendung das Feld
'comm' auf den Wert 3 (also Bits 0 und 1 auf 1 und alle anderen auf
0). Nach 'out_count' schreibt sie auch hier die Anzahl der Dateien,
die sie höchstens erwartet. 'out_ptr' wird als als Adresse eines
Strings inetrpretiert, in den die Namen durch Leerzeichen getrennt
geschreiben werden. Der String mu₧ gro₧ genug für 'out_count' Namen
incl. Leerzeichen sein. Beachten Sie auch hier, da₧ ein Name bis zu
255 Zeichen umfassen kann.
Da diese Methode Leerzeichen als Trennzeichen verwendet, kann es zu
Problemen kommen, wenn die übergebenen Dateinamen schon Leerzeichen
enthalten. Um diesen Problemen aus dem Wege zu gehen, werden diese
Namen in Hochkommata eingefa₧t. Eventuell in den Namen enthaltene
Hochkommata werden verdoppelt.
c) Rückgabe über Abruffunktionen
Diese Technik ermöglicht Ihnen, eine theoretisch unbegrenzte Anzahl
von Dateinamen zurückzuerhalten. Um sie anzufordern, müssen Sie
zunächst 'comm' mit dem Wert 9 laden (also Bit 0 und 3 auf 1 und alle
anderen auf 0). Wenn 'fsel_[ex]input()' dann signalisiert, da₧ der
User 'Ok' gewählt hat, rufen Sie zunächst 'get_first' auf. Diese
Funktion erwartet als Parameter (und zwar in C-Manier auf dem Stack)
einen Zeiger auf eine XDTA-Struktur und ein Attributwort. Eine
XDTA-Struktur ist wie folgt zu deklarieren:
typedef struct
{ char d_reserved[21];
unsigned char d_attrib;
unsigned int d_time;
unsigned int d_date;
unsigned long d_length;
char d_fname[256];
}
XDTA;
Bis auf die Länge des Namensfeldes ist sie identisch mit der
Standard-TOS-DTA. Das Namensfeld wurde mit Rücksicht auf die langen
Dateinamen erweitert.
'get_first' funktioniert wie 'Fsfirst' und füllt die XDTA-Struktur mit
Informationen über die erste selektierte Datei. Es werden nur solche
Dateien zurückgegeben, die die Attribute haben, die mit dem
übergebenen Attributwort korrespondieren (die Werte werden genauso
behandelt wie von GEMDOS bei Fsfirst(), d. h. Dateien mit den
Attributen 0, "Archiv" oder "schreibgeschützt" erscheinen immer).
Wenn eine Datei gefunden wurde, gibt 'get_first()' eine 0 zurück.
Dann können Sie mit 'get_next()' nacheinander alle weiteren Dateien
anfordern, bis ein Returncode ungleich 0 auftritt. Danach müssen Sie
'release_dir()' aufrufen, woraufhin BoxKite den von der Dateiliste
belegten Speicher freigibt. Diesen ganzen Ablauf sollten Sie in
'wind_update' einschachteln, damit kein anderer Proze₧ auf die Idee
kommt, zwischenzeitlich eine Dateiauswahlbox aufzurufen. Falls diese
Beschreibung etwas zu abstrakt geraten ist, werfen Sie einen Blick in
BEISPIEL.C.
Seit Version 1.71 enthält BoxKite eine Schnittstelle, über die die
Hauptapplikation GEM-Messages, die sich auf hintenliegende Fenster
beziehen, erhalten kann. Damit entfällt der Redraw mit kleinen bunten
Doppeldeckern.
Das Grundprinzip ist ganz einfach. Sie übergeben an BoxKite im
'fsel_exinput()' als zusätzlichen Parameter die Einsprungadresse
einer Routine, die die Behandlung dieser Messages übernimmt. Diese
Routine mu₧ in C folgenderma₧en deklariert werden:
void cdecl message_handler(int *message)
Sie sollte also auf dem Stack (in C-Manier) als einzigen Parameter
einen Zeiger auf den Message-Puffer erwarten, der von 'evnt_multi()'
gefüllt wird. Einen Rückgabewert braucht sie nicht zu erzeugen. Vor
dem Aufruf dieser Routine schaltet BoxKite wieder auf den Stack der
Hauptapplikation um.
Der Zeiger auf diese Routine wird im GEM-Feld 'addrin' als vierter
Parameter an 'fsel_exinput()' übergeben. Um deutlich zu machen, da₧
hier ein gültiger Zeiger steht, mu₧ 'contrl[3]' auf 4 gesetzt werden.
Andere Fileselectoren sollten sich nicht an dieser Änderung stören.
In BEISPIEL.C finden Sie auch für dieses Feature ein Anwedungsbeispiel
sowie ein in diesem Sinne erweitertes Binding für 'fsel_exinput()'.
Dieses Binding läuft mit Pure C 1.1. Eine Assembler-Version desselben
Bindings liegt als Quelltext und als Objekt-Datei im DR-Format bei.
Aufruf über die FSLX-Schnittstelle
----------------------------------
Mit MagiC Version 4.x wurden zusätzliche Systemaufrufe eingeführt, die
die Dateiauswahl im Fenster explizit unterstützen und daher keine der
Schwächen haben, mit denen sich BoxKite bisher herumschlagen mu₧te.
Daher unterstützt BoxKite nunmehr diese Aufrufe und stellt sie auch
in Nicht-MagiC-Umgebungen zur Verfügung. Einige Spezialitäten fehlen
noch in BoxKite 2.00 (z. B. die Filterfunktion). Ich werde sie aber
noch einbauen, wenn sie gewünscht werden. In den folgenden
Abschnitten möchte ich die Verwendung der FSLX-Schnittstelle kurz
beschreiben (obwohl ich wahrscheinlich auch hier längst Bekanntes
wiederkäue).
Wenn Sie die FSLX-Bibliothek verwenden möchten, müssen Sie als erstes
prüfen, ob diese Aufrufe im aktuellen System vorhanden sind. Hierzu
wird der aufruf 'appl_getinfo()' verwendet:
appl_getinfo(7, &gout1, &gout2, &gout3, &gout4);
if ( (gout1 & 8) == 0 )
{ form_alert(1, "[3][ FSLX nicht vorhanden! ][ Ok ]");
appl_exit();
return 0;
}
Die Unterfunktion 7 von 'appl_getinfo()' fragt MagiC-spezifische
Informationen ab. Im Parameter gout1 werden einzelne Bits
zurückgegeben, die das Vorhandensein diverser erweiterter
Dialogbibliotheken signalisieren. Bit 3 ist hier für die
Dateiauswahlbibliothek FSLX zuständig. Dieser Aufruf wird von BoxKite
so modifiziert, da₧ das Bit 3 immer gesetzt ist.
Falls die vorhandene TOS-Version die Funktion 'appl_getinfo()' nicht
unterstützt, kann auch der 'HBFS'-Cookie ausgewertet werden. Die
FSLX-Aufrufe sind genau dann vorhanden, wenn der Wert des Cookies auf
eine Struktur vom Typ 'BXKT_STR' zeigt, die ein gültiges 'magic'-Wort
und die Versionsnummer >= 2.00 enthält:
BXKT_STR *value;
if ( cookie_find('HBFS', &value) )
{ if ( value->magic == 'BxKt' && value->version >= 0x200 )
{
/* FSLX-Lib vorhanden */
}
}
BTW: Das 'Abschalten' von BoxKite über das CPX-Modul wirkt sich auf
die FSLX-Aufrufe nur dann aus, wenn das zugrundeliegende
Betriebssystem diese in einer eigenen Version zur Verfügung stellt
(gilt bisher m. W. nur für neuere MagiC-Versionen). Andernfalls
bleiben die entsprechenden Routinen von BoxKite immer aktiv, damit
diese Aufrufe nicht ins Leere gehen.
FSLX-Dateiauswahl als Fenster
-----------------------------
Die FSLX-Schnittstelle behandelt einen Fileselector nicht als
Dialogbox im herkömmlichen Sinne mit einer eigenen Event-Schleife,
sondern bindet ihn in die Hauptschleife der Applikation mit ein. Das
bedeutet, da₧ die Applikation nach jedem 'evnt_multi()'-Aufruf
erstmal die Dateiauswahlbox fragen mu₧, ob diese mit dem erhaltenen
Event etwas anfangen kann.
Die Einbindung in eine Applikation könnte grob so aussehen:
int fsel_cont;
int button, nfiles;
char name[256];
void *fsel = NULL; /* Diese Variable nimmt das Handle */
/* des Fileselectors auf. */
/* Hier sind wir in einem Unterprogramm, das z. B.
einen Menüaufruf verarbeitet ... */
fsel = fslx_open(...); /* Fileselector öffnen */
if ( fsel == NULL )
{
/* Fehlermeldung o. ä. */
}
...
/* Hier sind wir in der Hauptschleife der Applikation... */
event = evnt_multi(...); /* Events abrufen */
if ( fsel != NULL ) /* Wenn ein Fileselector offen ist */
{ /* Events an diesen abgeben */
fsel_cont = fslx_evnt(fsel, ..., name, &button, &nfiles, ...);
if ( fsel_cont == 0 ) /* Dateiauswahl wurde beendet */
{ if ( button )
{ /* User hat "Ok" geklickt, also */
/* verarbeite gewählte Dateien */
bearbeite_datei(name); /* 1. Datei */
while ( --nfiles ) /* weitere Dateien */
{ fslx_getnxtfile(fsel, name);
bearbeite_datei(name);
}
}
fslx_close(fsel); /* Fileselector schlie₧en */
fsel = NULL;
}
}
if ( event & MU_MESAG )
{ ...
/* Hier werden die Events für die weiteren Fenster */
/* der Applikation verarbeitet */
}
Nun folgt eine genaue Beschreibung der verwendeten FSLX-Aufrufe:
fslx_open()
-----------
Diese Funktion alloziert die nötigen Speicherblöcke und öffnet das
Dateiauswahlfenster.
C-Prototyp:
void *fslx_open(char *title,
int x, y,
int *whdl,
char *path,
int pathlen,
char *fname,
int fnamelen,
char *patterns,
void *filter,
char *paths,
int sort_mode,
int flags);
Bedeutung der Parameter:
title: Text für die Titelzeile. Unter Multitasking-Systemen
wird der Applikationsname vorangestellt.
x, y: Anfangsposition. Wird für beide Werte -1 übergeben,
so wird die Box zentriert.
whdl: In dieser Variablen wird der Fensterhandle abgelegt.
path: Vollständiger Pfad, beginnt mit Laufwerk und endet
mit '\'.
pathlen: Länge des Pfadbuffers, d. h. maximale Pfadlänge + 1
(für EOS).
fname: Puffer für den Dateinamen.
fnamelen: Länge des Dateinamenpuffers, d.h. maximale Länge des
Dateinamens + 1 (für EOS).
patterns: Dateinamenmuster wie "*.TXT" oder "*.PRG,*.APP".
Die alternativ anwählbaren Muster sind durch EOS
getrennt und durch EOS, EOS abgeschlossen. Diese Muster
werden in BoxKite in das "F1"-Popup aufgenommen.
filter: Unter MagiC: Zeiger auf eine Filterfunktion, die
Dateinamen von der Anzeige ausschlie₧en kann.
Zur Zeit in BoxKite nicht implementiert.
paths: Pfad-"History" wie "C:\\BIN\\" usw. Die alternativ
anwählbaren Pfade sind durch EOS getrennt und durch
EOS, EOS abgeschlossen. Diese Pfade werden in BoxKite
in das "F1"-Popup aufgenommen.
sort_mode: Unter MagiC: Sortiermodus für die Anzeige. Wird von
BoxKite zur Zeit ignoriert; hier gilt immer die vom
Anwender voreingestellte Sortierung.
flags: Verschiedene Einstellungen:
#define DOSMODE 1
#define NFOLLOWSLKS 2
#define GETMULTI 8
DOSMODE: Ist dieses Bit gesetzt, so wird die Anzeige
von Dateinamen im Format 8+3 erzwungen.
NFOLLOWSLKS: Unter MagiC werden symbolische Links
nicht verfolgt. BoxKite ignoriert dieses Bit zur
Zeit und verfolgt die Links generell nicht.
GETMULTI: Ist dieses Bit gesetzt, können mehrere
Dateien auf einmal ausgewählt und übergeben
werden. Dazu wird 'fslx_getnxtfile()' verwendet,
wenn 'fslx_evnt()' bzw. 'fslx_do()' im Parameter
'nfiles' signalisieren, da₧ noch weitere Dateien
selektiert sind.
Der Rückgabewert von 'fslx_open()' ist der Handle des Fileselektors,
der bei allen nachfolgenden Aufrufen zu verwenden ist. Im Fehlerfall
wird der Wert NULL zurückgegeben.
Belegung der AES-Arrays:
contrl[0] = 190 Funktionsnummer
contrl[1] = 6 Einträge in intin
contrl[2] = 1 Einträge in intout
contrl[3] = 6 Einträge in addrin
contrl[4] = 1 Einträge in addrout
intin[0] = x
intin[1] = y
intin[2] = pathlen
intin[3] = fnamelen
intin[4] = sort_mode
intin[5] = flags
addrin[0] = title
addrin[1] = path
addrin[2] = fname
addrin[3] = patterns
addrin[4] = filter
addrin[5] = paths
intout[0] = whdl
addrout[0] = Returnwert
fslx_evnt()
-----------
Diese Funktion übergibt Events an ein Dateiauswahlfenster. Wenn dieses
ein Ereignis verarbeitet, so wird das entsprechende Bit in der
Eventmaske gelöscht.
C-Prototyp:
int fslx_evnt(void *fsel,
EVNT *events,
char *path,
char *fname,
int *button,
int *nfiles,
int *sort_mode,
char **pattern);
Bedeutung der Parameter:
fsel: Handle des Dateiauswahlfensters, Rückgabewert
von 'fslx_open()'.
events: Zeiger auf eine Struktur mit Daten über den Event:
typedef struct
{ int mwhich; /* Eventmaske */
int mx; /* Mausposition - x */
int my; /* Mausposition - y */
int mbutton; /* Maustasten */
int kstate; /* Shifttasten */
int key; /* Tastencode */
int mclicks; /* Mausklicks */
int reserved[9];
int msg[16]; /* Messagebuffer */
}
EVNT;
Diese Struktur kann mit den Rückgabewerten aus
'evnt_multi()' gefüllt werden. Wird ein Event
vom Fileselector verarbeitet, wird das entsprechende
Bit in 'mwhich' gelöscht.
path: Zeiger auf den ausgewählten Pfad, wenn der Dialog
per Klick auf den OK-Button oder per Doppelklick
auf eine Datei beendet wurde.
fname: Zeiger auf den ausgewählten Namen, wenn der Dialog
per Klick auf den OK-Button oder per Doppelklick
auf eine Datei beendet wurde.
button: Ist 1, wenn der Dialog per Klick auf den OK-Button oder
per Doppelklick auf eine Datei beendet wurde. Ist 0,
wenn der Dialog per Klick auf "Abbruch" beendet wurde.
nfiles: Die Anzahl der selektierten Dateien (siehe Aufrufschema).
sort_mode: Hier wird der letzte Sortiermodus abgelegt.
pattern: Hier wird ein Zeiger auf die letzte benutzte Maske
abgelegt. Da es bei BoxKite möglich ist, eine Maske
auszuwählen, die nicht im Parameter 'patterns' von
'fslx_open()' aufgeführt ist, wird in diesem Fall
einfach der Wert dieses Parameters zurückgegeben.
Der Rückgabewert von 'fslx_evnt()' ist 0, wenn der Dialog beendet
werden soll (Klick auf "Ok" oder "Abbruch" oder Doppelcklick auf eine
Datei) und ansonsten 1.
Belegung der AES-Arrays:
contrl[0] = 193 Funktionsnummer
contrl[1] = 0 Einträge in intin
contrl[2] = 4 Einträge in intout
contrl[3] = 4 Einträge in addrin
contrl[4] = 1 Einträge in addrout
addrin[0] = fsel
addrin[1] = events
addrin[2] = path
addrin[3] = fname
intout[0] = Returnwert
intout[1] = button
intout[2] = nfiles
intout[3] = sort_mode
addrout[0] = pattern
fslx_getnxtfile()
-----------------
Diese Funktion ruft nach Ende des Dialogs weitere selektierte Dateien
des Fileselektors ab.
C-Prototyp:
int fslx_getnxtfile(void *fsel, char *name);
Bedeutung der Parameter:
fsel: Handle des Dateiauswahlfensters, Rückgabewert
von 'fslx_open()' oder 'fslx_do()' (siehe dort).
fname: Hier werden die gefundenen Dateinamen abgelegt.
Der Rückgabewert von 'fslx_getnxtfile()' ist 1, wenn ein weiterer
Dateiname zurückgegeben wurde, und ansonsten 0.
Belegung der AES-Arrays:
contrl[0] = 192 Funktionsnummer
contrl[1] = 0 Einträge in intin
contrl[2] = 1 Einträge in intout
contrl[3] = 2 Einträge in addrin
contrl[4] = 0 Einträge in addrout
addrin[0] = fsel
addrin[1] = fname
intout[0] = Returnwert
fslx_close()
------------
Diese Funktion schlie₧t den Fileselektor und gibt die dadurch belegten
Systemresourcen frei. Sie darf erst dann benutzt werden, wenn die
gewünschten Dateien mit 'fslx_getnxtfile()' abgerufen worden sind.
C-Prototyp:
int fslx_close(void *fsel);
Bedeutung des Parameters:
fsel: Handle des Dateiauswahlfensters, Rückgabewert
von 'fslx_open()' oder 'fslx_do()' (siehe dort).
Der Rückgabewert von 'fslx_close()' ist 0, wenn ein Fehler
festgestellt wurde.
Belegung der AES-Arrays:
contrl[0] = 191 Funktionsnummer
contrl[1] = 0 Einträge in intin
contrl[2] = 1 Einträge in intout
contrl[3] = 1 Einträge in addrin
contrl[4] = 0 Einträge in addrout
addrin[0] = fsel
intout[0] = Returnwert
FSLX-Dateiauswahl als Dialog
----------------------------
Für die Eiligen unter Ihnen besteht auch die Möglichkeit, den
FSLX-Fileselector als gewöhnliche Dialogbox aufzurufen, ohne auf alle
erweiterten Features verzichten zu müssen. Das grobe Aufrufschema für
diese Variante sieht so aus:
int button, nfiles;
char name[256];
void *fsel = NULL; /* Diese Variable nimmt das Handle */
/* des Fileselectors auf. */
/* Fileselector öffnen und Dialog abhandeln */
fsel = fslx_do(..., name, ..., &button, &nfiles, ...);
if ( fsel != NULL ) /* Wenn die Box sich öffnen lie₧ */
{ if ( button )
{ /* User hat "Ok" geklickt, also */
/* verarbeite gewählte Dateien */
bearbeite_datei(name); /* 1. Datei */
while ( --nfiles ) /* weitere Dateien */
{ fslx_getnxtfile(fsel, name);
bearbeite_datei(name);
}
}
fslx_close(fsel); /* Fileselector schlie₧en */
}
Hierfür wird nur eine weitere Funktion benötigt, die den ganzen Dialog
durchführt:
fslx_do()
---------
Diese Funktion öffnet die Dateiauswahlbox als Dialogbox und übernimmt
die ganze Dialogverarbeitung in einer eigenen Eventschleife. Sie
endet erst dann, wenn der User eine Datei ausgewählt oder "Abbruch"
angeklickt hat.
C-Prototyp:
void *fslx_do(char *title,
char *path,
int pathlen,
char *fname,
int fnamelen,
char *patterns,
void *filter,
char *paths,
int *sort_mode,
int flags
int *button,
int *nfiles,
char **pattern);
Bedeutung der Parameter:
title: Text für die Titelzeile. Unter Multitasking-Systemen
wird der Applikationsname vorangestellt.
path: Vollständiger Pfad, beginnt mit Laufwerk und endet
mit '\'.
pathlen: Länge des Pfadbuffers, d. h. maximale Pfadlänge + 1
(für EOS).
fname: Puffer für den Dateinamen.
fnamelen: Länge des Dateinamenpuffers, d.h. maximale Länge des
Dateinamens + 1 (für EOS).
patterns: Dateinamenmuster wie "*.TXT" oder "*.PRG,*.APP".
Die alternativ anwählbaren Muster sind durch EOS
getrennt und durch EOS, EOS abgeschlossen. Diese Muster
werden in BoxKite in das "F1"-Popup aufgenommen.
filter: Unter MagiC: Zeiger auf eine Filterfunktion, die
Dateinamen von der Anzeige ausschlie₧en kann.
Zur Zeit in BoxKite nicht implementiert.
paths: Pfad-"History" wie "C:\\BIN\\" usw. Die alternativ
anwählbaren Pfade sind durch EOS getrennt und durch
EOS, EOS abgeschlossen. Diese Pfade werden in BoxKite
in das "F1"-Popup aufgenommen.
sort_mode: Unter MagiC: Sortiermodus für die Anzeige. Wird von
BoxKite zur Zeit ignoriert; hier gilt immer die vom
Anwender voreingestellte Sortierung. Bei 'fslx_do()'
als Zeiger zu übergeben; hier wird nach dem Aufruf wie
bei 'fslx_evnt()' der aktuelle Sortiermodus zurück-
gegeben.
flags: Verschiedene Einstellungen, wie bei 'fslx_open()'.
button: Ist 1, wenn der Dialog per Klick auf den OK-Button oder
per Doppelklick auf eine Datei beendet wurde. Ist 0,
wenn der Dialog per Klick auf "Abbruch" beendet wurde.
nfiles: Die Anzahl der selektierten Dateien (siehe Aufrufschema).
pattern: Hier wird ein Zeiger auf die letzte benutzte Maske
abgelegt. Da es bei BoxKite möglich ist, eine Maske
auszuwählen, die nicht im Parameter 'patterns'
aufgeführt ist, wird in diesem Fall einfach der Wert
dieses Parameters zurückgegeben.
Der Rückgabewert von 'fslx_do()' ist der Handle des Fileselektors, der
bei allen nachfolgenden Aufrufen zu verwenden ist. Im Fehlerfall wird
der Wert NULL zurückgegeben.
Belegung der AES-Arrays:
contrl[0] = 194 Funktionsnummer
contrl[1] = 4 Einträge in intin
contrl[2] = 4 Einträge in intout
contrl[3] = 6 Einträge in addrin
contrl[4] = 2 Einträge in addrout
addrin[0] = title
addrin[1] = path
addrin[2] = fname
addrin[3] = patterns
addrin[4] = filter
addrin[5] = paths
intin[0] = pathlen
intin[1] = fnamelen
intin[2] = sort_mode
intin[3] = flags
intout[0] = 1
intout[1] = button
intout[2] = nfiles
intout[3] = sort_mode
addrout[0] = Returnwert
addrout[1] = pattern
Systemglobale Einstellungen
---------------------------
Der Aufrug 'fslx_set_flags()' dient unter MagiC dazu, systemweite
Einstellungen an den Fileselector zu übergeben. Da die entsprechenden
Einstellungen in BoxKite z. Zt. noch nicht implementiert sind, wird
dieser Aufruf von BoxKite ignoriert.
C-Prototyp:
int fslx_set_flags(int flags, int *oldval);
Belegung der AES-Arrays:
contrl[0] = 195 Funktionsnummer
contrl[1] = 2 Einträge in intin
contrl[2] = 2 Einträge in intout
contrl[3] = 0 Einträge in addrin
contrl[4] = 0 Einträge in addrout
intin[0] = 0
intin[1] = flags
intout[0] = Returnwert
intout[1] = oldval