Atari Logo
Programmieren

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

Beispiele zu Algorithmen - Beispiele zur Betriebssystemprogrammierung - Beispiele zu diversen Protokollen - Diverse andere Beispiele


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;
	xFSL_PAR    = record
		par_size,
		pfi_size   : integer;
		control    : longint;
		headline,
		example,
		helptext   : PChar;
		font       : FONTINFOPtr;
		fontflags  : word;
		poptext    : PChar;
		num_entries,
		sel_entry  : integer;
		popup      : pointer;
		helpinfo   : PChar
	end;

	xFSLPtr = ^xFSL;
	xFSL    = record
		id        : TCookieID;
		revision  : word;
		product   : TCookieID;
		version   : word;
		xfsl_input: function(d1,d2: pointer; d3,d4,d5: longint; vdihandle: integer; fontflags: word; headline: PChar; var fid,fsize: integer): integer;
		xfsl_init : function(d1,d2: pointer; d3,d4,d5: longint; vdihandle: integer; xpar: xFSL_PARPtr): integer;
		xfsl_event: function(d1,d2: pointer; d3,d4,d5: longint; xfsl_handle: integer; event: EVENTPtr): integer;
		xfsl_exit : procedure(d1,d2: pointer; d3,d4,d5: longint; xfsl_handle: integer);
		xfsl_info : function(d1,d2: pointer; d3,d4,d5: longint): longint;
	end;

var

	callufsl : UFSLPtr;
	callxfsl : xFSLPtr;
	fntinf   : FONTINFO;
	gl_apid,
	fid,
	fsiz,
	xhandle,
	vdiHandle,
	dummy,i,
	addFonts,
	ret      : integer;
	titel,
	example  : string;
	xpar     : xFSL_PAR;
	ev       : EVENT;
	fontname : array [0..39] of char;
	workIn   : workin_ARRAY;
	workOut  : workout_ARRAY;


function getjar: longint;

	begin
		getjar:=PLongint(_p_cookies)^
	end;


function clearufsl: longint;

	begin
		callufsl^.dialtyp:=0;
		callufsl^.helpbutton:=0;
		callufsl^.helpfunc:=0;
		clearufsl:=0
	end;


function ltoa(l: longint): string;
	var s: string;

	begin
		str(l,s);
		ltoa:=s
	end;


function GetCookie(cookie: TCookieID; var value: longint): boolean;
  var cookiejar: PCookie;

  begin
  	GetCookie:=false;
    cookiejar:=PCookie(supexec(getjar));
    if cookiejar<>nil then
			while PLongint(cookiejar)^<>0 do
				with cookiejar^ do
					if ID=cookie then
						begin
							value:=Val;
							GetCookie:=true;
							exit
						end
					else
						inc(longint(cookiejar),8)
  end;


procedure Error(e: integer);

	begin
		case e of
			xFS_LOADERROR:
				form_alert(1,'[2][Fehler beim Nachladen|von XFSL.OVL!][Abbruch]');
			xFS_RES_ERROR:
				form_alert(1,'[2][Aufloesung zu gering!][Abbruch]');
			xFS_NO_HANDLE:
				form_alert(1,'[2][Kein Handle frei!][Abbruch]');
			xFS_NO_WINDOW:
				form_alert(1,'[2][Kein Fenster frei!][Abbruch]');
			xFS_NO_FONTS:
				form_alert(1,'[2][Keine Fonts geladen!][Abbruch]');
			xFS_NO_FONTSIZE:
				form_alert(1,'[2][Fontgroesse konnte nicht|identifiziert werden!][Abbruch]');
			xFS_ACTIVE:
				form_alert(1,'[2][Fontselektor ist bereits aktiv!][Abbruch]');
			xFS_ERROR:
				form_alert(1,'[2][Speichermangel!][Abbruch]')
		else
			if e<0 then form_error(-31-e)
		end
	end;


procedure FontChanged(ID,Size,Color,Effects,Skew: integer);

	begin
		form_alert(1,'[0][ID='+ltoa(ID)+', Size='+ltoa(Size)+',|Color='+ltoa(Color)+', Effects='+ltoa(Effects)+',|Skew='+ltoa(Skew)+'][   OK   ]')
	end;


