Programmieren unter MiNT/MultiTOS, Teil 5

Kaum neigt sich unser Kurs dem Ende zu, schon bringt Atari eine neue Beta-Version von MultiTOS. In diesem Teil liefern wir Ihnen die restlichen AES-Funktionen noch. MultiTOS nähert sich seiner endgültigen Fassung.

Wer unter MultiTOS in Pure-C programmieren will, steht vor dem Problem, daß die neuen AES-Befehle in der »PCGEMLIB.LIB« noch nicht enthalten sind. Diesen Mangel beseitigt »NEWAES.LIB« auf der TOS-Diskette. Tragen Sie diese VOR »PCGEMLIB.LIB« in Ihre Projektdatei ein. Mit dem Einbinden von »NEWAES.H« stehen Ihnen dann die AES 4.0-Neuheiten zur Verfügung.

Im letzten Teil sind wir mit der Besprechung bis »appl_search()« gekommen, weiter geht es heute mit »appl_getinfo()«:

	int appl_getinfo(int ap_gtype, int *ap_gout1, int *ap_gout2, int *ap_gout3, int *ap_gout4);

Mit ihrer Hilfe können Informationen über die vom AES verwendeten Fonts, die Auflösung und Anzahl der Farben sowie die Landessprache abgefragt werden. In »ap_gtype« wird angegeben, welche Information gewünscht ist, die Antworten sind »ap_gout1« bis »ap_gout4« zu entnehmen. Direkt zurückgeliefert wird eine 1 für erfolgreiche Ausführung bzw. 0 für einen aufgetretenen Fehler.

0	Informationen über den normalen AES-Font
1	Informationen über den kleinen AES-Font
	ap_gout1	Font-Höhe
	ap_gout2	Font ID
	ap_gout3	Font Typ
		0 = System-Font
		1 = FSM-GDOS-Font
		2 und höher sind reserviert
2	Informationen über die momentane Auflösung und die Anzahl der verwendeten Farben
	ap_gout1	Nummer der Bildschirmauflösung
	ap_gout2	Anzahl der vom AES unterstützten Farben
	ap_gout3	Farbiconunterstützung, 1 = ja, 0 = Nein
	ap_gout4	Neues Resource-File-Format, 1 = ja, 0 = Nein
3	Informationen über die Landessprache (ap_gout1)
	0 = Englisch
	1 = Deutsch
	2 = Französisch
	3 = Spanisch
	4 = Italienisch
	5 = Schwedisch
int graf_mouse (int gr_monumber, MFORM *gr_mofaddr);

Wer bisher den Mauszeiger geändert hat, hatte keine Möglichkeit, seinen vorherigen Zustand zu sichern. In einer Multitasking-Umgebung kann dies zu allgemeiner Konfusion führen, spätestens dann, wenn mehrere Programme eigene Mauszeiger definieren. Aus diesem Grund wurde für den Parameter »gr_monumber« neue Werte eingeführt:

258 = Speichere aktuelle Mausform
259 = Setze die zuletzt gespeicherte Mausform
260 = Setze die letzte Mausform

Zurückgeliefert wird eine 1 für erfolgreiche Ausführung bzw. 0 für einen aufgetretenen Fehler. Trotzdem: Grundsätzlich sollte unter MultiTOS der Mauszeiger so selten wie nur irgend möglich geändert werden.

Die neuen Menü-Funktionen

Vom Multitasking abgesehen, ist die wohl am sehnsüchtigsten erwartete Erweiterung, die Fähigkeit Sub- bzw. Pop-Up-Menüs direkt vom Betriebssystem darstellen zu lassen. Dieses Feature fehlte bisher im AES und mußte von den Programmierern selbst »gestrickt« werden, was zwangsläufig einen gewissen Wildwuchs verschiedenster Varianten zur Folge hatte. Damit ist nun Schluß!

Jeder Prozeß kann in seiner Menüleiste bis zu 64 Untermenüs haben und so viele Pop-Ups darstellen, wie er will. Um auch den Freunden einer chaotischen Bildschirmdarstellung Rechnung zu tragen, können diese Menüs selbst wieder Sub-Pop-Up-Menüs enthalten. Die maximale Staffelungstiefe beträgt derzeit vier Ebenen. Ausgenommen von dieser Menü-Vielfalt bleibt das »Desk«-Menü (das mit den Accessories); hier sind keine Submenüs erlaubt. Trotz des praktischen Nutzens sollte die Übersicht immer vor den Gebrauch von Submenüs gehen. Weniger ist mehr. Ein Sub-/Pop-Up-Menü besteht immer aus einem Vaterobjekt vom Typ »G_BOX«. Die einzelnen Einträge können beliebige Objekte (auch User-Defined) sein. Wer sich allerdings nur auf Einträge vom Typ »G_STRING« beschränkt, der darf auch noch ein weiteres Bonbon genießen: Das automatische Scrollen der Menüs. Ab einer frei einstellbaren Anzahl von Einträgen scrollt das AES selbständig auf oder ab. Überhaupt läßt sich einiges am Verhalten der Sub-/Pop-Up-Menüs nach eigenen Vorstellungen einstellen:

