Atari Logo
Atari Computer

Hauptseite -
Welches System? -
Hardware -
Software -
Emulatoren -
Internet
MausNet
Programmieren
Verweise
Über

Beispiel: xFSL-Schnittstelle

Die folgenden Beispiele stellen Definitionen für die xFSL-Schnittstelle zur Verfügung.

Sprache C Pascal GFA Basic mForth
Definitionen xfsl.h     xfsl.4h
Beispiel xfsl.c xfsl.pas xfsl.lst xfsl.4th


xfsl.h

/*  @(#)xfsl.h, Dirk Haun/Stefan Rogel/Christoph Zwerschke, 21.07.1995
 *  @(#)Aufruf eines systemweiten Fontselektors ueber den Cookie 'xFSL'
 *
 *  Revision 4 vom 21.07.1995
 *
 */

#if !defined(__xFSL__)
#define __xFSL__

#if !defined(__AES__)
# include 
#endif

#if !defined(__VDI__)
# include 
#endif

#define xFSL_REVISION  4


/******** verwendete Strukturen ******************************************/

/*  Neuer Typ fr Fontgr”že in 1/65536 Punkt, gueltig ab Speedo 4.0
 *
 *  typedef long  fix31;
 */

/*  Angabe der Fontgroesse,
 *  wird ueber ein Kontrollflag (s.u.) unterschieden
 */

union fsize
{
 int           size;         /* Fontgroesse in Punkt */
 fix31         size31;       /* Fontgroesse in 1/65536 Punkt */
};


/*  allgemeine Fontinfo-Struktur
 */

typedef struct
{
 int           fontid;       /* ID des Fonts                             */
 int           fonttype;     /* Typ des Fonts, siehe vqt_info()          */
 char         *fontname;     /* Name des Fonts, siehe vqt_name()         */
 union fsize   fontsize;     /* Fontgroesse in pt oder fix31             */
 union fsize   fontwidth;    /* Breite in pt oder fix31                  */
 char          trackkern;    /* Track-Kerning, siehe vst_kern()          */
 char          pairkern;     /* Paar-Kerning, siehe vst_kern()           */
 int           fontattr;     /* Attribute, siehe vst_attributes()        */
 int           fontskew;     /* Neigung, siehe vst_skew()                */
 int           fontcol;      /* Farbe, siehe vst_color()                 */
 int           backcol;      /* Text-Hintergrundfarbe                    */
 int           halign;       /* horizontale Textausrichtung              */
 int           valign;       /* vertikale Textausrichtung                */
 int           rotation;     /* Textrotation in 1/10 Grad                */
 int           validtype;    /* Typ (V_CHAR_...) oder Mapping (MAP_...)  */
 int          *validchars;   /* ben”tigte Zeichen oder 0L                */
} PFONTINFO;


/*  ein Eintrag im Popup
 */

typedef struct
{
 char         *entry;        /* Text des Popup-Eintrags                  */
 PFONTINFO    *fontinfo;     /* Zeiger auf Fontinfo-Struktur             */
 unsigned int  fontflags;    /* erlaubte Fontarten                       */
 long          funcflags;    /* Funktionsflags, nur fuer HuGo!           */
} xFSL_PENTRY;


/*  xFSL-Parameter
 */

typedef struct
{
 int           par_size;     /* Groesse der xFSL_PAR-Struktur selbst      */
 int           pfi_size;     /* Groesse der PFONTINFO-Struktur            */
 unsigned long control;      /* Kontroll-Flags, s.u.                      */
 const char   *headline;     /* šberschrift oder 0L                       */
 const char   *example;      /* Beispieltext oder 0L                      */
 const char   *helptext;     /* Text fuer den Hilfe-Button oder 0L        */
 PFONTINFO    *font;         /* Zeiger auf Fontinfo, s.o.                 */
 unsigned int  fontflags;    /* erlaubte Fontarten                        */
 const char   *poptext;      /* Text vor dem Popup (nur Calvino) oder 0L  */
 int           num_entries;  /* Anzahl der Eintraege (0..n)               */
 int           sel_entry;    /* Selektierter Eintrag (0..n-1)             */
 xFSL_PENTRY  *popup;        /* Zeiger auf ein Popup oder 0L              */
 char         *helpinfo;     /* Rueckgabe: Zeiger auf Hilfedatei & -seite */
} xFSL_PAR;



