ST-Usern nicht unbekannt ist die Tatsache, daß die Accessories nur via Maus zu erreichen sind.
Mit einem einfachen Trick (das Wort Trick ist schon fast zu hoch gegriffen) ist es möglich, diese Accessories auch mit der Tastatur anzusprechen. Wenn man möchte, kann der Menüeintrag auch ganz entfallen.
Keyboard-Events - auf einen Event reagiert ein Accessory - sprechen ein Accessory höchst selten an, also wird ein Umweg benutzt. Die Sonderfunktionstasten (Shift rechts und links, Alternate, Control, Maustaste rechts und links und CapsLock) haben einen Status, der sich abfragen läßt.
Unser Accessory wartet nun nicht nur auf einen Message-Event, der signalisieren würde, daß es angewählt wurde, sondern auf einen Timer-Event. Dieser Timer-Event wird alle 100 ms (Millisekunden) gegeben und das Accessory fragt alle 100 ms die Sondertasten ab. Sollte die von uns vorbestimmte Kombination gedrückt sein, so wird eine Aktion ausgelöst. Diese 100 ms sind für den Programmbenutzer unmerklich, sowohl von der leichten Behinderung des Programmablaufes her als auch von der Wartezeit, bis die Aktion ausgelöst wird.
Das Accessory kann selbstverständlich nur dann aufgerufen werden, wenn ein Event möglich ist. Also ist ein Aufruf unter TOS-Anwendungen nicht möglich. Was kann man alles aufrufen? Eigentlich alles! Das Beispiel-Accessory stellt nur eine Alert-Box dar. Die Routinen können aber sehr vielfältig sein. Damit keine Probleme mit anderen Programmen entstehen, sollte man aber möglichst die Wahl der Sondertasten, die das Accessory aktivieren, dem Programmbenutzer überlassen.
Die Abfrage der Sondertasten wird über die (Modula 2-)BIOS-Funktion GetKBShift bewerkstelligt. Im Bios selbst heißt die Funktion ‘kbshift’ und trägt die Nummer 11. Diese Funktion liefert bei Megamax Modula 2, mit dem das Accessory geschrieben wurde, einen Set mit den gedrückten Tasten zurück. Bei Pascal Plus beispielsweise kann nur ein Integer-Wert abgefragt werden. Man muß dort anhand der einzelnen Bits überprüfen, welche Taste gedrückt wurde. Das Modul BIOS aus dem Megamax Modula 2-Modul stellt einen Set mit folgenden Tasten zur Verfügung:
Shift rechts : RightShift
Shift links : LeftShift
Control: ControlKey
Alternate: AlternateKey
Caps Lock : CapsLock
Maustaste rechts: RightMouseButton
Maustaste links : LeftMouseButton
Bei dem Beispiel-Accessory wird geprüft, ob beide Shift-Tasten gedrückt sind. Für andere Tastenkombinationen sind entsprechend andere Werte abzufragen. Man sollte aber möglichst Doppelbelegungen verwenden, da eine Aktion etwa auf Shift hin nicht unbedingt wünschenswert ist.
Möglichkeiten für eigene Programme gibt es reichlich. Es ist ja auch möglich, auf eine bestimmte Tastenkombination hin eine Dialog-Box zu öffnen und dort verschiedene Tätigkeiten zur Auswahl zu stellen.
Literatur: Atari ST Profibuch, Jankows-ki/ReschkelRabich, Sybex-Verlag
(***********************************************************)
(* Accessory, aufrufbar über Desk-Eintrag und Tastatur 2.0 *)
(* ------------------------------------------------------- *)
(* Entwickelt mit Megamax Modula 2 von Application *)
(* Systems, Heidelberg. *)
(* Autor: Dietmar Rabich, Dülmen *)
(* Datum: 13. März l988 *)
(***********************************************************)
MODULE HideACCi
(*$S1*) (* <- reseruierter Stack. Für andere *)
(* Anwendungen ggf. zu ändern. *)
(* Importe *)
FROM GrafBase IMPORT Point,Rect;
FROM AESEvents IMPORT MultiEvent,Event,EventSet, MessageBuffer,
accOpen.RectEnterMode;
FROM AESForms IMPORT FormAlert;
FROM AESMenus IMPORT RegisterAcc;
FROM GEMEnv IMPORT RC.InitGem.DeuiceHandle;
FROM GEMGlobals IMPORT MButtonSet,SpecialKeySet,GemChar,PtrMaxStr;
FROM BIOS IMPORT KBShifts,KBShiftBits,GetKBShift;
FROM Storage IMPORT ALLOCATE;
(* Zeit für Timer *)
CONST repeatTime = 100L:
(* Variablen *)
VAR ProgramName : PtrMaxStr;
OK : BOOLEAN:
Events : EventSet;
Message : MessageBuffer;
dummyPoint : Point;
dummyBut : MButtonSet;
dummyChar : GemChar;
dummyClick, dummyCard, ApplID : CARDINAL:
specialKeys : SpecialKeySet;
dev : DeviceHandle;
KeyKomb : KBShifts;
(* Unsere Beispielanwendung *)
PROCEDURE MachWas;
BEGIN
FormAlert(1,'[01[Hello World!![***]',dummyCard)
END MachWas;
BEGIN
ALLOCATE(ProgramName.256):
ProgramName^:=' Accessory'; (* Accessoryname *)
InitGem(RC,dev,OK):
(* Tastenkombination, die den Aufruf ermöglicht *)
KeyKomb:=KBShifts{RightShift,LeftShift);
IF OK THEN
RegisterAcc(ProgramName,ApplID,OK);
IF OK THEN
REPEAT
MultiEvent (EventSet{message,timer},
0, MButtonSet{},MButtonSet{}, lookForEntry,Rect(0,0,0,0), lookForEntry,Reet(0,0,0,0),
Message,
repeatTime,
dummyPoint,dummyBut,specialKeys,
dummyChar,
dummyClick,Events):
(* Aktion über Menüeintrag *)
IF ((message IN Events) AND (Message.msgType = accOpen)) OR
(* Aktion über Tastaturaufruf *)
((timer IN Events) AND (KeyKomb*GetKBShift()= KeyKomb))
THEN
EXCL(Events,message):
MachWas
END;
UNTIL FALSE
ELSE
FormAlert(1,'[0][Kein Accessorystart möglich][Ende]',dummyCard)
END
END
END HideACC
(* ------------ Ende des Listings -------------- *)