home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser 1998 October / STC_CD_10_1998.iso / ANWEND / QED410B / SOURCEN / FONTSEL.C < prev    next >
C/C++ Source or Header  |  1998-09-26  |  4KB  |  185 lines

  1. #include <support.h>
  2.  
  3. #include "global.h"
  4. #include "comm.h"
  5. #include "obj.h"
  6. #include "printer.h"
  7. #include "rsc.h"
  8. #include "window.h"
  9. #include "xfsl.h"
  10. #include "xufsl.h"
  11. #include "fontsel.h"
  12.  
  13. /*
  14.  * exportierte Variablen
  15.  */
  16. FONTINFO    winFont;
  17. FONTINFO    druckFont;
  18.  
  19. /* 
  20.  * Fontauswahl durchführen.
  21.  * Reihenfolge:
  22.  *        1. Cookie xFSL
  23.  *        2. Cookie UFSL
  24.  *        3. $FONTSELECT
  25.  *        4. fnts_do()
  26.  */
  27. BOOLEAN    select_font(BOOLEAN wind)
  28. {
  29.     FONTINFO    *font;
  30.     LONG        v;
  31.     WORD        f_id, f_pts, ret, i, d;
  32.     WORD        fs_handle, workout[57], f_anz;
  33.     BOOLEAN    ok = FALSE;
  34.     UBYTE        *p, *titel;
  35.  
  36.     if (wind)
  37.     {
  38.         font = &winFont;
  39.         titel = STRING(SELWFONTSTR);
  40.     }
  41.     else
  42.     {
  43.         font = &druckFont;
  44.         titel = STRING(SELPFONTSTR);
  45.     }
  46.     /* 
  47.      * Wir machen einfach eine eigene WS auf, da MagiC am Handle rumfummelt und
  48.      * alte UFSL den Demotext drucken würden.
  49.      * Wer einen Font für den Drucker aber nicht für den Bildschirm anmeldet,
  50.      * hat selber schuld!
  51.     */
  52.     fs_handle = open_vwork(workout);
  53.     f_anz = workout[10];
  54.     if (gdos)
  55.     {
  56.         f_anz += vst_load_fonts(fs_handle, 0);
  57.         vst_font(fs_handle, font->id);
  58.         vst_point(fs_handle, font->pts, &d,&d,&d,&d);
  59.     }
  60.     f_id = font->id;
  61.     f_pts = font->pts;
  62.  
  63.     if (getcookie('xFSL', &v))
  64.     {
  65.         xFSL    *xfsl;
  66.  
  67.         xfsl = (xFSL *)v;
  68.         ret = xfsl->xfsl_input(fs_handle, (FF_ALL), titel, &f_id, &f_pts);
  69.         if (ret == 1)
  70.         {
  71.             font->id = f_id;
  72.             font->pts = f_pts;
  73.             ok = TRUE;
  74.         }
  75.     }
  76.     else if (getcookie('UFSL', &v))
  77.     {
  78.         xUFSL_struct    *ufsl;
  79.         ULONG                flags=0xFFFF;
  80.         WORD                attr = 0, color = 1, skew = 0;
  81.         FW_INFO            width={0,0,0};
  82.  
  83.         ufsl = (xUFSL_struct *)v;
  84.         flags = UFS_SIZE_CHANGE|
  85.                   UFS_GDOS_FONTS|
  86.                   UFS_PROP_FONTS;
  87.  
  88.         if (ufsl->id == xUFS_ID)
  89.         {
  90.             if ((ufsl->version <= 0x103))
  91.             {
  92.                 ret = ufsl->font_selexinput(fs_handle, flags, titel,
  93.                                                     titel, 1, 1, &f_id, &f_pts,
  94.                                                     &width, &attr, &color, &skew);
  95.             }
  96.             else
  97.             {
  98.                 ret = ufsl->font_selexinput(fs_handle, flags, titel,
  99.                                                      titel, 1, 1, &f_id, &f_pts,
  100.                                                      &width, &attr, &color, &skew);
  101.             }
  102.         }
  103.         else
  104.         {
  105.             ufsl->dialtyp = UFS_DIALOG;
  106.             ret = ufsl->fontsel_input(fs_handle, f_anz, 0, titel, &f_id, &f_pts);
  107.         }
  108.         if (ret == UFS_OK)
  109.         {
  110.             font->id = f_id;
  111.             font->pts = f_pts;
  112.             ok = TRUE;
  113.         }
  114.     }
  115.     else if (wind && (p = getenv("FONTSELECT")) != NULL)        /* nur für Fenster-Font! */
  116.     {
  117.         UBYTE    name[9];
  118.  
  119.         strncpy(name, p, 8);
  120.         for (i = (WORD)strlen(name); i < 8; i++)
  121.             strcat(name, " ");
  122.         i = appl_find(name);
  123.         if (i >= 0)
  124.         {
  125.             memset(msgbuff, 0, (WORD)sizeof(msgbuff));
  126.             msgbuff[0] = 0x7A19;            /* FONT_SELECT */
  127.             msgbuff[3] = -1;
  128.             msgbuff[4] = f_id;
  129.             msgbuff[5] = f_pts;
  130.             msgbuff[6] = 1;
  131.             msgbuff[7] = 0;
  132.             send_msg(i);
  133.         }
  134.     }
  135.     else if (appl_xgetinfo(7, &i, &d, &d, &d) && (i & 0x04))
  136.     {
  137.         VOID    *fnt_ptr;
  138.         WORD    check;
  139.         LONG    ratio = 1l << 16,
  140.                 id = f_id,
  141.                 pts = (LONG) f_pts << 16;
  142.  
  143.         fnt_ptr = fnts_create(fs_handle, 0, (FNTS_BTMP|FNTS_OUTL|FNTS_MONO|FNTS_PROP),
  144.                                      (FNTS_3D), "The quick brown...", NULL);
  145.  
  146.         ret = fnts_do(fnt_ptr,  FNTS_BSET, id, pts, ratio, &check, &id, &pts, &ratio);
  147.  
  148.         if (ret == FNTS_OK|| ret == FNTS_SET)
  149.         {
  150.             font->id = (WORD) id;
  151.             font->pts = (WORD) (pts >> 16);
  152.             ok = TRUE;
  153.         }
  154.         fnts_delete(fnt_ptr, 1);
  155.     }
  156.     else
  157.         note(1, NOFSL);
  158.  
  159.     if (gdos)
  160.         vst_unload_fonts(fs_handle, 0);
  161.     v_clsvwk(fs_handle);
  162.  
  163.     return ok;
  164. }
  165.  
  166. GLOBAL VOID font_change(VOID)
  167. {
  168.     WORD    ret, w1, w2, d, dummy1[5], dummy3[3];
  169.  
  170.     /* gl_wchar und gl_hchar werden NUR hier verändert */
  171.     vst_font(vdi_handle, winFont.id);
  172.     winFont.pts = vst_point (vdi_handle, winFont.pts, &d, &d, &gl_wchar, &gl_hchar);
  173.  
  174.     vqt_width(vdi_handle,'M',&w1,&ret,&ret);
  175.     vqt_width(vdi_handle,'i',&w2,&ret,&ret);
  176.     winFont.prop = (w1 != w2);
  177.  
  178.     vqt_fontinfo(vdi_handle, &min_ascii, &max_ascii, dummy1, &d, dummy3);
  179.     if (min_ascii <= 0)
  180.         min_ascii = 1;
  181.  
  182.     /* Alle Fenster updaten */
  183.     do_all_window(CLASS_ALL, do_font_change);
  184. }
  185.