/******** Definition der Schnittstellen-Funktionen ***********************/
/*
 *  xFSL_INPUT xfsl_input    - vereinfachter Aufruf
 *  xFSL_INIT xfsl_init      - Init-Aufruf : Dialog darstellen
 *  xFSL_EVENT xfsl_event    - Event-Aufruf: Hauptschleife
 *  xFSL_EXIT xfsl_exit      - Exit-Aufruf : Dialog abmelden
 *
 */

typedef int cdecl (*xFSL_INPUT)
(
 int           vdihandle,    /* Handle einer geoeffneten VDI-Workstation */
 unsigned int  fontflags,    /* Flags, welche Fonts angeboten werden     */
 const char   *headline,     /* Ueberschrift oder 0L (Default-Text)      */
 int          *id,           /* Rueckgabe: ID des gewaehlten Fonts       */
 int          *size          /* Rueckgabe: Groesse des gewaehlten Fonts  */
);

typedef int cdecl (*xFSL_INIT)
(
 int           vdihandle,    /* Handle einer geoeffneten VDI-Workstation */
 xFSL_PAR     *xpar          /* Struktur mit weiteren Eingabeparametern  */
);

typedef int cdecl (*xFSL_EVENT)
(
 int           xfsl_handle,  /* Handle von xfsl_init()                   */
 EVENT        *event         /* Pure-C-Event-Struktur                    */
);

typedef void cdecl (*xFSL_EXIT)
(
 int           xfsl_handle   /* Handle von xfsl_init()                   */
);

typedef long cdecl (*xFSL_INFO)
(
 void                        /* keine Parameter                          */
);


/******** xFSL-Struktur **************************************************/

/*  Der Cookie 'xFSL' zeigt auf die folgende Struktur
 */

typedef struct
{
 unsigned long xfsl;         /* Magic 'xFSL'                             */
 unsigned int  revision;     /* Revisionsnummer der Schnittstelle        */
 unsigned long product;      /* Kennung des Fontselektors, z.B. 'CLVN'   */
 unsigned int  version;      /* Version des Fontselektors als BCD        */
 xFSL_INPUT    xfsl_input;   /* einfacher Aufruf                         */
 xFSL_INIT     xfsl_init;    /* Init-Aufruf                              */
 xFSL_EVENT    xfsl_event;   /* Event-Aufruf                             */
 xFSL_EXIT     xfsl_exit;    /* Exit-Aufruf                              */
 xFSL_INFO     xfsl_info;    /* Info-Aufruf (Features abfragen)          */
} xFSL;


/******** Flags **********************************************************/

/*  Fontflags
 */

#define FF_SYSTEM       0x0001 /* Systemfont (zusaetzlich) anzeigen      */
#define FF_MONOSPACED   0x0002 /* monospaced Fonts anzeigen              */
#define FF_PROPORTIONAL 0x0004 /* prop. Fonts anzeigen                   */
#define FF_BITMAP       0x0008 /* alle Bitmapfonts anzeigen              */
#define FF_SPD          0x0010 /* Speedofonts                            */
#define FF_TTF          0x0020 /* TrueType-Fonts                         */
#define FF_PFB          0x0040 /* Type-1-Fonts                           */
#define FF_CFN          0x0080 /* Calamus-Fonts (nicht implementiert!)   */
#define FF_VECTOR      (FF_SPD|FF_TTF|FF_PFB|FF_CFN) /* Vektorfonts anz. */
#define FF_ALL         (FF_MONOSPACED|FF_PROPORTIONAL|FF_VECTOR|FF_BITMAP)
#define FF_CHANGED      0x8000 /* Aenderung erfolgt (im Popup)           */

#define FF_VEKTOR       FF_VECTOR
#define FF_MONO         FF_MONOSPACED
#define FF_PROP         FF_PROPORTIONAL