begin
	{ ACHTUNG: Es finden _keine_ AES/VDI-Fehlerberprfungen statt!!! }
	gl_apid:=appl_init;
	vdiHandle:=graf_handle(dummy,dummy,dummy,dummy);
	for i:=0 to 9 do workIn[i]:=1;
	workIn[10]:=2;
	v_opnvwk(workIn,vdiHandle,workOut);
	if vdiHandle<=0 then goto _applexit;
	addFonts:=vst_load_fonts(vdiHandle,0);
	if GetCookie('xFSL',longint(callxfsl)) then
		begin
			if callxfsl=nil then goto _ende;
			titel:='W„hlen Sie einen Font aus!'#0;
			with callxfsl^ do
				begin
					if id='xFSL' then
						if revision>=4 then
							begin
								fillchar(xpar,sizeof(xFSL_PAR),0);
								fillchar(fntinf,sizeof(FONTINFO),0);
								xpar.par_size:=sizeof(xFSL_PAR);
								xpar.pfi_size:=sizeof(FONTINFO);
								xpar.control:=CC_WINDOW or CC_FAKESTYLE;
								xpar.headline:=@titel[1];
								xpar.fontflags:=FF_ALL;
								example:='The quick brown fox jumps over the lazy dog.'#0;
								xpar.example:=@example[1];
								fontname[0]:=#0;
								fntinf.fontname:=fontname;
								fntinf.fontcol:=Black;
								xpar.font:=@fntinf;
						    xhandle:=xfsl_init(nil,nil,0,0,0,vdiHandle,@xpar);
						    if xhandle=xFS_NO_WINDOW then
						    	begin
						    		xpar.control:=xpar.control and not(CC_WINDOW);
								    xhandle:=xfsl_init(nil,nil,0,0,0,vdiHandle,@xpar)
						    	end;
						    if xhandle>=0 then
						    	begin
						    		repeat
											ev.ev_mflags:=0;
											ret:=xfsl_event(nil,nil,0,0,0,xhandle,@ev)
										until (ret=xFS_OK) or (ret=xFS_STOP);
										xfsl_exit(nil,nil,0,0,0,xhandle);
										if ret=xFS_OK then
											with xpar.font^ do FontChanged(fontid,fontsize.size,fontcol,fontattr,fontskew)
										else
											Error(ret)
									end
								else
									if xfsl_input(nil,nil,0,0,0,vdiHandle,FF_ALL,@titel[1],fid,fsiz)=1 then FontChanged(fid,fsiz,-1,-1,0)
							end
				end
		end
	else
		if GetCookie('UFSL',longint(callufsl)) then
			begin
				if callufsl=nil then goto _ende;
				supexec(clearufsl);
				with callufsl^ do
					begin
						font_selinit(nil,nil,0,0,0);
						if font_selinput(nil,nil,0,0,0,vdiHandle,workOut[10]+addFonts,nil,0,fid,fsiz)=1 then FontChanged(fid,fsiz,-1,-1,0)
					end
			end
		else
			form_alert(1,'[2][Weder xFSL- noch UFSL-Cookie vorhanden. ][ Abbruch ]');
	_ende:
	vst_unload_fonts(vdiHandle,0);
  v_clsvwk(vdiHandle);
	_applexit:
	appl_exit
end.

xfsl.lst

DEFINT "a-z"
'
GOSUB xfsl_const
'
IF FN xfsl_aufruf=0
  ALERT 3,"Aufruf hat nicht geklappt!",1,"Abbruch",ok
