Alles unter Kontrolle
Macintosh-Kontrollfeld für PAK-68 und MacStart
Michael Parker
Bei der Konfiguration seines Systems hat´s der Mac-User leicht: einfach ein Kontrollfeld anklicken und die gewünschten Parameter einstellen. Anwender unserer Projekte MacStart und PAK-68/3 kamen dabei bislang zu kurz, weshalb wir hier ein Kontrollfeld nebst ausführlicher `Bauanleitung´ vorstellen wollen.Für den heutigen Mac-Anwender ist es sicherlich kaum noch vorstellbar, daß es am Anfang nur ein Kontrollfeld gab, und das im heutigen Sinne nicht einmal richtig: Es war nur ein Schreibtischzubehör (kurz DA für Desk Accessory). Bald schon wurde es im Kontrollfeld zu eng, und es wurde in der Systemversion 4.1 durch eine rollbalkengesteuerte Auswahlfunktion erweitert. In dieser Form blieb es den Mac-Usern bis System 6.0x erhalten.
Doch mit System 7 wurde alles anders: Das Kontrollfeld-DA in seiner ursprünglichen Form hat gänzlich das Zeitliche gesegnet, ab jetzt durfte sich jedes cdev selbst Kontrollfeld nennen und sein eigenes, beliebig großes Fenster haben. Doch dem gewissenhaften Programmierer sei geraten, die Standardgröße einzuhalten, damit´s auch unter System 6.0.x noch paßt.
Befehlsempfänger
Eines jedoch ist seit System 4.1 erhalten geblieben: Der Mechanismus. Im Prinzip ist ein Kontrollfeld nur ein Befehlsempfänger, der auf eine begrenzte Anzahl von Messages hört. Diese Messages befehlen dem Kontrollfeld, zu prüfen, ob es für die aktuelle Soft- beziehungsweise Hardware geeignet ist, sich zu initialisieren, auf vielerlei Events, wie zum Beispiel einen Mausklick, zu reagieren und am Ende wieder alles schön säuberlich aufzuräumen. Diese Messages kamen früher vom besagten Kontrollfeld-DA und werden seit System 7 vom Finder direkt verschickt. Die Event-Befehle sind Pendants altbekannter Recken wie Mausklick, Tastendruck, Cut/Copy/Paste/Clear wie auch Update-, Activate- und Deactivate-Events. Damit nichts anbrennt, bekommt ein Kontrollfeld regelmäßig ein Null-Event, welches dem Befehlsempfänger nicht viel mehr sagen will, als daß er jetzt ein bißchen Zeit hat, regelmäßige Arbeiten wie zum Beispiel die Anzeige der aktuellen Uhrzeit zu verrichten.Alles Routine
Das Herzstück eines Kontrollfeldes ist eine Kontrollfeldfunktion mit einer streng festgelegten Parameterliste. Jene Parameter verraten viel über die Besonderheiten von Kontrollfeldern. Neben der schon bekannten Message wird der Kontrollfeldfunktion ein Zeiger auf eine Dialog-Item-Liste übergeben. Dies offenbart, daß ein Kontrollfeld auch nur eine spezielle Art von Dialog darstellt. Als Besonderheit ist Aufbau und Zeichnen nicht Sache des Kontrollfeldes selbst, sondern des Finders. Deshalb stellt ein cdev eine oft genutzte Möglichkeit dar, im Finder ein Fenster zu öffnen, auch wenn man gar nichts kontrollieren will. Die Kontrollfeldfunktion bekommt im Falle eines Mausklicks oder Tastendrucks lediglich im Item-Parameter mitgeteilt, welches Dialog-Item betätigt wurde.Der Parameter numItems hat unter System 7 nur noch historische Bedeutung: Früher wurde im alten Kontrollfeld-DA die Dialog-Item-Liste des cdevs einfach an die des Kontrollfeld-DAs angehängt. Somit haben sich alle Item-Nummern um die Anzahl dieser Dialog Items verschoben. Um das auszugleichen, bekam das cdev die Anzahl der Items im numItems-Parameter mitgeliefert. Unter System 7 wird dort nichts mehr angehängt, der numItems-Parameter aber noch aus Kompatibilitätsgründen mitgeschleppt.
Kommt eine Message der Event-Gattung herein, macht es sich der Befehlsgeber leicht und reicht einfach den aus der Programmierung von Applikationen bekannten Event-Record durch. Dort kann sich das Kontrollfeld dann selbst nach Herzenslust bedienen und das holen, was es zur Auswertung der Message braucht.
Geben und Nehmen
Ein letzter Parameter namens cdevValue übernimmt die wechselseitige Kommunikation des Kontrollfelds mit dem Finder beziehungsweise dem alten Kontrollfeld-DA. Wenn sich ein Kontrollfeld einmal initialisiert hat, bekommt es im cdevValue-Parameter genau den Wert überreicht, den es beim letzten Aufruf zurückgegeben hat. Mit diesem Ping-Pong-Verfahren kann sich die Kontrollfeldfunktion zum Beispiel einen Zeiger oder ein Handle auf einen von ihr allozierten Speicherbereich erhalten.Geht irgend etwas während des Kontrollfeldbetriebes schief, kann es auch anstatt der Adresse des Speicherbereiches eine Fehlermeldung zurückgeben. So weiß der Finder, daß der User mittels Alertbox über diesen Fehler informiert werden muß und die Zeit reif ist, das Kontrollfeld schleunigst zu beenden.
Wunschzettel
Das c't-Kontrollfeld soll drei Aufgaben erfüllen. Erstens soll es bei einem Mac mit PAK (Prozessoraustauschkarte) [7] dem System begreiflich machen, daß dort wirklich ein Fließkommaprozessor installiert ist. Jeder normale Mac weiß das von Haus aus, nur die PAK-Macs stellen sich hier dumm, weil die ROMs und das System (noch) nichts von dem auf der PAK befindlichen Rechenknecht wissen. Bleibt nicht viel übrig, als dort ein bißchen nachzuhelfen: Eine Ersatzroutine muß her. In [2] stellten wir für diesen Zweck das hasFPU-Init vor, das aber unter System 7 nicht mehr einwandfrei funktioniert.Seit System 6.0.4 übernimmt nämlich der Gestaltmanager den Auskunftsdienst über System- und Hardwarekonfiguration. Mittels eines Selektors teilt man der Gestaltfunktion mit, was man denn gerne wissen möchte. Fleißig gibt die Funktion Auskunft, nur die Existenz der PAK-FPU bleibt unerkannt. Wohl haben die Systemprogrammierer von Apple solches geahnt, denn sie erlauben, für jeden Selektor die Auskunftsfunktion zu ersetzen. Also schreibt man die Routine neu und ersetzt damit die systemeigene.
Als zweite Aufgabe soll das Kontrollfeld die Installation der Shut-Down-Routine für das MacStart-Projekt übernehmen. Diese hängt man mittels Shut-Down-Manager in die Shut-Down-Sequenz ein. Was diese Routine mit dem Shut-Down so alles anstellt, kann in [3] nachgelesen werden. Als kleines Schmankerl und mithin dritte Aufgabe soll noch der Befehls- beziehungsweise Daten-Cache des Prozessors, zum Beispiel für Geschwindigkeitstests oder Beseitigung von Inkompatibilitäten, ein- und ausgeschaltet werden können.
cdev und mehr
Eine Kontrollfelddatei benötigt neben der cdev-Ressource, in der sich die Kontrollfeldfunktion befindet, noch eine Menge weiterer Ressourcen. Zum einen ist da die mach-Ressource, die jeweils nur ein Integer-Wort für die System- und ein Wort für die Hardwarekonfiguration enthält. Tatsächlich kann man in die Bits dieser beiden Wörter eine Menge Konfiguration hineinkodieren, im Gestaltzeitalter aber haben sich zwei Belegungen herauskristallisiert. $FFFF 0000 meint: Das Kontrollfeld läuft auf allen Konfigurationen, $0000 FFFF dagegen bedeutet: Frage mit einer speziellen Message die Kontrollfeldfunktion selbst, ob das Kontrollfeld unter dieser Konfiguration laufen kann.Die DITL-Ressource enthält Angaben über die Anzahl, Struktur und Position der Dialog-Items. Sie wird unter System 7 vom Finder selbständig verwaltet und der Kontrollfeldfunktion nur zur Auswertung von Mausklicks und Tastendrücken oder der Behandlung von User-Items übergeben.
In der nrct-Ressource befinden sich Angaben darüber, welche Rechtecke im Hintergrund des Kontrollfeldfensters gezeichnet werden sollen. Wer seine Rechtecke lieber über die DITL-Ressource zeichnen lassen will, der gibt hier als Rechteck die gesamte Fläche des Kontrollfeldfensters an; auch hier wird der Historie Rechnung getragen. Die Koordinaten der Rechtecke wie auch der DITL-Ressource beziehen sich nicht auf den Punkt (1,1), sondern auf (1,89). Dies rührt daher, daß im alten Kontrollfeld-DA neben der eigentlichen Kontrollfeldfläche Platz für die Icon-Liste der anderen verfügbaren cdevs gelassen werden mußte.
So präsentiert sich das vollständige c't-Kontrollfeld dem Anwender.
Damit sowohl im Finder als auch in der cdev-Liste des Kontrollfeld-DA ein Icon für jedes Kontrollfeld angezeigt werden kann, benötigt man als letztes die Bundle-Ressourcen samt Zubehör. Die Kombination aus Ressourcen von je einem Typ BNDL, FREF und ICN# ordnen jeder Kontrollfelddatei eindeutig ein Icon für den Finder zu. Unter System 7 kann man zur Not auch ohne diese Ressourcen leben.
All diese Ressourcen müssen stets die ID -4064 haben; das goldene Fragezeichen geht an den, der sich diese hübsche Zahl ausgedacht hat. Mit dieser Festlegung weiß der Finder allerdings immer, welche Ressourcen er sich beim Aufbau eines Kontrollfeldes greifen muß. Damit man mit der Erstellung der Ressourcen nicht soviel Arbeit hat, sei hier auch auf Apples ResEdit hingewiesen, das für alle notwendigen Ressourcen sehr angenehme Eingabemethoden bereitstellt.
Ein INIT muß sein
Das schönste Kontrollfeld nützt nichts, wenn kein Code vorhanden ist, der die Patch-Routinen im System installiert; das Ganze muß ja nach altem Brauch während des Systemstarts geschehen. Da gibt´s nur eins: Eine INIT-Ressource muß her. Eine angenehme Eigenschaft von Kontrollfelddateien ist, daß diese, soweit sie sich am richtigen Platz im Systemordner befinden, während des Systemstarts nach INIT-Ressourcen durchforstet werden. Wie ein INIT aufgebaut ist, haben Sie womöglich schon in [1] und [2] kennengelernt. Hier soll nur gesagt werden, daß diese Kontrollfeld-INIT nicht viel mehr macht, als die Einstellungen zu laden, zu prüfen, was installiert werden soll, entsprechende Routinen in den System-Heap zu laden und diese in die entsprechenden Stellen im System einzuklinken.Die Einstellungen werden System-7-like im Preferences-Ordner abgelegt. Somit wäre auch ein Booten über Netzwerk möglich.
Bauanleitung
Das Kontrollfeld wurde mit Think C entwickelt. Es besteht im Grunde genommen aus vier Projekten, die jeweils eine Ressource zum Kontrollfeld beitragen: die Kontrollfeldfunktion, die Gestaltersatzroutine für die FPU-Erkennung, die Shut-Down-Routine für die MacStart-Schaltung und ein INIT, welches letztere beiden bei Systemstart im Systemheap installiert. Das Projekt für die cdev-Ressource übernimmt darüber hinaus auch das Zusammenfügen aller Ressourcen zu einem ausgewachsenen Kontrollfeld.Das gesamte Listing würde den Rahmen dieses Artikels sprengen. Deshalb haben wir uns hier auf die wichtigsten Teile beschränkt. Eine Bauanleitung für INITs findet sich außerdem in [1]. Den gesamten Sourcecode nebst ausführbarem Programm stellen wir auch diesmal auf Sammeldiskette und in der c't-Mailbox zur Verfügung.(cm)
Literatur
[1] Leonidas Drisis: Starthilfe, c't 2/91, S. 182[2] Michael Parker, Carsten Meyer: FPU-Starthilfe, INIT für PAK-ausgerüstete Macs, c't 1/92, S. 188
[3] Carsten Meyer: Startautomatik, Macintosh automatisch ein- und ausschalten, c't 10/92 S. 196
[4] Inside Macintosh I, The Ressource Manager, The Dialog Manager, The File Manager, The Control Manager, Addison-Wesley 17737
[5] Inside Macintosh V: The Control Panel, The Shut Down Manager, Addison-Wesley 17719
[6] Inside Macintosh VI: Compatibility Guidelines, The Control Panel, The File Manager, The Finder Interface, Addison-Wesley 57755
[7] Holger Zimmermann: Doppel-PAK, PAK68/3 mit Cache und 68020/030 für 68000-Rechner, c't 11/93 S. 222, c't 12/93, S. 276
Last edited: