|
Hauptseite - Welches System? - Hardware - Software - Emulatoren - |
Internet MausNet Programmieren Verweise Über |
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, 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
/* @(#)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); }
{************************************** * 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