Atari-Insider: Leckeres vom MagiC-Filetselektor

Guten Tag, liebe Leserin und lieber Leser! Nachdem sich in den vergangenen Monaten viel bei den TOS-kompatiblen Betriebssystemen getan hat, wird es langsam Zeit, die Neuerungen öffentlich vorzustellen - und genau das soll im Rahmen dieser Rubrik ab sofort monatlich geschehen. "Atari-Insider" ist für Programmierer gedacht, die mit den Grundlagen der TOS/GEM-Programmierung vertraut sind. Es wird hier weniger vollständige Programme, als vielmehr nützliche Tips und Hinweise geben, was einer weiteren Beschäftigung lohnt und wo passende und weiterführende Informationen dazu zu bekommen sind.

Nun aber zum heutigen Thema. Aus aktuellem Anlaß starten wir mit einem MagiC-spezifischen Problem. Im Internet wurde vor kurzem darüber lamentiert, dass MagiC keine Dateiauswahl im Fenster anbietet, Mehrfachselektion vermissen lässt etc. Was offenbar die wenigsten wissen: Seit etwas über zweieinhalb Jahren ist genau so etwas in MagiC vorhanden, man muss dafür nur ein paar neue Aufrufe verwenden. Aber sehen wir uns erst einmal an, was MagiC hier zu bieten hat.

Der modale Dateiauswahldialog "moderner" Bauart scheint sich nicht vom altbekannten fsel_(ex)input()-Aufruf zu unterscheiden. Und doch zeigt Abbildung 1 eine wichtige Änderung: Wir können der Dateiauswahl eine beliebige Liste von Standardpfaden übergeben, die der Benutzer beim Anklicken des Pfadnamens zur Auswahl erhält. Ebenso ist Mehrfachselektion möglich, wie man in Abbildung 2 sieht.

Hier sehen wir also das eigentliche Ziel unserer Wünsche, die MagiC-Dateiauswahl im Fenster. Ebenso wie beim modalen Aufruf können wir eine Liste (!) von Extensions übergeben, die dann oberhalb der in der Datei MAGX.INF festgelegten Extensions dargestellt werden. In diesem Beispiel rufen wir die Dateiauswahl mit den Extensions *.PRG, *.APP, *.TOS, *.TTP und * auf, alle anderen sind in meiner MAGX.INF in der Zeile #_FSL eingetragen. Mittlerweile gibt es ja diverse Tools, um MAGX.INF nicht mehr von Hand bearbeiten zu müssen, also sollte das kein Problem darstellen.

Nun geht es ans Eingemachte, die Programmierung dieser Dateiauswahltypen. Zunächst müssen wir feststellen, ob das System solche Aufrufe überhaupt unterstützt. Das geschieht mit der Unterfunktion 7 von appl_getinfo(), der folgende Quelltextausschnitt zeigt wie.

int check,dummy,has_fslx = 0;

if (appl_getinfo(7,&check,&dummy,&dummy,&dummy))
{
        if (check & 0x0008) has_fslx = 1;
}
        
if (has_fslx)
{
        /* hurra, wir dürfen die fslx-Routinen verwenden! */
}
else
{
        /* Pech gehabt, fsel_exinput() verwenden */
}

Um die Dateiauswahl im Fenster anzuzeigen, müssen wir die Dateiauswahl mit fslx_open() erzeugen, in einer evnt_multi()-Schleife mit fslx_event() abarbeiten und am Ende mit fslx_close() wieder freigeben. Das Erzeugen des Fensterdialogs habe ich im folgenden etwas ausführlicher kommentiert.

fsel_dialog = fslx_open(

Wir rufen fslx_open() auf und erhalten als Rückgabe einen Deskriptor (Handle) des Fensterdialogs. Dieser Deskriptor wird an alle weiteren Funktionen zur Identifikation des eben erzeugten Dateiauswahldialogs verwendet. Man kann also ohne Probleme mehrer Dateiauswahldialoge gleichzeitig geöffnet haben. Konnte der Dialog nicht erzeugt werden, wird NULL zurückgegeben.

                    " Atari-Insider #1 ",

Dies ist der Titel der Dateiauswahl. Beim Fensterdialog sollten aus optischen Gründen zwei Leerzeichen um den eigentlichen Text stehen.

                    -1,-1,

Hier stehen die anfänglichen X- und Y-Koordinaten des Dialogs. Wenn beide Werte auf -1 gesetzt werden, wird der Dialog automatisch auf dem Bildschirm zentriert.

                    &whdl,

Jedes Fenster und somit jeder Fensterdialog hat ein Fensterhandle. fslx_open() schreibt das Fensterhandle der Dateiauswahl in diese Variable.

                    pathbuf, 128,

Nun übergeben wir den den Puffer für den Pfad, den wir vorher in diesen Puffer geschrieben haben müssen, sowie die Länge des Puffers. In diesem Fall kann unser Pfad 127 Zeichen lang sein, das 128. Zeichen wird für das abschließende Nullbyte benötigt. Zu beachten ist, dass an diesen Pfad im Unterschied zu fsel_(ex)input keine Maske angehängt wird!

                    fname, 33,

Wie beim Pfad übergeben wir den Puffer für den Dateinamen und dessen Länge.

                    "*.PRG,*.APP\0"
                    "*.TOS,*.TTP\0"
                    "*\0",

Jetzt folgen die Dateimasken. Jede Zeile des Popups wird mit einem Nullbyte abgeschlossen, die Liste der Dateimasken mit zwei Nullbytes (das macht C hier automatisch). Wenn man keine eigenen Masken definieren möchte, sollte man hier nur "*\0" übergeben. c 0L, c Hier kann die Adresse einer Filterfunktion eingetragen werden. Mit einer solchen Funktion kann man für alle Dateien einzeln entscheiden, ob sie angezeigt werden sollen oder nicht. Wir übergeben NULL, da wir keine solche Funktion benötigen.

                    "C:\\\0"
                    "D:\\Daten\\Tolle Bilder\\\0"
                    "D:\\Quelltexte\\\0",

Dies ist nun die Liste der Standardpfade (siehe Abbildung 1), der Aufbau der Liste (Nullbytes) entspricht dem der Dateimasken.

                    SORTBYNAME,
                    GETMULTI);