/* Kontroll-Flags (werden nicht alle von allen Selektoren untersttzt)   */
#define CC_WINDOW     0x0001 /* Fontselektor als Fenster                 */
#define CC_APPMODAL   0x0002 /* Fontselektor ist applikations-modal      */
#define CC_FIX31      0x0004 /* alle Groessenangaben in 1/65536 Point    */
#define CC_FAKESTYLE  0x0008 /* Schnitte simulieren (nur f. Bitmapfonts) */
#define CC_CLOSER     0x0010 /* Fenster mit Closer, kein OK-Button       */
#define CC_NOSIZE     0x0100 /* Groesse nicht aendern                    */
#define CC_NOCOLOR    0x0200 /* Farbe nicht aendern                      */
#define CC_NOATTR     0x0400 /* Attribute nicht aendern                  */
#define CC_NOWIDTH    0x0800 /* Breite nicht aendern                     */
#define CC_NOKERN     0x1000 /* Kerning nicht aendern                    */
#define CC_NOSKEW     0x2000 /* Skewing nicht aendern                    */
#define CC_NOALIGN    0x4000 /* Ausrichtung nicht aendern                */
#define CC_NOROTATION 0x8000 /* Textrotation nicht aendern               */
#define CC_DFLTSIZE  0x10000 /* Schriftgroesse "Default"                 */
#define CC_INVSTYLE  0x20000 /* Attribut "Invers"                        */

/* horizontale Textausrichtung (wie bei vst_alignment)                   */
#define THA_LEFT          0  /* linksbuendig                             */
#define THA_CENTER        1  /* zentriert                                */
#define THA_RIGHT         2  /* rechtsbuendig                            */

/* vertikale Textausrichtung (_nicht_ wie bei vst_alignment!)            */
#define TVA_BOTTOM        0  /* an der Text-Unterkante                   */
#define TVA_CENTER        1  /* vertikal zentriert                       */
#define TVA_TOP           2  /* an der Text-Oberkante                    */

/* Gruppen von erwnschten Zeichen im Font ('validtype' in PFONTINFO)    */
#define V_CHAR_IND       -1  /* "egal"                                   */
#define V_CHAR_ASC       -2  /* alle druckbaren ASCII-Zeichen (32-126)   */
#define V_CHAR_PRT       -3  /* alle druckbaren Zeichen (32-255)         */
#define V_CHAR_ALL       -4  /* wirklich alle Zeichen (0-255)            */

/* Mapping (ebenfalls fr 'validtype' in PFONTINFO)                      */
#define MAP_DIRECT        0  /* "direktes" Mapping (alle Zeichen)        */
#define MAP_ASCII         1  /* ASCII-Mapping, Bereich 0..255 (Default)  */

/* Fonttypen (erweitertes vqt_name ab SpeedoGDOS 5.0c/NVDI 3)            */
#define UNKNOWN_FONT 0x0000  /* Fonttyp unbekannt                        */
#define BITMAP_FONT  0x0001  /* Bitmapfont                               */
#define SPEEDO_FONT  0x0002  /* Speedofont                               */
#define TT_FONT      0x0004  /* TrueType-Font                            */
#define PFB_FONT     0x0008  /* Type-1-Font (Postscript)                 */
#define CFN_FONT     0x0010  /* Calamus-Font (nicht implementiert!)      */
#define ANY_FONT     0x00FF  /* als Maske (Hibyte ausmaskieren)          */


/*  Featureflags fr xfsl_info
 */
#define XF_SIZE      0x0001  /* Groessenaenderung moeglich               */
#define XF_COLOR     0x0002  /* Farbaenderung moeglich                   */
#define XF_ATTR      0x0004  /* Attributaenderung moeglich               */
#define XF_WIDTH     0x0008  /* Breitenaenderung moeglich                */
#define XF_KERN      0x0010  /* Kerningaenderung moeglich                */
#define XF_SKEW      0x0020  /* Neigungsaenderung moeglich               */
#define XF_ALIGN     0x0040  /* Aenderung der Ausrichtung moeglich       */
#define XF_ROTATION  0x0080  /* Textrotation moeglich                    */
#define XF_FIX31     0x0100  /* fix31-Unterstuetzung                     */
#define XF_POPUP     0x0200  /* Popup-Unterstuetzung                     */
#define XF_DRAGDROP  0x0400  /* Drag&Drop-Unterstuetzung                 */
#define XF_MAPPING   0x0800  /* beherrscht Mapping                       */


