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
Aus: ST-Computer 09 / 1995, Seite 88

Links

Copyright-Bestimmungen: siehe Über diese Seite