ENDIF
'
'
' ***************************************************************************
'
'                    Demoaufruf fr xFSL-Fontselektoren
'
' (c): Rosin Datentechnik
'      Reiner Rosin
'      Peter-Spahn-Str. 4
'      65375 Oestrich-Winkel
'      Tel. 06723 4978  Fax 7190
'      email: Reiner Rosin @ WI2  /  reiner_rosin@wi2.maus.de
'
'      V2.0 vom 19.6.1995
'
' ***************************************************************************
'
'
'
> PROCEDURE xfsl_const
  '
  ' ***************************************************************************
  '   Symbolische Konstanten
  ' ***************************************************************************
  '
  '
  ' ++SYM
  '
  ' Featureflags des Fontselektors:
  xf_size=1
  xf_color=2
  xf_attr=4
  xf_width=8
  xf_kern=16
  xf_skew=20
  xf_fix31=256
  xf_popup=512
  xf_dragdrop=1024
  '
  ' Offsets fr die Struktur xFSL_PAR:
  off_par_size=0
  off_pfi_size=2
  off_control=4
  off_headline=8
  off_example=12
  off_helptext=16
  off_font=20
  off_fontflags=24
  off_poptext=26
  off_num_entries=30
  off_sel_entry=32
  off_popup=34
  off_helpinfo=38
  '
  ' Kontrollflags
  cc_window=1
  cc_appmodal=2
  cc_fix31=4
  cc_fakestyle=8
  cc_closer=16
  cc_nosize=256
  cc_nocolor=512
  cc_noattr=1024
  cc_nowidth=2048
  cc_nokern=4096
  cc_noskew=8192
  cc_dfltsize=&H10000
  cc_invstyle=&H20000
  '
  ' Offsets fr die Struktur PFONTINFO
  off_fontid=0
  off_fonttype=2
  off_fontname=4
  off_fontsize=8
  off_fontwidth=12
  off_trackkern=16
  off_pairkern=17
  off_fontattr=18
  off_fontskew=20
  off_fontcol=22
  off_backcol=24
  off_halign=26
  off_valign=28
  off_rotation=30
  off_validtype=32
  off_validchars=34
  '
  ' Offset fr die Struktur xFSL_PENTRY
  off_pentry_entry=0
  off_pentry_fontinfo=4
  off_pentry_fontflags=8
  off_pentry_funcflags=10
  '
  ' Fontflags:
  ff_system=1
  ff_monospaced=2
  ff_proportional=4
  ff_bitmap=8
  ff_spd=16
  ff_ttf=32
  ff_pfb=64
  ff_cfn=128
  ff_vektor=240
  ff_all=254
  ff_changed=&H8000
  '
  ' Fehlercodes:
  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
  '
  '
  ' --SYM
RETURN
> FUNCTION xfsl_aufruf
LOCAL data,event,texte,popup,ml,flag,xfsl,back
LOCAL z,z$,i,control,xhandle,pfontinfo
'
'
' ***************************************************************************
'   INLINEs
' ***************************************************************************
'
' Speicher fuer die Struktur xpar (Typ: xFSL_PAR):
INLINE data,42
'
' Speicher fuer die Pure-C-Eventstruktur:
INLINE event,170
'
' Speicher fuer das Popup (6 Eintraege a 14 Bytes):
INLINE popup,84
'
' Speicher fuer diverse Texte waehrend des Aufrufs:
INLINE texte,240
'
' Speicher fuer 7 PFONTINFO-Strukturen a 40 Bytes (davon 38 belegt)
INLINE pf_infos,280
'
'
' ***************************************************************************
'   Einsprungpointer ermitteln
' ***************************************************************************
'
' Testen, ob XFSL-Selektor vorhanden ist
GOSUB test_cookie("xFSL",flag,xfsl)
IF flag=0
  ALERT 3,"Es ist kein xFSL-|Fontselektor installiert",1,"Abbruch",ok
  RETURN 0
