Es gibt drei grundlegende Möglichkeiten Sequenzen von Ereignismustern z.B. an Attribute von Objekten anzubinden.
Die einfachste Form ist ein einzelnes Zeichen, das die entsprechende Zuordnung erhalten soll, mit Ausnahme des Leerzeichens und der spitzen Klammer.
Die zweite Form von Ereignismustern findet Verwendung
zur anwenderdefinierten Erzeugung benannter virtueller Ereignisse.
Es hat die Form <<name>>
, also der Name des virtuellen
Ereignisses eingeschlossen in doppelte, statt
einfache spitze Klammern.
Die dritte Form hat die Syntax (Abbildung 8.4)
<modifier-modifier-type-detail> |
Abbildung 8.4: Quellentextbeispiel: Syntax Ereignismuster
Beispiele für gültige und
bereits vordefinierte Modifizierer (engl.: ,,modifier``)
für Aktionen sind
Control
,
Shift
,
Lock
,
Button1
oder B1
,
Button2
oder B2
,
Button3
oder B3
,
Button4
oder B4
,
Mod1
oder M1
,
Mod2
oder M2
,
Mod3
oder M3
,
Mod4
oder M4
,
Mod5
oder M5
,
Meta
oder M
,
Alt
,
Double
,
Triple
.
Typ-Elemente
(engl.: ,,type``) entsprechen dem Standard der Ereignistypen
des X Window Systems:
ButtonPress
oder Button
,
ButtonRelease
,
Circulate
,
Colormap
,
Configure
,
Destroy
,
Enter
,
Deactivate
,
Expose
,
FocusIn
,
FocusOut
,
Gravity
,
KeyPress
oder Key
,
KeyRelease
,
Leave
,
Map
,
Motion
,
Property
,
Reparent
,
Unmap
,
Visibility
,
Activate
.
Die erlaubten Werte der ,,Details`` (engl.: ,,detail``) hängen von dem jeweiligen Typ-Element ab.
In der angegebenen Syntax lassen sich die Ereignismuster also weitergehend mit Bezeichnern, Typ-Elementen und Details kombinieren, z.B. zu (Abbildung 8.5):
<Control-F5> <Control-Meta-Down> <Control-B3-Motion> <Control-ButtonRelease-3> <Shift-Button-2> |
Abbildung 8.5: Quellentextbeispiel: Beispiele für Kombinationen von Ereignismustern
Für einige Sequenzen existieren Abkürzungen. Es kommt auf den Einzelfall an, ob man solche weniger ,,sprechenden`` Abkürzungen verwenden sollte.
Nach einem der obigen Beispiele zur Anbindung von Ereignissen
stellt sich ein reales Beispiel
eines bind
wie in Abbildung 8.6 dar.
$w bind \ all <Meta-ButtonRelease-3> { puts "Button Released" } |
Abbildung 8.6: Quellentextbeispiel: Anbindung von Ereignissen mittels Ereignismuster
In diesem Beispiel wird allen Objekten (all
)
im Pfad $w
(z.B. mit set w .f.sub
)
eine kleine Textausgabe zugeordnet, die ausgelöst wird,
wenn Meta
gedrückt ist und gleichzeitig
die Maustaste 3 losgelassen wird.
Ereignisse lassen sich auch auf einfache Weise kombinieren. Es ist leicht möglich, beliebige Befehle an Sequenzen von mehreren Ereignissen anzubinden (Abbildung 8.7).
bind . \ <Meta-x><Meta-y> \ { puts "Ereignis: M-x M-y" } bind . \ <KeyPress-s><o><w><a><s> \ { puts "s o w a s gibt's" } |
Abbildung 8.7: Quellentextbeispiel: Anbindung an Kombination von Ereignissen
Die Ausführung der Befehle, die an diese Ereignisse angebunden sind, beginnt, wenn die entsprechenden Ereignisse nacheinander ausgelöst worden sind.
Es lassen sich aber auch vom Anwender neue Ereignisgruppen
erzeugen.
Virtuelle Ereignisse
können durch event
Operationen
erzeugt und gehandhabt werden (Abbildung 8.8):
event operation [arg1 arg2 ...] |
Abbildung 8.8: Quellentextbeispiel: Syntax zur Handhabung virtueller Ereignisse
Operationen sind in diesem Zusammenhang
add
,
delete
,
generate
und
info
.
Diese Operationen haben spezifische Optionen und verarbeiten
eine Reihe von Argumenten.
Das folgende Beispiel (Abbildung 8.9) demonstriert die praktische Vorgehensweise:
event add <<myvirtual>> \ <Control-v> <Control-t> bind . <<myvirtual>> { puts "- Virtuelles Ereignis! -" } event info <<myvirtual>> |
Abbildung 8.9: Quellentextbeispiel: Beispiel virtuelles Ereignis
Der erste Befehl definiert ein neues virtuelles Ereignis
unter dem Namen myvirtual
mittels der Operation
add
und den zugeordneten Ereignismustern.
Die Anbindung bindet eine Ausgabe mittels puts
an das virtuelle Ereignis.
Der letzte Befehl liefert die Informationen über das betreffende virtuelle Ereignis. Ohne Angabe eines bestimmten Ereignisses liefert dieser Aufruf eine Liste aller aktuell definierten virtuellen Ereignisse.
Vordefiniert sind in der Regel z.B. die virtuellen
Ereignisse <<Copy>>
, <<Paste>>
und <<Cut>>
.
Virtuelle Ereignisse helfen sowohl Systemunterschiede zu berücksichtigen als auch spezielle Gruppen von Ereignissen zu bilden.
Eine nützliche Funktion bei der Verwendung von Ereignissen
ist die Ersetzung in Ereignisfeldern.
Ähnlich wie Formate in Befehlen vieler Programmiersprachen
lassen sich Ersetzungen mit Ereignissen verwenden, z.B.
in bind
Befehlen.
Auf diese Art und Weise ist es möglich, bei der Ereignisbehandlung
Informationen über das aktuelle Ereignis zu parametrisieren.
Eine Auswahl der wichtigsten Ersetzungen mit einer Kurzbeschreibung zeigt folgende Tabelle (Tabelle 8.1).
Ausdruck | Kurzbeschreibung | ||
%% | einzelnes Prozentzeichen | ||
%W | Fenstername, ereignisempfangend | ||
%x | x-Koord. (Widget) des Mauszeigers | ||
%y | y-Koord. (Widget) des Mauszeigers | ||
%X | x-Koord. (Bildschirm) des Mauszeigers | ||
%Y | y-Koord. (Bildschirm) des Mauszeigers | ||
%b | Nummer der bedienten Maustaste | ||
%A | ASCII-Zeichen einer Taste | ||
%K | symbolischer Name einer Taste | ||
%h | Höhe eines Widgets | ||
%w | Breite eines Widgets |
Folgendes Beispiel (Abbildung 8.10) demonstriert eine einfache Anwendung:
bind . <B1-Motion> { puts "Bewegung Mauszeiger %x %y" } |
Abbildung 8.10: Quellentextbeispiel: Einfaches Anwendungsbeispiel einer Ersetzung
Bei jeder Bewegung der Maus mit gehaltener erster Maustaste wird eine Zeichenkette mit den aktuellen Koordinaten des Mauszeigers ausgegeben.