home *** CD-ROM | disk | FTP | other *** search
/ M.u.C.S. Disc 2000 / MUCS2000.iso / anwend / bkite213 / develop_ / bsp_fslx.c < prev    next >
C/C++ Source or Header  |  1998-04-11  |  17KB  |  719 lines

  1. /*
  2.  * Beispiel-Programm zur Benutzung der FSLX-Schnittstelle mit BoxKite
  3.  * unter TOS/MiNT/MultiTOS/MagiC/MagiC Mac/N.AES
  4.  * (c) Harald Becker, 30.3.1998. Übersetzt mit Pure C und DEFAULT.PRJ.
  5.  */
  6. #include <aes.h>
  7. #include <vdi.h>
  8. #include <tos.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12.  
  13. /* Sortiermodi */
  14. #define SORTBYNAME    0
  15. #define SORTBYDATE    1
  16. #define SORTBYSIZE    2
  17. #define SORTBYTYPE    3
  18. #define SORTBYNONE    4
  19.  
  20. /* Flags für Dateiauswahl */
  21. #define DOSMODE        1
  22. #define NFOLLOWSLKS    2
  23. #define GETMULTI    8
  24.  
  25. /*
  26.  * In dieser Struktur erwarten die FSLX-Aufrufe die Daten
  27.  * über ein Ereignis.
  28.  */
  29. typedef struct
  30. {    int        mwhich;
  31.     int        mx;
  32.     int        my;
  33.     int        mbutton;
  34.     int        kstate;
  35.     int        key;
  36.     int        mclicks;
  37.     int        reserved[9];
  38.     int        msg[16];
  39. }
  40. EVNT;
  41.  
  42. typedef struct
  43. {    unsigned int    branch;        /* Sprungbefehl um den struct herum */
  44.     unsigned long    magic;        /* Wert immer 'BxKt' */
  45.     unsigned int    version;    /* Versionsnummer: 0x200 für 2.00 */
  46. }
  47. BXKT_STR;
  48.  
  49. typedef struct
  50. {    long    id;
  51.     long    value;
  52. }
  53. COOKIE;
  54.  
  55. typedef int cdecl XFSL_FILTER(char *path, char *name, XATTR *xa);
  56.  
  57. char path[256] = "";
  58. char name[256] = "";
  59. char alert[256];
  60. char extlist[] = "*.*\0*.CFG\0*\0*.C\0*.H\0*.RSC\0\0";
  61. char pathlist[] = "C:\\AUTO\\\0C:\\GEMINI2\\\0\0";
  62.  
  63. void *fsel = NULL;    /* Handle der Dateiauswahlbox */
  64. int window;            /* Fensterkennung */
  65. OBJECT contents =     /* Fensterinhalt */
  66.     { -1, -1, -1, G_BOXCHAR, 0, 0, 0x2dff11f0, 1, 1, 1, 1 };
  67. char animate[] = "-\\|/";
  68. char *animate_p = &animate[1];
  69.  
  70. int xdesk, ydesk, wdesk, hdesk;
  71.  
  72. /*
  73.  * Gibt die Adresse des Cookie-Jar zurück. Mit Supexec() aufrufen.
  74.  */
  75. long get_cookiejar(void)
  76. {    return *((long *)0x05a0l);
  77. }
  78.  
  79. /*
  80.  * Durchsucht den Cookie Jar nach einem cookie mit gegebener id und
  81.  * liefert dessen Wert zurück.
  82.  */
  83. int get_cookie(long id, long *pval)
  84. {    long sav;
  85.     COOKIE *cookiejar;
  86.     int    i = 0;
  87.  
  88.     cookiejar = (COOKIE *)Supexec(get_cookiejar);
  89.  
  90.     if ( cookiejar )
  91.     {    while ( cookiejar[i].id )
  92.         {    if ( cookiejar[i].id == id )
  93.             {    *pval = cookiejar[i].value;
  94.                 return 1;
  95.             }
  96.             i++;
  97.         }
  98.     }
  99.     return 0;
  100. }
  101.  
  102. /*
  103.  * Fragt das aktuelle Laufwerk und den aktuellen Pfad ab.
  104.  */
  105. void getpath(char *p)
  106. {    int drv;
  107.  
  108.     drv = Dgetdrv();
  109.     *p++ = drv + 'A';
  110.     *p++ = ':';
  111.     Dgetpath(p, drv);
  112.     p += strlen(p) - 1;
  113.     if ( *p != '\\' )
  114.     {    p++;
  115.         *p++ = '\\';
  116.         *p = 0;
  117.     }
  118. }
  119.  
  120. /* 
  121.  * Die folgenden vier Funktionen befassen sich nur mit dem Zeichnen
  122.  * des Fensterinhaltes. Ich denke, die Methode hat sich inzwischen
  123.  * herumgesprochen.
  124.  */
  125. int min(int a, int b)
  126. {    return ( a < b ? a : b );
  127. }
  128.  
  129. int max(int a, int b)
  130. {    return ( a > b ? a : b );
  131. }
  132.  
  133. int rc_intersect(GRECT *p1, GRECT *p2)
  134. {    int tx, ty, tw, th;
  135.  
  136.     tw = min(p2->g_x + p2->g_w, p1->g_x + p1->g_w);
  137.     th = min(p2->g_y + p2->g_h, p1->g_y + p1->g_h);
  138.     tx = max(p2->g_x, p1->g_x);
  139.     ty = max(p2->g_y, p1->g_y);
  140.  
  141.     p2->g_x = tx;
  142.     p2->g_y = ty;
  143.     p2->g_w = tw - tx;
  144.     p2->g_h = th - ty;
  145.  
  146.     return( (tw > tx) && (th > ty) );
  147. }
  148.  
  149. void window_redraw(int handle, int x, int y, int w, int h)
  150. {    GRECT r1, r2, world;
  151.  
  152.     wind_update(BEG_UPDATE);
  153.  
  154.     r2.g_x = x;
  155.     r2.g_y = y;
  156.     r2.g_w = w;
  157.     r2.g_h = h;
  158.  
  159.     world.g_x = xdesk;
  160.     world.g_y = ydesk;
  161.     world.g_w = wdesk;
  162.     world.g_h = hdesk;
  163.  
  164.     wind_get(handle, WF_FIRSTXYWH, &r1.g_x, &r1.g_y, &r1.g_w, &r1.g_h);
  165.     while ( r1.g_w && r1.g_h )
  166.     {    if ( rc_intersect(&world, &r1) && rc_intersect(&r2, &r1) )
  167.             objc_draw(&contents, ROOT, MAX_DEPTH, r1.g_x, r1.g_y, r1.g_w, r1.g_h);
  168.         wind_get(handle, WF_NEXTXYWH, &r1.g_x, &r1.g_y, &r1.g_w, &r1.g_h);
  169.     }
  170.     wind_update(END_UPDATE);
  171. }
  172.  
  173. /*
  174.  * Hier stehen die Bindings der benötigten AES-Aufrufe, soweit
  175.  * sie nicht in jeder Standard-Library enthalten sind.
  176.  * Bei allen Funktionen werden die AES-Parameterfelder lokal
  177.  * deklariert; und das global[]-Feld wird als erster Parameter
  178.  * explizit übergeben. Damit sind diese Bindings multithreading-
  179.  * fähig.
  180.  * Ich wei₧, da₧ sich diese Routinen in C auch effizienter schreiben 
  181.  * lie₧en. Es ging mir aber bei dieser Codierung darum, sie auch
  182.  * für jemanden lesbar zu halten, der sich mit C nicht so auskennt.
  183.  * Das folgende '#pragma' unterdrückt die Compilerwarnungen, die 
  184.  * entsehen, weil (zumindest in der mir vorliegenden Version der
  185.  * PC-Header) die Struktur 'AESPB' ein bi₧chen daneben ist: 'addrin[]'
  186.  * und 'addrout[]' sind als Zeiger auf 'int' deklariert.
  187.  */
  188. #pragma warn -sus
  189.  
  190. void *fslx_open(int *global,
  191.                 char *title,
  192.                 int x, int y,
  193.                 int    *handle,
  194.                 char *path, int pathlen,
  195.                 char *fname, int fnamelen,
  196.                 char *patterns,
  197.                 XFSL_FILTER *filter,
  198.                 char *paths,
  199.                 int sort_mode,
  200.                 int flags)
  201. {    AESPB aespb;
  202.     void *addrin[6], *addrout[6];
  203.     int contrl[5], intin[16], intout[7];
  204.  
  205.     aespb.contrl  = contrl;
  206.     aespb.global  = global;
  207.     aespb.intin   = intin;
  208.     aespb.intout  = intout;
  209.     aespb.addrin  = addrin;
  210.     aespb.addrout = addrout;
  211.  
  212.     contrl[0] = 190;
  213.     contrl[1] = 6;
  214.     contrl[2] = 1;
  215.     contrl[3] = 6;
  216.     contrl[4] = 1;
  217.  
  218.     intin[0] = x;
  219.     intin[1] = y;
  220.     intin[2] = pathlen;
  221.     intin[3] = fnamelen;
  222.     intin[4] = sort_mode;
  223.     intin[5] = flags;
  224.  
  225.     addrin[0] = title;
  226.     addrin[1] = path;
  227.     addrin[2] = fname;
  228.     addrin[3] = patterns;
  229.     addrin[4] = filter;
  230.     addrin[5] = paths;
  231.  
  232.     _crystal(&aespb);
  233.  
  234.     *handle = intout[0];
  235.     return addrout[0];
  236. }
  237.  
  238. int fslx_evnt(int *global,
  239.             void *fsd,
  240.             EVNT *events,
  241.             char *path,
  242.             char *fname,
  243.             int *button,
  244.             int *nfiles,
  245.             int *sort_mode,
  246.             char **pattern)
  247. {    AESPB aespb;
  248.     void *addrin[6], *addrout[6];
  249.     int contrl[5], intin[16], intout[7];
  250.  
  251.     aespb.contrl  = contrl;
  252.     aespb.global  = global;
  253.     aespb.intin   = intin;
  254.     aespb.intout  = intout;
  255.     aespb.addrin  = addrin;
  256.     aespb.addrout = addrout;
  257.  
  258.     contrl[0] = 193;
  259.     contrl[1] = 0;
  260.     contrl[2] = 4;
  261.     contrl[3] = 4;
  262.     contrl[4] = 1;
  263.  
  264.     addrin[0] = fsd;
  265.     addrin[1] = events;
  266.     addrin[2] = path;
  267.     addrin[3] = fname;
  268.  
  269.     _crystal(&aespb);
  270.  
  271.     *button = intout[1];
  272.     *nfiles = intout[2];
  273.     *sort_mode = intout[3];
  274.  
  275.     *pattern = addrout[0];
  276.  
  277.     return intout[0];
  278. }
  279.  
  280. int fslx_close(int *global, void *fsd)
  281. {    AESPB aespb;
  282.     void *addrin[6], *addrout[6];
  283.     int contrl[5], intin[16], intout[7];
  284.  
  285.     aespb.contrl  = contrl;
  286.     aespb.global  = global;
  287.     aespb.intin   = intin;
  288.     aespb.intout  = intout;
  289.     aespb.addrin  = addrin;
  290.     aespb.addrout = addrout;
  291.  
  292.     contrl[0] = 191;
  293.     contrl[1] = 0;
  294.     contrl[2] = 1;
  295.     contrl[3] = 1;
  296.     contrl[4] = 0;
  297.  
  298.     addrin[0] = fsd;
  299.  
  300.     _crystal(&aespb);
  301.  
  302.     return intout[0];
  303. }
  304.  
  305. int fslx_getnxtfile(int *global, void *fsd,    char *fname)
  306. {    AESPB aespb;
  307.     void *addrin[6], *addrout[6];
  308.     int contrl[5], intin[16], intout[7];
  309.  
  310.     aespb.contrl  = contrl;
  311.     aespb.global  = global;
  312.     aespb.intin   = intin;
  313.     aespb.intout  = intout;
  314.     aespb.addrin  = addrin;
  315.     aespb.addrout = addrout;
  316.  
  317.     contrl[0] = 192;
  318.     contrl[1] = 0;
  319.     contrl[2] = 1;
  320.     contrl[3] = 2;
  321.     contrl[4] = 0;
  322.  
  323.     addrin[0] = fsd;
  324.     addrin[1] = fname;
  325.  
  326.     _crystal(&aespb);
  327.  
  328.     return intout[0];
  329. }
  330.  
  331. void *fslx_do(int *global,
  332.             char *title,
  333.             char *path, int pathlen,
  334.             char *fname, int fnamelen,
  335.             char *patterns,
  336.             XFSL_FILTER *filter,
  337.             char *paths,
  338.             int *sort_mode,
  339.             int flags,
  340.             int *button,
  341.             int *nfiles,
  342.             char **pattern)
  343. {    AESPB aespb;
  344.     void *addrin[6], *addrout[6];
  345.     int contrl[5], intin[16], intout[7];
  346.  
  347.     aespb.contrl  = contrl;
  348.     aespb.global  = global;
  349.     aespb.intin   = intin;
  350.     aespb.intout  = intout;
  351.     aespb.addrin  = addrin;
  352.     aespb.addrout = addrout;
  353.  
  354.     contrl[0] = 194;
  355.     contrl[1] = 4;
  356.     contrl[2] = 4;
  357.     contrl[3] = 6;
  358.     contrl[4] = 2;
  359.  
  360.     intin[0] = pathlen;
  361.     intin[1] = fnamelen;
  362.     intin[2] = *sort_mode;
  363.     intin[3] = flags;
  364.  
  365.     addrin[0] = title;
  366.     addrin[1] = path;
  367.     addrin[2] = fname;
  368.     addrin[3] = patterns;
  369.     addrin[4] = filter;
  370.     addrin[5] = paths;
  371.  
  372.     _crystal(&aespb);
  373.  
  374.     *button = intout[1];
  375.     *nfiles = intout[2];
  376.     *sort_mode = intout[3];
  377.  
  378.     *pattern = addrout[1];
  379.     return addrout[0];
  380. }
  381.  
  382. /*
  383.  * Die folgende Routine dürfte in den meisten neueren GEM-Libraries
  384.  * schon enthalten sein.
  385.  */
  386. int appl_getinfo(int *global, int ap_gtype, int *ap_gout1, int *ap_gout2, int *ap_gout3, int *ap_gout4)
  387. {    AESPB aespb;
  388.     void *addrin[6], *addrout[6];
  389.     int contrl[5], intin[16], intout[7];
  390.  
  391.     aespb.contrl  = contrl;
  392.     aespb.global  = global;
  393.     aespb.intin   = intin;
  394.     aespb.intout  = intout;
  395.     aespb.addrin  = addrin;
  396.     aespb.addrout = addrout;
  397.  
  398.     contrl[0] = 130;
  399.     contrl[1] = 1;
  400.     contrl[2] = 5;
  401.     contrl[3] = 0;
  402.     contrl[4] = 0;
  403.  
  404.     intin[0] = ap_gtype;
  405.  
  406.     _crystal(&aespb);
  407.  
  408.     *ap_gout1 = intout[1];
  409.     *ap_gout2 = intout[2];
  410.     *ap_gout3 = intout[3];
  411.     *ap_gout4 = intout[4];
  412.  
  413.     return intout[0];
  414. }
  415.  
  416. /*
  417.  * Die folgende Routine wird zwar im vorliegenden Demoprogramm 
  418.  * nicht genutzt; sie ist der Vollständigkeit halber trotzdem
  419.  * aufgeführt.
  420.  */
  421. int fslx_set_flags(int *global, int flags, int *oldval)
  422. {    AESPB aespb;
  423.     void *addrin[6], *addrout[6];
  424.     int contrl[5], intin[16], intout[7];
  425.  
  426.     aespb.contrl  = contrl;
  427.     aespb.global  = global;
  428.     aespb.intin   = intin;
  429.     aespb.intout  = intout;
  430.     aespb.addrin  = addrin;
  431.     aespb.addrout = addrout;
  432.  
  433.     contrl[0] = 195;
  434.     contrl[1] = 2;
  435.     contrl[2] = 2;
  436.     contrl[3] = 0;
  437.     contrl[4] = 0;
  438.  
  439.     intin[0] = 0;
  440.     intin[1] = flags;
  441.  
  442.     _crystal(&aespb);
  443.  
  444.     *oldval = intout[1];
  445.     return intout[0];
  446. }
  447. #pragma warn .sus
  448.  
  449. /*
  450.  * Diese Routine ruft 'appl_getinfo()' auf und prüft zuvor, ob das 
  451.  * aktuelle Betriebssystem diese Routine überhaupt enthält.
  452.  * Sie benötigt ebenfalls ein korrekt initialsiertes 'global[]'-Feld.
  453.  */
  454. int appl_xgetinfo(int *global, int code, int *rv1, int *rv2, int *rv3, int *rv4)
  455. {    int magx, j, aes_version;
  456.     int **value;
  457.  
  458. #define WF_WINX    22360
  459.  
  460.     aes_version = global[0];
  461.     magx = ( get_cookie('MagX', (long *)&value) && value[2][24] >= 0x200 );
  462.  
  463.     if ( code > 3 && !magx && aes_version <= 0x400 )
  464.         return 0;
  465.  
  466.     if ( aes_version >= 0x400 || magx || wind_get(0, WF_WINX, &j, &j, &j, &j) == WF_WINX || appl_find("?AGI") == 0 )
  467.         return appl_getinfo(global, code, rv1, rv2, rv3, rv4);
  468.  
  469.     return 0;
  470. }
  471.  
  472. /*
  473.  * Diese Routine findet heraus, ob das vorhandene System die 
  474.  * FSLX-Aufrufe unterstützt.
  475.  * Einziger Parameter ist ein Zeiger auf das global[]-Feld,
  476.  * der zum Ermitteln der AES-Version benötigt wird. 
  477.  */
  478. int system_has_fslx(int *global)
  479. {    int gout1, gout2, gout3, gout4;
  480.     BXKT_STR *value;
  481.  
  482.     if ( appl_xgetinfo(global, 7, &gout1, &gout2, &gout3, &gout4) )
  483.     {    /*
  484.          * 'appl_getinfo()' mit Modus 7 aufrufen, bei Erfolg das Ergebnis
  485.          * auswerten.
  486.          */
  487.         if ( gout1 & 8 )
  488.             return 1;
  489.         else
  490.             return 0;
  491.     }
  492.     else
  493.     {    /*
  494.           * Wenn 'appl_getinfo()' nicht geht, auf den 'HBFS'-Cookie 
  495.           * zurückgreifen.
  496.           */
  497.         if ( get_cookie('HBFS', (long *)&value) )
  498.             if ( value->magic == 'BxKt' && value->version >= 0x200 )
  499.                 return 1;
  500.     }
  501.     return 0;
  502. }
  503.  
  504. /* 
  505.  * Diese Funktion bekommt die AES-Messages, die der Fileselektor übriglä₧t.
  506.  * Sie verarbeitet die Ereignisse, die für das Demofenster bestimmt sind.
  507.  */
  508. void message_handler(int *msg)
  509. {    switch ( msg[0] )
  510.     {    case WM_REDRAW:
  511.             wind_get(msg[3], WF_WORKXYWH, &contents.ob_x, &contents.ob_y, &contents.ob_width, &contents.ob_height);
  512.             window_redraw(msg[3], msg[4], msg[5], msg[6], msg[7]);
  513.             break;
  514.         case WM_MOVED:
  515.             wind_set(msg[3], WF_CURRXYWH, msg[4], msg[5], msg[6], msg[7]);
  516.             break;
  517.         case WM_TOPPED:
  518.             wind_set(msg[3], WF_TOP, 0, 0, 0, 0);
  519.             break;
  520.         case WM_CLOSED:
  521.             /*
  522.              * Demofenster wird geschlossen: Alles freigeben und Programm beenden.
  523.              */
  524.             if ( fsel != NULL )
  525.                 fslx_close(_GemParBlk.global, fsel);
  526.             wind_close(msg[3]);
  527.             wind_delete(msg[3]);
  528.             appl_exit();
  529.             exit(0);
  530.     }
  531. }
  532.  
  533. /*
  534.  * Diese Funktion verarbeitet Timer-Events und realisiert darüber 
  535.  * eine 'Mini-Animation' im Hintergrundfenster
  536.  */
  537. void timer_handler(int window)
  538. {    contents.ob_spec.obspec.character = *animate_p++;
  539.     if ( *animate_p == 0 )
  540.         animate_p = animate;
  541.     wind_get(window, WF_WORKXYWH, &contents.ob_x, &contents.ob_y, &contents.ob_width, &contents.ob_height);
  542.     window_redraw(window, contents.ob_x, contents.ob_y, contents.ob_width, contents.ob_height);
  543. }
  544.  
  545. int main(void)
  546. {    int rv, button, window, f_window, result, nfiles, sortmode, boxmode;
  547.     int msg[8], which, mx, my, kreturn, breturn, kstate;
  548.     EVNT evnt;
  549.     char *pattern;
  550.  
  551.     appl_init();
  552.     wind_get(0, WF_WORKXYWH, &xdesk, &ydesk, &wdesk, &hdesk);
  553.     graf_mouse(ARROW, NULL);
  554.  
  555.     Pdomain(1);        /* Damit auch wirklich lange Namen rauskommen */
  556.     getpath(path);
  557.  
  558.     /*
  559.      * Prüfen, ob das OS die FSLX-Aufrufe versteht.
  560.      */
  561.     if ( system_has_fslx(_GemParBlk.global) == 0 )
  562.     {    form_alert(1, "[1][Kein kompatibler Fileselector|installiert.][   Ok   ]");
  563.         appl_exit();
  564.         return 0;
  565.     }
  566.  
  567.     boxmode = form_alert(1, "[2][Wie soll die Box verwaltet|werden?][ Fenster | Dialog ]");
  568.     if ( boxmode == 1 )
  569.     {    /*
  570.          * Ein Fenster neben dem Fileselector öffenen, damit man sieht,
  571.          * da₧ der Fileselektor ein echtes Applikationsfenster und kein 
  572.          * lokaler Modus ist.
  573.          */
  574.         window = wind_create(NAME | MOVER | CLOSER, xdesk, ydesk, wdesk, hdesk);
  575.         if ( window < 0 )
  576.         {    form_alert(1, "[1][Das Fenster klemmt mal wieder!][   Ok   ]");
  577.             appl_exit();
  578.             return 0;
  579.         }
  580.         wind_set(window, WF_NAME, "Noch'n Fenster");
  581.         wind_open(window, xdesk + 50, ydesk + 50, 300, 200);
  582.         window_redraw(window, xdesk, ydesk, wdesk, hdesk);
  583.  
  584.         fsel = fslx_open(
  585.                 _GemParBlk.global,
  586.                 "BoxKite",
  587.                 -1,-1,
  588.                 &f_window,
  589.                 path, 258,
  590.                 name, 258,
  591.                 extlist,        /* ext list */
  592.                 0L,                /* no filter */
  593.                 pathlist,        /* path list */
  594.                 SORTBYDATE,
  595.                 GETMULTI);
  596.  
  597.         if ( fsel == NULL )
  598.             form_alert(1, "[3][Der Fileselector lä₧t sich|nicht öffnen!][   Ok   ]");
  599.  
  600.         /* 
  601.          * Hier beginnt die Hauptschleife. Sie wird auch dann betreten, wenn
  602.          * der Fileselektor sich nicht öffnen lä₧t. Das Programm wird beendet,
  603.          * wenn das Hintergrundfenster geschlossen wird.
  604.          */
  605.         do
  606.         {    which = evnt_multi(MU_KEYBD | MU_BUTTON | MU_MESAG | MU_TIMER,
  607.                     2, 1, 1,
  608.                     0, 0, 0, 0, 0,
  609.                     0, 0, 0, 0, 0,
  610.                     msg,
  611.                     500, 0,
  612.                     &mx, &my, &button,
  613.                     &kstate, &kreturn, &breturn);
  614.  
  615.             if ( fsel != NULL )
  616.             {    /*
  617.                  * Wenn wir einen offenen Fileselektor haben, 
  618.                  * dann bekommt der jedes Ereignis zuerst.
  619.                  */
  620.                 evnt.mwhich  = which;
  621.                 evnt.mx      = mx;
  622.                 evnt.my      = my;
  623.                 evnt.mbutton = button;
  624.                 evnt.kstate  = kstate;
  625.                 evnt.key      = kreturn;
  626.                 evnt.mclicks = breturn;
  627.                 memcpy(evnt.msg, msg, 16);
  628.     
  629.                 result = fslx_evnt(
  630.                     _GemParBlk.global,
  631.                     fsel,
  632.                     &evnt,
  633.                     path,
  634.                     name,
  635.                     &button,
  636.                     &nfiles,
  637.                     &sortmode,
  638.                     &pattern);
  639.  
  640.                 if ( result == 0 )
  641.                 {    /*
  642.                      * Ein Returncode von 0 an dieser Stelle bedeutet, da₧
  643.                      * der Fileselektor beendet wurde und die evtl. gewählten
  644.                      * Dateien verarbeitet werden müssen.
  645.                      */
  646.                     if ( button == 0 )
  647.                         form_alert(1, "[3][ Dialog abgebochen.][   Ok   ]");
  648.                     else
  649.                     {    sprintf(alert, "[2][ Anzahl: %d | Sortmode: %d | Muster: %s | Auswahl: %s ][   Ok   ]", nfiles, sortmode, pattern, name);
  650.                         form_alert(1, alert);
  651.                         while ( --nfiles )
  652.                         {    fslx_getnxtfile(_GemParBlk.global, fsel, name);
  653.                             sprintf(alert, "[2][ Auswahl: %s ][   Ok   ]", name);
  654.                             form_alert(1, alert);
  655.                         }
  656.                     }
  657.                     fslx_close(_GemParBlk.global, fsel);
  658.                     fsel = NULL;
  659.                 }
  660.                 /*
  661.                  * Da 'fslx_evnt()' die Bits der verarbeiteten Events aus
  662.                  * 'evnt.mwhich' löscht, mu₧ dieser modifizierte Wert weiter
  663.                  * analysiert werden.
  664.                  */
  665.                 which = evnt.mwhich;
  666.             }
  667.             /*
  668.              * Hier werden endlich die Ereignisse, die der Fileselektor
  669.              * übriggelassen hat, vom Programm selbst verarbeitet.
  670.              */
  671.             if ( which & MU_MESAG )
  672.                 message_handler(msg);
  673.  
  674.             if ( which & MU_TIMER )
  675.                 timer_handler(window);
  676.         }
  677.         while ( 1 );
  678.     }
  679.     else
  680.     {    /*
  681.          * In diesem Zweig wird der Fileselektor als modaler
  682.          * Dialog über 'fslx_do()' aufgerufen.
  683.          */
  684.         sortmode = SORTBYDATE;
  685.         fsel = fslx_do(
  686.                 _GemParBlk.global,
  687.                 "BoxKite",
  688.                 path, 258,
  689.                 name, 258,
  690.                 extlist,        /* ext list */
  691.                 0L,                /* no filter */
  692.                 pathlist,        /* path list */
  693.                 &sortmode,
  694.                 GETMULTI,
  695.                 &button,
  696.                 &nfiles,
  697.                 &pattern
  698.             );
  699.         if ( fsel == NULL )
  700.             form_alert(1, "[3][Der Fileselector lä₧t sich|nicht öffnen!][   Ok   ]");
  701.         else
  702.         {    if ( button == 0 )
  703.                 form_alert(1, "[3][ Dialog abgebochen.][   Ok   ]");
  704.             else
  705.             {    sprintf(alert, "[2][ Anzahl: %d | Sortmode: %d | Muster: %s | Auswahl: %s ][   Ok   ]", nfiles, sortmode, pattern, name);
  706.                 form_alert(1, alert);
  707.                 while ( --nfiles )
  708.                 {    fslx_getnxtfile(_GemParBlk.global, fsel, name);
  709.                     sprintf(alert, "[2][ Auswahl: %s ][   Ok   ]", name);
  710.                     form_alert(1, alert);
  711.                 }
  712.             }
  713.             fslx_close(_GemParBlk.global, fsel);
  714.         }
  715.     }
  716.     appl_exit();
  717.     return 0;
  718. }
  719.