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

Links

Copyright-Bestimmungen: siehe Über diese Seite