ENDIF
'
'
' ***************************************************************************
'   šbergabestrukturen fllen
' ***************************************************************************
'
' Texte vorbesetzen
CHAR{texte}="Demoaufruf xFSL-Fontselektor" ! Fenstertitel (<30 Zeichen)
CHAR{texte+30}="Aufgerufen aus GFA-Basic"  ! Demotext (<50 Zeichen)
CHAR{texte+80}="Fonttypen:"                ! Popup (<15 Zeichen)
CHAR{texte+95}="HELP"                      ! Text im Hilfe-Button
CHAR{texte+100}="  monospaced"             ! Texte fuer 6 Popupeintr„ge
CHAR{texte+120}="  proportionale"          ! (max. 19 Zeichen)
CHAR{texte+140}="  Bitmapfonts"
CHAR{texte+160}="  Vektorfonts"
CHAR{texte+180}="----------------"
CHAR{texte+200}="  alle Fonts"
'
' Fontselektor konfigurieren:
control=cc_window OR cc_appmodal OR cc_nocolor OR cc_noattr OR cc_nowidth OR cc_nokern OR cc_noskew
'
' Struktur xpar auffllen:
CARD{data+off_par_size}=42                 ! par_size    Groesse der Struktur
CARD{data+off_pfi_size}=38                 ! pfi_size    Groesse der Struktur
{data+off_control}=control                 ! control     Kontrollflags
{data++off_headline}=texte                 ! headline    Ueberschrift
{data+off_example}=texte+30                ! example     Demotext
{data+off_helptext}=texte+95               ! helptext    Hilfetext
'
' PFONTINFO font:
pfontinfo=pf_infos                         ! Adresse der PFONTINFO-Struktur
CARD{pfontinfo+off_size}=0                 ! fontid      ID des Fonts
CARD{pfontinfo+off_fonttype}=0             ! fonttype    Typ des Fonts
{pfontinfo+off_fontname}=0                 ! fontname    Name des Fonts
{pfontinfo+off_fontsize}=0                 ! fontsize    Groesse des Fonts in pt oder fix31
{pfontinfo+off_fontwidth}=0                ! fontwidth   Breite in pt oder fix31
BYTE{pfontinfo+off_trackkern}=0            ! trackkern   Track-Kerning
BYTE{pfontinfo+off_pairkern}=0             ! pairkern    Paar-Kerning
CARD{pfontinfo+off_fontattr}=0             ! fontattr    Attribute
CARD{pfontinfo+off_fontskew}=0             ! fontskew    Neigung
CARD{pfontinfo+off_fontcol}=1              ! fontcol     Farbe Vordergrund
CARD{pfontinfo+off_backcol}=0              ! backcol     Farbe Hintergrund
CARD{pfontinfo+off_halign}=0               ! halign      hor. Textausrichtung
CARD{pfontinfo+off_valign}=0               ! valign      vert. Textausrichtung
CARD{pfontinfo+off_rotation}=0             ! rotation    Textrotation
CARD{pfontinfo+off_validtype}=0            ! validtype   Typ oder Mapping
{pfontinfo+off_validchars}=0               ! validchars  Mappingtabelle
'
{data+off_font}=pfontinfo                  ! font   Zeiger auf PFONTINFO
CARD{data+off_fontflags}=ff_all            ! fontflags   erlaubte Fonts
{data+off_poptext}=texte+80                ! poptext     Text vor dem Popup
CARD{data+off_num_entries}=6               ! num_entries Zahl der Popupeintr„ge
CARD{data+off_sel_entry}=0                 ! sel_entry   selektierter Eintrag
{data+off_popup}=popup                     ! popup       Popup
'
' Popups setzen:
GOSUB set_xfsl_popup(popup,pf_infos,0,texte+100,ff_monospaced,0,0)
GOSUB set_xfsl_popup(popup,pf_infos,1,texte+120,ff_proportional,0,0)
GOSUB set_xfsl_popup(popup,pf_infos,2,texte+140,ff_bitmap,0,0)
GOSUB set_xfsl_popup(popup,pf_infos,3,texte+160,ff_vektor,0,0)
GOSUB set_xfsl_popup(popup,pf_infos,4,texte+180,0,0,0)
GOSUB set_xfsl_popup(popup,pf_infos,5,texte+200,ff_all,0,0)
'                                                      ^ ^ Font-ID und Groesse
'                                               ^^^^^^  Fontflags
'                                      ^^^^^^^^^-------- Zeiger auf den Popuptext
'                                   ^------------------ Nummer des Eintrages (0..n-1)
'                          ^^^^^^^^ ------------------- Zeiger auf die PFONTINFOs
'                    ^^^^^----------------------------- Zeiger auf das Popup
'
'
' Eventstruktur vorbesetzen:
CARD{event}=&X100000  ! e_flags (nur Timerevents)
CARD{event+2}=0
CARD{event+4}=0
CARD{event+6}=0
{event+28}=&H2000000  ! Timerwert
'
'
' ***************************************************************************
'   Noch ein Check
' ***************************************************************************
'
ml={xfsl+28}    ! xfsl_info
back=C:ml()
'
' Auswerten:
IF back<0
  RETURN 0
ENDIF
IF (back AND xf_popup)=0
  ALERT 3,"Kein Popup m”glich!",1,"Schade",ok
ENDIF
'
'
' ***************************************************************************
'   Der eigentliche Aufruf
' ***************************************************************************
'
' Initialisieren, Handle holen
ml={xfsl+16}    ! xfsl_init
xhandle=WORD(C:ml(0,L:data))
'
' Handle bekommen?
IF xhandle<0
  ALERT 1,"Oeffnen des Fontselektors hat|nicht geklappt!",1,"Abbruch",ok
  RETURN 0