Display Delay Dieser Wert gibt an, nach welcher Zeit ein Submenü erscheinen soll.
Drag Delay Hier haben wir das Gegenteil, dieser Wert gibt an, nach welcher Zeit ein Submenü wieder verschwindet.
Click Delay Zeit bis zum ersten Scrollen
Scroll Delay Scrollgeschwindigkeit
Scroll Height Ab wievielen Einträgen soll gescrollt werden

Zwei neue Strukturen erleichtern die Verwaltung und die Einstellungen der neuen Menü-Typen:

typedef struct_menu
{
	OBJECT *mn_tree;	/* Zeiger auf den Objekt-Baum des Menüs */
	int mn_menu;	/* Der »Vater« der Menüeinträge */
	int mn_item;	/* Start-Eintrag */
	int mn_scroll;	/* Soll nicht gescrollt werden, muß */
		/* hier eine 0 stehen. Ist Scrollen er- */
		/* wünscht, steht hier der Eintrag, bei */
		/* dem begonnen wird. */
		/* ACHTUNG! Es können nur Menüs ge- */
		/* scrollt werden, deren Einträge aus- */
		/* schließlich aus G_STRING-Objekten */
		/* bestehen! */
	int mn_keystate;	/* Hier wird vom AES der Status von Con- */
		/* trol, Alternate und Shift, beim */
		/* Drücken der Maustaste, eingetragen. */
} MENU;

typedef struct mn_set
{
	long Display;	/* Display Delay */
	long Drag;	/* Drag Delay */
	long Delay;	/* Click Delay */
	long Speed;	/* Scroll Delay */
	int Height;	/* Scroll Height */
} MN_SET;

Die Submenüs

Um einen Eintrag in der Menüleiste mit einem Submenü zu versehen, brauchen wir natürlich zuerst ein Submenü. Man nehme: Eine G_BOX-Objekt als »parent« mit einigen Einträgen vom Typ G_STRING und schon ist das Submenü fertig. Der »parent« sollte zudem mit einem Schatten versehen sein. Um das AES mit der Verwaltung unseres Submenüs zu beauftragen, hängen wir dieses mit der neuen Funktion »menu_attach()« an einen Eintrag in der Menüleiste an. Bei diesem Vorgang treten dann auch ein paar Dinge auf, die eventuell Inkompatibilitäten mit alten Programmen hervorrufen könnten: Für die Verwaltung der Submenüs benötigt das AES das High-Wort des Objekt-Typs unseres Eintrages. Die Werte 128 bis 192 dienen für das neue Menüsystem. Manche älteren GEM-Libraries haben eben diese Werte schon in Beschlag genommen, im guten Glauben an die DR-Dokumentation, die dieses Vorgehen nicht verbietet. Unter MultiTOS entstehen jetzt aber Probleme.

Grundsätzlich sollten Sie auf die Verwendung der erweiterten Objekt-Typen bis auf weiteres verzichten.

Keine Probleme sollte hingegen die Erweiterung der Anzahl von Werten in der Message-Pipe bei »evnt_mesag()« und »evnt_multi()« mit sich bringen. Zwei neue Werte (in drei Worten) in der Message-Pipe dienen dazu, auch bei mehreren Submenüs den Verursacher einer MN_SELECTED-Nachricht exakt ausfindig zu machen.

Wort 0	MN_SELECTED (0)
Wort 1	.....
Wort 2	.....
Wort 3	Objekt-Index des gewählten Menü-Titels
Wort 4	Objekt-Index des gewählten Menü-Eintrags
Wort 5&6	NEU! Der Objektbaum des Eintrags (32 BIT)
Wort 7	NEU! Objekt-Index vom »Vater« des Eintrags

Um ein einwandfreies Funktionieren der Submenüs zu gewährleisten, sollten sich MultiTOS-Programme an folgende Atari-Richtlinien halten:

  1. Der Menüeintrag, an den ein Submenü angehängt wird, muß vom Typ G_STRING sein
  2. Dieser Menüeintrag muß mit Leerzeichen auf die Breite des Menüs aufgefüllt sein und sollte keine Tastaturkürzel enthalten
  3. Ein Submenü sollte keine weiteren Submenüs haben
  4. Das Submenü ist zu schattieren

Die Pop-Up-Menüs

Da sich die Pop-Up- von den Sub-Menüs im Grunde genommen nicht unterscheiden, gelten für sie die gleichen Regeln, mit der Ausnahme, daß sie vom Programm selbst gestartet werden müssen. Es ist also nicht möglich, einem Button via menu_attach ein Submenü zuzuordnen. Hier ist wieder der Programmierer gefragt. Klickt der Anwender auf einen entsprechenden Button muß das Programm auf die Nachricht »MU_BUTTON« mit einem »menu_popup()« Aufruf reagieren.