/*  Returncodes der xfsl_xxx-Aufrufe
 *  (aufw„rtskompatibel zu den UFSL-Rueckgabewerten [markiert mit 'U'])
 */

#define xFS_PARERROR     -9  /* Parameterfehler, z.B. Aufruf nach Rev. 3 */
#define xFS_LOADERROR    -8  /* Fehler beim Nachladen des Overlays       */
#define xFS_RES_ERROR    -7  /* Aufloesung kleiner als 640*400 Punkte    */
#define xFS_NO_HANDLE    -6  /* Kein Handle frei                         */
#define xFS_NO_WINDOW    -5  /* Kein Fenster frei                        */
#define xFS_NO_FONTS     -4  /* Keine Fonts geladen                    U */
#define xFS_NO_FONTSIZE  -3  /* Fontgroesse nicht identifizierbar      U */
#define xFS_ACTIVE       -2  /* Fontselektor ist bereits aktiv         U */
#define xFS_ERROR        -1  /* allgemeiner Fehler (Speichermangel)    U */
#define xFS_STOP          0  /*  gewaehlt                     U */
#define xFS_OK            1  /*  gewaehlt                          U */
#define xFS_HELP          2  /* Hilfe-Button angewaehlt                  */
#define xFS_EVENT         3  /* AES-Event aufgetreten                    */
#define xFS_POPUP         4  /* das User-Popup wurde angewaehlt          */


/*  Schriftbreiten-Informationsstruktur,
 *  wird nur fr das Font-Protokoll (Nachricht XFONT_CHANGED) benoetigt
 */

typedef struct
{
  unsigned int pair  : 1;    /* Pair-Kerning (0=nein, 1=ja)              */
  unsigned int track : 2;    /* Tr.-K. (0=ohne,1=norm.,2=eng,3=sehr eng) */
  unsigned int width : 13;   /* Schriftbreite in pt (0..8191)            */
} FW_INFO;

#endif

xfsl.c

/*  @(#)minimal.c, Dirk Haun, Juni 1995
 *
 *  Dieser Quelltext zeigt einen minimalen xFSL-Aufruf. Wie man sehen kann,
 *  genuegt es, die xFSL_PAR- und PFONTINFO-Struktur mit Nullen zu fuellen,
 *  die Groessen der beiden Strukturen (und evtl. noch die Fontfarbe)
 *  einzutragen.
 *
 *  Ein Fontselektor-Aufruf in dieser Form ist i.A. nicht sehr sinnvoll, da
 *  man ja meist nur bestimmte Fonts zur Auswahl stellen will. Dieser Quell-
 *  text ist auch nur zur Demonstration und als Einladung zum Herumspielen
 *  mit den vielen Parametern gedacht.
 *
 *  Insbesondere soll aber gezeigt werden, daž ein xFSL-Aufruf gar nicht so
 *  kompliziert ist, wie es die vielen Parameter vermuten lassen. Was man
 *  nicht benoetigt (oder versteht), kann man einfach weglassen bzw. auf Null
 *  setzen.
 *
 */

#include 
#include 
#include 
#include 
#include 
#include 

extern int get_cookie(long cookie,long *value);

