KeyWatch geschrieben Juni/Juli 1997 von Manfred Lippert
========

     --- Programmbergreifende Tastatur-Shortcuts

KeyWatch berwacht alle Tastatureingaben, die mit gleichzeitig
gedrckter Control- und Alternate-Taste erfolgen. Desweiteren bietet
KeyWatch ber eine Cookie anderen Programmen die Mglichkeit, sich in
diese Tastendrcke "einzuklinken". Somit werden programmbergreifende
Shortcuts mglich.

Ein Programm, das KeyWatch benutzt, ist z.B. der Desktop jinnee. Ist
KeyWatch installiert, so sind die Shortcuts in jinnee angemeldeter
Applikationen jederzeit mglich, sofern die Shortcuts mit
Control+Alternate ausgelst werden. Ebenso sind die Quick-Keys davon
betroffen.

Wichtig: KeyWatch mu dazu vor jinnee installiert sein.

Unter MagiC legt man sich deshalb KeyWatch am besten in den
START-Ordner. Der genaue Pfad ist in der MAGX.INF neben dem
_APP-Eintrag angegeben und lautet meist C:\GEMSYS\MAGIC\START\.

Hinweis: KeyWatch funktioniert nur, falls bei der Installation im
Cookie-Jar noch Platz fr den KeyWatch-Cookie vorhanden ist. KeyWatch
erweitert den Cookie-Jar also nicht selbstndig.

Das Programm darf beliebig - aber nur zusammen mit diesem Text und
beides unverndert - weitergegeben werden.

Zugabe: Das beiliegende kleine Progrmmchen MORECOOK.PRG erweitert den
Cookie-Jar auf 50 Eintrge. MORECOOK.PRG sollte mglichst weit vorne
im AUTO-Ordner (nicht START-Ordner!) - meist C:\AUTO\ - liegen. Unter
MagiCMac nicht vergessen, MORECOOK mglichst weit vorne in der
AUTOEXEC.BAT (falls vorhanden) einzutragen.

--------- fr Programmierer: ----------

KeyWatch installiert einen Cookie namens 'KyWt' dessen Wert auf
folgende Struktur zeigt:

typedef struct
{
	int cdecl (*install_func)(keywatch_func func);
	void cdecl (*remove_func)(keywatch_func func);
} KEYWATCH_COOKIE_STRUCT;

wobei der Parameter keywatch_func folgendermaen definiert ist:

typedef int cdecl (*keywatch_func)(int key, int shift);

install_func ist also ein Zeiger auf eine Funktion, die man aufruft,
wenn man eine Shortcut-Routine einklinken will. Als Parameter bergibt
man genau diese Routine.

Liefert install_func einen Wert ungleich 0, so war die Installation
erfolgreich.

In diesem Falle mu man unbedingt am Programmende remove_func
aufrufen, um die Routine wieder zu deinstallieren.

WICHTIG: Programme, die sich in KeyWatch einklinken, sollten sich
unbedingt auch in den etv_term-Vektor einklinken, und sich bei dessen
Ansprung aus KeyWatch wieder ausklinken. Ansonsten kommt es
unweigerlich bei nachfolgenden Control+Alt-Tastendrcken zu Abstrzen,
wenn ein Programm aus dem Speicher "gekickt" wird, das sich in
KeyWatch eingeklinkt hat. Z.B. wenn man es ber den Taskmanager von
MagiC brutal beendet, oder wenn es schlicht und einfach abstrzt.
KeyWatch kann nicht selbst berprfen, ob ein Programm noch vorhanden
ist.

Zur eingeklinkten Routine selbst:

keywatch_func ist ein Zeiger auf eine Funktion, die bei jedem
Control+Alternate-Tastendruck aufgerufen werden soll.

Die Routine erhlt als Parameter in key die gedrckte Taste und in
shift die gedrckten Umschalttasten. Das Format von key ist wie das
vom evnt_keybd() gelieferte: Bit 0-7 = ASCII-Code, Bit 8-15 =
Scan-Code. Das Format von shift ist wie das von Kbshift() gelieferte.

Zurckliefern mu die Funktion einen Wert ungleich 0 (im Register d0),
falls die Taste ausgewertet wurde. Konnte die Funktion dagegen mit der
Taste nichts anfangen, so mu sie unbedingt 0 zurckgeliefern! Nur so
haben auch andere eingeklinkte Shortcut-Routinen eine Chance, an
Tasten zu kommen.

Achtung! Es ist darauf zu achten, da die eingeklinkte Routine unter
fremden Applikationen luft! Die Taste wird vom evnt_multi der
Top-Applikation ausgefiltert und die eingeklinkte Routine quasi von
dieser Applikationen aufgerufen. Man sollte also vorsichtig bei
AES-Aufrufen oder hnlichem sein. Auerdem sollte die Routine so wenig
Stack wie mglich benutzen.
Man knnte beispielsweise auswerten, ob man die Taste brauchen kann,
und sich in diesem Falle einfach selbst eine AV_SENDKEY-Message
senden. Somit macht man "unter fremden Namen" nur sehr wenig und das
Haupt-Handling erfolgt sauber im eigenen Hauptprogramm.

Beispiel in Pseudo-C-Code:

int cdecl keywatch_keyfunc(int key, int shift)
{
	if ( >kann Taste brauchen< )	/* nur testen (keine AES-Aufrufe!) */
	{
		int msg[8];
		msg[0] = AV_SENDKEY;
		msg[1] = my_pid;
		msg[2] = 0;
		msg[3] = shift;
		msg[4] = key;
		msg[5] = 0;
		msg[6] = 0;
		msg[7] = 0;
		appl_write(my_pid, 16, msg);	/* Taste an Hauptprogramm schicken! */
		return TRUE;
	}
	return FALSE;
}


Und noch ein letzter Hinweis:

Alle in KeyWatch eingeklinkten Programme mssen sich gemeinsam die
Tastatur teilen. Deshalb ist es sehr sinnvoll, da der Benutzer die
Shortcuts der KeyWatch-Programme frei festlegen kann, oder im
einfacheren Fall einfach komplett abschalten kann.
Darauf sollten KeyWatch-Programmierer achten.

Viel Spa wnscht
Manfred
