% ASCREEN-3.2-HANDBUCH --- Anhang A (GEM-Nachrichten)
% Copyright (C) 1992 by Anselm Lingnau
%
\chapter{\ASCREEN\ und GEM-Nachrichten} \label{a:gem-msg}

\section{GEM-Nachrichten}

Alle, die schon einmal ein GEM-Programm geschrieben haben,
kennen {\em Nachrichten\/} und die Warteschlange:
jedes GEM-Programm bekommt so zum Beispiel mitgeteilt,
welche Men�punkte gew�hlt wurden
oder welche Fenster neu gezeichnet werden m�ssen.
Meist werden Nachrichten von den AES erzeugt,
dem Teil des Atari-""Betriebssystems,
das sich mit der graphischen Benutzungsoberfl�che befa�t.

Auch \ASCREEN\ verarbeitet nat�rlich diverse GEM-""Nachrichten.
Dazu geh�ren aber nicht nur die �blichen Nachrichten
wie "`Fenster neuzeichnen"' oder "`Men�punkt ausgew�hlt"',
sondern auch einige besondere nur f�r \ASCREEN\ definierte Nachrichten.
Hiermit k�nnen andere Programme \ASCREEN\ bitten,
eine \DVI-Datei einzulesen,
die gerade gezeigte \DVI-Datei nochmals zu lesen,
ein neues Fenster zu �ffnen und einiges mehr.
In diesem Anhang erkl�re ich Ihnen diese Nachrichten
und zeige auch, wie Sie sie von einem Programm aus verschicken k�nnen.

\section{Nachrichten f�r \ASCREEN}

Betrachten wir zuerst die Nachrichten,
die f�r \ASCREEN\ definiert sind.
Neben den �blichen AES-""Nachrichten,
die Sie am besten in einem beliebigen GEM-Buch, etwa dem {\sl Profibuch},
nachschlagen und die hier nicht aufgef�hrt werden,
gibt es einige spezielle \ASCREEN-""Nachrichten.

Zun�chst der allgemeine Aufbau einer GEM-""Nachricht.
Nachrichten m�ssen mindestens 8~W�rter, also 16~Bytes lang sein,
sonst wird die Annahme bzw.\ Zustellung verweigert.
Mit der Definition
\begin{typed}
WORD msg[8];
\end{typed}
gilt die Zuordnung
\begin{example}
{\tt msg[0]}\qquad Nachrichtentyp\\
{\tt msg[1]}\qquad Proze�nummer des Absenders\\
{\tt msg[2]}\qquad "`�berl�nge"' der Nachricht
\end{example}
Der Rest der Nachricht kann ein beliebiges Format haben.
Die "`�berl�nge"' ist die Anzahl von Bytes,
die nicht mehr in die 16~Bytes der eigentlichen Nachricht gepa�t haben
und daher mit einem expliziten Aufruf von \verb|appl_read()|
gelesen werden m�ssen.

Das erste Wort gibt den {\em Typ\/} der Nachricht an,
zum Beispiel \verb|MN_SELECTED| (0)
f�r die AES-""Nachricht "`Men�punkt gew�hlt"'.
Bei \ASCREEN-""Nachrichten hat das erste Wort
immer den Wert \verb|MSG_ASCREEN|, die Zahl 8196.
\begin{aha}
Hierbei handelt es sich um eine willk�rliche Definition,
die Nummer 8196 ist hoffentlich noch frei\dots
\end{aha}
\ASCREEN\ unterscheidet die verschiedenen Arten von Nachrichten,
bei denen \verb|msg[0]| gleich \verb|MSG_ASCREEN| ist,
am Wert des vierten Worts (\verb|msg[3]|).
Hier gibt es die Werte
\begin{center}
\begin{tabular}{cl}
\tt MSG\_READ	& \DVI-Datei einlesen\\
\tt MSG\_REREAD	& \DVI-Datei wieder einlesen\\
\tt MSG\_NEWPAGE& Neue Seite formatieren\\
\tt MSG\_NEWWIN & Neues Fenster �ffnen
\end{tabular}
\end{center}
Die numerischen Werte dieser Namen sollten Sie nicht allzusehr interessieren,
es sei denn, Sie benutzen abartige Programmiersprachen
wie Pascal oder Assembler.
Im Verzeichnis {\tt ALAUNCH} der \ASCREEN-""Distribution
finden Sie eine Datei {\tt ASCRMSGS.H},
die die entsprechenden Definitionen f�r C enth�lt.