static void xfsl_error(int err)
{
 char alert[256], z[8];

 strcpy(alert,"[3][Fontselektor meldet:|");
 switch(err)
 {
  case xFS_ERROR:       strcat(alert,"Nicht genug Speicher");
                        break;
  case xFS_ACTIVE:      strcat(alert,"Mehrfachaufruf nicht m”glich");
                        break;
  case xFS_NO_FONTSIZE: strcat(alert,"Fontgroesse konnte nicht|identifiziert werden");
                        break;
  case xFS_NO_FONTS:    strcat(alert,"Anzahl Fonts muž|groesser Null sein");
                        break;
  case xFS_NO_WINDOW:   strcat(alert,"Konnte kein Fenster oeffnen");
                        break;
  case xFS_NO_HANDLE:   strcat(alert,"Kein Handle mehr frei");
                        break;
  case xFS_RES_ERROR:   strcat(alert,"Aufloesung zu klein|(mind. 640x400)");
                        break;
  case xFS_LOADERROR:   strcat(alert,"Fehler beim Nachladen|des Overlays");
                        break;
  case xFS_PARERROR:    strcat(alert,"Fehlerhafte Parameter!|Aufruf nach Revision 3?");
                        break;
  default:              itoa(err,z,10);
                        strcat(alert,"Fehler ");
                        strcat(alert,z);
 }
 strcat(alert,"! ][ Abbruch ]");
 form_alert(1,alert);
}

int main(void)
{
 int xhandle, xret;
 xFSL *xfsl;      /* Zeiger auf xFSL-Struktur */
 xFSL_PAR xpar;   /* Parameter-Struktur */
 PFONTINFO pfont; /* Fontinfo-Struktur */
 char msg[256];

 if(appl_init()>=0)
 {
  if(get_cookie('xFSL',(long*)&xfsl))
  {

   memset(&xpar,0,sizeof(xFSL_PAR));    /* Strukturen "ausnullen" */
   memset(&pfont,0,sizeof(PFONTINFO));

   xpar.font=&pfont;                    /* Zeiger auf PFONTINFO eintragen */
   xpar.par_size=(int)sizeof(xFSL_PAR); /* Groesen eintragen (wichtig!) */
   xpar.pfi_size=(int)sizeof(PFONTINFO);
   xpar.font->fontcol=BLACK;            /* Fontfarbe schwarz */

   xhandle=xfsl->xfsl_init(0,&xpar);    /* Init-Aufruf */
   if(xhandle>=0)
   {
    do
    {
     xret=xfsl->xfsl_event(xhandle,0L); /* Event-Aufruf */
     if(xret<0) break;                  /* Fehler aufgetreten */
    }
    while(xret!=xFS_STOP && xret!=xFS_OK);
    xfsl->xfsl_exit(xhandle);           /* Exit-Aufruf (nicht vergessen) */
    if(xret<0) xfsl_error(xret);
    else
    {
     if(xret==xFS_STOP) form_alert(1,"[1][\'Abbruch\' ausgewaehlt.][ OK ]");
     else if(xret==xFS_OK)
     {
      sprintf(msg,"[1][Ausgewaehlt wurde Font %d|in der Groese %d pt.][ OK ]",
                  xpar.font->fontid,xpar.font->fontsize.size);
      form_alert(1,msg);
     }
    }
   }
   else xfsl_error(xhandle);

  }
  else form_alert(1,"[2][Cookie \'xFSL\' nicht|gefunden!][ Abbruch ]");
  appl_exit();
 }
 return(0);
}

xfsl.pas

{**************************************
 *    einfaches xFSL-Testprogramm     *
 *  Pascal-Umsetzung von Thomas Much  *
 **************************************
 *   Softdesign Computer Software     *
 *   Thomas Much, Gerwigstraže 46,    *
 * 76131 Karlsruhe, (0721) 62 28 41   *
 *        Thomas Much @ KA2           *
 *     uk48@rz.uni-karlsruhe.de       *
 * much@rpkhp7.mach.uni-karlsruhe.de  *
 * http://www.uni-karlsruhe.de/~uk48/ *
 **************************************
 *  erstellt am:         20.05.1995   *
 *  letztes Update am:   21.06.1995   *
 **************************************}

{ Das urspruengliche C-Testprogramm (fix31) stammt von Dirk Haun.
  Teile des Pascal-Quelltextes stammen aus ObjectGEM bzw. Texel }

{$IFDEF DEBUG}
	{$B+,D+,G-,I-,L+,P-,Q+,R+,S+,T-,V-,X+,Z-}
{$ELSE}
	{$B+,D-,G-,I-,L-,P-,Q-,R-,S-,T-,V-,X+,Z-}
{$ENDIF}

program Call_xFSL;

uses

	Tos,Gem;

label

	_ende,_applexit;