ENDIF
'
' ***************************************************************************
'   Die Messageschleife
' ***************************************************************************
'
DO
  '
  ' Event-Aufruf:
  ml={xfsl+20}  ! xfsl_event
  back=WORD(C:ml(xhandle,L:event))
  '
  ' Rckgabewert auswerten
  SELECT back
    '
    ' Hilfebutton gedrckt:
  CASE xfs_help
    ALERT 3,"Hilfebutton wurde angeklickt!",1,"Aha",ok
    '
    z={data+off_helpinfo}
    IF z=0 OR z=-1
      ALERT 3,"Es wurde aber kein Hypertext|angegeben!",1,"Echt?",ok
    ELSE
      z$=CHAR{z}
      ALERT 3,"Hypertext:|"+z$,1,"Super!",ok
    ENDIF
    '
    ' AES-Event
  CASE xfs_event
    ' Hier muss jetzt ein Sprung in die programmeigene Messageauswerte-
    ' routine hin. Der AES-Eventpuffer liegt ab  (ev_mwich)
    '
    ' Žnderungen am Popup:
  CASE 4
    ALERT 3,"Ein Popupeintrag hat|sich geaendert!",1,"OK",ok
    '
  ENDSELECT
  '
LOOP UNTIL back<2
'
'
' ***************************************************************************
'   Fontselektor wurde verlassen
' ***************************************************************************
'
'
' Exit-Aufruf
ml={xfsl+24}   ! xfsl_exit
~C:ml(xhandle)
'
' letzten Returnwert auswerten
IF back=xfs_stop
  ALERT 3,"Fontselektor wurde mit|'Abbruch' verlassen!",1,"OK",ok
  RETURN -1
  '
ELSE IF back=xfs_ok
  ALERT 3,"Fontselektor wurde mit|'OK' verlassen!",1,"Fein",ok
  '
  PRINT
  PRINT "Zuletzt gewaehltes Popup: ";CARD{data+off_sel_entry}
  '
  GOSUB font_info("Selektierter Font:",pfontinfo)
  '
  FOR i=0 TO 5
    IF CARD{popup+14*i+off_pentry_fontflags} AND ff_changed  ! Popup geaendert?
      GOSUB font_info("Popup Nr. "+STR$(i+1),{popup+14*i+off_pentry_fontinfo})
    ENDIF
  NEXT i
  '
  RETURN -1
  '
ELSE
  ALERT 3,"Returnwert des Fontselektors:|"+STR$(back),1,"Aha",ok
  RETURN 0
  '
ENDIF
'
ENDFUNC
> PROCEDURE set_xfsl_popup(popup,popup_pfinfos,index,text,fontflags,font,size)
'
LOCAL pt
'
' Unterprogramm: Einen Popupeintrag setzen
'
popup=popup+14*index
pt=popup_pfinfos+40*index+40
'
' Struktur xFSL_PENTRY auffllen:
{popup+off_pentry_entry}=text       ! Zeiger auf Popuptext
{popup+off_pentry_fontinfo}=pt
CARD{popup+off_pentry_fontflags}=fontflags  ! Font-Flags
{popup+off_pentry_funcflags}=0              !Func-Flags
'
' Struktur PFONTINFO innerhalb der Struktur xFSL_PENTRY auffuellen:
CARD{pt+off_fontid}=font            ! Font-ID
CARD{pt+off_fonttype}=0             ! Fonttyp
{pt+off_fontname}=0                 ! Fontname
CARD{pt+off_fontsize}=size          ! Fontgr”že
CARD{pt+off_fontwidth}=0            ! Fontweite
BYTE{pt+off_trackkern}=0            ! Track-Kerning
BYTE{pt+off_pairkern}=0             ! Paar-Kerning
CARD{pt+off_fontattr}=0             ! Fontattribute
CARD{pt+off_fontskew}=0             ! Neigung
CARD{pt+off_fontcol}=1              ! Farbe Vordergrund
CARD{pt+off_backcol}=0              ! Farbe Hintergrund
CARD{pt+off_halign}=0               ! hor. Textausrichtung
CARD{pt+off_valign}=0               ! vert. Textausrichtung
CARD{pt+off_rotation}=0             ! Textrotation
CARD{pt+off_validtype}=0            ! Typ oder Mapping
{pt+off_validchars}=0               ! Mappingtabelle
'
RETURN
> PROCEDURE font_info(text$,pt)
PRINT
PRINT text$
PRINT "     Font-ID:   ";CARD{pt+off_fontid}
PRINT "     Fonttyp:   ";CARD{pt+off_fonttype}
'
IF {pt+off_fontname}
  PRINT "     Fontname:  ";CHAR{pt+off_fontname}