Zum Schluß übergeben wir noch zwei Flags. Zum einen setzen wir die Anfangssortierung der Dateiauswahl (hier also nach Namen sortiert; weitere Sortiertypen stehen in der MagiC-Programmierdoku), zum anderen erlauben wir die Mehrfachselektion. Beim letzten Flag kann man außerdem noch Werte hinsichtlich der Abarbeitung von Links (Aliasen) und der Darstellung von Dateien im "8+3"-Modus (DOS) festlegen.

Hat der Aufruf von fslx_open() geklappt - in fsel_dialog steht dann ein Wert ungleich NULL - verfährt man nun weiter nach folgendem Schema: c do { evnt_multi(...);

            result = fslx_evnt(...);
            
    } while (result);

c Wenn der Benutzer "OK" oder "Abbruch" angewählt hat, liefert fslx_evnt() eine Null zurück. In einer weiteren Variable übergibt diese Routine, welcher dieser Buttons zum Verlassen der Dateiauswahl geführt hat, und man kann - bei OK - mit der Auswertung beginnen.

In fname und pathbuf (beide Puffer hatten wir oben übergeben) stehen nun Pfad und Dateiname, die der Benutzer ausgewählt hat. Wenn man eine Mehrfachauswahl erlaubt hat (GETMULTI, s.o.), liefert fslx_evnt() in einer Variablen die Anzahl der zusätzlich ausgewählten Dateien zurück. Diese können dann mit der Funktion fslx_getnxtfile() abgefragt werden.

Ganz zum Schluß müssen wir den Dialogdeskriptor wieder freigeben:

    if (fsel_dialog)
            fslx_close(fsel_dialog);

Der modale Aufruf der Dateiauswahl erfolgt sehr ähnlich. Statt fslx_open() und fslx_evnt() verwendet man einfach die Funktion fslx_do(), schematisch sieht das also folgendermaßen aus:

    fslx_do(...);
    /* Rückgabe auswerten */
    fslx_close(...);

Natürlich macht der Aufruf der modalen Dateiauswahl in dieser Form nur dann Sinn, wenn man mehrere Dateimasken oder Standardpfade übergeben möchte - sonst ist der bisher übliche Aufruf von fsel_exinput() immer noch etwas einfacher.

Das soll als Einblick auch schon reichen. Wer die MagiC-Dateiauswahl in den oben genannten Formen aufrufen möchte, sollte sich unbedingt noch die MagiC-Programmierdokumentation besorgen, die in allen Zweifelsfällen maßgeblich ist. Darin sind auch die Bindings der fslx-Routinen enthalten. Das Archiv liegt z.B. auf http://members.aol.com/ashinfo/ashftp.htm, die für uns interessanten Quelltexte und Beschreibungen sind im Ordner aes\fslx\ zu finden. Ein Link zur Doku, weitere Hinweise zu dieser Artikelreihe und die Quelltexte der hier vorgestellten Demoprogramme liegen ab sofort auch auf http://www.snailshell.de/insider.html.

Und noch etwas zur Überschrift: Natürlich bietet MagiC keine Fleischauswahl, aber diese Stilblüte bietet uns einen passenden Anlaß, um uns zum Schluß noch die korrekte Schreibweise der Dateiwauswahl zu Gemüte zu führen. Also: Entweder heißt das Ding "Dateiauswahldialog" oder aber "file select box". Bitte keinen deutsch-englischen Mischmasch, die Sprachwissenschaftler beider Länder, einige meiner Uni-Professoren sowie der Programmierer von MagiC werden sich darüber freuen!

Bis zum nächsten Monat!


Thomas Much
Aus: ST-Computer 09 / 1998, Seite 40

Links

Copyright-Bestimmungen: siehe Über diese Seite