const

	_p_cookies      =   $5a0;

	FF_SYSTEM       =  $0001;
	FF_MONOSPACED   =  $0002;
	FF_PROPORTIONAL =  $0004;
	FF_BITMAP       =  $0008;
	FF_SPD          =  $0010;
	FF_TTF          =  $0020;
	FF_PFB          =  $0040;
	FF_CFN          =  $0080;
	FF_VECTOR       =  FF_SPD or FF_TTF or FF_PFB or FF_CFN;
	FF_ALL          =  FF_MONOSPACED or FF_PROPORTIONAL or FF_VECTOR or FF_BITMAP;
	FF_CHANGED      =  $8000;
  FF_VEKTOR       =  FF_VECTOR;
  FF_MONO         =  FF_MONOSPACED;
  FF_PROP         =  FF_PROPORTIONAL;

	CC_WINDOW       =  $0001;
	CC_APPMODAL     =  $0002;
	CC_FIX31        =  $0004;
	CC_FAKESTYLE    =  $0008;
	CC_CLOSER       =  $0010;
	CC_NOSIZE       =  $0100;
	CC_NOCOLOR      =  $0200;
	CC_NOATTR       =  $0400;
	CC_NOWIDTH      =  $0800;
	CC_NOKERN       =  $1000;
	CC_NOSKEW       =  $2000;
	CC_DFLTSIZE     = $10000;
	CC_INVSTYLE     = $20000;

	XF_SIZE         =  $0001;
	XF_COLOR        =  $0002;
	XF_ATTR         =  $0004;
	XF_WIDTH        =  $0008;
	XF_KERN         =  $0010;
	XF_SKEW         =  $0020;
	XF_FIX31        =  $0100;
	XF_POPUP        =  $0200;
	XF_DRAGDROP     =  $0400;

	xFS_PARERROR    =     -9;
	xFS_LOADERROR   =     -8;
	xFS_RES_ERROR   =     -7;
	xFS_NO_HANDLE   =     -6;
	xFS_NO_WINDOW   =     -5;
	xFS_NO_FONTS    =     -4;
	xFS_NO_FONTSIZE =     -3;
	xFS_ACTIVE      =     -2;
	xFS_ERROR       =     -1;
	xFS_STOP        =      0;
	xFS_OK          =      1;
	xFS_HELP        =      2;
	xFS_EVENT       =      3;
	xFS_POPUP       =      4;

	THA_LEFT        =      0;
	THA_CENTER      =      1;
	THA_RIGHT       =      2;

	TVA_BOTTOM      =      0;
	TVA_CENTER      =      1;
	TVA_TOP         =      2;

	V_CHAR_IND      =     -1;
	V_CHAR_ASC      =     -2;
	V_CHAR_PRT      =     -3;
	V_CHAR_ALL      =     -4;

	MAP_DIRECT      =      0;
	MAP_ASCII       =      1;

type

	PLongint = ^longint;

	PCookieID = ^TCookieID;
	TCookieID = array [0..3] of char;

	PCookie = ^TCookie;
	TCookie = record
		ID:  TCookieID;
		Val: longint
	end;

	UFSLPtr = ^UFSL;
	UFSL    = record
		id           : longint;
		version      : word;
		dialtyp      : integer;
		font_selinit : function(d1,d2: pointer; d3,d4,d5: longint): integer;
		font_selinput: function(d1,d2: pointer; d3,d4,d5: longint; vdihandle,fanz: integer; text: PChar; ftype: integer; var fretid,fretsize: integer): integer;
		helpbutton,
		helpfunc     : longint
	end;

	FSIZE = record
		case boolean of
		false: (size  : integer);
		true:  (size31: fix31)
	end;

	FONTINFOPtr = ^FONTINFO;
	FONTINFO    = record
		fontid,
		fonttype  : integer;
		fontname  : PChar;
		fontsize,
		fontwidth : FSIZE;
		trackkern,
		pairkern  : byte;
		fontattr,
		fontskew,
		fontcol,
		backcol,
		halign,
		valign,
		rotation,
		validtype : integer;
		validchars: PChar
	end;

	xFSL_PARPtr = ^xFSL_PAR;
	xF