home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / gpr140s / gem.c < prev    next >
C/C++ Source or Header  |  1994-09-10  |  26KB  |  736 lines

  1. /**********************************************/
  2. /* GEM-Rahmen-Programm                        */
  3. /* Eigene Dialoge in das EXAMPLE.C der        */
  4. /* Enhanced-GEM-Lib von Christian Grunenberg  */
  5. /* eingehaengt (v1.40)                        */
  6. /* aktuelle Versionen der Libary @ S2, @ FL   */
  7. /**********************************************/
  8. #ifdef __PUREC__
  9. #define ZAHL_NACH_ASCII itoa
  10. #include <ext.h>
  11. #endif
  12. #ifdef __GNUC__
  13. #define __TCC_COMPAT__
  14. #define ZAHL_NACH_ASCII _itoa
  15. #include <support.h>
  16. #include <unistd.h>
  17. #include <ostruct.h>
  18. #include <mintbind.h>
  19. #endif
  20. #include <osbind.h>
  21. #include <vdibind.h>
  22. #include <aesbind.h>
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include <string.h>
  26. #include <e_gem.h>
  27. #include "gdos.h"
  28. #include "gprint.h"
  29.  
  30. #define DND                /* Drag & Drop */
  31. /*#define CMD_DEBUG */     /* Comandline  */
  32. /*#define FONT_DEBUG*/     /* Font-ID's usw */
  33.  
  34. #define AP_DRAGDROP  63
  35. #define ERROR        -1
  36. #define ERANGE      -64
  37. #define EACCDN      -36
  38.  
  39. /*************** Prototypen ******************/
  40. extern int  bestimme_datei      (char *n, char *dn, char *dp);
  41. extern int  bestimme_datei_v    (char *name, char *pfad);
  42. extern long text_laden          (const char *text_name, unsigned long *laenge);
  43. extern void ausgabe_vorbereiten (void);
  44. extern void get_font_height     (void);
  45. extern void dd_recieve          (int msg[]);
  46. extern int  get_fonts           (int wk_handle);
  47. extern void print_pic           (int wk_handle, char *pfad);
  48. extern int  open_wkst           (int wk_handle);
  49. extern int  save_opt            (void);
  50. extern int  load_opt            (void);
  51.  
  52. /* extern int  save_fontliste      (FONT *fonts, int anzahl);*/
  53. /* extern long load_datei          (const char *name, unsigned long *laenge);*/
  54. /* extern int  set_font            (int wk_handle, int font_id);*/
  55.  
  56. #ifdef SBEDARF
  57. extern void ausgabe_quer_sim    (int lh, int height, int xo);
  58. extern void ausgabe_norm_sim    (int lh, int height, int xo);
  59. #endif
  60.  
  61. extern int ap_id, oldhandle, akt_font, anz_font;
  62.  
  63. void CycleCloseWindow(int mode);
  64. void OpenDialog(DIAINFO *info, OBJECT *tree, int obj,
  65.                 DIAINFO *parent, int dial_mode, char *name);
  66. void CloseDialog(DIAINFO *info);
  67. int  InitMsg(EVENT *evt);
  68. void Messag(EVENT *event);
  69. void ExitExample(int all);
  70. void set_font_state(DIAINFO *exinf);
  71. void drucken(char *text, long size);
  72.  
  73. /*****************************************************/
  74. EVENT event;
  75. static int double_click, exobj;
  76.  
  77. /* Zeiger auf Objektbäume sowie DIAINFO-Strukturen für Dialoge */
  78. OBJECT *dial_tree, *help_tree, *font_tree, *opt_tree, *pop_tree, *ppop_tree, *dev_tree;
  79. DIAINFO dial_info, help_info, font_info, opt_info, pop_info, ppop_info, dev_info, *ex_info;
  80.  
  81. POPUP pop = { &dial_info, 0, 0, POPBTN, 0, TRUE, TRUE };
  82. POPUP ppop = { &opt_info, 0, 0, PPAGEPOP, 0, TRUE, TRUE };
  83.  
  84. /* Liste von Zeigern auf DIAINFO-Strukturen der geöffneten Dialoge */
  85. DIAINFO *wins[6];
  86. int win_cnt;                      /* Anzahl der geöffneten Dialoge */
  87.  
  88. /***********************************************************************
  89.  Alle Dialoge schließen sowie optional Beenden der Applikation
  90.  (Menüleiste löschen, Resource freigeben, Abmeldung bei AES und VDI)
  91. ***********************************************************************/
  92. void ExitExample(int all)
  93. {
  94.   while (--win_cnt >= 0)    /* alle geöffneten Dialoge schließen */
  95.     close_dialog(wins[win_cnt],FALSE);
  96.   if(fontp != NULL)
  97.     free((void *)fontp);
  98.   fontp = NULL;
  99.   afp   = NULL;
  100.   akt_font = 0;
  101.   oldhandle = 0;
  102.  
  103.   if(all)
  104.   {
  105.     close_rsc();    /* Resource freigeben, Abmelden */
  106.     exit(0);        /* Programm beenden */
  107.   }
  108.  
  109.   win_cnt=0;
  110. }
  111.  
  112. /***********************************************************************
  113.  Resource und Objektbäume initialsieren
  114. ***********************************************************************/
  115. void init_resource(void)
  116. {
  117.     /* Adressen der Objektbäume (Dialoge,Menüs,Popups) ermitteln */
  118.     rsrc_gaddr(R_TREE, GDOSUTIL,      &dial_tree);
  119.     rsrc_gaddr(R_TREE, HILFE,         &help_tree);
  120.     rsrc_gaddr(R_TREE, FONTEINST,     &font_tree);
  121.     rsrc_gaddr(R_TREE, OPTIONENEINST, &opt_tree);
  122.     rsrc_gaddr(R_TREE, IDPOP,         &pop_tree);
  123.     rsrc_gaddr(R_TREE, PAGEPOP,       &ppop_tree);
  124.     rsrc_gaddr(R_TREE, DEVICEINFO,    &dev_tree);
  125.     pop.p_menu  = pop_tree;
  126.     ppop.p_menu = ppop_tree;
  127.  
  128.     /* erweiterte Objekte sowie Images/Icons anpassen */
  129.     fix_objects(dial_tree, NO_SCALING);
  130.     fix_objects(help_tree, NO_SCALING);
  131.     fix_objects(font_tree, NO_SCALING);
  132.     fix_objects(opt_tree,  NO_SCALING);
  133.     fix_objects(pop_tree,  NO_SCALING);
  134.     fix_objects(ppop_tree, NO_SCALING);
  135.     fix_objects(dev_tree,  NO_SCALING);
  136. }
  137.  
  138. /***********************************************************************
  139.  Fensterdialog rotieren (mode==0) oder schließen (mode!=0)
  140. ***********************************************************************/
  141. void CycleCloseWindow(int mode)
  142. {
  143.   /* Dialog geöffnet ? */
  144.   if (win_cnt > 0)
  145.   {
  146.     register int i, handle = FAIL;
  147.     int top, dummy;
  148.  
  149.     /* Handle des obersten Fensters ermitteln */
  150.     wind_get(0, WF_TOP, &top, &dummy, &dummy, &dummy);
  151.  
  152.     /* DIAINFO-Struktur des obersten Fensterdialoges suchen */
  153.     for(i = 0; i < win_cnt; i++)
  154.     {
  155.       if(wins[i]->di_flag >= WINDOW && wins[i]->di_handle == top)
  156.       {
  157.         /* Dialog schließen ? */
  158.         if(mode)
  159.         {
  160.           /* Falls Hauptdialog geschlossen wird, auch alle
  161.              anderen Dialoge schließen */
  162.           if(wins[i] == &dial_info)
  163.             ExitExample(0);
  164.            /* ansonsten nur obersten Dialog schließen */
  165.           else
  166.             CloseDialog(wins[i]);
  167.         }
  168.         /* Dialog rotieren ? */
  169.         else if (i < (win_cnt-1))
  170.           handle = wins[i+1]->di_handle;
  171.         else
  172.           handle = wins[0]->di_handle;
  173.         break;
  174.       }
  175.      /* Dialog nach Rotation in Vordergrund bringen */
  176.      if(handle > 0)
  177.        wind_set(handle, WF_TOP);
  178.     }
  179.   }
  180. }
  181.  
  182. /***********************************************************************
  183.  Dialog öffnen und in Liste der geöffneten Dialoge eintragen bzw. falls
  184.  der Dialog schon geöffnet ist, diesen in den Vordergrund bringen. Außerdem
  185.  Verwaltung der geöffneten Dialoge und Auswertung der Benutzeraktionen
  186. ***********************************************************************/
  187. void OpenDialog(DIAINFO *info, OBJECT *tree, int obj,
  188.                 DIAINFO *parent, int dial_mode, char *name)
  189. {
  190.   exobj = win_cnt;
  191.   if(parent && obj > FAIL)
  192.   {
  193.     ob_undostate(parent->di_tree, obj, SELECTED);
  194.     ob_draw_chg(parent, obj, NULL, FAIL, FALSE);
  195.   }
  196.  
  197.   switch(info->di_flag)
  198.   {
  199.     case WINDOW:                             /* Fensterdialog bereits geöffnet ? */
  200.     case WIN_MODAL:
  201.          wind_set(info->di_handle, WF_TOP);  /* Dialog in den Vordergrund holen */
  202.          break;
  203.     case CLOSED:    /* Dialog geschlossen ? */
  204.                     /* Dialog öffnen und bei Erfolg in Liste eintragen */
  205.         if(open_dialog(tree, info, name, TRUE, FALSE, dial_mode))
  206.           wins[win_cnt++] = info;
  207.   }
  208.  
  209.                 /* Waren bereits vorher Dialoge geöffnet ? */
  210.   if(exobj > 0)
  211.                 /* Ja, also wird die Verwaltung bereits an anderer Stelle übernommen */
  212.     return;
  213.  
  214.   while(win_cnt > 0)
  215.   {
  216.     /* exit -> angewähltes Objekt (Bit 15 = Doppelklick)
  217.        ex_info -> Zeiger auf DIAINFO-Struktur des angewählten Dialogs
  218.     */
  219.     exobj = X_Form_Do(&ex_info, 0, InitMsg, Messag);
  220.  
  221.     if(exobj == W_CLOSED)            /* Dialog schließen */
  222.     {
  223.       if(ex_info == &dial_info && _app)
  224.         ExitExample(1);
  225.       else if(ex_info == &dial_info && !_app)
  226.         ExitExample(0);
  227.       else
  228.         CloseDialog(ex_info);
  229.     } /* Dialog wurde geschlossen, aber kein Objekt angewählt
  230.          (z.B. durch AC_CLOSE) */
  231.     else if(exobj == W_ABANDON)
  232.       ExitExample(0);
  233.     else
  234.     { /* Doppelklick erfassen und aus Wert für Exit-Objekt ausmaskieren */
  235.       exobj ^= (double_click = exobj & 0x8000);
  236.  
  237.       if(ob_isstate(ex_info->di_tree, exobj, SELECTED))
  238.       {
  239.         /* angewähltes Objekt deselektieren und neu zeichnen */
  240.         ob_undostate(ex_info->di_tree, exobj, SELECTED);
  241.         ob_draw_chg(ex_info, exobj, NULL, FAIL, FALSE);
  242.       }
  243.       if(ex_info == &dial_info)      /* Haupt-Dialog */
  244.       {
  245.         char devstr[128];
  246.         int ret, wk_handle, fn, devexits;
  247.         int g_slice, g_page, a_slice, a_page, div_fac;
  248.         long mem;
  249.         unsigned long laenge;
  250.         switch(exobj)
  251.         {
  252.                 /* Hilfe-Button -> Hilfe-Dialog öffnen */
  253.           case POPBTN:
  254.                Popup(&pop, (double_click) ? POPUP_CYCLE_CHK : POPUP_BTN_CHK,
  255.                      OBJPOS, 0, 0, NULL, FAIL);
  256.                break;
  257.           case AKTUELLERPFAD:
  258.                break;
  259.           case EINSTELLUNGEN:
  260. /*             opt_tree[AUTOCHK].ob_state  = PF.dev_chk; */
  261.                opt_tree[SAVEPFAD].ob_state   = PF.s_pfad;
  262.                opt_tree[ABSATZMODE].ob_state = PF.abs_mode;
  263.                opt_tree[MEMDYN].ob_state     = PF.memory;
  264. /*             opt_tree[STATFONT].ob_state   = PF.stat_fontl; */
  265.                opt_tree[COPYS].ob_state      = PF.copies;
  266.                opt_tree[SPARMODE].ob_state   = PF.sparmod;
  267.  
  268.                if(PF.beginpage == 1)
  269.                  opt_tree[FROMPAGE].ob_state = NORMAL;
  270.                OpenDialog(&opt_info, opt_tree, exobj, ex_info, AUTO_DIAL|MODAL, " GDOS-Print ");
  271.                break;
  272.           case HELP:
  273.                OpenDialog(&help_info, help_tree, exobj, ex_info,
  274.                           AUTO_DIAL, " Hilfe ");
  275.                break;
  276.           case NAMEDATEI:
  277.                *fname = 0x0;
  278.                if(bestimme_datei(datei, fname, fpath))
  279.                {
  280.                  dial_tree[NAMEDATEI].ob_spec.tedinfo->te_ptext = fname;
  281.                  dial_tree[AKTUELLERPFAD].ob_spec.tedinfo->te_ptext = fpath;
  282.                  ob_draw_chg(ex_info, NAMEDATEI, NULL, FAIL, FALSE);
  283.                  ob_draw_chg(ex_info, AKTUELLERPFAD, NULL, FAIL, FALSE);
  284.                }
  285.                break;
  286.           case FONTSELECT:
  287.                ausgabe_vorbereiten();
  288.                if(get_fonts(PF.lh))
  289.                {
  290.                  ZAHL_NACH_ASCII(anz_font - 1, font_tree[FONTSINSGESAMT].ob_spec.tedinfo->te_ptext, 10);
  291.                  set_font_state(ex_info);
  292.                  OpenDialog(&font_info, font_tree, exobj, ex_info, AUTO_DIAL|MODAL, " GDOS-Print ");
  293.                }
  294.                break;
  295.           case DEVINFO:
  296.                ausgabe_vorbereiten();
  297.                if((wk_handle = open_wkst(PF.lh)) != 0)
  298.                {
  299.                  ZAHL_NACH_ASCII(PF.lh, dev_tree[DEVID].ob_spec.tedinfo->te_ptext, 10);
  300.                  ZAHL_NACH_ASCII(PF.res, dev_tree[DEVDPI].ob_spec.tedinfo->te_ptext, 10);
  301.                  ZAHL_NACH_ASCII(work_out[0] + 1, dev_tree[DEVX].ob_spec.tedinfo->te_ptext, 10);
  302.                  ZAHL_NACH_ASCII(work_out[1] + 1, dev_tree[DEVY].ob_spec.tedinfo->te_ptext, 10);
  303.                  vqt_devinfo(wk_handle, PF.lh, &devexits, devstr);
  304.                  if(devexits)
  305.                    dev_tree[DEVNAME].ob_spec.tedinfo->te_ptext = devstr;
  306.                  vq_scan(wk_handle, &g_slice, &g_page, &a_slice, &a_page, &div_fac);
  307.                  ZAHL_NACH_ASCII(g_slice, dev_tree[DEVSLICES].ob_spec.tedinfo->te_ptext, 10);
  308.                  ZAHL_NACH_ASCII(g_page,  dev_tree[DEVSLICESH].ob_spec.tedinfo->te_ptext, 10);
  309.                  ZAHL_NACH_ASCII(a_slice, dev_tree[DEVTEXTZ].ob_spec.tedinfo->te_ptext, 10);
  310.                  ZAHL_NACH_ASCII(a_page,  dev_tree[DEVTEXTZH].ob_spec.tedinfo->te_ptext, 10);
  311.                  m_v_clswk(wk_handle);
  312.                  OpenDialog(&dev_info, dev_tree, exobj, ex_info, AUTO_DIAL|MODAL, " GDOS-Print ");
  313.                }
  314.                break;
  315.           case CATALOG:
  316.                ausgabe_vorbereiten();
  317.                ret = bestimme_datei_v(datei, fpath);
  318.                if(ret && get_fonts(PF.lh))
  319.                {
  320.                  if((wk_handle = open_wkst(PF.lh)) != 0)
  321.                  {
  322.                    anz_font = vst_load_fonts(wk_handle, 0) + work_out[10] + 1;
  323.                    fn = vst_font(wk_handle, afp->font_id);
  324.                    if(fn == afp->font_id)
  325.                    {
  326.                      print_pic(wk_handle, fpath);
  327.                    }
  328.                    vst_unload_fonts(wk_handle, 0);
  329.                    m_v_clswk(wk_handle);
  330.                  }
  331.                }
  332.                break;
  333.           case GDUOK:
  334.                ausgabe_vorbereiten();
  335.                if(strlen(fname) == 0)                            /* schon eine Datei gewaehlt? */
  336.                {
  337.                  ret = bestimme_datei(datei, fname, fpath);
  338.                  dial_tree[NAMEDATEI].ob_spec.tedinfo->te_ptext = fname;
  339.                  dial_tree[AKTUELLERPFAD].ob_spec.tedinfo->te_ptext = fpath;
  340.                  ob_draw_chg(ex_info, NAMEDATEI, NULL, FAIL, FALSE);
  341.                  ob_draw_chg(ex_info, AKTUELLERPFAD, NULL, FAIL, FALSE);
  342.                }
  343.                else
  344.                {
  345.                  strcpy(datei, fname);
  346.                  ret = TRUE;
  347.                }
  348.                if(ret && get_fonts(PF.lh))
  349.                {
  350.                  mem = 0L;
  351.                  mem = text_laden(datei, &laenge);
  352.                  if(mem == 0L)
  353.                  {
  354.                    form_alert(1, "[3][ GDOS-Print: |  Datei nicht gefunden!  ][Abbruch]");
  355.                  }
  356.                  else
  357.                  {
  358.                    drucken((char *)mem, laenge);
  359.                    free((void *)mem);
  360.                    mem = NULL;
  361.                    strcpy(fname, "");
  362.                    ob_draw_chg(ex_info, NAMEDATEI, NULL, FAIL, FALSE);
  363.                  }
  364.                }
  365.                break;
  366.           default:
  367.                CloseDialog(ex_info);
  368.         }
  369.       }
  370.       else if(ex_info == &font_info)      /* Font-Dialog */
  371.       {
  372.         switch(exobj)
  373.         {
  374.           case FONTVORHER :
  375.                if((afp - 1)->font_id != -1 && akt_font > 1)
  376.                {
  377.                  akt_font--;
  378.                  afp--;
  379. #ifdef FONT_DEBUG
  380.                  printf("%d- %d %d %d \n",akt_font, afp->font_id, afp->font_spd, afp->font_prop);
  381. #endif
  382.                  set_font_state(ex_info);
  383.                }
  384.                break;
  385.           case FONTDANACH :
  386.                if(akt_font < anz_font)
  387.                {
  388.                  akt_font++;
  389.                  afp++;
  390. #ifdef FONT_DEBUG
  391.                  printf("%d+ %d %d %d \n",akt_font, afp->font_id, afp->font_spd, afp->font_prop);
  392. #endif
  393.                  set_font_state(ex_info);
  394.                }
  395.                break;
  396.           case FONTOK     :
  397.                dial_tree[FONTSELECT].ob_spec.tedinfo->te_ptext = afp->font_name;
  398.                dial_tree[SPECIAL].ob_state = NORMAL;
  399.                if(font_tree[ZHBEL].ob_state & SELECTED)
  400.                  dial_tree[SPECIAL].ob_spec.tedinfo->te_ptext = font_tree[ZHBELIEBIG].ob_spec.tedinfo->te_ptext;
  401.                else if(font_tree[ZH6].ob_state & SELECTED)
  402.                  dial_tree[SPECIAL].ob_spec.tedinfo->te_ptext = font_tree[SZH6].ob_spec.tedinfo->te_ptext;
  403.                else if(font_tree[ZH8].ob_state & SELECTED)
  404.                  dial_tree[SPECIAL].ob_spec.tedinfo->te_ptext = font_tree[SZH8].ob_spec.tedinfo->te_ptext;
  405.                else if(font_tree[ZH10].ob_state & SELECTED)
  406.                  dial_tree[SPECIAL].ob_spec.tedinfo->te_ptext = font_tree[SZH10].ob_spec.tedinfo->te_ptext;
  407.                set_font_state(ex_info);
  408.           case FONTABBR   :
  409.                ob_draw_chg(&dial_info, FONTSELECT, NULL, FAIL, FALSE);
  410.                ob_draw_chg(&dial_info, PROFONT, NULL, FAIL, FALSE);
  411.                ob_draw_chg(&dial_info, SPDFONT, NULL, FAIL, FALSE);
  412.                ob_draw_chg(&dial_info, SPECIAL, NULL, FAIL, FALSE);
  413.  
  414.                CloseDialog(ex_info);
  415.           break;
  416.         }
  417.       }
  418.       else if(ex_info == &opt_info)  /* Einstellungen-Dialog */
  419.       {
  420.         switch(exobj)
  421.         {
  422.           case PPAGEPOP:
  423.                Popup(&ppop, (double_click) ? POPUP_CYCLE_CHK : POPUP_BTN_CHK,
  424.                      OBJPOS, 0, 0, NULL, FAIL);
  425.                break;
  426. /*          case STATFONTSICHERN:
  427.                if(afp == NULL)
  428.                  form_alert(1, "[3][ GDOS-PRINT| Fontliste kann nicht |   gesichert werden! | Keine Fonts geladen! ][ Ok ]");
  429.                else
  430.                {
  431.                  if(!save_fontliste(fontp, anz_font))
  432.                  form_alert(1, "[3][ GDOS-PRINT| Fehler beim schreiben | der Fontliste! ][ Ok ]");
  433.                }
  434.                break;
  435. */
  436.           case SAVEOPT:
  437.                if(!save_opt())
  438.                  form_alert(1, "[3][ GDOS-PRINT| Fehler beim speichern! ][ Ok ]");
  439.           case OKOPT  :
  440. /*             PF.dev_chk  = opt_tree[AUTOCHK].ob_state;     */
  441.                PF.s_pfad   = opt_tree[SAVEPFAD].ob_state;
  442.                PF.abs_mode = opt_tree[ABSATZMODE].ob_state;
  443.                PF.memory   = opt_tree[MEMDYN].ob_state;
  444. /*             PF.stat_fontl = opt_tree[STATFONT].ob_state;  */
  445.                PF.sparmod    = opt_tree[SPARMODE].ob_state;
  446.                PF.copies     = opt_tree[COPYS].ob_state;
  447.                if(opt_tree[FROMPAGE].ob_state & SELECTED)
  448.                  PF.beginpage = atoi(opt_tree[FROMPAGENUM].ob_spec.tedinfo->te_ptext);
  449.                else
  450.                  PF.beginpage = 1;
  451.                CloseDialog(ex_info);
  452.                break;
  453.           default:
  454.                CloseDialog(ex_info);
  455.         }
  456.       }
  457.       else      /* andere Dialoge schließen */
  458.         CloseDialog(ex_info);
  459.  
  460.     }
  461.   }
  462. }
  463.  
  464. /*******************************************/
  465. /*******************************************/
  466. void drucken(char *text, long size)
  467. {
  468.   int wk_handle, fn;
  469.   long tlen;
  470.  
  471.   if(get_fonts(PF.lh))
  472.   {
  473.     tlen = text + size;
  474.     if((wk_handle = open_wkst(PF.lh)) != 0)
  475.     {
  476.       anz_font = vst_load_fonts(wk_handle, 0) + work_out[10] + 1;
  477.       fn = vst_font(wk_handle, afp->font_id);
  478.       if(fn == afp->font_id)
  479.       {
  480.         if(afp->font_spd && afp->font_prop)
  481.           print_vek_on_workstation(wk_handle, text, tlen);
  482.         else
  483.           print_pix_on_workstation(wk_handle, text, tlen);
  484.       }
  485.       else
  486.       {
  487.         form_alert(1, "[3][ GDOS-Print: | Gewünschter Zeichensatz | nicht verfügbar!][Abbruch]");
  488.       }
  489.       vst_unload_fonts(wk_handle, 0);
  490.       m_v_clswk(wk_handle);
  491.     }
  492.   }
  493. } /* drucken() */
  494.  
  495. /*******************************************/
  496. /* Die Fontinformationen in den Dialogen   */
  497. /* eintragen : p S xx Fontname             */
  498. /*******************************************/
  499. void set_font_state(DIAINFO *exinf)
  500. {
  501.   font_tree[FONTNAME].ob_spec.tedinfo->te_ptext = afp->font_name;
  502.   ob_draw_chg(exinf, FONTNAME, NULL, FAIL, FALSE);
  503.  
  504.   if(afp->font_spd == TRUE)
  505.   {
  506.     font_tree[SPEEDFONT].ob_state = NORMAL;
  507.     font_tree[ZHBEL].ob_state    &= ~DISABLED;
  508.     dial_tree[SPDFONT].ob_state   = NORMAL;
  509.   }
  510.   else
  511.   {
  512.     font_tree[SPEEDFONT].ob_state = DISABLED;
  513.     font_tree[ZHBEL].ob_state    |= DISABLED;
  514.     dial_tree[SPDFONT].ob_state   = DISABLED;
  515.   }
  516.   ob_draw_chg(&font_info, SPEEDFONT, NULL, FAIL, FALSE);
  517.   ob_draw_chg(&font_info, ZHBEL, NULL, FAIL, FALSE);
  518.  
  519.   if(afp->font_prop == TRUE)
  520.   {
  521.     font_tree[PROPFONT].ob_state = NORMAL;
  522.     dial_tree[PROFONT].ob_state = NORMAL;
  523.   }
  524.   else
  525.   {
  526.     font_tree[PROPFONT].ob_state = DISABLED;
  527.     dial_tree[PROFONT].ob_state = DISABLED;
  528.   }
  529.   ob_draw_chg(&font_info, PROPFONT, NULL, FAIL, FALSE);
  530. }
  531.  
  532. /***********************************************************************
  533.  Dialog schließen und aus Liste der geöffneten Dialoge entfernen
  534. ***********************************************************************/
  535. void CloseDialog(DIAINFO *info)
  536. {
  537.   if (info->di_flag > CLOSED)
  538.   {
  539.     int i;
  540.  
  541.     close_dialog(info, FALSE);
  542.  
  543.     for (i = 0; i < win_cnt; i++)
  544.       if (wins[i] == info)
  545.         break;
  546.  
  547.     for (win_cnt--; i < win_cnt; i++)
  548.       wins[i] = wins[i+1];
  549.   }
  550. }
  551.  
  552. /***********************************************************************
  553.  Initialisierungs-Routine, welche von X_Form_Do aufgerufen wird und
  554.  die Event-Struktur setzt sowie die Ereignisse, die von der Applikation
  555.  benötigt werden, zurückgibt
  556. ***********************************************************************/
  557. int InitMsg(EVENT *evt)
  558. {  /* Nachrichten und Tastendrücke auswerten */
  559.   evt->ev_mflags |= MU_MESAG|MU_KEYBD;
  560.   return (MU_MESAG|MU_KEYBD);
  561. }
  562.  
  563. /***********************************************************************
  564.  Ereignisauswertung (AES-Nachrichten und Tastendrücke), welche sowohl
  565.  von der Hauptschleife in der Funktion main() als auch von X_Form_Do()
  566.  aufgerufen wird
  567. ***********************************************************************/
  568. void Messag(EVENT *event)
  569. {
  570.   register int ev = event->ev_mwich, *msg = event->ev_mmgpbuf;
  571.  
  572.   if(ev & MU_MESAG)
  573.   {
  574.     switch(*msg)
  575.     {
  576.       case WM_CLOSED:
  577.            if(ex_info != &dial_info)
  578.              CloseDialog(ex_info);
  579.            else if(ex_info == &dial_info)
  580.            ExitExample(1);
  581.            break;
  582. #ifdef DND
  583.       case AP_DRAGDROP:
  584.            dd_recieve(event->ev_mmgpbuf);
  585.            dial_tree[AKTUELLERPFAD].ob_spec.tedinfo->te_ptext = fpath;
  586.            dial_tree[NAMEDATEI].ob_spec.tedinfo->te_ptext = fname;
  587.            ob_draw_chg(&dial_info, AKTUELLERPFAD, NULL, FAIL, FALSE);
  588.            ob_draw_chg(&dial_info, NAMEDATEI, NULL, FAIL, FALSE);
  589.            break;
  590. #endif
  591.       case AP_TERM:               /* Applikation beenden/ruecksetzen  */
  592.       case AC_CLOSE:
  593.            dial_tree[FONTSELECT].ob_spec.tedinfo->te_ptext = null_string;
  594.            ExitExample(0);
  595.            break;
  596.       case AC_OPEN:
  597.            OpenDialog(&dial_info, dial_tree, 0, NULL, AUTO_DIAL, " GDOS-Print ");
  598.            return;
  599.       default: ;
  600.     }
  601.   }
  602.  
  603.   if((ev & MU_KEYBD) && (event->ev_mmokstate & K_CTRL))
  604.   {
  605.     switch(scan_2_ascii(event->ev_mkreturn, event->ev_mmokstate))
  606.     {
  607.       case 'Q':
  608.            dial_tree[FONTSELECT].ob_spec.tedinfo->te_ptext = null_string;
  609.            if(_app)
  610.              ExitExample(1);
  611.            else
  612.              ExitExample(0);
  613.            break;
  614.       default: ;
  615.     }
  616.   }
  617. } /* Message() */
  618.  
  619. /***********************************************************/
  620. void main(int argc, char *argv[])
  621. {
  622.   int  mint;
  623.   long sem, mversion;
  624.  
  625.   getcwd(fpath, 128);
  626.   if(*(fpath + strlen(fpath)) != 92)
  627.     strcat(fpath, "\\");
  628.   *fname = 0x0;
  629.   *null_string = 0x0;
  630.  
  631.   if(argc > 1)                /* Datei auf Ikon gezogen */
  632.   {
  633.     strcpy(fname, argv[1]);
  634.   }
  635.  
  636.   ldrive = (*fpath) - 65;
  637.   sdrive = ldrive;
  638.   strcpy(lpath, fpath+2);     /* Ohne Laufwerksbuchstabe */
  639.   strcpy(spath, lpath);       /* Startpfad */
  640.   mint = get_cookie('MiNT', &mversion);
  641.  
  642.   if(mint && mversion >= 0x100)
  643.   {
  644.     sem = Psemaphore(2, (long)'SGPR', 1000);        /* Semaphor frei?      */
  645.  
  646.     switch((int)sem)
  647.     {
  648.       case ERANGE: Psemaphore(0, (long)'SGPR', 0);  /* kein Semaphor da: erzeugen */
  649.                    break;
  650.       case EACCDN: form_alert(1, "[3][ GDOS-Print: | Programm befindet sich | bereits im Speicher!][Abbruch]");
  651.                    exit(0);
  652.                    break;
  653.       default:     ;
  654.     }
  655.   }
  656.  
  657.   switch(open_rsc("GPRINT.RSC","  GDOS-Print"))  /* open_rsc() geaendert !!! */
  658.   {
  659.     case FAIL:
  660.          form_alert(1, "[3][GPRINT.RSC nicht gefunden!][Abbruch]");
  661.          break;
  662.     case FALSE:
  663.          form_alert(1, "[3][Workstation konnte|nicht geöffnet werden!][Abbruch]");
  664.          break;
  665.     case TRUE:
  666.     {
  667.       wind_update(BEG_UPDATE);
  668.  
  669.       init_resource();
  670.  
  671.       if(load_opt())
  672.       {
  673.         ausgabe_vorbereiten();
  674. /*        set_font(lh, id_akt_font);  <- ersetzen: akt_font = id_akt_font;
  675.                                                    get_fonts(); */
  676.         if(afp != NULL)
  677.         {
  678.           set_font_state(&font_info);
  679.           dial_tree[FONTSELECT].ob_spec.tedinfo->te_ptext = afp->font_name;
  680.         }
  681.       }
  682.  
  683.       dial_options(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE);
  684.       dial_tree[AKTUELLERPFAD].ob_spec.tedinfo->te_ptext = fpath;
  685.       dial_tree[NAMEDATEI].ob_spec.tedinfo->te_ptext = fname;
  686.  
  687. /*    PF.speedo     = get_cookie('_SPD', NULL);*/
  688. /*    PF.dev_chk    = opt_tree[AUTOCHK].ob_state;*/
  689.       PF.s_pfad     = opt_tree[SAVEPFAD].ob_state;
  690.       PF.abs_mode   = opt_tree[ABSATZMODE].ob_state;
  691.       PF.memory     = opt_tree[MEMDYN].ob_state;
  692. /*    PF.stat_fontl = opt_tree[STATFONT].ob_state;*/
  693.       PF.copies     = opt_tree[COPYS].ob_state;
  694.       PF.sparmod    = opt_tree[SPARMODE].ob_state;
  695.  
  696.       /* testen ob ein Device angeschlossen ist */
  697. /*    if(PF.dev_chk == SELECTED)
  698.       {
  699.         for(wh = 21; wh < 30; wh++)
  700.         {
  701.           work_in[0] = wh;
  702.           for(i = 1; i < 10; work_in[i++] = 1);
  703.           work_in[10] = 2;
  704.           v_opnwk(work_in, &ret, work_out);
  705.           if(ret == 0)
  706.             pop_tree[(wh-21) + ID21].ob_state |= DISABLED;
  707.         }
  708.       }
  709. */
  710.       wind_update(END_UPDATE);
  711.  
  712.       if(_app)
  713.       {
  714.         /*menu_bar(menu, 1);*/
  715.         OpenDialog(&dial_info, dial_tree, 0, NULL, AUTO_DIAL, " GDOS-Print ");
  716.       }
  717.       event.ev_mflags = MU_MESAG|MU_KEYBD;
  718.  
  719.       for(;;)
  720.       {
  721.         EvntMulti(&event);
  722.         Messag(&event);
  723.       }
  724.     }
  725.   }
  726.  
  727.   if(!_app)
  728. #ifdef __PUREC__
  729.     for(;;) evnt_timer(0, 32000);
  730. #endif
  731. #ifdef __GNUC__
  732.     for(;;) evnt_timer(32000L);
  733. #endif
  734. }
  735.  
  736.