ELSE
  PRINT "     Fontname:   keiner"
ENDIF
PRINT "     Gr”že:     ";CARD{pt+off_fontsize}
PRINT "     Weite:     ";CARD{pt+off_fontwidth}
PRINT "     Attribute: ";CARD{pt+off_fontattr}
PRINT "     Farbe:     ";CARD{pt+off_fontcol}
PRINT "     Neigung:   ";CARD{pt+off_fontskew}
ALERT 1,"Weiter...",1,"OK",ok
RETURN
'
> PROCEDURE test_cookie(kenn$,VAR flag,wert)
REM
REM
REM  Modul: test_cookie
REM
REM V1.0 vom 21.11.90
REM
REM Testet, ob der angegebene Cookie im Cookie-Jar installiert ist.
REM Rckgabe: flag =  0 - nicht installiert
REM      oder flag = -1 - installiert, wert = Parameter des Cookie
REM
LOCAL cookie,such_kennung,kennung
such_kennung=CVL(kenn$)
cookie=LPEEK(&H5A0)
IF cookie<>0
  REPEAT
    kennung=LPEEK(cookie)
    wert=LPEEK(cookie+4)
    ADD cookie,8
  UNTIL kennung=such_kennung OR kennung=0
  IF kennung=0
    flag=0
    wert=0
  ELSE
    flag=-1
  ENDIF
ELSE
  flag=0
  wert=0
ENDIF
RETURN
'

xfsl.4h

hex     
#define CC_WINDOW      0001  /* Fontselektor als Fenster */
#define CC_APPMODAL    0002  /* Fontselektor ist applikationsmodal */
#define CC_FIX31       0004  /* alle Groessenangaben in 1/65536 Punkt */
#define CC_FAKESTYLE   0008  /* Schnitte simulieren (nur Bitmapfonts) */
#define CC_CLOSER      0010  /* Fenster mit Closer, kein OK-Button */
#define CC_NOSIZE      0100  /* Groesse nicht aendern */
#define CC_NOCOLOR     0200  /* Farbe nicht aendern */
#define CC_NOATTR      0400  /* Attribute nicht aendern */
#define CC_NOWIDTH     0800  /* Breite nicht aendern */
#define CC_NOKERN      1000  /* Kerning nicht aendern */
#define CC_NOSKEW      2000  /* Skewing nicht aendern */
#define CC_NOALIGN     4000  /* Ausrichtung nicht aendern */
#define CC_NOROTATION  8000  /* Textrotation nicht aendern */
#define CC_DFLTSIZE   10000  /* Schriftgroesse "Default" */
#define CC_INVSTYLE   20000  /* Attribut "Invers" */

#define FF_SYSTEM        0001  /* Systemfont (zusaetzlich) anzeigen */
#define FF_MONOSPACED    0002  /* monospaced Fonts anzeigen */
#define FF_PROPORTIONAL  0004  /* proportionale Fonts anzeigen */
#define FF_BITMAP        0008  /* Bitmapfonts anzeigen */
#define FF_SPD           0010  /* Speedofonts anzeigen */
#define FF_TTF           0020  /* TrueType-Fonts anzeigen */
#define FF_PFB           0040  /* Type-1-Fonts anzeigen */
#define FF_CFN           0080  /* Calamusfonts anzeigen (n.i.) */ 
#define FF_VECTOR        00F0  /* alle Vektorfonts anzeigen */
#define FF_ALL           00FE  /* alle Fonts anzeigen */
#define FF_CHANGED       8000  /* Aenderung erfolgt (nur im Popup) */

decimal

