home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / GNU_C++ / LIB / CFLIB-11.LZH / src / fontsel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-11-10  |  7.6 KB  |  389 lines

  1. /*
  2.  * fontsel.c
  3.  *
  4.  * ACHTNG: Dieses Modul darf nicht mit -O übersetzt werden, da sonst der 
  5.  *              ASM-Hack kaputt-optimiert wird!! (gilt nur für gcc 2.7.2.3)
  6.  *
  7. */
  8. #include "intern.h"
  9.  
  10. #ifdef __MINT__
  11. #include <gemx.h>
  12. #endif
  13.  
  14. #include "xfsl.h"
  15.  
  16.  
  17. #ifdef __GNUC__
  18. /*
  19.  * Hier müssen wir basteln, um int-Parameter auf wortbreite umzumappen.
  20. */
  21. #define xfsl_init(f, w, l) \
  22. __extension__ \
  23. ({ \
  24.     register long retvalue __asm__("d0"); \
  25.  \
  26.     __asm__ volatile \
  27.     ("    \
  28.         movl    %3,sp@-; \
  29.         movw    %2,sp@-; \
  30.         movl    %1,a0; \
  31.         jsr    a0@; \
  32.         addw    #6,sp " \
  33.     : "=r"(retvalue)                /* output */ \
  34.     : "r"(f), "g"(w), "g"(l)    /* input */ \
  35.     : "d0", "d1", "d2", "a0"    /* clobbered regs */    \
  36.     AND_MEMORY \
  37.   ); \
  38.   retvalue; \
  39. })
  40.  
  41. #define xfsl_event(f, w, l) \
  42. __extension__ \
  43. ({ \
  44.     register long retvalue __asm__("d0"); \
  45.  \
  46.     __asm__ volatile \
  47.     ("    \
  48.         movl    %3,sp@-; \
  49.         movw    %2,sp@-; \
  50.         movl    %1,a0; \
  51.         jsr    a0@; \
  52.         addw    #6,sp " \
  53.     : "=r"(retvalue)                /* output */ \
  54.     : "r"(f), "g"(w), "g"(l)    /* input */ \
  55.     : "d0", "d1", "a0"            /* clobbered regs */    \
  56.     AND_MEMORY \
  57.   ); \
  58.   retvalue; \
  59. })
  60.  
  61. #define xfsl_exit(f, w) \
  62. __extension__ \
  63. ({ \
  64.     register long retvalue __asm__("d0"); \
  65.  \
  66.     __asm__ volatile \
  67.     (" \
  68.         movw    %2,sp@-;    \
  69.         movl    %1,a0; \
  70.         jsr    a0@; \
  71.         addw    #2,sp " \
  72.     : "=r"(retvalue)        /* outputs */ \
  73.     : "r"(f), "g"(w)        /* inputs */ \
  74.     : "a0"                    /* clobbered regs */    \
  75.     AND_MEMORY \
  76.   ); \
  77.   retvalue; \
  78. })
  79.  
  80. #else
  81. #define xfsl_init(a,b,c)    a(b, c)
  82. #define xfsl_event(a,b,c)    a(b, c)
  83. #define xfsl_exit(a,b)        a(b)
  84. #endif
  85.  
  86.  
  87. static xFSL_PAR    xpar;
  88. static PFONTINFO    f_info;
  89. static EVENT        ev;
  90.  
  91. static int do_xfsl(long v, int handle, int flags, char *title, int *id, int *pts)
  92. {
  93.     xFSL        *xfsl;
  94.     int        ret = 0;
  95.     int        win;
  96.     int        use_win;
  97.         
  98.     xfsl = (xFSL *)v;
  99.     memset(&ev, 0, sizeof(EVENT));
  100.  
  101.     memset(&xpar, 0, sizeof(xFSL_PAR));
  102.     xpar.par_size = sizeof(xFSL_PAR);
  103.     xpar.pfi_size = sizeof(PFONTINFO);
  104.     
  105.     xpar.headline = title;
  106.     xpar.fontflags = FF_ALL;
  107.     if (flags & FS_F_MONO)
  108.         xpar.fontflags &= ~FF_PROPORTIONAL;
  109.                 
  110.     f_info.fontid = *id;
  111.     f_info.fontsize.size = *pts;
  112.     xpar.font = &f_info;
  113.  
  114.     use_win = cf_msg_cb;        /* Msg-Routine da -> Fenster */
  115.     if (use_win)
  116.     {
  117.         xpar.control = (CC_WINDOW|CC_APPMODAL);
  118.         ev.ev_mflags = MU_MESAG;
  119.     }
  120.     
  121.     win = xfsl_init(xfsl->xfsl_init, handle, &xpar);
  122.     if (win == xFS_ERROR)
  123.         return FALSE;
  124.  
  125.     if (use_win && (win == xFS_NO_WINDOW))
  126.     {
  127.         xpar.control = 0;
  128.         ev.ev_mflags = 0;
  129.         use_win = FALSE;
  130.     }
  131.  
  132.     if (use_win)
  133.         disable_menu();
  134.  
  135.     ret = 0;
  136.     do
  137.     {
  138.         ret = xfsl_event(xfsl->xfsl_event, win, &ev);
  139.       if (ret == xFS_EVENT)
  140.         {
  141. #ifdef __GNUC__
  142.             int    m[8], i;
  143.     
  144.             for (i = 0; i<8; i++)
  145.                 m[i] = ev.ev_mmgpbuf[i];
  146.             handle_mdial_msg(m);
  147. #else
  148.             handle_mdial_msg((int*)ev.ev_mmgpbuf);
  149. #endif
  150.         }
  151.     }
  152.     while (ret != xFS_OK && ret != xFS_STOP);
  153.     xfsl_exit(xfsl->xfsl_exit, win);
  154.  
  155.     if (use_win)
  156.         enable_menu();
  157.  
  158.     if (ret == xFS_OK)
  159.     {
  160.         *id = f_info.fontid;
  161.         *pts = f_info.fontsize.size;
  162.     }
  163.     return (ret == xFS_OK);
  164. }
  165.  
  166. static int check_for_xfsl(long *v)
  167. {
  168.     int    ok;
  169.     xFSL    *xfsl;
  170.         
  171.     ok = getcookie("xFSL", v);
  172.     if (ok)
  173.     {
  174.         xfsl = (xFSL *)*v;
  175.         if (xfsl->product == 0x4D584653L)    /* MagxUFSL versteht uns nicht! */
  176.         {
  177.             ok = FALSE;                                /* -> FALSE, damit MagiC benutz wird */
  178.             *v = 0L;
  179.         }
  180.     }
  181.     return ok;
  182. }
  183.  
  184. /* --------------------------------------------------------------------------- */
  185.  
  186. static int check_for_fprot(void)
  187. {
  188.     char    name[9], *p;
  189.     int    i = -1;
  190.  
  191.     p = getenv("FONTSELECT");
  192.     if (p)
  193.     {
  194.         strncpy(name, p, 8);
  195.         name[8] = EOS;
  196.         for (i = (int)strlen(name); i < 8; i++)
  197.             strcat(name, " ");
  198.         i = appl_find(name);
  199.     }
  200.     return i;
  201. }
  202.  
  203. static void do_fprotokoll(int ap_id, int id, int pts)
  204. {
  205.     short    msgbuff[8];
  206.         
  207.     msgbuff[0] = 0x7A19;            /* FONT_SELECT */
  208.     msgbuff[1] = gl_apid;
  209.     msgbuff[2] = 0;
  210.     msgbuff[3] = -1;
  211.     msgbuff[4] = id;
  212.     msgbuff[5] = pts;
  213.     msgbuff[6] = 1;
  214.     msgbuff[7] = 0;
  215.     appl_write(ap_id, (int)sizeof(msgbuff), msgbuff);
  216. }
  217.  
  218. /* --------------------------------------------------------------------------- */
  219.  
  220. static int do_magx(int handle, int f_anz, int flags, int *id, int *pts)
  221. {
  222.     FNT_DIALOG    *fnt_ptr;
  223.     int            check, f_typ, ret, but, win, d;
  224.     long            ratio = 1l << 16,
  225.                     n_id, n_pts;
  226.     EVNT            ev;
  227.     
  228.     f_typ = FNTS_BTMP|FNTS_OUTL|FNTS_MONO;
  229.     if (!(flags & FS_F_MONO))
  230.         f_typ |= FNTS_PROP;
  231.         
  232.     n_id = *id;
  233.     n_pts = (long) *pts << 16;
  234.     
  235.     fnt_ptr = fnts_create(handle, f_anz, f_typ, FNTS_3D, "The quick brown...", NULL);
  236.  
  237.     if (!cf_msg_cb)    /* keine Msg-Routine -> modal */
  238.         ret = fnts_do(fnt_ptr,  FNTS_BSET, n_id, n_pts, ratio, &check, &n_id, &n_pts, &ratio);
  239.     else
  240.     {
  241.         disable_menu();
  242.         
  243.         win = fnts_open(fnt_ptr, FNTS_BSET, -1, -1, n_id, n_pts, ratio);
  244.         
  245.         ret = 0;
  246.         while (ret == 0)
  247.         {
  248. #ifdef __GNUC__
  249.             int    msg[8], i, mx, my, mb, mc, ks, kr;
  250.  
  251.             /*
  252.              * GNU erwartet beim evnt_multi wirklich 'int', in EVNT sind aber
  253.              * nur 'short', so daß die Struktur nicht übergeben werden kann!
  254.             */
  255.             ev.mwhich = (short)evnt_multi(MU_KEYBD|MU_MESAG|MU_BUTTON, 2, 1, 1, 
  256.                                             0, 0, 0, 0, 0,    0, 0, 0, 0, 0,
  257.                                             msg, 0, &mx, &my, &mb, &ks, &kr, &mc);
  258.             ev.mx = mx;
  259.             ev.my = my;
  260.             ev.mbutton = mb;
  261.             ev.kstate = ks;
  262.             ev.key = kr;
  263.             ev.mclicks = mc;
  264.             for (i = 0; i<8; i++)
  265.                 ev.msg[i] = msg[i];
  266. #else
  267. #ifdef __MTAES__
  268.             MOBLK    null = {0,0,0,0,0};
  269.  
  270.             EVNT_multi((MU_KEYBD|MU_MESAG|MU_BUTTON), 2, 1, 1,
  271.                                 &null, &null, 0, &ev);
  272. #else
  273.             ev.mwhich = (short)evnt_multi(MU_KEYBD|MU_MESAG|MU_BUTTON, 2, 1, 1, 
  274.                                             0, 0, 0, 0, 0,    0, 0, 0, 0, 0,
  275.                                             (int*)ev.msg, 0, (int*)&ev.mx, (int*)&ev.my, (int*)&ev.mbutton, 
  276.                                             (int*)&ev.kstate,    (int*)&ev.key, (int*)&ev.mclicks);
  277. #endif
  278. #endif
  279.             if (ev.mwhich & MU_MESAG)
  280.             {
  281.                 switch (ev.msg[0])
  282.                 {
  283.                     case WM_REDRAW :
  284.                     case WM_MOVED :
  285.                     case WM_SIZED:
  286.                         if (ev.msg[3] != win)        /* für fremdes Fenster */
  287. #ifdef __GNUC__
  288.                             handle_mdial_msg(msg);
  289. #else
  290.                             handle_mdial_msg((int*)ev.msg);
  291. #endif
  292.                         break;
  293.  
  294.                     case WM_BOTTOMED:                    /* nicht erlaubt! */
  295.                         break;
  296.                     
  297.                     case WM_TOPPED :
  298.                     case WM_NEWTOP :
  299.                     case WM_ONTOP :        
  300.                         ev.msg[0] = WM_TOPPED;        /* immer Fontbox toppen! */
  301.                         ev.msg[3] = win;
  302.                         break;
  303.                 }
  304.  
  305.             }
  306.             ret = fnts_evnt(fnt_ptr, &ev, &but, &check, &n_id, &n_pts, &ratio);
  307.             
  308.             if (ret == 0)
  309.                 ret = but;
  310.             else
  311.                 ret = 0;
  312.         }
  313.         fnts_close(fnt_ptr, &d, &d);
  314.         
  315.         enable_menu();
  316.     }
  317.     
  318.     fnts_delete(fnt_ptr, 0);
  319.  
  320.     if (ret == FNTS_OK|| ret == FNTS_SET)
  321.     {
  322.         *id = (int) n_id;
  323.         *pts = (int) (n_pts >> 16);
  324.         return TRUE;
  325.     }
  326.     return FALSE;
  327. }
  328.  
  329. /* --------------------------------------------------------------------------- */
  330.  
  331. int do_fontsel(int flags, char *title, int *id, int *pts)
  332. {
  333.     int    new_id, new_pts;
  334.     int    fs_handle, workout[57], f_anz, d, i;
  335.     int    ok = FALSE;
  336.     long    v;
  337.                 
  338.     /* 
  339.      * Wir machen einfach eine eigene WS auf, da MagiC am Handle rumfummelt und
  340.      * alte UFSL den Demotext drucken würden.
  341.      * Wer einen Font für den Drucker nicht für den Bildschirm anmeldet,
  342.      * hat selber schuld!
  343.     */
  344.     fs_handle = open_vwork(workout);
  345.     f_anz = workout[10];
  346.     if (gl_gdos)
  347.     {
  348.         f_anz += vst_load_fonts(fs_handle, 0);
  349.         vst_font(fs_handle, *id);
  350.         vst_point(fs_handle, *pts, &d,&d,&d,&d);
  351.     }
  352.     new_id = *id;
  353.     new_pts = *pts;
  354.  
  355.     if ((flags & FS_M_XFSL) && check_for_xfsl(&v))
  356.     {
  357.         ok = do_xfsl(v, fs_handle, flags, title, &new_id, &new_pts);
  358.     }
  359.  
  360.     else if ((flags & FS_M_FPROT) && (i = check_for_fprot()) >= 0)
  361.     {
  362.         do_fprotokoll(i, *id, *pts);
  363.         return FALSE;                /* immer so, da neuer Font per Message kommt! */
  364.     }        
  365.  
  366.     else if ((flags & FS_M_MAGX) && (appl_xgetinfo(7, &i, &d, &d, &d) && (i & 0x04)))
  367.     {
  368.         ok = do_magx(fs_handle, f_anz, flags, &new_id, &new_pts);
  369.     }
  370.  
  371.     else            /* keine der drei Methoden möglich */
  372.     {
  373.         *id = -1;
  374.         *pts = -1;
  375.         ok = FALSE;
  376.     }    
  377.  
  378.     if (gl_gdos)
  379.         vst_unload_fonts(fs_handle, 0);
  380.     v_clsvwk(fs_handle);
  381.  
  382.     if (ok)
  383.     {
  384.         *id = new_id;
  385.         *pts = new_pts;
  386.     }
  387.     return ok;
  388. }
  389.