|
Hauptseite - Welches System? - Hardware - Software - Textverarbeitung - |
Internet MausNet Programmieren Verweise Über |
Beispiele zu Algorithmen - Beispiele zur Betriebssystemprogrammierung - Beispiele zu diversen Protokollen - Diverse andere Beispiele
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;
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.
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
'
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
/* 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
|
English version not yet available. |