struct
{	2 field fontid      /* ID des Fonts                  */
   2 field fonttype    /* Typ des Fonts                 */
   4 field *fontname   /* Name des Fonts                */
   4 field fontsize    /* Fontgroesse in pt oder fix31  */
   4 field fontwidth   /* Breite in pt oder fix31       */
   1 field trackkern   /* Track-Kerning                 */
   1 field pairkern    /* Paar-Kerning                  */
   2 field fontattr    /* Attribute                     */
   2 field fontskew    /* Neigung                       */
   2 field fontcol     /* Farbe                         */
   2 field backcol     /* Text-Hintergrundfarbe         */
   2 field halign      /* horizontale Textausrichtung   */
   2 field valign      /* vertikale Textausrichtung     */
   2 field rotation    /* Textrotation in 1/10 Grad     */
   2 field validtype   /* Typ (V_CHAR_...) oder Mapping */
   4 field *validchars /* benoetigte Zeichen oder 0L    */
} PFONTINFO

struct
{  2 field par_size    /* Groesse der xFSL_PAR-Struktur */
   2 field pfi_size    /* Groesse der PFONTINFO-Struktur*/
   4 field control     /* Kontrollflags                 */
   4 field *headline   /* Ueberschrift oder 0L          */
   4 field *example    /* Beispieltext oder 0L          */
   4 field *helptext   /* Text des Hilfe-Buttons od. 0L */
   4 field *font       /* Zeiger auf Fontinfo-Struktur  */
   2 field fontflags   /* erlaubte Fontarten            */
   4 field *poptext    /* Text vor dem Popup oder 0L    */
   2 field num_entries /* Anzahl der Eintr„ge (0..n)    */
   2 field sel_entry   /* Selektierter Eintrag (0..n-1) */
   4 field *popup      /* Zeiger auf ein Popup oder 0L  */
   4 field *helpinfo   /* Zeiger auf Hilfedatei/-seite  */
} xFSL_PAR

struct
{ 	4 field xfsl       /* Magic 'xFSL'              */
	2 field revision   /* Schnittstellen-Revision   */
	4 field product    /* Kennung des Fontselektors */
	2 field version    /* Version des Fontselektors */
	4 field xFSL_INPUT /* einfacher Aufruf          */
	4 field xFSL_INIT  /* Init-Aufruf               */
	4 field xFSL_EVENT /* Event-Aufruf              */
	4 field xFSL_EXIT  /* Exit-Aufruf               */
	4 field xFSL_INFO  /* Info-Aufruf               */
} xFSL
decimal

xfsl.4th

/*
	Fontauswahl ueber xFSL unter mForth
	1996 Rainer Saric
	Letzte Aenderung: 23.12.1996	
*/

system warning on
mforth
false constant APP immediate
APP #if system macro on automark on #endif

mforth bload bin\xfsl.bin >voc XFSL 
		 XFSL also definitions

include system\xfsl.h

variable: id size xhandle xret ;
xFSL_PAR  xpar
PFONTINFO pfont

: call_xfsl	( -- )
	sizeof xFSL_PAR  xpar par_size w!
	sizeof PFONTINFO xpar pfi_size w!
	pfont            xpar *font     !
	s" Fontselector aus mForth" xpar *headline !
	1 pfont fontcol w!
	v_handle w@ xpar xfsl_init dup xhandle ! w>l
	0> if	xhandle w@ xfsl_exit drop
	   endif ;
	
mforth XFSL also
	
: main	( -- )
	appl_init 0>=
	if		1 s" [0][mForth Test fr| XFSL-Schnitstelle][ OK ]"
			form_alert drop
			/* VDI-Workstation - ohne Test ob OK! */
			1 1 1 1 1 1 1 1 1 1 2 opnvwk contrl 12 + w@ v_handle w!
			xFSL? 	/* Installiert */
			if		v_handle w@ FF_ALL s" Fontselector aus mForth" 
					id size xfsl_input drop
					/* call_xfsl */
					1 s" [ | ... und Tschuess | ][ Ja ]" 
			else	1 s" [1][xFSL nicht vorhanden!][ Ohh ]"
			endif	form_alert drop 
			clsvwk
			appl_exit
	endif 
	APP #if 0 return [ system macro off ] mark #endif
;

APP #if
	system make xfsl.app bye
#endif

Best viewed with any browser English version not yet available.

Änderungen und Irrtümer vorbehalten. Letzte Änderung:
09 Oktober 2004.
Home - Mail an den Webmaster - Impressum