Hier nun der Aufbau der einzelnen Nachrichten.
Die ersten drei W�rter haben wir ja schon diskutiert;
ich spare es mir, sie hier immer wieder mit anzugeben.
\begin{description}
\item[MSG\_READ] \<Dateiname>\dots\\
	Mit dieser Nachricht fordern Sie \ASCREEN\ auf,
	eine neue \DVI-""Datei einzulesen.
	Die bisherige wird verworfen;
	ist der Name der bisherigen Datei gleich dem \<Dateiname>n,
	so entspricht die Nachricht der Nachricht {\tt MSG\_REREAD}.
	Diese Nachricht hat mit einiger Sicherheit �berl�nge.
	Weiter unten k�nnen Sie sehen, wie Sie sie korrekt verschicken:
	der Dateiname folgt unmittelbar
	auf die ersten vier W�rter der Nachricht,
	und alles wird mit einem einzigen \verb|appl_write()|
	auf die Reise geschickt.
\item[MSG\_REREAD] (keine weiteren Parameter)\\
	Wenn \ASCREEN\ diese Nachricht empf�ngt,
	liest er die gerade im Speicher befindliche \DVI-Datei nochmals ein.
	Dies entspricht dem gleichnamigen Men�punkt.
\item[MSG\_NEWPAGE] \<Seitennummer>\\
	Diese Nachricht bittet \ASCREEN,
	die Seite mit der Nummer, die {\tt msg[4]} angibt,
	zu formatieren und in den Cachespeicher zu tun.
	Der praktische N�hrwert dieser Nachricht au�erhalb von \ASCREEN\
	ist zweifelhaft.
	\ASCREEN\ verwendet die Nachricht jedoch intern,
	um das Vorausarbeiten zu koordinieren.
\item[MSG\_NEWWIN] \<Art> \<Seite> \<x> \<y> \<w> \<h>\\
	Hiermit k�nnen Sie \ASCREEN\ veranlassen, ein neues Fenster zu �ffnen.
	Die \<Art> des Fensters ist 1 f�r ein normales Fenster,
	2 f�r ein um den Faktor 2 verkleinertes Fenster,
	4 f�r ein um den Faktor 3 verkleinertes Fenster,
	8 f�r ein um den Faktor 2 verkleinertes
	und 16 f�r ein um den Faktor 3 verkleinertes doppelseitiges Fenster.
	Das Fenster enth�lt die Seite mit der Nummer \<Seite>,
	und als Gr��e w�nschen Sie sich die Breite \<w> und H�he \<h>
	an der Position (\<x>, \<y>).
	Diese Nachricht hat eine �berl�nge von 2~Bytes.
\end{description}
Interessant f�r die �u�erliche Anwendung sind vor allem
die beiden erstgenannten Nachrichten.

\section{Das Programm {\tt ALaunch}}

Die \ASCREEN""-Distribution enth�lt ein Programm
zur Demonstration der Nachrichtenschnittstelle.
{\tt ALaunch} ist f�r Sie vielleicht interessant,
wenn Sie einen GEM-""Multitaskingzusatz wie {\sl MultiGEM\/} benutzen
--- es scheint, da� es �berhaupt nur dann f�r Sie sinnvoll ist!
{\tt ALaunch} wird mit dem Namen einer \DVI-Datei als Parameter aufgerufen.
Es pr�ft, ob gerade ein \ASCREEN-Proze� l�uft.
Falls nein, wird ein neuer \ASCREEN\ mit der betreffenden Datei gestartet.
Falls doch,
so erh�lt der laufende \ASCREEN\ eine {\tt MSG\_READ}-""Nachricht
mit dem angegebenen Dateinamen.
Sie k�nnen also {\tt ALaunch} als Applikation
f�r Dateien vom Typ {\tt DVI} anmelden
(oder, ein hinreichend intelligentes Desktop wie {\sl Gemini}
oder das neue von Atari vorausgesetzt,
ein {\tt ALaunch}-Icon auf dem Desktophintergrund ablegen)
und durch einfaches Anklicken (oder Abschleppen) von \DVI-""Dateien
\ASCREEN\ starten.
{\tt ALaunch} sorgt dann daf�r,
da� Ihr Speicher nicht durch mehrfache \ASCREEN s aufgefressen wird.
\begin{attention}
Philosophische Personen k�nnen sich die Frage stellen,
ob sie immer nur einen \ASCREEN\ haben wollen.
Wer lieber mehrere \DVI-""Dateien gleichzeitig auf dem Schirm hat,
sollte {\tt ALaunch} eben nur als Beispiel ansehen
und nicht wirklich installieren.
\end{attention}
Der Quellcode f�r {\tt ALaunch} steht im entsprechenden Verzeichnis
der \ASCREEN-""Distribution zur Inspektion bereit.
Ich m�chte hier nicht den ganzen Code wiederholen,
sondern beschr�nke mich auf die wesentlichen Teile.

