TOS-Rechner haben schon seit 1985 einen feinen Edelstein in ihrem Betriebssystem: GEM. GEM stellt Routinen zur Verfügung, die die Gestaltung und Verwaltung der grafischen Oberfläche von Applikationen erlauben. Doch auch GEM ist nicht perfekt. Mitunter ist ein Entwickler mehr mit der Benutzerschnittstelle beschäftigt als mit der eigentlichen Aufgabe, für die das Programm gedacht ist.
Diesem Umstand wird durch die Verwendung von GEM-Libraries Rechnung getragen. GEM-Libraries sind eine Sammlung von fertig programmierten Funktionen, die den Anspruch haben, einen Programmierer soweit irgend möglich bei der Gestaltung der grafischen Benutzeroberfläche zu unterstützen.
Der Vergleich von älteren, nicht mehr gepflegten Applikationen mit aktuellen zeigt die verschiedene und vor allem komplexere Gestaltung der Benutzerschnittstelle überdeutlich: 3D-Effekte, Farb-Icons, Fensterdialoge, Flying Dials, Iconify, Pop-ups, Tastaturbedienung usw.
Einige Punkte, wie 3D-Effekte, Iconify und Pop-ups, wurden von ATARI mit TOS 4.0x bzw. MultiTOS vorgegeben. Leider versäumte es ATARI, für ältereTOS-Versionen eine entsprechende Betriebssystemerweiterung anzubieten, so daß Programme, die die neuen Funktionen benutzen, nicht auf älteren Rechnern laufen. Im allgemeinen werden diese Betriebssystemfunktionen im Original kaum genutzt. Statt dessen werden sie in den GEM-Libraries implementiert und sind somit unter allen AES-Versionen verfügbar.
Andere Erweiterungen sind im Laufe der Zeit hinzugekommen, und kaum eine vernünftige Applikation kommt heute ohne sie aus: komplette Tastaturbedienung der Dialoge, erweiterte Bedienung von Edit-Feldern, fliegende Dialoge, Fensterdialoge.
Und nicht zuletzt wurde und wird einiges von anderen Plattformen übernommen. Darunter fallen beispielsweise Fenstermenüs und Drop /List-boxen.
Neben den für den Anwender sichtbaren Erweiterungen interessiert den Programmierer auch die Schnittstelle zwischen eigenen Sourcen und der Library. Sie sollte möglichst einfach sein, die Ereignisverwaltung soweit wie möglich übernehmen und modulare Programmierung gestatten.
Eine GEM-Library muß also einiges leisten, damit sie ihrem Anspruch gerecht werden kann. Grund genug, einige GEM-Libraries miteinander zu vergleichen. Berücksichtigt wurden ausschließlich Libraries, die zumindest mit Pure C verwendet werden können.
Before Dawn, ESS-Code, Freedom, LZH-Shell, WinLupe ... Die Liste ließe sich noch fortsetzen; die Library wird schon in vielen Programmen - meist nicht erkannt - eingesetzt. Sicherlich liegt das einerseits am Freeware-Status für die nichtkommerzielle Nutzung, andererseits merkt man die Bemühung des Autors, eine flexible und universelle Library zu erstellen.
So wird der aufwendige Kern jeder GEM-Applikation, die Ereignisauswertung, durch Callback-Methoden stark modularisiert. Der Library wird nur noch mitgeteilt, welche Funktion bei einem bestimmten Ereignis aufgerufen werden soll. Die eigentliche Auswertung der Nachrichten wird dann komplett von der Library übernommen. Dadurch kann EnhancedGEM der Applikation auch mehr als die gewohnten Ereignisse anbieten. Es sind vier Rechteck-, zwei Button- und beliebig viele Timer-Events möglich. Die Nachrichten werden optimiert gepuffert, falls sie nicht sofort verarbeitet werden können.
Äußerst praktisch ist auch die Einbindung aller gängigen Kommunikationsprotokolle. Neben dem offiziellen Drag&Drop von ATARI sind das von Gemini bekannte AV-Protokoll, das Xacc2-Protokoll sowie das Clipboard- und View-Protokoll implementiert. Welche Protokolle ein Programm letztlich unterstützt, gibt man EnhancedGEM mit einem Funktionsaufruf bekannt. Danach erledigt die Library die Kommunikation -soweit sinnvoll -ohne weiteres Zutun der Applikation (beispielsweise das An- und Abmelden von Fensterdialogen beim AV-Server).
Sehr mächtiggestaltet sind die Edit-Felder. Der Anwender einer Enhanced-GEM-Applikation kann mit dem Cursor nahezu wie in einer normalen Textverarbeitung navigieren. Darüber hinaus kann man über eine History-Funktion durch die letzten Eingaben blättern bzw. nach einem bestimmten Eintrag suchen lassen. Ebenso ist es möglich, Eingaben in und über das Clipboard zu tätigen sowie Text durch andere Applikationen über das Xacc2-Protokoll in die Edit-Felder einzufügen. Enhanced-GEM-Editfelder haben auch eine größere Anzahl von Gültigkeitsmasken, z.B. Binärziffern, Oktalziffern, Hexadezimalziffern usw.
Natürlich stehen auch eine Reihe von erweiterten Objekten für die Gestaltung der Dialoge zu Verfügung: Circlebuttons, Pop-ups, Slider-Objekte, Unterstriche in beliebiger Dicke, GDOS /Vektor-Text mit beliebigen Attributen, freie Farbgebung für alle Objekte. Selbst ein Fontselector, der die Auswahl auf bestimmte Fonts beschränken kann (Bitmap/Vektor, proportional/monospaced) ist vorhanden.
Da die Library mit Sourcen verfügbar ist, kann man sich über Konstantenmakros speichersparende Versionen zusammenstellen, die die von vornherein nicht benutzten Funktionen ausblenden. So lassen sich Libraries ohne erweiterte Edit-Felder, Fontselector oder Protokollfunktionen compilieren. Weitere Besonderheiten von EnhancedGEM offenbaren sich, wenn man sich die Demoprogramme des Autors näher ansieht. So liegt beispielsweise ein Programm bei, das ASCII-Texte in einem Fenster anzeigt und dessen Scroll-Geschwindigkeit trotz der Programmierung in C wirklich beeindruckend ist. Die verwendeten Fonts werden überexterne Programme, Fontselector bzw. Font-Palette - ähnlich wie unter OS/2 - eingestellt. Das entsprechende Protokoll kann von eigenen Programmen auch genutzt werden. Übrigens kann man in den Sourcen noch den einen oder anderen Programmiertrick finden. Falls man noch ein Feature in der Library haben möchte, kann man sich getrost an den äußerst kooperativen Autor wenden. Für die Version 2.25 plant der Autor noch einige interessante Erweiterungen, beispielsweise Drop-Boxen und Text-/Terminal-Fenster.
Da Multitasking-Systeme niemals genügend Speicher haben können, ist es sinnvoll, nicht jeder Applikation dieselben Libraries im Code mitzugeben, sondern die Libraries für alle laufenden Prozesse einmal im Speicher zur Verfügung zu stellen. Weil die selben Libraries von mehreren Programmen benutzt werden, nennt man sie im Englischen Shared Libraries. Dieses auf anderen Plattformen durchaus übliche Verfahren verwirklicht Magic (nicht zu verwechseln mit MagiC, dem alternativen Betriebssystem) für TOS-Rechner.
Ein Programm im Autoordner legt über einen Cookie fest, in welchem Verzeichnis sich der Library-Kernel befindet. Der Kernel wird dann von der ersten Applikation, die Magic benützt, nachgeladen und bleibt, bis die letzte Applikation beendet ist, im Speicher. Zum Programm selbst wird nur eine wenige Kilobytes große Library dazugelinkt, deren Aufgabe es ist, eventuell den Kernel nachzuladen, die Applikation beim Kernel anzumelden und die Kommunikation zwischen Applikation und Kernel zu übernehmen. Allerdings tritt der Spareffekt bedingt durch den zusätzlichen Verwaltungsaufwand, erst bei mehreren gleichzeitig benutzten Magie-Applikationen ein.
Das Konzept der Shared Library erlaubt Magic eine systemweite Konfiguration. Der Anwender kann gut 60 verschiedene Optionen konfigurieren (z.B. Dialoge zentriert oder zur Mausposition, Farbe der Buttons, Pop-up-Verzögerungen usw.), wahlweise über ein CPX-Modul oder ein Programm.
Auch der Programmierer bekommt von Magic einiges geboten. Zur Ereignisauswertung benutzt Magic ebenfalls Callback-Methoden, nur daß mehr als eine Funktion - sogenannte Handler - zur Auswertung der Ereignisses installiert werden können. Magic geht alle Handler durch, bis das Ereignis ausgewertet wurde oder kein weiterer Handler mehr existiert.
Magic bietet neben den vom GEM bekannten Ereignissen noch eine Reihe weiterer, beispielsweise einen Mausmoved-Event, der dann eintritt, wenn die Maus bewegt wurde. Dazu können fast beliebig viele Timer- und Rechteck-Events installiert werden.
Für die Gestaltung der Oberfläche stellt Magic jede Menge erweiterte Objekte bereit: Circlebuttons, Drop- und Listboxen, erweiterte Edit-Felder, Farb-Icons, Fenstermenüs, Registerkarten, Pop-ups mit Slider, Slider-Verwaltung usw. Bemerkenswert ist noch ein Timer-Objekt, das man direkt in einen Dialog setzen kann und das nach der angegebenen Zeit einen Timer-Event absetzt. Ähnlich gibt es ein Help-Objekt, das bei Druck der Taste Help ein Accessory (beispielsweise ST-Guide) mit einem Stichwort aufruft. Für die Edit-Felder existieren ebenfalls zusätzliche Gültigkeitsmasken. Vorhanden ist auch ein Fontselector, der zwischen Bitmap-, Speedo-, Truetype- und Type-1-Fonts unterscheidet und über einen Autolocator für die Tastatur verfügt. Unverständlich, daß der Fontselector nur immer von einer Magie-Applikation gleichzeitig genutzt werden kann.
Über die normalen Library-Fähigkeiten hinaus bietet Magic weitere interessante Möglichkeiten. Die Fenster können an allen Ecken und Kanten verschoben und vergrößert/verkleinert werden. Für die Tastatur gibt es einen NKCC-ähnlichenTreiber, der auch Dead-keys beherrscht (für jede Applikation getrennt verwaltet). Auch so nützliche Dinge wie eine Suchfunktion mit Wildcards für Einträge in Drop-oder Listbox (dadurch erspart man sich eine eigene Liste) sind in Magic enthalten.
Ergänzt wird Magic mit einer Sammlung von nützlichen Routinen, die vor allem für Modula und Pascal interessant sind: Zufallszahlen, Zeitwandlung (Datum in Strings, Zeit in Strings, Zeitberechnungen), Zahlenkonvertierung usw.
Eine Applikation komfortabler zu programmieren als mit ACSpro ist kaum vorstellbar. Anstatt üblicherweise nur Dialoge und Menüs mit einem Entwicklungswerkzeug, einem sogenannten Resource Construction Set, zu gestalten, arbeitet man mit ACSpro die komplette Benutzerschnittstelle aus.
ACSpro arbeitet, ähnlich wie der Interface Builder von NeXTstep, objektorientiert. Jedes Objekt, insbesondere ein Dialog, hat besondere Eigenschaften wie Datenbereiche, Ein-/Ausgaben und die Erscheinungsform für den Anwender. Über Referenzen werden die Objekte mit den eigenen Sourcen verbunden. Referenzen legen beispielsweise fest, welche Funktionen beim Anklicken eines Buttons ausgeführt werden sollen. Die Objekte werden mit Hilfe des Builders von ACSpro soweit wie irgend möglich auf grafischem Weg bearbeitet. Dabei stehen für jedes Objekt die entsprechenden Werkzeuge wie Icon- und Image-Editor zu Verfügung. Da ACSpro auch einen Texteditor und eine Compilershell enthält, stellt es schon mehr eine Entwicklungsumgebung als eine reine GEM-Library dar.
An herkömmlichen Library-Funktionen gibt es auch bei ACSpro Sehenswertes. Neben den zusätzlichen Objekten, wie Circlebuttons, Checkboxen, Radiobuttons, Pop-ups, Pfeile in alle Richtungen und der Möglichkeit, ein Image gekachelt im Dialog auszugeben, gibt es auch eine Reihe von Objekten, die nicht so alltäglich sind: Desktop, Fontselector, einen komfortablen Texteditor und ProtokolF/Plot-Fenster. Das Desktop erlaubt die Verwaltung von Fenstern, die bei ACSpro komplette Programme - sogenannte Module-sein können. Der Texteditor wird auch im Builder für die Eingaben der Referenzen verwendet. Das Protokollfenster ermöglicht die Ausgabe formatierter Texte in ein Fenster. In das Plot-Fenster können die Ausgaben der VDI-Befehle umgelenkt werden. Andere Objekte wie beispielsweise ein Pop-up mit Slider oder Drop- bzw. Listboxen können dank des Einsatzes von Referenzen relativ einfach selbst programmiert werden.
Ab der getesteten Version unterstützt ACSpro auch die gängigen Protokolle: AV, Drag&Drop, Xacc2 sowie das Clipboard-Protokoll. Leider wird beim AV-Protokoll nur die Anmeldung der Applikation und der Fenster übernommen, die eigentliche Kommunikation (z.B. Einfügen von Text) muß selbst implementiert werden. Zusätzlich gibt es noch diverse Routinen für den Cookiejar, das Environment und Datei-/ Pfadbehandlung.
Entsprechend der Komplexität des Konzeptes gibt es ein ausführliches Handbuch, das verständlich in die Arbeitsweise des Applicationbuilders einführt, einen ausführlichen Referenzteil hat und die Bedienung des Desktops und Editors beschreibt. In naher Zukunft wird es eine Step-by-Step Einführung geben, die vor allem dem Anfänger den Einstieg erleichtern wird. Dazu gibt es noch eine Reihe von fertigen Modulen mit Sourcen, die die Möglichkeiten von ACSpro demonstrieren.
Gerade noch rechtzeitig traf eine Beta-Version von SysGem V2.0 ein, weswegen die Library nicht so ausführlich besprochen werden kann wie die anderen. Beim Erscheinen dieses Artikels dürfte SysGem V2.0 schon veröffentlicht sein.
Da modale Dialoge nicht mehr zeitgemäß sind, verzichtet SysGem vollkommen auf sie und kann Dialoge nur im Fenster darstellen. Falls das Betriebssystem kein Fenster mehr zu Verfügung stellt, schließt SysGem auf Wunsch kurzfristig ein bereits geöffnetes Fenster, um den neuen Dialog darstellen zu können (es wird trotzdem weiter verwaltet, so als wäre es weiter offen).
Bei der Event-Verwaltung gibt sich SysGem ebenfalls modern und verwendet auch Callback-Methoden. Außerdem werden beliebig viele Timer-und Rechteck-Events bereitgestellt. In die Event-Verwaltung integriert sind die üblichen Kommunikationsprotokolle, wie AV-Protokoll, Drag&Drop, Xacc2-und Clipboard-Protokoll.
An zusätzlichen Objekten hat SysGem natürlich auch seine Spezialitäten. Checkbox, Tristate-Buttons, List-und Drop-Boxen, Slider-Objekte, Registerkarten, 16 verschiedene Circle-und Pfeil-Buttons, 20 Frame- und Rahmenobjekte, Edit-Felder mit beliebigem Vektortext und möglichem Windows-ähnlichem Design. Mit Hilfe von C-ICON - einem Programm für den Autoordner von Roger Jordan - kann SysGem sogar Farb-Icons unter allen TOS-Versionen darstellen.
Komplett wird SysGem mit Routinen für das Clipboard, den Cookie Jar und das GDOS. Für das RCS „Interface" gibt es ein EXTOBFIX. Zu SysGem wird es eine ausführliche Dokumentation im Umfang von ein paar hundert Seiten geben, die auch einen Kurs für den Anfänger enthalten wird.
Alle hier vorgestellten GEM-Libraries werden ihrem Anspruch, den Entwickler von der lästigen Programmierung der Benutzerschnittstelle zu entlasten, gerecht. Die Libraries realisieren Callback-Methoden für die Event-Verwaltung, stellen neue und sinnvolle Objekte zu Verfügung und erlauben die Verwendung von unmodalen Dialogen. Die Libraries grenzen sich mehr in den möglichen Anwendungsgebieten voneinander ab. Entscheiden muß letzten Endes der Programmierer, welche Library für seine Bedürfnisse am ehesten geeignet ist. Unsere tabellarische Übersicht kann bei der Entscheidung hilfreich sein.
ACSpro
Positiv:
Negativ:
EnhancedGEM:
Positiv:
Negativ:
Magic
Positiv:
Negativ:
SysGem
Positiv:
Negativ:
(keine Wertung, da noch Beta-Version)