home *** CD-ROM | disk | FTP | other *** search
/ M.u.C.S. Disc 2000 / MUCS2000.iso / anwend / bkite213 / develop_ / boxprog.doc next >
Text File  |  1999-02-15  |  33KB  |  835 lines

  1.  
  2.                           BoxKite V 2.13
  3.                           ==============
  4.  
  5.                 ---- Just another file selector ----
  6.  
  7.  
  8.  
  9.             Programmierdokumentation
  10.             ------------------------
  11.  
  12.  
  13.     Traps und Cookies
  14.     -----------------
  15.  
  16. BoxKite verbiegt die Vektoren für  Trap  #2 (GEM) und Trap #13 (BIOS).
  17. Die XBRA-Kennung ist 'HBFS'.
  18.  
  19. BoxKite legt die folgenden Cookies an:
  20.  
  21.     a) 'FSEL'
  22.  
  23. Über   den   'FSEL'-Cookie   wird   eine   Teilmenge   der  inzwischen
  24. wohlbekannten Selectric┐-Programmierschnittstelle realisiert.
  25.  
  26.     b) 'HBFS'
  27.  
  28. Der Wert des 'HBFS'-Cookies ist, wie schoon in früheren Versionen, die
  29. Einsprungadresse des  Trap-2-Handlers  von  BoxKite.  In  Version 2.00
  30. zeigt dieser Cookie auf die folgende Struktur (in C-Notation):
  31.  
  32. typedef struct
  33. {   unsigned int    branch;     /* Sprungbefehl um den struct herum */
  34.     unsigned long   magic;      /* Wert immer 'BxKt' */
  35.     unsigned int    version;    /* Versionsnummer: 0x200 für 2.00 */
  36.     long            resvd1;     /* reserviert */
  37.     long            resvd2;     /* reserviert */
  38.     long            resvd3;     /* reserviert */
  39.     long            resvd4;     /* reserviert */
  40. }
  41. BXKT_STR;
  42.  
  43. In zukünftigen Versionen wird diese Struktur möglicherweise erweitert;
  44. die  Versionsnummer  wird  das   Vorhandensein  solcher  Erweiterungen
  45. signalisieren.
  46.  
  47.     c) '_IDT'
  48.  
  49. Der   '_IDT'-Cookie   definiert    das    Format   der   Datums-   und
  50. Uhrzeitdarstellung übergreifend für  alle Anwendungsprogramme. BoxKite
  51. legt diesen Cookie, falls er  noch  nicht im System vorhanden ist, und
  52. initialisiert ihn  mit  den  für  Deutschland  üblichen Einstellungen.
  53. Wenn der Cookie bereits vorhanden ist, bleibt er unverändert.
  54.  
  55. Wenn beim Start  von  BoxKite  der  Cookie  'FSEL'  oder  'HBFS' schon
  56. existiert, wird  BoxKite  nicht  installiert,  da  in  diesem  Fall zu
  57. vermuten  ist,   da₧   schon   ein   anderer  residenter  Fileselector
  58. installiert ist (der Klügere gibt nach).
  59.  
  60. Der  Aufruf  von  BoxKite  über   'fsel_exinput()'  braucht  nicht  in
  61. 'wind_update()'-Aufrufe geklammert zu  werden.  Die nötigen Semaphoren
  62. werden      automatisch      gesetzt.      Die      Verwendung     von
  63. 'wind_update(BEG_UPDATE)' ist  aber  unschädlich,  da  BoxKite  diesen
  64. Semaphoren   im   Fensterbetrieb   selbsttätig   wieder   zurücksetzt.
  65. 'wind_update(BEG_MCTRL)' sollte dagegen  gemieden  werden,  da BoxKite
  66. ansonsten davon  ausgeht,  von  einem  modalen  Dialog  aus aufgerufen
  67. worden zu sein. Damit wird der Fensterbetrieb wirksam unterbunden.
  68.  
  69. Die folgenden Abschnitte  erläutern  zunächst  den  Aufruf von BoxKite
  70. über die Selectric-Schnittstelle und  anschlie₧en  den Aufruf über die
  71. FSLX-Schnittstelle. Die hier  in  Prosa beschriebenen Techniken werden
  72. in den Beispielprogrammen 'BSP_FSEL.C' bzw. BSP_FSLX.C' illustriert.
  73.  
  74.     Aufruf über das Selectric-Protokoll
  75.     -----------------------------------
  76.     
  77. Auch auf die Gefahr hin, bereits  Bekanntes zu wiederholen, möchte ich
  78. hier  die  Funktionsweise  der  Selectric┐-Schnittstelle  beschreiben,
  79. soweit sie auf BoxKite zutrifft.  Der  Wert des 'FSEL'-Cookies ist die
  80. Adresse einer Datenstruktur, über die  der Datenaustausch zwischen dem
  81. Anwendungsprogramm und dem Fileselector  erfolgt. Unter MiNT-Versionen
  82. mit Speicherschutz ist diese Datenstruktur für Anwendungsprogramme nur
  83. im  Supervisor-Mode   zugänglich.   Die   Datenstruktur   wird   in  C
  84. folgenderma₧en deklariert:
  85.  
  86. typedef struct
  87. {    unsigned long   id;           /* ID (`SLCT')                */
  88.      unsigned int    version;      /* Version (BCD-Format)       */
  89.      struct
  90.      {    unsigned           : 8;   /* reserviert                */
  91.           unsigned pthsav    : 1;
  92.           unsigned stdest    : 1;
  93.           unsigned           : 1;
  94.           unsigned numsrt    : 1;   /* numerisches Sortieren     */
  95.           unsigned lower     : 1;
  96.           unsigned dclick    : 1;   /* Ordner mit Doppelklick    */
  97.           unsigned hidden    : 1;   /* versteckte Dateien        */
  98.           unsigned onoff     : 1;   /* Fileselector AN/AUS       */
  99.      }         config;
  100.      int       sort;               /* Sortiermodus               */
  101.      int       num_ext;            /* Anzahl Extensions          */
  102.      char      *(*ext)[];          /* Standard-Extensions        */
  103.      int       num_paths;          /* Anzahl Pfade               */
  104.      char      *(*paths)[];        /* Standard-Pfade             */
  105.      int       comm;               /* communication word         */
  106.      int       in_count;           /* input counter              */
  107.      void      *in_ptr;            /* input pointer              */
  108.      int       out_count;          /* output counter             */
  109.      void      *out_ptr;           /* output pointer             */
  110.      int cdecl (*get_first)(XDTA *dta, int attrib);
  111.      int cdecl (*get_next)(XDTA *dta);
  112.      int cdecl (*release_dir)(void);
  113. }
  114. SLCT_STR;
  115.  
  116. Die Felder 'in_count' und  'in_ptr'  sind  weder  in Selectric noch in
  117. BoxKite benutzt. Die Felder  'pthsav',  'stdest' und 'lower' haben für
  118. Selectric eine  Bedeutung,  sind  aber  unter  BoxKite  als reserviert
  119. anzusehen. 
  120.  
  121. Alle Strings,  von  denen  in  diesem  Abschnitt  die  Rede  ist, sind
  122. selbstredend nullterminiert. Die Felder im Einzelnen:
  123.  
  124.     -  'id':  Dieses  Langwort  mu₧  den  Inhalt  'SLCT'  haben.
  125.     Andernfalls wurde der  'FSEL'-Cookie  von einem Fileselector
  126.     installiert,  der  das  Selectric-Protokoll  nicht versteht.
  127.     Bevor Sie das Selectric-Protokoll verwenden, müssen Sie also
  128.     dieses Feld testen.
  129.  
  130.     -   'version':   Hier    steht    die   Versionsnummer   des
  131.     Selectric-Protokolls im  BCD-Format,  also  0x100  für  1.0.
  132.     BoxKite trägt die Nummer  1.02  ein.
  133.  
  134.     - 'config': Die  einzelenen  Bits  in  diesem  Wort schalten
  135.     bestimme Features von BoxKite  bzw.  Selectric ein oder aus.
  136.     Die folgenden Bits sind für BoxKite relevant:
  137.  
  138.        onoff    steht dieses Bit auf 0, so wird die
  139.                 GEM-Dateiauswahl anstelle von Selectric bzw.
  140.                 BoxKite benutzt.
  141.        hidden   Gibt an, ob versteckte Dateien angezeigt  werden 
  142.                 sollen.
  143.        dclick   Ordner erst auf Doppelklick öffnen.
  144.        numsrt   Schaltet die numerische Sortierung ein.
  145.  
  146.     - 'sort': Konfiguriert  das  Sortierkriterium,  dabei gelten
  147.     folgende Werte:
  148.  
  149.                1    Sortiert nach dem Namen
  150.                2    nach Datum
  151.                3    nach Grö₧e
  152.                4    nach Typ bzw. Extension
  153.                5    unsortiert
  154.  
  155.     Negative Werte werden von BoxKite ignoriert.
  156.  
  157.     - 'num_ext',  'ext':  Über  diese  beiden  Felder  kann  die
  158.     Anwendung an BoxKite  eine  Liste  von Dateitypen übergeben.
  159.     Dazu  mu₧  sie  in  'num_ext'   die  Anzahl  der  Typstrings
  160.     eintragen, in 'ext'  die  Adresse  eines  Arrays von Zeigern
  161.     auf  die  fraglichen   Strings.   Wenn   BoxKite  die  Liste
  162.     übernommen hat,  wird  'ext'  wieder  auf die BoxKite-eigene
  163.     Liste zurückgebogen. Die  Applikation  mu₧ diese Felder also
  164.     vor jedem fsel_input() bzw. fsel_exinput() einstellen.
  165.  
  166.     -  'num_paths',  'paths':   Mit   diesen  Feldern  kann  die
  167.     Applikation BoxKite eine  neue  Liste  von Pfaden übergeben.
  168.     Das Verfahren  ist  dasselbe  wie  oben.  Auch  diese Felder
  169.     müssen vor jedem Aufruf eingestellt werden.
  170.  
  171.     Die  Pfade  und  Suchmasken,  die  über  diese Schnittstelle
  172.     übergeben  werden,  erscheinen  nicht  in  der  History  des
  173.     Pfadfeldes oder in den  Maskenknöpfen,  sondern immer nur im
  174.     Popup hinter der  übergebenen  Maske (oberster Maskenknopf).
  175.     Wenn der Anwender "Arbeit sichern"  betätigt, werden die von
  176.     BoxKite selbst  gespeicherten  Pfade  und  Typen  gesichert,
  177.     NICHT die von der Applikation festgelegten.
  178.  
  179.     - 'comm',  'out_count',  'out_ptr', 'get_first', 'get_next',
  180.     'release_dir':  Diese  Felder   werden   benötigt,   um  die
  181.     Rückgabe von mehreren  Dateinamen  an  die Hauptanwendung zu
  182.     realisieren. Näheres im folgenden Abschnitt.
  183.  
  184. Wie  geht  man  nun  vor,  um  eine  Mehrfachauswahl  von  Dateien  zu
  185. realisieren? Hier sieht  das  Selectric-Protokoll 3 Möglichkeiten vor.
  186. Allen ist gemeinsam, da₧ vor dem Aufruf  von BoxKite das Bit 0 im Wort
  187. 'comm' auf 1  gesetzt  werden  mu₧.  Die  Nutzung  der weiteren Felder
  188. hängt von der vorgesehenen Variante ab. Es sind dies die folgenden:
  189.  
  190.     a) Rückgabe über ein Zeigerarray
  191.  
  192. Um diese Rückgabemethode  anzufordern,  setzt  die  Anwendung das Feld
  193. 'comm' auf den Wert 1 (also Bit 0  auf 1 und alle anderen auf 0). Nach
  194. 'out_count' schreibt sie  die  Anzahl  der  Dateien, die sie höchstens
  195. erwartet. Nach 'out_ptr'  gehört  dann  die  Adresse  eines Arrays von
  196. Zeigern interpretiert, von  denen  jeder  auf  den  Speicher für einen
  197. Dateinamen verweist. Es  müssen  mindestens  so  viele  gültige Zeiger
  198. vorhanden sein,  wie  'out_count'  angibt,  und  jeder  Zeiger mu₧ auf
  199. einen hinreichend gro₧en  freien  Speicherblock verweisen. ACHTUNG: 13
  200. Bytes (incl. terminierender 0) sind NICHT  genug, 256 Bytes kommen der
  201. Sache schon näher.
  202.  
  203.     b) Rückgabe über eine Kommandozeile
  204.  
  205. Um diese Rückgabemethode  anzufordern,  setzt  die  Anwendung das Feld
  206. 'comm' auf den Wert 3 (also Bits  0  und  1 auf 1 und alle anderen auf
  207. 0). Nach 'out_count' schreibt sie  auch  hier  die Anzahl der Dateien,
  208. die sie  höchstens  erwartet.  'out_ptr'  wird  als  als Adresse eines
  209. Strings inetrpretiert, in  den  die  Namen  durch Leerzeichen getrennt
  210. geschreiben werden. Der String  mu₧  gro₧  genug für 'out_count' Namen
  211. incl. Leerzeichen sein. Beachten Sie  auch  hier,  da₧ ein Name bis zu
  212. 255 Zeichen umfassen kann.
  213.  
  214. Da diese Methode Leerzeichen  als  Trennzeichen  verwendet, kann es zu
  215. Problemen kommen, wenn  die  übergebenen  Dateinamen schon Leerzeichen
  216. enthalten. Um diesen Problemen  aus  dem  Wege  zu gehen, werden diese
  217. Namen in Hochkommata  eingefa₧t.  Eventuell  in  den  Namen enthaltene
  218. Hochkommata werden verdoppelt.
  219.  
  220.     c) Rückgabe über Abruffunktionen
  221.  
  222. Diese Technik ermöglicht  Ihnen,  eine  theoretisch unbegrenzte Anzahl
  223. von  Dateinamen  zurückzuerhalten.  Um  sie  anzufordern,  müssen  Sie
  224. zunächst 'comm' mit dem Wert 9 laden (also  Bit 0 und 3 auf 1 und alle
  225. anderen auf 0).  Wenn  'fsel_[ex]input()'  dann  signalisiert, da₧ der
  226. User 'Ok'  gewählt  hat,  rufen  Sie  zunächst  'get_first' auf. Diese
  227. Funktion erwartet als Parameter (und  zwar  in C-Manier auf dem Stack)
  228. einen  Zeiger  auf  eine  XDTA-Struktur  und  ein  Attributwort.  Eine
  229. XDTA-Struktur ist wie folgt zu deklarieren:
  230.  
  231. typedef struct
  232. {   char            d_reserved[21];
  233.     unsigned char   d_attrib;
  234.     unsigned int    d_time;
  235.     unsigned int    d_date;
  236.     unsigned long   d_length;
  237.     char            d_fname[256];
  238. XDTA;
  239.  
  240. Bis  auf  die  Länge  des  Namensfeldes  ist  sie  identisch  mit  der
  241. Standard-TOS-DTA. Das Namensfeld wurde  mit  Rücksicht  auf die langen
  242. Dateinamen erweitert.
  243.  
  244. 'get_first' funktioniert wie 'Fsfirst' und füllt die XDTA-Struktur mit
  245. Informationen über die erste  selektierte  Datei. Es werden nur solche
  246. Dateien  zurückgegeben,  die  die   Attribute   haben,   die  mit  dem
  247. übergebenen Attributwort  korrespondieren  (die  Werte  werden genauso
  248. behandelt wie  von  GEMDOS  bei  Fsfirst(),  d.  h.  Dateien  mit  den
  249. Attributen 0,  "Archiv"  oder  "schreibgeschützt"  erscheinen  immer).
  250. Wenn eine Datei  gefunden  wurde,  gibt  'get_first()'  eine 0 zurück.
  251. Dann können Sie mit  'get_next()'  nacheinander  alle weiteren Dateien
  252. anfordern, bis ein Returncode  ungleich  0 auftritt. Danach müssen Sie
  253. 'release_dir()' aufrufen,  woraufhin  BoxKite  den  von der Dateiliste
  254. belegten Speicher  freigibt.  Diesen  ganzen  Ablauf  sollten  Sie  in
  255. 'wind_update' einschachteln, damit kein  anderer  Proze₧  auf die Idee
  256. kommt, zwischenzeitlich eine  Dateiauswahlbox  aufzurufen. Falls diese
  257. Beschreibung etwas zu abstrakt geraten ist,  werfen Sie einen Blick in
  258. BEISPIEL.C.
  259.  
  260. Seit Version 1.71  enthält  BoxKite  eine  Schnittstelle, über die die
  261. Hauptapplikation GEM-Messages,  die  sich  auf  hintenliegende Fenster
  262. beziehen, erhalten kann. Damit entfällt  der Redraw mit kleinen bunten
  263. Doppeldeckern.
  264.  
  265. Das  Grundprinzip  ist  ganz  einfach.  Sie  übergeben  an  BoxKite im
  266. 'fsel_exinput()'  als  zusätzlichen   Parameter  die  Einsprungadresse
  267. einer Routine, die  die  Behandlung  dieser  Messages übernimmt. Diese
  268. Routine mu₧ in C folgenderma₧en deklariert werden:
  269.  
  270.     void cdecl message_handler(int *message)
  271.  
  272. Sie sollte also auf  dem  Stack  (in  C-Manier) als einzigen Parameter
  273. einen Zeiger auf den  Message-Puffer  erwarten, der von 'evnt_multi()'
  274. gefüllt wird. Einen Rückgabewert  braucht  sie  nicht zu erzeugen. Vor
  275. dem Aufruf dieser Routine schaltet  BoxKite  wieder  auf den Stack der
  276. Hauptapplikation um.
  277.  
  278. Der Zeiger auf diese  Routine  wird  im  GEM-Feld 'addrin' als vierter
  279. Parameter an 'fsel_exinput()' übergeben.  Um  deutlich  zu machen, da₧
  280. hier ein gültiger Zeiger steht, mu₧  'contrl[3]' auf 4 gesetzt werden.
  281. Andere Fileselectoren sollten sich nicht an dieser Änderung stören.
  282.  
  283. In BEISPIEL.C finden Sie auch für dieses Feature ein Anwedungsbeispiel
  284. sowie ein in diesem  Sinne  erweitertes  Binding für 'fsel_exinput()'.
  285. Dieses Binding läuft mit Pure  C 1.1. Eine Assembler-Version desselben
  286. Bindings liegt als Quelltext und als Objekt-Datei im DR-Format bei.
  287.  
  288.     Aufruf über die FSLX-Schnittstelle
  289.     ----------------------------------
  290.  
  291. Mit MagiC Version 4.x wurden zusätzliche Systemaufrufe eingeführt, die
  292. die Dateiauswahl im Fenster explizit  unterstützen und daher keine der
  293. Schwächen haben, mit denen  sich  BoxKite  bisher herumschlagen mu₧te.
  294. Daher unterstützt BoxKite nunmehr  diese  Aufrufe  und stellt sie auch
  295. in Nicht-MagiC-Umgebungen zur  Verfügung.  Einige Spezialitäten fehlen
  296. noch in BoxKite 2.00 (z.  B.  die  Filterfunktion). Ich werde sie aber
  297. noch  einbauen,  wenn   sie   gewünscht   werden.   In  den  folgenden
  298. Abschnitten möchte  ich  die  Verwendung  der  FSLX-Schnittstelle kurz
  299. beschreiben (obwohl  ich  wahrscheinlich  auch  hier  längst Bekanntes
  300. wiederkäue).
  301.  
  302. Wenn Sie die FSLX-Bibliothek verwenden  möchten, müssen Sie als erstes
  303. prüfen, ob diese Aufrufe  im  aktuellen  System vorhanden sind. Hierzu
  304. wird der aufruf 'appl_getinfo()' verwendet:
  305.  
  306.     appl_getinfo(7, &gout1, &gout2, &gout3, &gout4);
  307.     if ( (gout1 & 8) == 0 )
  308.     {   form_alert(1, "[3][ FSLX nicht vorhanden! ][   Ok   ]");
  309.         appl_exit();
  310.         return 0;
  311.     }
  312.  
  313. Die  Unterfunktion  7  von  'appl_getinfo()'  fragt  MagiC-spezifische
  314. Informationen   ab.   Im   Parameter   gout1   werden   einzelne  Bits
  315. zurückgegeben,   die    das    Vorhandensein    diverser   erweiterter
  316. Dialogbibliotheken   signalisieren.   Bit   3   ist   hier   für   die
  317. Dateiauswahlbibliothek FSLX zuständig. Dieser  Aufruf wird von BoxKite
  318. so modifiziert, da₧ das Bit 3 immer gesetzt ist.
  319.  
  320. Falls die vorhandene  TOS-Version  die Funktion 'appl_getinfo()' nicht
  321. unterstützt,  kann  auch  der  'HBFS'-Cookie  ausgewertet  werden. Die
  322. FSLX-Aufrufe sind genau dann vorhanden, wenn  der Wert des Cookies auf
  323. eine Struktur vom Typ 'BXKT_STR'  zeigt, die ein gültiges 'magic'-Wort
  324. und die Versionsnummer >= 2.00 enthält:
  325.  
  326.     BXKT_STR *value;
  327.  
  328.     if ( cookie_find('HBFS', &value) )
  329.     {   if ( value->magic == 'BxKt' && value->version >= 0x200 )
  330.         {
  331.             /* FSLX-Lib vorhanden */
  332.         }
  333.     }
  334.  
  335. BTW: Das 'Abschalten' von BoxKite  über  das  CPX-Modul wirkt sich auf
  336. die   FSLX-Aufrufe   nur   dann   aus,   wenn   das   zugrundeliegende
  337. Betriebssystem diese in  einer  eigenen  Version  zur Verfügung stellt
  338. (gilt bisher  m.  W.  nur  für  neuere  MagiC-Versionen).  Andernfalls
  339. bleiben die entsprechenden  Routinen  von  BoxKite  immer aktiv, damit
  340. diese Aufrufe nicht ins Leere gehen.
  341.  
  342.     FSLX-Dateiauswahl als Fenster
  343.     -----------------------------
  344.  
  345. Die  FSLX-Schnittstelle  behandelt   einen   Fileselector   nicht  als
  346. Dialogbox im  herkömmlichen  Sinne  mit  einer eigenen Event-Schleife,
  347. sondern bindet ihn in die  Hauptschleife  der Applikation mit ein. Das
  348. bedeutet,  da₧  die   Applikation   nach  jedem  'evnt_multi()'-Aufruf
  349. erstmal die Dateiauswahlbox fragen  mu₧,  ob  diese mit dem erhaltenen
  350. Event etwas anfangen kann.
  351.  
  352. Die Einbindung in eine Applikation könnte grob so aussehen:
  353.  
  354.     int fsel_cont;
  355.     int button, nfiles;
  356.     char name[256];
  357.     void *fsel = NULL;          /* Diese Variable nimmt das Handle */
  358.                                 /* des Fileselectors auf. */
  359.  
  360.     /* Hier sind wir in einem Unterprogramm, das z. B.
  361.        einen Menüaufruf verarbeitet ... */
  362.  
  363.     fsel = fslx_open(...);      /* Fileselector öffnen */
  364.     if ( fsel == NULL )
  365.     {
  366.         /* Fehlermeldung o. ä. */
  367.     }
  368.  
  369.     ...
  370.  
  371.     /* Hier sind wir in der Hauptschleife der Applikation... */
  372.  
  373.     event = evnt_multi(...);    /* Events abrufen */
  374.     if ( fsel != NULL )         /* Wenn ein Fileselector offen ist */
  375.     {                           /* Events an diesen abgeben */
  376.  
  377.         fsel_cont = fslx_evnt(fsel, ..., name, &button, &nfiles, ...);
  378.  
  379.         if ( fsel_cont == 0 )   /* Dateiauswahl wurde beendet */
  380.         {   if ( button )
  381.             {                   /* User hat "Ok" geklickt, also */
  382.                                 /* verarbeite gewählte Dateien */
  383.                 bearbeite_datei(name);  /* 1. Datei */
  384.  
  385.                 while ( --nfiles )      /* weitere Dateien */
  386.                 {   fslx_getnxtfile(fsel, name);
  387.                     bearbeite_datei(name);
  388.                 }
  389.             }
  390.             fslx_close(fsel);   /* Fileselector schlie₧en */
  391.             fsel = NULL;
  392.         }
  393.     }
  394.     if ( event & MU_MESAG )
  395.     {   ...
  396.  
  397.         /* Hier werden die Events für die weiteren Fenster */
  398.         /* der Applikation verarbeitet */
  399.     }
  400.  
  401. Nun folgt eine genaue  Beschreibung der verwendeten FSLX-Aufrufe:
  402.  
  403.     fslx_open()
  404.     -----------
  405.  
  406. Diese Funktion alloziert  die  nötigen  Speicherblöcke  und öffnet das
  407. Dateiauswahlfenster.
  408.  
  409. C-Prototyp:
  410.  
  411. void *fslx_open(char *title,
  412.                 int x, y, 
  413.                 int *whdl, 
  414.                 char *path, 
  415.                 int pathlen,
  416.                 char *fname, 
  417.                 int fnamelen,
  418.                 char *patterns,
  419.                 void *filter,
  420.                 char *paths,
  421.                 int sort_mode,
  422.                 int flags);
  423.  
  424. Bedeutung der Parameter:
  425.  
  426. title:      Text für die Titelzeile. Unter Multitasking-Systemen 
  427.             wird der Applikationsname vorangestellt.
  428.  
  429. x, y:       Anfangsposition. Wird für beide Werte -1 übergeben, 
  430.             so wird die Box zentriert.
  431.  
  432. whdl:       In dieser Variablen wird der Fensterhandle abgelegt.
  433.  
  434. path:       Vollständiger Pfad, beginnt mit Laufwerk und endet 
  435.             mit '\'.
  436.  
  437. pathlen:    Länge des Pfadbuffers, d. h. maximale Pfadlänge + 1 
  438.             (für EOS).
  439.  
  440. fname:      Puffer für den Dateinamen.
  441.  
  442. fnamelen:   Länge des Dateinamenpuffers, d.h. maximale Länge des 
  443.             Dateinamens + 1 (für EOS).
  444.  
  445. patterns:   Dateinamenmuster wie "*.TXT" oder "*.PRG,*.APP". 
  446.             Die alternativ anwählbaren Muster sind durch EOS 
  447.             getrennt und durch EOS, EOS abgeschlossen. Diese Muster
  448.             werden in BoxKite in das "F1"-Popup aufgenommen.
  449.  
  450. filter:     Unter MagiC: Zeiger auf eine Filterfunktion, die
  451.             Dateinamen von der Anzeige ausschlie₧en kann.
  452.             Zur Zeit in BoxKite nicht implementiert.
  453.  
  454. paths:      Pfad-"History" wie "C:\\BIN\\" usw. Die alternativ 
  455.             anwählbaren Pfade sind durch EOS getrennt und durch 
  456.             EOS, EOS abgeschlossen. Diese Pfade werden in BoxKite 
  457.             in das "F1"-Popup aufgenommen.
  458.  
  459. sort_mode:  Unter MagiC: Sortiermodus für die Anzeige. Wird von 
  460.             BoxKite zur Zeit ignoriert; hier gilt immer die vom
  461.             Anwender voreingestellte Sortierung.
  462.  
  463. flags:      Verschiedene Einstellungen:
  464.  
  465.             #define DOSMODE     1
  466.             #define NFOLLOWSLKS 2
  467.             #define GETMULTI    8
  468.  
  469.             DOSMODE: Ist dieses Bit gesetzt, so wird die Anzeige
  470.             von Dateinamen im Format 8+3 erzwungen.
  471.  
  472.             NFOLLOWSLKS: Unter MagiC werden symbolische Links 
  473.             nicht verfolgt. BoxKite ignoriert dieses Bit zur
  474.             Zeit und verfolgt die Links generell nicht.
  475.  
  476.             GETMULTI: Ist dieses Bit gesetzt, können mehrere
  477.             Dateien auf einmal ausgewählt und übergeben
  478.             werden. Dazu wird 'fslx_getnxtfile()' verwendet, 
  479.             wenn 'fslx_evnt()' bzw. 'fslx_do()' im Parameter 
  480.             'nfiles' signalisieren, da₧ noch weitere Dateien 
  481.             selektiert sind.
  482.  
  483. Der Rückgabewert von 'fslx_open()'  ist  der Handle des Fileselektors,
  484. der bei allen nachfolgenden  Aufrufen  zu verwenden ist. Im Fehlerfall
  485. wird der Wert NULL zurückgegeben.
  486.  
  487. Belegung der AES-Arrays:
  488.  
  489.         contrl[0] = 190        Funktionsnummer
  490.         contrl[1] = 6          Einträge in intin
  491.         contrl[2] = 1          Einträge in intout
  492.         contrl[3] = 6          Einträge in addrin
  493.         contrl[4] = 1          Einträge in addrout
  494.  
  495.         intin[0] = x
  496.         intin[1] = y
  497.         intin[2] = pathlen
  498.         intin[3] = fnamelen
  499.         intin[4] = sort_mode
  500.         intin[5] = flags
  501.  
  502.         addrin[0] = title
  503.         addrin[1] = path
  504.         addrin[2] = fname
  505.         addrin[3] = patterns
  506.         addrin[4] = filter
  507.         addrin[5] = paths
  508.  
  509.         intout[0] = whdl
  510.  
  511.         addrout[0] = Returnwert
  512.  
  513.     fslx_evnt()
  514.     -----------
  515.  
  516. Diese Funktion übergibt Events an ein Dateiauswahlfenster. Wenn dieses
  517. ein  Ereignis  verarbeitet,  so  wird  das  entsprechende  Bit  in der
  518. Eventmaske gelöscht.
  519.  
  520. C-Prototyp:
  521.  
  522. int fslx_evnt(void *fsel, 
  523.               EVNT *events, 
  524.               char *path, 
  525.               char *fname,
  526.               int *button, 
  527.               int *nfiles, 
  528.               int *sort_mode, 
  529.               char **pattern);
  530.  
  531. Bedeutung der Parameter:
  532.  
  533. fsel:       Handle des Dateiauswahlfensters, Rückgabewert 
  534.             von 'fslx_open()'.
  535.  
  536. events:     Zeiger auf eine Struktur mit Daten über den Event:
  537.  
  538.             typedef struct
  539.             {   int     mwhich;     /* Eventmaske */
  540.                 int     mx;         /* Mausposition - x */
  541.                 int     my;         /* Mausposition - y */
  542.                 int     mbutton;    /* Maustasten */
  543.                 int     kstate;     /* Shifttasten */
  544.                 int     key;        /* Tastencode */
  545.                 int     mclicks;    /* Mausklicks */
  546.                 int     reserved[9];
  547.                 int     msg[16];    /* Messagebuffer */
  548.             }
  549.             EVNT;
  550.  
  551.             Diese Struktur kann mit den Rückgabewerten aus
  552.             'evnt_multi()' gefüllt werden. Wird ein Event
  553.             vom Fileselector verarbeitet, wird das entsprechende
  554.             Bit in 'mwhich' gelöscht.
  555.  
  556. path:       Zeiger auf den ausgewählten Pfad, wenn der Dialog 
  557.             per Klick auf den OK-Button oder per Doppelklick
  558.             auf eine Datei beendet wurde.
  559.  
  560. fname:      Zeiger auf den ausgewählten Namen, wenn der Dialog 
  561.             per Klick auf den OK-Button oder per Doppelklick
  562.             auf eine Datei beendet wurde.
  563.  
  564. button:     Ist 1, wenn der Dialog per Klick auf den OK-Button oder 
  565.             per Doppelklick auf eine Datei beendet wurde. Ist 0, 
  566.             wenn der Dialog per Klick auf "Abbruch" beendet wurde.
  567.  
  568. nfiles:     Die Anzahl der selektierten Dateien (siehe Aufrufschema).
  569.  
  570. sort_mode:  Hier wird der letzte Sortiermodus abgelegt.
  571.  
  572. pattern:    Hier wird ein Zeiger auf die letzte benutzte Maske
  573.             abgelegt. Da es bei BoxKite möglich ist, eine Maske
  574.             auszuwählen, die nicht im Parameter 'patterns' von
  575.             'fslx_open()' aufgeführt ist, wird in diesem Fall
  576.             einfach der Wert dieses Parameters zurückgegeben.
  577.  
  578. Der Rückgabewert von  'fslx_evnt()'  ist  0,  wenn  der Dialog beendet
  579. werden soll (Klick auf "Ok" oder  "Abbruch" oder Doppelcklick auf eine
  580. Datei) und ansonsten 1.
  581.  
  582. Belegung der AES-Arrays:
  583.  
  584.         contrl[0] = 193        Funktionsnummer
  585.         contrl[1] = 0          Einträge in intin
  586.         contrl[2] = 4          Einträge in intout
  587.         contrl[3] = 4          Einträge in addrin
  588.         contrl[4] = 1          Einträge in addrout
  589.  
  590.         addrin[0] = fsel
  591.         addrin[1] = events
  592.         addrin[2] = path
  593.         addrin[3] = fname
  594.  
  595.         intout[0] = Returnwert
  596.         intout[1] = button
  597.         intout[2] = nfiles
  598.         intout[3] = sort_mode
  599.  
  600.         addrout[0] = pattern
  601.  
  602.     fslx_getnxtfile()
  603.     -----------------
  604.  
  605. Diese Funktion ruft nach Ende  des Dialogs weitere selektierte Dateien
  606. des Fileselektors ab.
  607.  
  608. C-Prototyp:
  609.  
  610. int fslx_getnxtfile(void *fsel, char *name);
  611.  
  612. Bedeutung der Parameter:
  613.  
  614. fsel:       Handle des Dateiauswahlfensters, Rückgabewert 
  615.             von 'fslx_open()' oder 'fslx_do()' (siehe dort).
  616.  
  617. fname:      Hier werden die gefundenen Dateinamen abgelegt.
  618.  
  619. Der Rückgabewert von  'fslx_getnxtfile()'  ist  1,  wenn  ein weiterer
  620. Dateiname zurückgegeben wurde, und ansonsten 0.
  621.  
  622. Belegung der AES-Arrays:
  623.  
  624.         contrl[0] = 192        Funktionsnummer
  625.         contrl[1] = 0          Einträge in intin
  626.         contrl[2] = 1          Einträge in intout
  627.         contrl[3] = 2          Einträge in addrin
  628.         contrl[4] = 0          Einträge in addrout
  629.  
  630.         addrin[0] = fsel
  631.         addrin[1] = fname
  632.  
  633.         intout[0] = Returnwert
  634.  
  635.     fslx_close()
  636.     ------------
  637.  
  638. Diese Funktion schlie₧t den Fileselektor und gibt die dadurch belegten
  639. Systemresourcen frei. Sie  darf  erst  dann  benutzt  werden, wenn die
  640. gewünschten Dateien mit 'fslx_getnxtfile()' abgerufen worden sind.
  641.  
  642. C-Prototyp:
  643.  
  644. int fslx_close(void *fsel);
  645.  
  646. Bedeutung des Parameters:
  647.  
  648. fsel:       Handle des Dateiauswahlfensters, Rückgabewert 
  649.             von 'fslx_open()' oder 'fslx_do()' (siehe dort).
  650.  
  651. Der  Rückgabewert  von   'fslx_close()'   ist   0,   wenn  ein  Fehler
  652. festgestellt wurde.
  653.  
  654. Belegung der AES-Arrays:
  655.  
  656.         contrl[0] = 191        Funktionsnummer
  657.         contrl[1] = 0          Einträge in intin
  658.         contrl[2] = 1          Einträge in intout
  659.         contrl[3] = 1          Einträge in addrin
  660.         contrl[4] = 0          Einträge in addrout
  661.  
  662.         addrin[0] = fsel
  663.  
  664.         intout[0] = Returnwert
  665.  
  666.     FSLX-Dateiauswahl als Dialog
  667.     ----------------------------
  668.  
  669. Für  die  Eiligen  unter  Ihnen  besteht  auch  die  Möglichkeit,  den
  670. FSLX-Fileselector als gewöhnliche Dialogbox  aufzurufen, ohne auf alle
  671. erweiterten Features verzichten zu müssen.  Das grobe Aufrufschema für
  672. diese Variante sieht so aus:
  673.  
  674.     int button, nfiles;
  675.     char name[256];
  676.     void *fsel = NULL;          /* Diese Variable nimmt das Handle */
  677.                                 /* des Fileselectors auf. */
  678.  
  679.     /* Fileselector öffnen und Dialog abhandeln */
  680.     fsel = fslx_do(..., name, ..., &button, &nfiles, ...);
  681.  
  682.     if ( fsel != NULL )         /* Wenn die Box sich öffnen lie₧ */
  683.     {   if ( button )
  684.         {                       /* User hat "Ok" geklickt, also */
  685.                                 /* verarbeite gewählte Dateien */
  686.              bearbeite_datei(name);  /* 1. Datei */
  687.  
  688.              while ( --nfiles )      /* weitere Dateien */
  689.              {   fslx_getnxtfile(fsel, name);
  690.                  bearbeite_datei(name);
  691.              }
  692.          }
  693.          fslx_close(fsel);      /* Fileselector schlie₧en */
  694.     }
  695.  
  696. Hierfür wird nur eine weitere Funktion benötigt, die den ganzen Dialog
  697. durchführt:
  698.  
  699.     fslx_do()
  700.     ---------
  701.  
  702. Diese Funktion öffnet die Dateiauswahlbox  als Dialogbox und übernimmt
  703. die  ganze  Dialogverarbeitung  in  einer  eigenen  Eventschleife. Sie
  704. endet erst dann, wenn der  User  eine  Datei ausgewählt oder "Abbruch"
  705. angeklickt hat.
  706.  
  707. C-Prototyp:
  708.  
  709. void *fslx_do(char *title,
  710.               char *path, 
  711.               int pathlen,
  712.               char *fname, 
  713.               int fnamelen,
  714.               char *patterns,
  715.               void *filter,
  716.               char *paths,
  717.               int *sort_mode,
  718.               int flags
  719.               int *button,
  720.               int *nfiles,
  721.               char **pattern);
  722.  
  723. Bedeutung der Parameter:
  724.  
  725. title:      Text für die Titelzeile. Unter Multitasking-Systemen 
  726.             wird der Applikationsname vorangestellt.
  727.  
  728. path:       Vollständiger Pfad, beginnt mit Laufwerk und endet 
  729.             mit '\'.
  730.  
  731. pathlen:    Länge des Pfadbuffers, d. h. maximale Pfadlänge + 1 
  732.             (für EOS).
  733.  
  734. fname:      Puffer für den Dateinamen.
  735.  
  736. fnamelen:   Länge des Dateinamenpuffers, d.h. maximale Länge des 
  737.             Dateinamens + 1 (für EOS).
  738.  
  739. patterns:   Dateinamenmuster wie "*.TXT" oder "*.PRG,*.APP". 
  740.             Die alternativ anwählbaren Muster sind durch EOS 
  741.             getrennt und durch EOS, EOS abgeschlossen. Diese Muster
  742.             werden in BoxKite in das "F1"-Popup aufgenommen.
  743.  
  744. filter:     Unter MagiC: Zeiger auf eine Filterfunktion, die
  745.             Dateinamen von der Anzeige ausschlie₧en kann.
  746.             Zur Zeit in BoxKite nicht implementiert.
  747.  
  748. paths:      Pfad-"History" wie "C:\\BIN\\" usw. Die alternativ 
  749.             anwählbaren Pfade sind durch EOS getrennt und durch 
  750.             EOS, EOS abgeschlossen. Diese Pfade werden in BoxKite 
  751.             in das "F1"-Popup aufgenommen.
  752.  
  753. sort_mode:  Unter MagiC: Sortiermodus für die Anzeige. Wird von 
  754.             BoxKite zur Zeit ignoriert; hier gilt immer die vom
  755.             Anwender voreingestellte Sortierung. Bei 'fslx_do()'
  756.             als Zeiger zu übergeben; hier wird nach dem Aufruf wie
  757.             bei 'fslx_evnt()' der aktuelle Sortiermodus zurück-
  758.             gegeben.
  759.  
  760. flags:      Verschiedene Einstellungen, wie bei 'fslx_open()'.
  761.  
  762. button:     Ist 1, wenn der Dialog per Klick auf den OK-Button oder 
  763.             per Doppelklick auf eine Datei beendet wurde. Ist 0, 
  764.             wenn der Dialog per Klick auf "Abbruch" beendet wurde.
  765.  
  766. nfiles:     Die Anzahl der selektierten Dateien (siehe Aufrufschema).
  767.  
  768. pattern:    Hier wird ein Zeiger auf die letzte benutzte Maske
  769.             abgelegt. Da es bei BoxKite möglich ist, eine Maske
  770.             auszuwählen, die nicht im Parameter 'patterns'
  771.             aufgeführt ist, wird in diesem Fall einfach der Wert 
  772.             dieses Parameters zurückgegeben.
  773.  
  774. Der Rückgabewert von 'fslx_do()' ist der Handle des Fileselektors, der
  775. bei allen nachfolgenden Aufrufen zu  verwenden ist. Im Fehlerfall wird
  776. der Wert NULL zurückgegeben.
  777.  
  778. Belegung der AES-Arrays:
  779.  
  780.         contrl[0] = 194        Funktionsnummer
  781.         contrl[1] = 4          Einträge in intin
  782.         contrl[2] = 4          Einträge in intout
  783.         contrl[3] = 6          Einträge in addrin
  784.         contrl[4] = 2          Einträge in addrout
  785.  
  786.         addrin[0] = title
  787.         addrin[1] = path
  788.         addrin[2] = fname
  789.         addrin[3] = patterns
  790.         addrin[4] = filter
  791.         addrin[5] = paths
  792.  
  793.         intin[0] = pathlen
  794.         intin[1] = fnamelen
  795.         intin[2] = sort_mode
  796.         intin[3] = flags
  797.  
  798.         intout[0] = 1
  799.         intout[1] = button
  800.         intout[2] = nfiles
  801.         intout[3] = sort_mode
  802.  
  803.         addrout[0] = Returnwert
  804.         addrout[1] = pattern
  805.  
  806.     Systemglobale Einstellungen
  807.     ---------------------------
  808.  
  809. Der Aufrug  'fslx_set_flags()'  dient  unter  MagiC  dazu, systemweite
  810. Einstellungen an den Fileselector zu  übergeben. Da die entsprechenden
  811. Einstellungen in BoxKite z.  Zt.  noch  nicht implementiert sind, wird
  812. dieser Aufruf von BoxKite ignoriert.
  813.  
  814. C-Prototyp:
  815.  
  816. int fslx_set_flags(int flags, int *oldval);
  817.  
  818. Belegung der AES-Arrays:
  819.  
  820.         contrl[0] = 195        Funktionsnummer
  821.         contrl[1] = 2          Einträge in intin
  822.         contrl[2] = 2          Einträge in intout
  823.         contrl[3] = 0          Einträge in addrin
  824.         contrl[4] = 0          Einträge in addrout
  825.  
  826.         intin[0] = 0
  827.         intin[1] = flags
  828.  
  829.         intout[0] = Returnwert
  830.         intout[1] = oldval
  831.  
  832.  
  833.  
  834.