Natürlich darf ein Pop-Up-Menü selbst wieder Untermenüs enthalten, die dann das AES auch wieder automatisch verwaltet. Aber auch hier gilt: nicht übertreiben. Um den Wildwuchs zu begrenzen und den Programmen ein einheitliches Aussehen zu geben, gibt es von Atari noch einige Stil-Richtlinien, die bei der Verwendung von Pop-Up-Menüs Beachtung finden sollten:

  1. Die Schachtelungstiefe von Pop-Up-Menüs sollte sich auf eine Ebene beschränken (maximal vier)
  2. Der Button, »unter« dem sich ein Pop-Up-Menü verbirgt, ist zu schattieren, ebenso wie das Pop-Up-Menü selbst
  3. Während ein Pop-Up-Menü geöffnet ist, bleibt der Verursacher (etwa ein Button) selektiert

Um Ihren Tatendrang nicht länger aufzuhalten, fahren wir nun mit der Besprechung der AES-Funktionen in alphabetischer Reihenfolge fort.

	int menu_attach(int me_flag,OBJECT *me_tree,int me_item, MENU *me_mdata) ;

Mit ihr hängen Sie Submenüs an bestehende an, ändern sie, fragen sie ab oder löschen diese. Über »me_flag« geben Sie die gewünschte Funktion an.

0 Abfragen der Daten des Submenüs, das am Menüeintrag »me_tree/me_item« hängt. Die Daten werden in der Struktur »me_mdata« zurückgeliefert.
1 Anhängen oder Ändern eines Submenüs. Der Menüeintrag wird in »me_tree/me_item« angegeben, das Submenü in der MENU-Struktur »me_data«.
2 Löscht ein Submenü, das am Menüeintrag me_tree/me_item hängt. me_data sollte NULL sein. Zurückgeliefert wird eine 1 für erfolgreiche Ausführung bzw. 0 für einen aufgetretenen Fehler. int menu_bar (OBJECT *me_btree, int me_bshow);

Da es unter MultiTOS natürlich nicht gewährleistet ist, daß die aktuelle Menüleiste auch die eigene ist, müssen Sie vor Veränderungen der Menüleiste abfragen, welche gerade aktiv ist. Zu diesem Zweck wurde »menu_bar()« um eine Abfragefunktion erweitert. Wird in »me_btree« 0L und in »me_bshow« -1 übergeben, liefert menu_bar() die AES-ID des Besitzers der aktuellen Menüleiste zurück.

int menu_istart (int me_flag, OBJECT *me_tree, int me_imenu, int me_item);

Diese Funktion erlaubt das Setzen und Abfragen des Starteintrags eines Submenüs. In »me_flag« steht die gewünschte Funktion.

0	Abfrage des Starteintrags
	me_tree = Objekt-Baum des Submenüs
	me_imenu = G_BOX-Objekt des Submenüs
	me_item = 0
1	Setzen des Starteintrags
	me_tree = Objekt-Baum des Submenüs
	me_imenu = G_BOX-Objekt des Submenüs
	me_item = Starteintrag

Zurückgeliefert wird der gesetzte bzw. erfragte Starteintrag.

	int menu_popup (MENU *me_menu, int me_xpos,int me_ypos, MENU *me_mdata);

Sie stellt ein Pop-Up-Menü auf dem Bildschirm dar und verwaltet es inklusive eventueller Submenüs.

me-menu = MENU-Struktur mit den Angaben für das PopUp-Menü
me-xpos = Gewünschte X-Position des Starteintrags
me-ypos = Gewünschte Y-Position des Starteintrags
me-data = MENU-Struktur für Rückgabewerte (gewählter Eintrag)

Zurückgeliefert wird eine 1 für erfolgreiche Ausführung bzw. 0 für einen aufgetretenen Fehler oder wenn der Benutzer keinen Eintrag angewählt hat.

	int menu_register (int me_rapid, const char *me_rpstring);

Unter MultiTOS gilt die Beschränkung auf sechs Accessories nicht mehr. Die Anzahl der Einträge ist nur durch die Größe des Bildschirms begrenzt (solange das Menü »Desk« auf den Bildschirm paßt). Auch kann ein Accessory seinen Eintrag durch erneutes Aufrufen von menu_register() ändern. Die Parameter haben sich nicht geändert.

	int menu_settings (int me_flag, MN_SET *me_values);

Sie erlaubt das Setzen und Abfragen der Geschwindigkeits- bzw. Scroll-Einstellungen für Pop-Up- und Sub-Menüs. Den gewünschten Modus geben Sie in »me_flag« an:

0 Abfrage der Werte. Die aktuellen Werte werden in die MN_SET-Struktur me_values eingetragen.
1 Setzen der Werte. Die neuen Werte müssen in der MN_SET-Struktur me_values stehen.

Als Rückgabewerte erhalten Sie stets eine 1. Im Laufe der nächsten Monate informieren wir Sie im Rahmen dieser Reihe natürlich weiter über MultiTOS und den Falcon. (ah)


Richard Kurz
Aus: TOS 03 / 1993, Seite 58

Links

Copyright-Bestimmungen: siehe Über diese Seite