next up previous contents
Next: 7 Graphikschnittstelle Up: 6.2 Eingabeanalyse Previous: 6.2.8 Gesamtfunktion

6.2.9 Transiente Regeln

Zusätzlich zu der Regel ,,root``, die als Wurzel der üblichen Regeln zum Editieren dient, gibt es eine weitere ,,Regelfamilie`` unter der Wurzel ,,escape``. Diese enthält Regeln, die unabhängig vom aktuellen Zustand des Parsers aktiviert werden sollen, wie z.B. für Zoomen. Diese Regeln können jederzeit unabhängig vom Zustand des Parsers aktiviert werden, haben typisch Seiteneffekte wie die Änderung des aktuellen Bildes, aber keine Wirkung auf den Datenbestand und liefern keine den Parser betreffenden Resultate.

Erreicht werden diese Regeln über das Schlüsselwort :ESCAPE. Dieses bewirkt, daß der Parser seinen momentanen Zustand mit ,,escape`` überlagert. Nach Abarbeitung einer ,,rechten Seite`` zu ,,escape`` wird der alte Zustand inklusive Datenstapel wieder völlig regeneriert.

Als Beispiel für eine derartige Regel diene ,,zoom``. Diese Operation kann über einen Menüpunkt eingeleitet werden, oder durch Drücken der Steuerungs-Taste. Damit wird die Konfiguration der Mausknöpfe vorübergehend umgeschaltet auf:
"zoom-in" ":ESCAPE :ZOOM-IN '(%h %v)"
"un-zoom" "(progn (ped::unzoom) :IGNORE)"
"zoom-out" ":ESCAPE :ZOOM-OUT '(%h %v)"

Drücken der linken Taste sendet also erst das :ESCAPE-Schlüsselwort an den Parser, der es als spezielles Steuerzeichen erkennt, und die Marke :DATA-POP sowie das Nonterminal escape auf den Zustandsstapel legt. Diese Marke wird den Parser später anweisen, das oberste Element des Datenstapels, also das Ergebnis des escape Nonterminals, zu entfernen, ohne es weiterzuverwenden.

Das akzeptierte Schlüsselwort :ESCAPE kommt auf den Datenstapel.

Für den weiteren Verlauf sind die folgenden Regeln wichtig:

   figure2275
Abbildung 6.6: Zustände der beiden Stapel (oben Parserstapel, unten Datenstapel) während der Abarbeitung der Regel zoom-in

Eine (von mehreren, hier nicht interessierenden) Möglichkeiten zur Ableitung von escape ist zoom-in zum Vergrößern eines Bildausschnittes:

(newrule
 "escape"
 NIL
 '("zoom-in"))

(newrule
 "zoom-in"
 NIL
 '(:ZOOM-IN     ; select the rule with this keyword
   "coords"     ; specify the first corner of the rectangle
   (mode "Second corner for zoom window"        ; title of mode
         ("second corner" "'(%h %v)")           ; left button gives corner
         ("" "")
         ("cancel" ":CANCEL")                   ; cancel operation
         #'ped::elastic-zoom #'ped::elastic-zoom ($ 2)  ; show rectangle
         NIL
         ("second corner" "'(%h %v)")           ; release-text
         )
   "coords"     ; coordinates of second corner
   (ped::zoom (car ($ 2)) (car ($ 4)) (cadr ($ 2)) (cadr ($ 4)))
                ; apply new view-port and redraw screen
))

Aufgrund der transparenten Implementierung können auch mehrere escape-Aufrufe verschachtelt stattfinden.



Martin Knaipp
Wed Jun 12 15:41:33 MET DST 1996