UFSL Universal Fontselector (c) 1991-1993 by Michael Th„nitz UFSL ist Freeware. Wo liegt eigentlich das Problem? Nun ganz einfach, die Einstellung eines anderen als des Systemfonts ist eigentlich recht trivial. vst_font() stellt den Font ein, vst_point() stellt die Gr”áe ein. Woher weiá man aber nun welche Fonts es gibt und in welchen Gr”áen sie vorliegen? Auch das ist recht einfach. Man l„dt die Fonts, klappert alle Fonts nach Ihren "echten" Gr”áen ab und stellt alles in einer Listbox dar. Tja, und da liegt das Problem. Ist die Abfage der Gr”áen schon ein klein wenig kompliziert, schmeiáen bei Listbox die meisten Gelegenheits- programmierer das Handtuch. Entsprechend bescheiden sind dann auch die Ergebnisse. Hier springt UFSL nun ein und bietet den gleichen einfach zu programmierenden Komfort wie bei der Fileselectbox. Einfach die Fontauswahlbox mit einigen einfach zu erfahrenen Parametern versorgen, ber den Cookie aufrufen und man erh„lt FontId und die Punktgr”áe zurck. Ein entsprechendes Beispiel liegt mit FONTTEST.C vor. Der Programmierer entscheidet, ob es sich um einen konventionellen Dialog mit Let 'em Fly Untersttzung oder um einen Fensterdialog handelt. UFSL darf jedem Programm ohne Rcksprache kostenlos beigelegt werden. Trotzdem interessiert es mich natrlich, wo UFSL berall beiliegt. UFSL nutzt die M”glichkeiten von "Let 'em Fly" laut Doku Version 1.17. UFSL stellt beliebig viele Fonts mit je max. 16 Gr”žen dar. *************************************************************************** Programmierschnittstelle: ------------------------- UFSL ist eine Fontauswahlbox fr den Autoordner. Sie bietet dem Programmierer eine einfache Programmierschnittstelle ber einen Cookie. Der Cookie lautet: 'UFSL'. Der Cookie liefert einen Zeiger auf folgende Struktur: typedef struct { unsigned long id; /* UFSL ID (UFSL) */ unsigned int version; /* Version (BCD-Format) */ int dialtyp; /* 0=Dialog, 1=Fenster */ /*****************************************************************/ /* nicht mehr untersttzt ab 0.97, aber noch da: */ int cdecl (*font_selinit)(void); int cdecl (*font_selinput)( int vdihandle, int dummy, int ftype, /* 1=nur monospaced Fonts, 0=alles */ char *text, /* eigener Text, max. 34 Zeichen */ int *fretid, /* eingestellte FontId */ int *fretsize /* eingestellte Fontgr”že */ ); OBJECT *helpbutton; /* Typ: BOXTEXT */ void cdecl (*helpfunc)(void); /* Benutzerdefinierte Helpfkt. */ /*****************************************************************/ /**** ab Version 0.91 ********************************************/ char *examplestr; /* Beispieltext fr Fontdarstellung */ /**** ab Version 0.96 ********************************************/ void cdecl (*msgfunc)(int event, int msgbuf[]);/* Redrawfunktion */ /**** ab Version 0.97 ********************************************/ int cdecl (*fontsel_exinput)( int vdihandle, int ftype, /* 1=nur monospaced Fonts, 0=alles */ char *text, /* eigener Text, max. 34 Zeichen */ int *fretid, /* eingestellte FontId */ int *fretsize /* eingestellte Fontgr”že */ ); } UFSL; Aufruf: ------- UFSL *ufsl; ufsl=(UFSL *)get_cookie('UFSL'); ufsl->helpfunc= my_helpfunc; /* Hilfefunktion oder NULL */ ufsl->msgfunc = my_msghandler; /* Redrawfunktion oder NULL, Dialtyp beachten */ ufsl->fontsel_input(vdihandle,0,0,"Bitte Font ausw„hlen",&id,&size); oder ufsl->fontsel_input(vdihandle,0,0,NULL,&id,&size); Returncodes: ------------ 1 : Alles OK, Werte gltig. 0 : Abbruch gew„hlt. -1 : Out of memory. -2 : Unzul„ssiger Mehrfachaufruf. -3 : Fontgr”že konnte nicht identifiziert werden. -4 : Anzahl Fonts muž gr”žer null sein. Sonderfunktionen: ----------------- void cdecl (*helpfunc)(void); /* Benutzerdefinierte Helpfkt. */ UFSL kann eine benutzerdefinierbare Hilfefunktion ber den ebenfalls optionalen Hilfebutton aufrufen. helpfunc() ben”tigt keine Parameter und liefert auch keinen Wert zurck. void cdecl (*msgfunc)(int event, int msgbuf[]);/* Redrawfunktion */ Bei Verwendung von UFSL als Fensterdialog ist es notwendig eine Redrawfunktion zur Verfgung zu stellen. Sie schickt die anfallenden Events an das aufrufende Programm zurck, damit nach Verschieben des Dialogs die Hintergrundfenster restauriert werden k”nnen. msgfunc() liefert als ersten Parameter das Ergebnis von evnt_multi() und als zweiten Parameter die MsgPipe. Ein Returncode wird nicht ben”tigt. Das Anwenderprogramm muá die n”tigen Routinen zur Fenster- behandlung zur Verfgung stellen. wind_update(..._UPDATE) wird von UFSL nicht gesetzt, obliegt also dem rufenden Anwenderprogramm. Prinzipbedingt(?) ist die Memoryprotection von MTOS auszuschalten. Grunds„tzlich gilt es zu berlegen, ob tats„chlich alle Events entsprechend beantwortet werden sollen. Ein WM_TOPPED, das andere eigene Fenster nach vorn bringt, sollte wohl nicht beantwortet werden, da UFSL naturgem„á nur applikationsmodal sein kann, da UFSL ja in einem eigenen form_do() sprich evnt_multi() kreist. *************************************************************************** Versionsbersicht: ------------------ Version 0.90 vom Mai 1993 (Dezember 1991) ----------------------------------------- Ich m”chte noch anmerken, das die Cookieinstallation noch recht drftig ist. Es wird einfach installiert, ohne zu fragen ob Platz ist. Das Profibuch bietet hierzu eine m.E. fehlerhafte Beschreibung. Es wird von einen Nullcookie und seines Wertes gesprochen. Das ist m.E. ein Syntaxerror. Wer also vernnftige Cookieroutinen in 'C' hat, m”chte mir doch bitte weiterhelfen. Dem Fensterdialog muá noch seine Unmodalit„t abgew”hnt werden. Version 0.91 vom Mai 1993 ------------------------- Die Cookiefrage ist gekl„rt durch Assemblerroutinen von Arnd Beissner. Alle benutzerdefinierten Variablen werden beim Verlassen zurckgesetzt. Fonteinstellung ber Editfeld mit Mausdoppelklick auf Beispieltext.(Nur Speedo). Version 0.92 vom Juni 1993 -------------------------- UFSL erkennt Aufl”sungswechsel und initialisiert sein Resourcefile neu. Version 0.93 vom Juli 1993 -------------------------- Bugfix. appl_init() entfernt. Unter MTOS gabs dabei einen Absturz. Version 0.94 - 0.95 vom August/September 1993 --------------------------------------------- Erweiterte Returncodes fr detailiertere Fehlermeldungen. Version 0.96 vom November/Dezember 1993 --------------------------------------- Returnwerte fr FontId und FontSize bleiben bei ABBRUCH unangetastet. Das gilt auch fr die Attribute des bergebenen VdiHandles, weil ein internes VdiHandle genutzt wird. ufsl->msgfunc(event, msgbuf) ruft fr die programmeigenen Fenster deren Redrawfunktion auf, damit beim Verschieben von UFSL der Hintergrund restauriert wird. "dummy font" wird ausgewertet. Version 0.97 vom Februar/M„rz 1994 ---------------------------------- Dank Mithilfe von Dirk Haun ein paar heftige Bugs behoben. Danke. DH>Der korrigierte UFSL l„uft sowohl auf meinem TT (mit Nova-Graphikkarte DH>und Speedo 4.20) als auch auf meinem ST (mit NVDI 2.12) ohne Probleme. Neue Schnittstelle "fontsel_exinput()". Der Helpbutton fhrt zu Problemen und wir in Zukunft nicht mehr untersttzt. UFSL *ufsl; ufsl=(UFSL *)get_cookie('UFSL'); als Fensterdialog: ufsl->dialtyp = WINDOW; ufsl->msgfunc = my_msghandler; /* Redrawfunktion, Dialtyp beachten */ oder als Dialog: ufsl->dialtyp = DIALOG; ufsl->fontsel_exinput(vdihandle,0,"Bitte Font ausw„hlen",&id,&size); oder ufsl->fontsel_exinput(vdihandle,0,NULL,&id,&size); *************************************************************************** Das Projekt UFSL wird von mir nicht weiter verfolgt, da ich keine Lust mehr dazu habe. Die Resonanz war auch nicht sonderlich. 30. April 1994 MfG Michael Th„nitz Email: MICHAEL THAENITZ @BI im Mausnetz