Accessory auch über Tastatur

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 -------------- *)

Dietmar Rabich
Aus: ST-Computer 07 / 1988, Seite 93

Links

Copyright-Bestimmungen: siehe Über diese Seite