include "/var/www/banner.php"; ?>
This is an old version from the tos.hyp. The new is on GitHub!
8.10 Fileselektoren
Die folgenden Funktionen wurden mit MagiC 4 eingeführt, und
ermöglichen die Verwaltung der Dateiauswahl (Fileselektor):
Hinweis: Die Existenz dieser Funktionen kann per appl_getinfo
(Opcode 7) festgestellt werden.
Der Hauptvorteil bei der Verwendung dieser Routinen ist darin zu
sehen, daß die hier angegebenen Funktionen auch mit alternativen
Dateisystemen (Stichwort: lange Dateinamen) zurechtkommen.
Querverweis:
Fileselektor als Dialog Fileselektor im Fenster Bedienung der Dateiauswahl
8.10.1 fslx_close
Name: |
»File SelectionX Close« - Auswahl schließen und Speicher
freigeben. |
AES-Nummer: |
191 |
Deklaration: |
int16_t fslx_close ( void *fsd ); |
Beschreibung: |
Die Funktion schließt die Dateiauswahl, und gibt den angegebenen
Deskriptor wieder frei. Es gilt:
Parameter |
Bedeutung |
|
|
fsd |
Deskriptor, der beim erfolgreichen Öffnen eines
Dateiauswahlfensters übergeben wurde
|
|
Ergebnis: |
Die Funktion liefert bei fehlerfreier Ausführung den Wert 1
zurück, anderenfalls den Wert 0. |
Verfügbar: |
Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7)
festgestellt werden. |
Gruppe: |
Fileselektoren |
Querverweis: |
Binding fslx_open
|
8.10.1.1 Bindings für fslx_close
8.10.2 fslx_do
Name: |
»File SelectionX Do« - schneller Aufruf des Fileselektors. |
AES-Nummer: |
194 |
Deklaration: |
void *fslx_do ( int8_t *title, int8_t *path, int16_t pathlen,
int8_t *fname, int16_t fnamelen, int8_t *patterns, XFSL_FILTER
*filter, int8_t *paths, int16_t *sort_mode, int16_t flags, int16_t
*button, int16_t *nfiles, int8_t **pattern ); |
Beschreibung: |
Die Funktion stellt eine Dateiauswahlbox auf dem Bildschirm
dar, und übernimmt deren Bearbeitung. Es gilt:
Parameter |
Bedeutung |
|
|
title |
Titel der Auswahl oder NULL |
path |
vollständiger Pfad, welcher mit dem Laufwerk beginnt, und mit
'\' endet. |
pathlen |
Länge des aufnehmenden Pfad-Puffers. |
fname |
Puffer für den Dateinamen. |
fnamelen |
Länge des aufnehmenden Dateinamen-Puffers. |
patterns |
Dateinamensmuster wie "*.TXT", "*.PRG" oder "*.IMG". Diese
alternativ anwählbaren Muster sind durch EOS getrennt und durch EOS,
EOS abgeschlossen. |
filter |
Filterfunktion, die vor dem Mustervergleich aufgerufen
wird (oder NULL). Gibt diese den Wert 0 zurück, so ist die Datei
ungültig; bei einem Wert von 1 wird der Dateiname angezeigt. |
paths |
Pfad-History. Die alternativ anwählbaren Pfade sind durch EOS
getrennt, und durch EOS, EOS abgeschlossen. |
sort_mode |
Sortiermodus für die Anzeige
0 |
= |
nach Namen |
1 |
= |
nach Datum |
2 |
= |
nach Größe |
3 |
= |
nach Typ |
4 |
= |
unsortiert (physik. Reihenfolge) |
|
flags |
verschiedene Einstellungen
1 = |
DOSMODE. Dies ist der Kompatibilitätsmodus, der auch von
fsel_(ex)input verwendet wird, und Dateinamen grundsätzlich im Format
8+3 liefert. Dazu werden alle Unterverzeichnissse per Dopendir (name,
1) aufgerufen. |
2 = |
symbolische Links nicht verfolgen. In diesem Fall
gehören also Datum, Uhrzeit sowie die XATTR-Struktur, die filter
übergeben wird, zum Link selbst. |
8 = |
Mehrfachauswahl. In diesem Fall können mehrere Dateien auf
einmal ausgewählt und übergeben werden.
|
|
button |
Nummer des ausgewählten Buttons
0 |
= |
Abbruch-Button |
1 |
= |
Ok-Button |
|
nfiles |
Anzahl der ausgewählten Dateien |
pattern |
ausgewähltes Dateinamensmuster wie "*.TXT"
|
Hinweis: Die Funktion ist eine Kombination aus fslx_open
und fslx_evnt, benutzt aber eine Dialogbox ohne Fenster. |
Ergebnis: |
Die Funktion liefert einen Zeiger auf einen Deskriptor zurück,
der bei den anderen Routinen anzugeben ist. |
Verfügbar: |
Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7)
festgestellt werden. |
Gruppe: |
Fileselektoren |
Querverweis: |
Binding fslx_open fslx_evnt
|
8.10.2.1 Bindings für fslx_do
C: |
void *fslx_do ( int8_t *title, int8_t *path, int16_t pathlen,
int8_t *fname, int16_t fnamelen, int8_t *patterns, XFSL_FILTER
*filter, int8_t *paths, int16_t *sort_mode, int16_t flags, int16_t
*button, int16_t *nfiles, int8_t **pattern ); |
Umsetzung: |
void *fslx_do ( int8_t *title, int8_t *path, int16_t pathlen,
int8_t *fname, int16_t fnamelen, int8_t *patterns,
XFSL_FILTER *filter, int8_t *paths,
int16_t *sort_mode, int16_t flags, int16_t *button,
int16_t *nfiles, int8_t **pattern )
{
addr_in[0] = title;
addr_in[1] = path;
addr_in[2] = fname;
addr_in[3] = patterns;
addr_in[4] = filter;
addr_in[5] = paths;
int_in[0] = pathlen;
int_in[1] = fnamelen;
int_in[2] = *sort_mode;
int_in[3] = flags;
crys_if (194);
*button = int_out[1];
*nfiles = int_out[2];
*sort_mode = int_out[3];
*pattern = addr_out[1];
return ( (void *) addr_out[0] );
}
|
GEM-Arrays: |
|
8.10.3 fslx_evnt
Name: |
»File SelectionX Event« - übernimmt die Bearbeitung der
Dateiauswahl. |
AES-Nummer: |
193 |
Deklaration: |
int16_t fslx_evnt ( void *fsd, EVNT *events, int8_t *path,
int8_t *fname, int16_t *button, int16_t *nfiles, int16_t *sort_mode,
int8_t **pattern ); |
Beschreibung: |
Die Funktion übernimmt die Bearbeitung einer auf dem Bildschirm
dargestellten Dateiauswahl. Es gilt:
Parameter |
Bedeutung |
|
|
fsd |
Deskriptor, der beim Öffnen der Auswahl zurückgeliefert wurde. |
events |
EVNT-Struktur. Die Ereignisse werden von der Auswahl
bearbeitet, wenn sie für das entsprechende Fenster bestimmt sind. |
path |
Zeiger auf den ausgewählten Pfad. |
fname |
Zeiger auf den ausgewählten Dateipfad. |
button |
Nummer des ausgewählten Buttons
0 |
= |
Abbruch-Button |
1 |
= |
Ok-Button |
|
nfiles |
Anzahl der ausgewählten Dateien. |
sort_mode |
ausgewählter Sortiermodus. |
pattern |
ausgewähltes Dateinamensmuster wie "*.TXT"
|
Hinweis: Ereignisse werden zunächst an die Dateiauswahl
übermittelt, und von dieser dann ggfs. verarbeitet. Sobald ein
Ereignis bearbeitet wurde, wird das entsprechende Bit in der
EVNT-Struktur gelöscht. |
Ergebnis: |
Die Funktion liefert den Wert 0, wenn der Dialog beendet werden
soll und anderenfalls den Wert 1. |
Verfügbar: |
Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7)
festgestellt werden. |
Gruppe: |
Fileselektoren |
Querverweis: |
Binding
|
8.10.3.1 Bindings für fslx_evnt
C: |
int16_t fslx_evnt ( void *fsd, EVNT *events, int8_t *path,
int8_t *fname, int16_t *button, int16_t *nfiles, int16_t *sort_mode,
int8_t **pattern ); |
Umsetzung: |
int16_t fslx_evnt ( void *fsd, EVNT *events, int8_t *path,
int8_t *fname, int16_t *button, int16_t *nfiles,
int16_t *sort_mode, int8_t **pattern )
{
addr_in[0] = fsd;
addr_in[1] = events;
addr_in[2] = path;
addr_in[3] = fname;
crys_if (193);
*button = int_out[1];
*nfiles = int_out[2];
*sort_mode = int_out[3];
*pattern = addr_out[0];
return ( int_out[0] );
}
|
GEM-Arrays: |
|
8.10.4 fslx_getnxtfile
Name: |
»File SelectionX GetNextFile« - ermittelt alle weiteren
selektierten Einträge der Dateiauswahl. |
AES-Nummer: |
192 |
Deklaration: |
int16_t fslx_getnxtfile ( void *fsd, int8_t *fname ); |
Beschreibung: |
Die Funktion ermittelt alle weiteren, selektierten Einträge der
Dateiauswahl. Es gilt:
Parameter |
Bedeutung |
|
|
fsd |
Deskriptor, der beim Öffnen der Auswahl zurückgeliefert wurde |
fname |
Name des ermittelten Eintrags
|
Hinweis: Wurde das Flag GETMULTI bei fslx_do oder
fslx_open übergeben, wird durch fslx_do bzw. fslx_evnt im Parameter
nfiles die Anzahl der Dateien zurückgegeben, die zusätzlich zu
dem in fname zurückgegebenen noch selektiert sind. Man kann
die weiteren Dateien mit fslx_getnxtfile abrufen. Erst danach darf man
fslx_close aufrufen. |
Ergebnis: |
Die Funktion liefert den Wert 0, wenn keine weitere Datei
ausgewählt ist, bzw. den Wert 1, falls noch ein Dateiname kopiert
wurde. |
Verfügbar: |
Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7)
festgestellt werden. |
Gruppe: |
Fileselektoren |
Querverweis: |
Binding fslx_open fslx_close
|
8.10.4.1 Bindings für fslx_getnxtfile
8.10.5 fslx_open
Name: |
»File SelectionX Open« - initialisiert und öffnet die Dateiauswahl. |
AES-Nummer: |
190 |
Deklaration: |
void *fslx_open ( int8_t *title, int16_t x, int16_t y, int16_t
*whdl, int8_t *path, int16_t pathlen, int8_t *fname, int16_t fnamelen,
int8_t *patterns, XFSL_FILTER *filter, int8_t *paths, int16_t
sort_mode, int16_t flags ); |
Beschreibung: |
Die Funktion initialisiert und öffnet die Dateiauswahlbox. Es
gilt:
Parameter |
Bedeutung |
|
|
title |
Fenstertitel der Auswahl oder NULL |
x |
x-Koordinate |
y |
y-Koordinate der linken oberen Ecke des Fensters. Falls diese
den Wert -1 besitzen, so wird das Fenster zentriert dargestellt. |
whdl |
Fensterkennung nach erfolgreichem Öffnen. |
path |
vollständiger Pfad, welcher mit dem Laufwerk beginnt, und mit
'\' endet.
Seit MagiC 6.10 darf der Pfad, wie beifsel_xxx(), unvollständig
initialisiert werden, z.B. als Leer-String. MagiC komplettiert dann
den Pfad sinnvoll. |
pathlen |
Länge des aufnehmenden Pfad-Puffers. |
fname |
Puffer für den Dateinamen. |
fnamelen |
Länge des aufnehmenden Dateinamen-Puffers. |
patterns |
Dateinamensmuster wie "*.TXT", "*.PRG" oder "*.IMG". Diese
alternativ anwählbaren Muster sind durch EOS getrennt und durch
EOS,EOS abgeschlossen.
Seit MagiC 6.10 darf hier ein Nullzeigerübergeben werden, MagiC
verwendet dann "*\0". |
filter |
Filterfunktion, die vor dem Mustervergleich aufgerufen
wird (oder NULL). Gibt diese den Wert 0 zurück, so ist die Datei
ungültig; bei einem Wert von 1 wird der Dateiname angezeigt. |
paths |
Pfad-History. Die alternativ anwählbaren Pfade sind durch EOS
getrennt, und durch EOS,EOS abgeschlossen. |
sort_mode |
Sortiermodus für die Anzeige
SORTBYNAME (0) |
= |
nach Namen |
SORTBYDATE (1) |
= |
nach Datum |
SORTBYSIZE (2) |
= |
nach Größe |
SORTBYTYPE (3) |
= |
nach Typ |
SORTBYNONE (4) |
= |
unsortiert (physik. Reihenfolge) |
SORTDEFAULT (-1) |
= |
default |
SORTDEFAULT existiert seit MagiC 6.10 und bedeutet, daß der im
System gespeicherte Sortiermodus verwendet wird.
|
flags |
verschiedene Einstellungen
1 = |
(DOSMODE) Dies ist der Kompatibilitätsmodus, der auch von
fsel_(ex)input verwendet wird, und Dateinamen grundsätzlich im Format
8+3 liefert. Dazu werden alle Unterverzeichnissse per Dopendir
(DOPEN_COMPAT) aufgerufen. |
2 = |
(NFOLLOWSLKS) symbolische Links nicht verfolgen. In
diesem Fall gehören also Datum, Uhrzeit sowie die XATTR-Struktur, die
filter übergeben wird, zum Link selbst. |
8 = |
Ist GETMULTI 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.
|
|
|
Ergebnis: |
Die Funktion liefert einen Deskriptor für die weiteren
Aktionen, bzw. den Wert NULL, wenn ein Fehler aufgetreten ist. |
Verfügbar: |
Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7)
festgestellt werden. |
Gruppe: |
Fileselektoren |
Querverweis: |
Binding fslx_close
|
8.10.5.1 Bindings für fslx_open
C: |
void *fslx_open ( int8_t *title, int16_t x, int16_t y, int16_t
*whdl, int8_t *path, int16_t pathlen, int8_t *fname, int16_t fnamelen,
int8_t *patterns, XFSL_FILTER *filter, int8_t *paths, int16_t
sort_mode, int16_t flags ); |
Umsetzung: |
void *fslx_open ( int8_t *title, int16_t x, int16_t y, int16_t *whdl,
int8_t *path, int16_t pathlen, int8_t *fname,
int16_t fnamelen, int8_t *patterns,
XFSL_FILTER *filter, int8_t *paths,
int16_t sort_mode, int16_t flags )
{
addr_in[0] = title;
addr_in[1] = path;
addr_in[2] = fname;
addr_in[3] = patterns;
addr_in[4] = filter;
addr_in[5] = paths;
int_in[0] = x;
int_in[1] = y;
int_in[2] = pathlen;
int_in[3] = fnamelen;
int_in[4] = sort_mode;
int_in[5] = flags;
crys_if (190);
*whdl = int_out[0];
return ( (void *) addr_out[0] );
}
|
GEM-Arrays: |
|
8.10.6 fslx_set_flags
Name: |
»File SelectionX SetFlags« - setzt bestimmte Flags der
Dateiauswahl für das ganze System. |
AES-Nummer: |
195 |
Deklaration: |
int16_t fslx_set_flags ( int16_t flags, int16_t *oldval ); |
Beschreibung: |
Die Funktion setzt bestimmte Flags der Dateiauswahlbox für das
ganze System. Es gilt:
Parameter |
Bedeutung |
|
|
flags |
verschiedene Flags
1 = |
Format 8+3: Dies gilt nur für die Darstellung von
Verzeichnissen auf DOS-Laufwerken. Entspricht dem Schalter
"TOS-Dateien als 8+3" in MagXDesk.
|
|
oldval |
vorheriger Wert
|
|
Ergebnis: |
Die Funktion liefert im Fehlerfall den Wert 0, und den Wert 1
bei fehlerfreier Ausführung. |
Verfügbar: |
Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7)
festgestellt werden. |
Gruppe: |
Fileselektoren |
Querverweis: |
Binding fslx_open fslx_close
|
8.10.6.1 Bindings für fslx_set_flags
8.10.7 Die Bedienung des File-Selektors ab MagiC 4
MagiC stellt ab Version 4.0 eine eigene Dateiauswahlbox zur
Verfügung, die neben der Unterstützung von langen Dateinamen auch
einiges an Bedienungskomfort bietet, welcher sonst nur von
alternativen Selektoren bekannt war. Die folgende Tabelle gibt eine
Übersicht über die wichtigsten Shortcuts:
Tasten-Kombination |
Funktion |
|
|
Return |
Keine Datei ausgewählt: Gibt den Text im Editfeld an
das Programm zurück.
Datei ausgewählt: Gibt ausgewählte Datei zurück.
Ordner ausgewählt: Öffnet den Ordner. |
Alt-A..Z |
Öffnet das jeweilige Laufwerk im aktuellen Verzeichnis. |
Ctrl-Esc |
Verzeichnis neu einlesen |
Ctrl-Backspace |
oder |
Ctrl-H |
Geht eine Verzeichnisebene zurück. |
Ctrl-D |
Deselektiert alle Einträge. Damit kann man erzwingen, daß der
eingegebene Dateiname statt der selektierten Datei zurückgegeben wird. |
Cursor up,down |
Auswahl verschieben |
Ctrl-Cursor up,down |
scrollen |
Sh-Cursor up,down |
Auswahl seitenweise verschieben |
Sh-Ctrl-Cursor up,down |
seitenweise scrollen |
Home |
selektiert oberstes Element |
Sh-Home |
selektiert unterstes Element
|
Auch bei der Bedienung der Buttons gibt es einiges zu
beachten: Ein Doppelklick auf das 'parent'-Feld geht zurück aufs
Wurzelverzeichnis. Ein Klick auf eine Zeile selektiert das
entsprechende Objekt. Für den Fall, daß mehrere Dateien auswählbar
sind (dies ist durch den Systemaufruf beeinflußbar), werden diese
durch Shift-Klick ausgewählt. In jedem Fall kann man eine Datei mit
Shift-Klick deselektieren.
Zu beachten ist ferner:
Lange Dateinamen werden nur dann zurückgegeben, wenn der
Aufrufer zuvor mit Pdomain(1) angekündigt hat, daß er damit auch etwas
anfangen kann.
Bei Auswahl eines Ordners durch [Return] wird das Eingabefeld
gelöscht. Wenn nichts selektiert ist, selektiert "Cursor runter" die
erste Zeile, "Cursor hoch" die letzte.
Bei den alten Aufrufen fsel_(ex)input() wird der eingestellte
Sortiermodus beim Booten auf "nach Namen" gesetzt und später in einer
globalen Variablen gemerkt, d.h. der letzte eingestellte Sortiermodus
wird bis zum nächsten Bootvorgang gespeichert.
Bei den alten Funktionen fsel_(ex)input() wird ggf. das Muster
"*.*" statt "*" zurückgegeben.
Querverweis: Tastaturbelegung
8.10.8 Fileselektor als Dialog
fsel = fslx_do(..., &button, &nfiles, ...);
if (fsel) /* war der Selektor offen? */
{
if (button)
{
while (--nfiles) /* mehrere Files? */
fslx_getnxtfile(...); /* alle abholen */
}
fslx_close(fsel); /* alles wieder freigeben */
}
8.10.9 Fileselektor im Fenster
fsel = fslx_open(...);
if (fsel)
{
do {
evnt.mwhich = evnt_multi(...);
rv = fslx_evnt(fsel, &evnt, ..., &nfiles, ...);
/* Bits für eigene Fenster/Menüs auswerten */
} while (rv);
while (--nfiles) fslx_getnxtfile(...);
fslx_close(fsel);
}