/*  @(#)fix31.c, Dirk Haun, Mai/Juli 1995
 *  @(#)einfaches xFSL-Testprogramm fr fix31-Modus
 *
 *  Das Programm zeigt, wie man einen Fontselektor ber die xFSL-Schnittstelle
 *  aufruft. Die bergebene xFSL_PAR-Struktur dient dabei der Ein- und Ausgabe.
 *
 *  Die ben”tigten Informationen ber den ausgew„hlten Font stehen hinterher in
 *  xpar.font, d.h. in der PFONTINFO-Struktur innerhalb der xFSL_PAR-Struktur.
 *
 *  Der Fontselektor wird hierbei im fix31-Modus aufgerufen, sofern er dies
 *  untersttzt.
 *
 *  Da es sich nur um ein Demo-Programm handelt, das mit dem ausgew„hlten Font
 *  nichts weiter anf„ngt, wird auf das ™ffnen einer VDI-Workstation und das
 *  Nachladen der Fonts mit vst_load_fonts() verzichtet.
 *
 *  Bugs: Der Aufruf der Hilfe (ST-Guide) funktioniert so nicht mit Memory
 *        Protection.
 */

#include <stdio.h>
#include <aes.h>
#include <vdi.h>
#include <string.h>
#include <xfsl.h>

#ifndef FALSE
# define FALSE (0)
# define TRUE  (1)
#endif

#define VA_START 0x4711

extern int get_cookie(long cookie,long *val);
extern fix31 pt2fix(int pt);
extern int fix2pt(fix31 f);

void error(int e)
{
 switch(e)
 {
  case xFS_PARERROR   : form_alert(1,"[2][Fehler in den bergebenen|Parametern!][Abbruch]");
                        break;
  case xFS_LOADERROR  : form_alert(1,"[2][Fehler beim Nachladen|von XFSL.OVL!][Abbruch]");
                        break;
  case xFS_RES_ERROR  : form_alert(1,"[2][Aufl”sung zu gering!][Abbruch]");
                        break;
  case xFS_NO_HANDLE  : form_alert(1,"[2][Kein Handle frei!][Abbruch]");
                        break;
  case xFS_NO_WINDOW  : form_alert(1,"[2][Kein Fenster frei!][Abbruch]");
                        break;
  case xFS_NO_FONTS   : form_alert(1,"[2][Keine Fonts geladen!][Abbruch]");
                        break;
  case xFS_NO_FONTSIZE: form_alert(1,"[2][Fontgr”že konnte nicht|identifiziert werden!][Abbruch]");
                        break;
  case xFS_ACTIVE     : form_alert(1,"[2][Fontselektor ist bereits aktiv!][Abbruch]");
                        break;
  case xFS_ERROR      : form_alert(1,"[2][Speichermangel!][Abbruch]");
                        break;
  default             : if(e<0) form_error(-31-e); /* Gemdos-Fehlermeldung */
 }
}

void appl_pwrite(int apid,...)
{
 int i, msg[8];
 va_list pp;

 va_start(pp,apid);
 for(i=0;i<8;i++) msg[i]=va_arg(pp,int);
 appl_write(apid,16,msg);
 va_end(pp);
}

void main(void)
{
 int ret, xhandle, stg, gl_apid, again, vork;
 char fontname[40], alert[128], transfer[256];
 long features, nachk;
 char *cp;
 EVENT ev;
 xFSL *xfsl;
 xFSL_PAR xpar;
 PFONTINFO pfont;

 gl_apid=appl_init();
 if(get_cookie('xFSL',(long*)&xfsl))
 {
  features=xfsl->xfsl_info();
  if((features&XF_FIX31)==0)
    form_alert(1,"[1][Der xFSL-Selektor untersttzt |keine fix31-Angaben! ][ Schade ]");


  /*  Vorbereitungen
   */
  memset(&xpar,0,sizeof(xFSL_PAR));         /* Strukturen "ausnullen" */
  memset(&pfont,0,sizeof(PFONTINFO));

  xpar.par_size=(int)sizeof(xFSL_PAR);      /* Strukturgr”žen eintragen */
  xpar.pfi_size=(int)sizeof(PFONTINFO);
  xpar.font=&pfont;                         /* Zeiger auf Fontinfo eintragen */

  xpar.control|=CC_WINDOW;                  /* xFSL als Fenster */
  if(features&XF_FIX31) xpar.control|=CC_FIX31;
  xpar.headline="W„hlen Sie einen Font!";   /* šberschrift */
  xpar.example="Jetzt aber fix!";           /* Beispieltext */
  xpar.helptext="HILFE";                    /* Text fr Hilfe-Button */
  xpar.fontflags=FF_VEKTOR;                 /* nur Vektorfonts zur Auswahl stellen */
  fontname[0]='\0';
  xpar.font->fontname=fontname;
  xpar.font->fontcol=BLACK;


  /*  Jetzt kann's losgehen
   */
  do
  {
   again=FALSE;

   xhandle=xfsl->xfsl_init(0,&xpar);        /* Dialog darstellen, Handle zurckgeben */

   if(xhandle==xFS_NO_WINDOW) /* Kein Fenster frei? Dann als modaler Dialog */
   {
    xpar.control&=~CC_WINDOW;
    xhandle=xfsl->xfsl_init(0,&xpar);
   }

   if(xhandle>=0)                           /* gltiges Handle? */
   {
    do
    {
     ev.ev_mflags=0;
     ret=xfsl->xfsl_event(xhandle,&ev);
     if(ret==xFS_HELP && xpar.helpinfo)     /* Hilfe aufrufen */
     {
      stg=appl_find("ST-GUIDE");
      if(stg>0)
      {
       cp=strchr(xpar.helpinfo,',');
       if(cp)
       {
        strcpy(transfer,"*:\\");
        strncat(transfer,xpar.helpinfo,(int)(cp-xpar.helpinfo));
        strcat(transfer,".hyp ");
        strcat(transfer,cp+1);
        appl_pwrite(stg,VA_START,gl_apid,0,transfer,0,0,0);
       }
      }
      else form_alert(1,"[2][Keine Hilfe verfgbar! ][ Pech ]");
     }
    }
    while(ret!=xFS_OK && ret!=xFS_STOP);    /* bis "OK" oder "Abbruch" gew„hlt */
    xfsl->xfsl_exit(xhandle);               /* Dialog abmelden */
    if(ret<0) error(ret);
    else if(ret==xFS_OK)
    {
     vork=(int)(xpar.font->fontsize.size31>>16); /* Vorkomma-Anteil */
     nachk=(xpar.font->fontsize.size31&0xffff);  /* Nachkomma-Anteil */
     nachk*=100; nachk+=49; nachk/=65536L;       /* ... auf zwei Stellen runden */

     sprintf(alert,"[1][Ausgew„hlt wurde der|Font mit ID %u|in der Gr”že %d.%d pt|(gerundet: %d pt).][ Nochmal | Abbruch ]"
                  ,xpar.font->fontid,vork,(int)nachk,fix2pt(xpar.font->fontsize.size31));
     if(form_alert(1,alert)==1) again=TRUE;
    }
   }
   else error(xhandle);
  }
  while(again);

 }
 else form_alert(1,"[2][Sorry, kein xFSL-Cookie vorhanden. ][ Abbruch ]");
 appl_exit();
}