Die Anwesenheit von \ASCREEN\ k�nnen Sie mit der AES-""Funktion
\verb|appl_find()| wie im folgenden Ausschnitt �berpr�fen:
\begin{wtyped}
if ((id = appl_find("ASCREEN ")) < 0)
    /* Fehler */
else if (id <= app_count) /* geladenen ASCREEN weiterbenutzen */
    send_message(app_id, id, argv[1]);
else /* neuen ASCREEN starten */
    launch_ascreen(argv[1]);
\end{wtyped}
{\tt app\_count} ist dabei eine Abk�rzung
f�r das zweite Wort des {\tt global[]}-Felds von GEM,
das die Maximalzahl der gleichzeitig m�glichen Prozesse angibt.
Bei einem GEM ohne Multitaskingerweiterung ist dies immer~1
({\tt ALaunch} tut dann nichts Sinnvolles);
bei {\sl MultiGEM\/} kann der Wert eingestellt werden.
Beachten Sie auch,
da� das Argument von {\tt appl\_find()} genau acht Zeichen lang sein mu�.

Und {\tt MSG\_READ} verschicken Sie an \ASCREEN\ ungef�hr so:
\begin{wtyped}
void
send_message (const int from, const int to, const char *file)
{
    int  size;
    char msg[8 + MAX_CMDLINE];	/* MAX_CMDLINE ist z. B. 128 */
#define PUT_WORD(a, i, v) a[i] = (v) >> 8, a[i+1] = (v) & 0xff

    strcpy(msg + 8, file);
    size = 8 + (int)strlen(msg + 8) + 1;
    if (size < 16) size = 16;

    PUT_WORD(msg, 0, MSG_ASCREEN);
    PUT_WORD(msg, 2, from);
    PUT_WORD(msg, 4, size - 16);  /* die "Uberl"ange */
    PUT_WORD(msg, 6, MSG_READ);
    appl_write(to, size, msg);
}
\end{wtyped}

{\tt ALaunch} ist an einer Stelle von {\sl MultiGEM\/} abh�ngig:
es verwendet den Aufruf {\tt Mfork()},
um einen neuen \ASCREEN\ als unabh�ngigen Proze� zu starten.
Leider wei� ich nicht,
inwieweit {\tt Mfork()} etwa von {\sl MultiTOS\/} oder {\sl Mag!X}
unterst�tzt wird
und ob {\tt ALaunch} daher in diese Umgebungen portabel ist.
Erfahrungsberichte w�rden mich nat�rlich brennend interessieren.
Damit Sie {\tt Mfork()} mit Turbo- oder Pure-C
und seiner Nichtstandard-""Parameter�bergabe in Registern
benutzen k�nnen,
brauchen Sie ein kleines Binding in Assembler,
siehe {\tt MFORK.S}.

\section{Die Zukunft}

Stefan Lindner, Lutz Birkhahn und Robert Kie�ling
bereiten ein \TeX-""System vor,
das auf der Steuersprache {\tt tcl} von John Ousterhout beruhen wird.
Dies wird vermutlich diverse Interaktionen zwischen \TeX,
\TeX shell und Programmen wie Previewer und Druckertreiber zulassen.
Wenn dar�ber mehr bekannt ist,
wird auch \ASCREEN\ na"-t�r"-lich entsprechend ge"-�n"-dert werden.
Wir sind alle sehr gespannt.

\begin{chapterquote}
Die Botschaft h�r' ich wohl,
allein mir fehlt der Glaube;
Das Wunder ist des Glaubens liebstes Kind.
\author JOHANN WOLFGANG VON GOETHE, {\it Faust} (1808)
\end{chapterquote}
