Atarium: Abfrage des System-Fonts

Besser spät als nie! Manchmal dauert es eben etwas länger. Im März-Heft hatte ich das Listing für eine Routine versprochen, die möglichst flexibel die Nummer der AES-Systemzeichensätze (normale Schrift und Icon-Schrift) und deren Größe erfragt. Ich nutze die ‘Sommerflaute’, um dieses Versäumnis nun nachzuholen (siehe Listing).

Es werden nur zwei Fälle unterschieden. Bei AES-Versionen, die appl_getinfo() unterstützen, wird einfach das AES nach der Font-Information gefragt. Dies klappt beispielswei se beim MultiTOS-AES sowie bei MagiC 3.x (MagiC ist ärgerlicherweise noch immer nicht zu AES 4.0 kompatibel, unterstützt aber immerhin appl_getinfo()).

In allen anderen Fällen wird ein kleiner Trick benutzt: es wird kurz ein kleiner Dummy-Dialog gezeichnet, um das AES dazu zu zwingen, den ‘richtigen’ Zeichensatz einzustellen. Anschließend werden die Font-Informationen für die vom AES benutzte VDI-Workstation abgefragt. Das ist zugegebenermaßen weder sauber noch elegant, doch dafür wird diese Methode ja nur in ‘alten’ Systemumgebungen benutzt. Autoren von Autoordner-Programmen zur Installation alternativer System zeichensätze brauchen nur appl_getinfo() einzubauen, und schon klappt auch hier die Größenabfrage korrekt.

Soviel für diesen Monat!


/* sysfonts.c (c)1995 by MAXON-Computer Julian F. Reschke, 23. Juli 1995 IDs und Größen der Systemzeichensätze erfragen */ #include <stdio.h> #include <aes.h> #include <vdi.h> static int load_font (int vdihandle, int fontid) { int loaded = 0; if (fontid != vst_font (vdihandle, fontid) && vq_gdos ()) { vst_load_fonts (vdihandle, 0); loaded = 1; } return loaded; void FontAESInfo (int vdihandle, int *pfontsloaded, int *pnormid, int *pnormheight, int *piconid, int *piconheight) { vst_load_fonts (vdihandle, 0); loaded = 1; static int done = 0; static int normid, normheight; static int iconid, iconheight; int fontsloaded =0; if (!done) { int aeshandle, cellwidth, cellheight; int dummy; wind_update (DEG_UPDATE); aeshandle = graf_handle (&cellwidth, &cellheight, &dummy, &dummy); if (_GemParBlk.global[0] >= 0x0400 || 0 == appl_find ("?AGI\0\0\0\0")) { /* zunächst versuchen wir, die Fontids beim AES zu erfragen */ appl_getinfo (0, &normheight, &tnormid, &dummy, &dummy); appl_getinfo (1, &conheight, &iconid, &dummy, &dummy); } else { /* Hier fragen wir den aktuellen Font der AES-Workstation ab. Dies ist ein Hack, aber es funktioniert mit den unterschiedlichen Auto-Ordner-Tools und ist eben nur bis AES 3.99 nötig. Außerdem gehen wir davon aus, daß für beide Textgrößen dieselbe Schrift verwendet wird */ static OBJECT dum_ob = {0, -1, -1, G_BOXCHAR, LASTOB, 0, 0X20001100L, 0, 0, 8, 16}; int attrib[10]; objc_draw (&dum_ob, 0, 1, 0, 0, 1, 1); vqt_attributes (aeshandle, attrib); iconid = normid = attrib[0]; normheight = attrib[7]; iconheight = 4; } /* Nun haben wir für beide Fonts die Id und die Pixelgröße (Parameter für vst_height). Nun sorgen wir dafür, daß beide Fonts auch wirklich auf der aktuellen virtuellen Workstation geladen (wir gehen davon, daß sie generell verfügbar sind. hätte sie uns das AES ja nicht melden dürfen). */ fontsloaded |= load_font (vdihandle, normid); fontsloaded |= load_font (vdihandle, iconid); /* Systemfont in Standardgröße einstellen */ vst_font (vdihandle, normid); vst_height (vdihandle, normheight, &dummy, &dummy, &dummy, &dummy); wind_update (END_UPDATE); done = 1; } /* Rückgabewerte */ if (pnormid) *pnormid = normid; if (pnormheight) *pnormheight = normheight; if (piconid) *piconid = iconid; if (piconheight) *piconheight = iconheight; if (pfontsloaded) *pfontsloaded = fontsloaded; }


Julian F. Reschke


Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]