commentary
authorClaus Gittinger <cg@exept.de>
Tue, 23 Apr 1996 21:57:07 +0200
changeset 598 1a2339e902d4
parent 597 958e2673ca11
child 599 d978fa59094a
commentary
KeybdFwd.st
KeybdMap.st
KeyboardForwarder.st
KeyboardMap.st
SWSensor.st
SynchronousWindowSensor.st
WEvent.st
WGroup.st
WSensor.st
WindowEvent.st
WindowGroup.st
WindowSensor.st
--- a/KeybdFwd.st	Tue Apr 23 21:41:54 1996 +0200
+++ b/KeybdFwd.st	Tue Apr 23 21:57:07 1996 +0200
@@ -64,33 +64,36 @@
     while general destinations get a #keyXXX:x:y:view: message, with the original
     view (the one in which the event occurred) as additional argument.
 
-    Instance Variables:
+    [Instance Variables:]
 
-	destinationView         <View>          the view which shall receive
-						the forwarded keyboard events.
+        destinationView         <View>          the view which shall receive
+                                                the forwarded keyboard events.
 
-	destination             <Object>        the object which shall receive
-						the forwarded keyboard events.
+        destination             <Object>        the object which shall receive
+                                                the forwarded keyboard events.
 
-	sourceView              <ViewOrNil>     if non-nil, only events from this
-						view are forwarded.
-						(currently nowhere used)
+        sourceView              <ViewOrNil>     if non-nil, only events from this
+                                                view are forwarded.
+                                                (currently nowhere used)
 
-	condition               <Symbol>        an additional condition for forwarding
-						currently only #noFocus is implemented.
-						The #noFocus condition will only forward
-						events if no explicit focus has been
-						set in the windowGroup.
+        condition               <Symbol>        an additional condition for forwarding
+                                                currently only #noFocus is implemented.
+                                                The #noFocus condition will only forward
+                                                events if no explicit focus has been
+                                                set in the windowGroup.
 
-				<Block>         condition block - event is forwarded,
-						if it evaluates to true.
-						The block gets 3 arguments:
-						    eventType   #keyPress or #keyRelease
-						    key         the key
-						    view        the originating view
+                                <Block>         condition block - event is forwarded,
+                                                if it evaluates to true.
+                                                The block gets 3 arguments:
+                                                    eventType   #keyPress or #keyRelease
+                                                    key         the key
+                                                    view        the originating view
 
     For more info on event handling/forwarding, see the documentation in
     WindowSensor, WindowGroup and especially in WindowEvent.
+
+    [see also:]
+        WindowEvent WindowSensor WindowGroup
 "
 !
 
@@ -422,5 +425,5 @@
 !KeyboardForwarder class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/Attic/KeybdFwd.st,v 1.12 1996-03-04 22:31:36 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/Attic/KeybdFwd.st,v 1.13 1996-04-23 19:56:57 cg Exp $'
 ! !
--- a/KeybdMap.st	Tue Apr 23 21:41:54 1996 +0200
+++ b/KeybdMap.st	Tue Apr 23 21:57:07 1996 +0200
@@ -11,10 +11,10 @@
 "
 
 IdentityDictionary subclass:#KeyboardMap
-	 instanceVariableNames:'current'
-	 classVariableNames:''
-	 poolDictionaries:''
-	 category:'Interface-Support'
+	instanceVariableNames:'current'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-Support'
 !
 
 !KeyboardMap class methodsFor:'documentation'!
@@ -45,17 +45,17 @@
     To add a mapping (for example, to attach the logical function 'DoIt' to
     the key-combination Cmd-'d'):
 
-	|m|
+        |m|
 
-	m := Display keyboardMap.
-	m bindValue:#DoIt to:#Cmdd.
+        m := Display keyboardMap.
+        m bindValue:#DoIt to:#Cmdd.
 
     Key sequences can also be defined (hey emacs fans ;-) as in:
 
-	|m|
+        |m|
 
-	m := Display keyboardMap.
-	m bindValue:#DoIt to:#Ctrlx followedBy:#Ctrld
+        m := Display keyboardMap.
+        m bindValue:#DoIt to:#Ctrlx followedBy:#Ctrld
 
     Key prefixes are defined in the DeviceWorkstation>>translateKey: method.
     Typical prefixes are Cmd (for Alt or Meta), Ctrl etc.
@@ -66,50 +66,72 @@
     To remove a mapping, use the same value for both logical and physical key,
     as in:
 
-	|m|
+        |m|
 
-	m := Display keyboardMap.
-	m bindValue:#Cmdd to:#Cmdd.
+        m := Display keyboardMap.
+        m bindValue:#Cmdd to:#Cmdd.
+
+    [see also:]
+        WindowEvent WindowSensor WindowGroup
+        View DeviceWorkstation
 "
 ! !
 
 !KeyboardMap methodsFor:'accessing'!
 
 bindValue:logicalKey to:aKey
+    "bind aLogicalKey to a rawKey.
+     The event mechanism uses this to pass logical keyboard events
+     to the application (such as #Copy, #Cut etc.) 
+     instead of physical ones (such as #AltC, #AltX)"
+
     aKey == logicalKey ifTrue:[
-	self removeKey:aKey
+        self removeKey:aKey
     ] ifFalse:[
-	self at:aKey put:logicalKey
+        self at:aKey put:logicalKey
     ]
+
+    "Modified: 23.4.1996 / 21:54:45 / cg"
 !
 
 bindValue:logicalKey to:key1 followedBy:key2
+    "bind aLogicalKey to a sequence of two rawKeys.
+     The event mechanism uses this to pass logical keyboard events
+     to the application (such as #Copy, #Cut etc.) 
+     instead of physical ones (such as #AltC, #AltX)"
+
     |submap|
 
     submap := self at:key1 ifAbsent:[].
     submap isNil ifTrue:[
-	submap := KeyboardMap new.
-	self at:key1 put:submap.
+        submap := KeyboardMap new.
+        self at:key1 put:submap.
     ].
     submap at:key2 put:logicalKey
+
+    "Modified: 23.4.1996 / 21:55:04 / cg"
 !
 
 valueFor:aKey
+    "retrieve a logical key"
+
     |where value|
 
     where := (current notNil ifTrue:[current] ifFalse:[self]).
 
     value := where at:aKey ifAbsent:aKey.
     (value isMemberOf:KeyboardMap) ifTrue:[
-	current := value.
-	^ nil.
+        current := value.
+        ^ nil.
     ].
     current := nil.
     ^ value
+
+    "Modified: 23.4.1996 / 21:55:22 / cg"
 ! !
 
 !KeyboardMap class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/Attic/KeybdMap.st,v 1.9 1995-11-23 17:45:09 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/Attic/KeybdMap.st,v 1.10 1996-04-23 19:56:52 cg Exp $'
 ! !
--- a/KeyboardForwarder.st	Tue Apr 23 21:41:54 1996 +0200
+++ b/KeyboardForwarder.st	Tue Apr 23 21:57:07 1996 +0200
@@ -64,33 +64,36 @@
     while general destinations get a #keyXXX:x:y:view: message, with the original
     view (the one in which the event occurred) as additional argument.
 
-    Instance Variables:
+    [Instance Variables:]
 
-	destinationView         <View>          the view which shall receive
-						the forwarded keyboard events.
+        destinationView         <View>          the view which shall receive
+                                                the forwarded keyboard events.
 
-	destination             <Object>        the object which shall receive
-						the forwarded keyboard events.
+        destination             <Object>        the object which shall receive
+                                                the forwarded keyboard events.
 
-	sourceView              <ViewOrNil>     if non-nil, only events from this
-						view are forwarded.
-						(currently nowhere used)
+        sourceView              <ViewOrNil>     if non-nil, only events from this
+                                                view are forwarded.
+                                                (currently nowhere used)
 
-	condition               <Symbol>        an additional condition for forwarding
-						currently only #noFocus is implemented.
-						The #noFocus condition will only forward
-						events if no explicit focus has been
-						set in the windowGroup.
+        condition               <Symbol>        an additional condition for forwarding
+                                                currently only #noFocus is implemented.
+                                                The #noFocus condition will only forward
+                                                events if no explicit focus has been
+                                                set in the windowGroup.
 
-				<Block>         condition block - event is forwarded,
-						if it evaluates to true.
-						The block gets 3 arguments:
-						    eventType   #keyPress or #keyRelease
-						    key         the key
-						    view        the originating view
+                                <Block>         condition block - event is forwarded,
+                                                if it evaluates to true.
+                                                The block gets 3 arguments:
+                                                    eventType   #keyPress or #keyRelease
+                                                    key         the key
+                                                    view        the originating view
 
     For more info on event handling/forwarding, see the documentation in
     WindowSensor, WindowGroup and especially in WindowEvent.
+
+    [see also:]
+        WindowEvent WindowSensor WindowGroup
 "
 !
 
@@ -422,5 +425,5 @@
 !KeyboardForwarder class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/KeyboardForwarder.st,v 1.12 1996-03-04 22:31:36 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/KeyboardForwarder.st,v 1.13 1996-04-23 19:56:57 cg Exp $'
 ! !
--- a/KeyboardMap.st	Tue Apr 23 21:41:54 1996 +0200
+++ b/KeyboardMap.st	Tue Apr 23 21:57:07 1996 +0200
@@ -11,10 +11,10 @@
 "
 
 IdentityDictionary subclass:#KeyboardMap
-	 instanceVariableNames:'current'
-	 classVariableNames:''
-	 poolDictionaries:''
-	 category:'Interface-Support'
+	instanceVariableNames:'current'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-Support'
 !
 
 !KeyboardMap class methodsFor:'documentation'!
@@ -45,17 +45,17 @@
     To add a mapping (for example, to attach the logical function 'DoIt' to
     the key-combination Cmd-'d'):
 
-	|m|
+        |m|
 
-	m := Display keyboardMap.
-	m bindValue:#DoIt to:#Cmdd.
+        m := Display keyboardMap.
+        m bindValue:#DoIt to:#Cmdd.
 
     Key sequences can also be defined (hey emacs fans ;-) as in:
 
-	|m|
+        |m|
 
-	m := Display keyboardMap.
-	m bindValue:#DoIt to:#Ctrlx followedBy:#Ctrld
+        m := Display keyboardMap.
+        m bindValue:#DoIt to:#Ctrlx followedBy:#Ctrld
 
     Key prefixes are defined in the DeviceWorkstation>>translateKey: method.
     Typical prefixes are Cmd (for Alt or Meta), Ctrl etc.
@@ -66,50 +66,72 @@
     To remove a mapping, use the same value for both logical and physical key,
     as in:
 
-	|m|
+        |m|
 
-	m := Display keyboardMap.
-	m bindValue:#Cmdd to:#Cmdd.
+        m := Display keyboardMap.
+        m bindValue:#Cmdd to:#Cmdd.
+
+    [see also:]
+        WindowEvent WindowSensor WindowGroup
+        View DeviceWorkstation
 "
 ! !
 
 !KeyboardMap methodsFor:'accessing'!
 
 bindValue:logicalKey to:aKey
+    "bind aLogicalKey to a rawKey.
+     The event mechanism uses this to pass logical keyboard events
+     to the application (such as #Copy, #Cut etc.) 
+     instead of physical ones (such as #AltC, #AltX)"
+
     aKey == logicalKey ifTrue:[
-	self removeKey:aKey
+        self removeKey:aKey
     ] ifFalse:[
-	self at:aKey put:logicalKey
+        self at:aKey put:logicalKey
     ]
+
+    "Modified: 23.4.1996 / 21:54:45 / cg"
 !
 
 bindValue:logicalKey to:key1 followedBy:key2
+    "bind aLogicalKey to a sequence of two rawKeys.
+     The event mechanism uses this to pass logical keyboard events
+     to the application (such as #Copy, #Cut etc.) 
+     instead of physical ones (such as #AltC, #AltX)"
+
     |submap|
 
     submap := self at:key1 ifAbsent:[].
     submap isNil ifTrue:[
-	submap := KeyboardMap new.
-	self at:key1 put:submap.
+        submap := KeyboardMap new.
+        self at:key1 put:submap.
     ].
     submap at:key2 put:logicalKey
+
+    "Modified: 23.4.1996 / 21:55:04 / cg"
 !
 
 valueFor:aKey
+    "retrieve a logical key"
+
     |where value|
 
     where := (current notNil ifTrue:[current] ifFalse:[self]).
 
     value := where at:aKey ifAbsent:aKey.
     (value isMemberOf:KeyboardMap) ifTrue:[
-	current := value.
-	^ nil.
+        current := value.
+        ^ nil.
     ].
     current := nil.
     ^ value
+
+    "Modified: 23.4.1996 / 21:55:22 / cg"
 ! !
 
 !KeyboardMap class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/KeyboardMap.st,v 1.9 1995-11-23 17:45:09 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/KeyboardMap.st,v 1.10 1996-04-23 19:56:52 cg Exp $'
 ! !
--- a/SWSensor.st	Tue Apr 23 21:41:54 1996 +0200
+++ b/SWSensor.st	Tue Apr 23 21:57:07 1996 +0200
@@ -11,10 +11,10 @@
 "
 
 WindowSensor subclass:#SynchronousWindowSensor
-	 instanceVariableNames:'device'
-	 classVariableNames:''
-	 poolDictionaries:''
-	 category:'Interface-Support'
+	instanceVariableNames:'device'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-Support'
 !
 
 !SynchronousWindowSensor class methodsFor:'documentation'!
@@ -330,4 +330,4 @@
 !SynchronousWindowSensor class methodsFor:'documentation'!
 
 version
-^ '$Header: /cvs/stx/stx/libview/Attic/SWSensor.st,v 1.3 1995-11-25 11:26:57 cg Exp $'! !
+^ '$Header: /cvs/stx/stx/libview/Attic/SWSensor.st,v 1.4 1996-04-23 19:56:21 cg Exp $'! !
--- a/SynchronousWindowSensor.st	Tue Apr 23 21:41:54 1996 +0200
+++ b/SynchronousWindowSensor.st	Tue Apr 23 21:57:07 1996 +0200
@@ -11,10 +11,10 @@
 "
 
 WindowSensor subclass:#SynchronousWindowSensor
-	 instanceVariableNames:'device'
-	 classVariableNames:''
-	 poolDictionaries:''
-	 category:'Interface-Support'
+	instanceVariableNames:'device'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-Support'
 !
 
 !SynchronousWindowSensor class methodsFor:'documentation'!
@@ -330,4 +330,4 @@
 !SynchronousWindowSensor class methodsFor:'documentation'!
 
 version
-^ '$Header: /cvs/stx/stx/libview/SynchronousWindowSensor.st,v 1.3 1995-11-25 11:26:57 cg Exp $'! !
+^ '$Header: /cvs/stx/stx/libview/SynchronousWindowSensor.st,v 1.4 1996-04-23 19:56:21 cg Exp $'! !
--- a/WEvent.st	Tue Apr 23 21:41:54 1996 +0200
+++ b/WEvent.st	Tue Apr 23 21:57:07 1996 +0200
@@ -49,23 +49,23 @@
 
     The algorithm for event dispatching is:
 
-	- if the destination view has a keyboard focus set,
-	  AND the event is a keyboard event,
-	  THEN recursively invoke the event dispatching method,
-	       sending the event to the focus view (or its delegate, as below)
+        - if the destination view has a keyboard focus set,
+          AND the event is a keyboard event,
+          THEN recursively invoke the event dispatching method,
+               sending the event to the focus view (or its delegate, as below)
 
-	- if the destination view has a delegate,
-	  AND its a keyboard, button or pointer event,
-	  AND the delegate is interested in that event 
-	      (i.e. implements & responds to #handlesXXX with true)
-	  THEN send the event to the delegate, passing the original view
-	       as additional argument
+        - if the destination view has a delegate,
+          AND its a keyboard, button or pointer event,
+          AND the delegate is interested in that event 
+              (i.e. implements & responds to #handlesXXX with true)
+          THEN send the event to the delegate, passing the original view
+               as additional argument
 
-	- if the view has a nonNil controller,
-	  AND its a key, button or pointer event,
-	  THEN send the event to the controller
+        - if the view has a nonNil controller,
+          AND its a key, button or pointer event,
+          THEN send the event to the controller
 
-	- otherwise send the event to the view
+        - otherwise send the event to the view
 
 
     If the view has a non-nil transformation, the event is sent as a
@@ -85,29 +85,35 @@
 
     Therefore, for a delegated keyPress messages, the flow is:
 
-	sendEvent
-	    view has delegate
-		------> ask delegate via 'handlesKeyPress:key inView:view'
-		<------ returns true
-		------> 'delegate keyPress:key x:x y:y view:view'
-			-----> delegate does whatever it wants to do
-			       (typically sends the event to some other view)
+        sendEvent
+            view has delegate
+                ------> ask delegate via 'handlesKeyPress:key inView:view'
+                <------ returns true
+                ------> 'delegate keyPress:key x:x y:y view:view'
+                        -----> delegate does whatever it wants to do
+                               (typically sends the event to some other view)
 
     for an undelegated message:
 
-	sendEvent
-	    view has delegate
-		------> ask delegate via 'handlesKeyPress:key inView:view'
-		<------ returns false
-	    view has controller
-		------> 'controller keyPress:key x:x y:y'
-	    view has no controller
-		view has transformation
-		    ----> 'view deviceKeyPress:key x:x y:y'
-			  inverse transform x/y
-			  ----> 'self keyPress:key x:xLogical y:yLogical'
-		view has no transformation
-		    ----> 'view keyPress:key x:x y:y'
+        sendEvent
+            view has delegate
+                ------> ask delegate via 'handlesKeyPress:key inView:view'
+                <------ returns false
+            view has controller
+                ------> 'controller keyPress:key x:x y:y'
+            view has no controller
+                view has transformation
+                    ----> 'view deviceKeyPress:key x:x y:y'
+                          inverse transform x/y
+                          ----> 'self keyPress:key x:xLogical y:yLogical'
+                view has no transformation
+                    ----> 'view keyPress:key x:x y:y'
+
+    [see also:]
+        WindowGroup WindowSensor
+        DeviceWorkstation View
+        KeyboardMap KeyboardForwarder EventListener
+
 "
 ! !
 
@@ -499,5 +505,5 @@
 !WindowEvent class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/Attic/WEvent.st,v 1.25 1996-03-07 13:59:00 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/Attic/WEvent.st,v 1.26 1996-04-23 19:56:12 cg Exp $'
 ! !
--- a/WGroup.st	Tue Apr 23 21:41:54 1996 +0200
+++ b/WGroup.st	Tue Apr 23 21:57:07 1996 +0200
@@ -155,7 +155,8 @@
     doc/online directory.
 
     [see also:]
-        WindowSensor DeviceWorkstation
+        WindowSensor EventListener KeyboardForwarder
+        DeviceWorkstation
         Process ProcessorScheduler
         View StandardSystemView
         ApplicationModel
@@ -1288,6 +1289,6 @@
 !WindowGroup class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/Attic/WGroup.st,v 1.75 1996-04-23 19:40:52 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/Attic/WGroup.st,v 1.76 1996-04-23 19:57:07 cg Exp $'
 ! !
 WindowGroup initialize!
--- a/WSensor.st	Tue Apr 23 21:41:54 1996 +0200
+++ b/WSensor.st	Tue Apr 23 21:57:07 1996 +0200
@@ -61,9 +61,9 @@
     a so-called 'eventListener' to get the event before it is entered into
     the queue. There are 3 possible listening hooks available:
 
-	a global EventListener - gets keybd/mouse events for all views
-	a per-sensor eventListener - gets only keybd/mouse events for this sensors wGroup
-	a per-sensor keyboardListener - only gets keyboard events for this sensors wGroup
+        a global EventListener - gets keybd/mouse events for all views
+        a per-sensor eventListener - gets only keybd/mouse events for this sensors wGroup
+        a per-sensor keyboardListener - only gets keyboard events for this sensors wGroup
 
     (actually, there are two more mechanisms, event delegation which allows
      delegation of key- and buttonEvents of a specific view,
@@ -87,85 +87,91 @@
     Read the documentation in WindowEvent for more info.
 
 
-    instance variables:
-	eventSemaphore          <Semaphore>     the semaphore to be signalled when an event
-						(or damage) arrives
+    [instance variables:]
+        eventSemaphore          <Semaphore>     the semaphore to be signalled when an event
+                                                (or damage) arrives
 
-	damage                  <Collection>    collection of damage events
+        damage                  <Collection>    collection of damage events
 
-	mouseAndKeyboard        <Collection>    collection of user events
+        mouseAndKeyboard        <Collection>    collection of user events
 
-	compressMotionEvents    <Boolean>       if true, multiple motion events are
-						compressed to one event. If false, each
-						event is handled individual.
-						(should be set to false when doing free-hand drawing)
+        compressMotionEvents    <Boolean>       if true, multiple motion events are
+                                                compressed to one event. If false, each
+                                                event is handled individual.
+                                                (should be set to false when doing free-hand drawing)
 
-	ignoreUserInput         <Boolean>       if true, key & button events are ignored
-						(usually set to true by WindowGroup, while a
-						 modalbox covers a view)
+        ignoreUserInput         <Boolean>       if true, key & button events are ignored
+                                                (usually set to true by WindowGroup, while a
+                                                 modalbox covers a view)
 
-	shiftDown               <Boolean>       true while shift/meta/control-key is pressed
-	metaDown                                (to support ST-80 style query: sensor shiftDown)
-	ctrlDown
-	altDown                                 (notice, that on most systems, alt and meta key is
-						 the same, both reported as #Alt)
+        shiftDown               <Boolean>       true while shift/meta/control-key is pressed
+        metaDown                                (to support ST-80 style query: sensor shiftDown)
+        ctrlDown
+        altDown                                 (notice, that on most systems, alt and meta key is
+                                                 the same, both reported as #Alt)
 
-	exposeEventSemaphore    <Semaphore>     X-special: semaphore to be signalled when
-						expose event arrives after a copyArea.
+        exposeEventSemaphore    <Semaphore>     X-special: semaphore to be signalled when
+                                                expose event arrives after a copyArea.
 
-	catchExpose             <Boolean>       true, while waiting for an expose event 
-						(after a copyArea)
+        catchExpose             <Boolean>       true, while waiting for an expose event 
+                                                (after a copyArea)
 
-	gotExpose               <Boolean>       set to true, when an expose event arrives
-						(after a copyarea)
+        gotExpose               <Boolean>       set to true, when an expose event arrives
+                                                (after a copyarea)
 
-	gotOtherEvent           <Boolean>       set to true if other events arrive while
-						waiting for expose (after a copyarea).
+        gotOtherEvent           <Boolean>       set to true if other events arrive while
+                                                waiting for expose (after a copyarea).
 
-	translateKeyboardEvents <Boolean>       if true, keyboard events are translated via
-						the devices leyboardMap; if false, they
-						are reported as raw-keys. Default is true.
+        translateKeyboardEvents <Boolean>       if true, keyboard events are translated via
+                                                the devices leyboardMap; if false, they
+                                                are reported as raw-keys. Default is true.
 
-	eventListener           <Object>        if non nil, this one will get all pointer
-						and keyboard events for this sensors views first.
-						If it returns true, the event is supposed to
-						be already handled by the listener and not sent to
-						the view. If false, the event is handled as usual.
-						This allows applications to catch events for any of
-						its views.
+        eventListener           <Object>        if non nil, this one will get all pointer
+                                                and keyboard events for this sensors views first.
+                                                If it returns true, the event is supposed to
+                                                be already handled by the listener and not sent to
+                                                the view. If false, the event is handled as usual.
+                                                This allows applications to catch events for any of
+                                                its views.
 
-	keyboardListener        <Object>        if non nil, this one will get all keyboard events 
-						for this sensors views first (but after the eventListener,
-						if any).
-						If it returns true, the event is supposed to
-						be already handled by the listener and not sent to
-						the view. If false, the event is handled as usual.
-						This allows applications to catch events for any of
-						its views.
-						ApplicationModels can catch keyboard input with:
-						    postOpenWith:aBuilder
-							aBuilder window sensor keyboardListener:self
+        keyboardListener        <Object>        if non nil, this one will get all keyboard events 
+                                                for this sensors views first (but after the eventListener,
+                                                if any).
+                                                If it returns true, the event is supposed to
+                                                be already handled by the listener and not sent to
+                                                the view. If false, the event is handled as usual.
+                                                This allows applications to catch events for any of
+                                                its views.
+                                                ApplicationModels can catch keyboard input with:
+                                                    postOpenWith:aBuilder
+                                                        aBuilder window sensor keyboardListener:self
 
 
-    class variables:
+    [class variables:]
 
-	ControlCEnabled         <Boolean>       if true (which is the default) Control-C
-						will interrupt the process handling the
-						view.
-						For secure stand-alone applications,
-						this can be set to false, in which case 
-						Control-C does NOT interrupt the process.
+        ControlCEnabled         <Boolean>       if true (which is the default) Control-C
+                                                will interrupt the process handling the
+                                                view.
+                                                For secure stand-alone applications,
+                                                this can be set to false, in which case 
+                                                Control-C does NOT interrupt the process.
 
-	EventListener           <Object>        if non nil, this one will get all pointer
-						and keyboard events for ALL views first.
-						If it returns true, the event is supposed to
-						be already handled by the listener and not enqueued. 
-						If false, the event is handled as usual.
-						This allows overall event catchers to be
-						installed for example to implement event
-						recorders, active help managers etc.
+        EventListener           <Object>        if non nil, this one will get all pointer
+                                                and keyboard events for ALL views first.
+                                                If it returns true, the event is supposed to
+                                                be already handled by the listener and not enqueued. 
+                                                If false, the event is handled as usual.
+                                                This allows overall event catchers to be
+                                                installed for example to implement event
+                                                recorders, active help managers etc.
 
-	ComposeTable            <Array>         compose-key translation table
+        ComposeTable            <Array>         compose-key translation table
+
+
+    [see also:]
+        WindowGroup 
+        WindowEvent KeyboardMap KeyboardForwarder EventListener
+        DeviceWorkstation View
 "
 ! !
 
@@ -1792,6 +1798,6 @@
 !WindowSensor class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/Attic/WSensor.st,v 1.51 1996-04-22 14:23:27 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/Attic/WSensor.st,v 1.52 1996-04-23 19:56:32 cg Exp $'
 ! !
 WindowSensor initialize!
--- a/WindowEvent.st	Tue Apr 23 21:41:54 1996 +0200
+++ b/WindowEvent.st	Tue Apr 23 21:57:07 1996 +0200
@@ -49,23 +49,23 @@
 
     The algorithm for event dispatching is:
 
-	- if the destination view has a keyboard focus set,
-	  AND the event is a keyboard event,
-	  THEN recursively invoke the event dispatching method,
-	       sending the event to the focus view (or its delegate, as below)
+        - if the destination view has a keyboard focus set,
+          AND the event is a keyboard event,
+          THEN recursively invoke the event dispatching method,
+               sending the event to the focus view (or its delegate, as below)
 
-	- if the destination view has a delegate,
-	  AND its a keyboard, button or pointer event,
-	  AND the delegate is interested in that event 
-	      (i.e. implements & responds to #handlesXXX with true)
-	  THEN send the event to the delegate, passing the original view
-	       as additional argument
+        - if the destination view has a delegate,
+          AND its a keyboard, button or pointer event,
+          AND the delegate is interested in that event 
+              (i.e. implements & responds to #handlesXXX with true)
+          THEN send the event to the delegate, passing the original view
+               as additional argument
 
-	- if the view has a nonNil controller,
-	  AND its a key, button or pointer event,
-	  THEN send the event to the controller
+        - if the view has a nonNil controller,
+          AND its a key, button or pointer event,
+          THEN send the event to the controller
 
-	- otherwise send the event to the view
+        - otherwise send the event to the view
 
 
     If the view has a non-nil transformation, the event is sent as a
@@ -85,29 +85,35 @@
 
     Therefore, for a delegated keyPress messages, the flow is:
 
-	sendEvent
-	    view has delegate
-		------> ask delegate via 'handlesKeyPress:key inView:view'
-		<------ returns true
-		------> 'delegate keyPress:key x:x y:y view:view'
-			-----> delegate does whatever it wants to do
-			       (typically sends the event to some other view)
+        sendEvent
+            view has delegate
+                ------> ask delegate via 'handlesKeyPress:key inView:view'
+                <------ returns true
+                ------> 'delegate keyPress:key x:x y:y view:view'
+                        -----> delegate does whatever it wants to do
+                               (typically sends the event to some other view)
 
     for an undelegated message:
 
-	sendEvent
-	    view has delegate
-		------> ask delegate via 'handlesKeyPress:key inView:view'
-		<------ returns false
-	    view has controller
-		------> 'controller keyPress:key x:x y:y'
-	    view has no controller
-		view has transformation
-		    ----> 'view deviceKeyPress:key x:x y:y'
-			  inverse transform x/y
-			  ----> 'self keyPress:key x:xLogical y:yLogical'
-		view has no transformation
-		    ----> 'view keyPress:key x:x y:y'
+        sendEvent
+            view has delegate
+                ------> ask delegate via 'handlesKeyPress:key inView:view'
+                <------ returns false
+            view has controller
+                ------> 'controller keyPress:key x:x y:y'
+            view has no controller
+                view has transformation
+                    ----> 'view deviceKeyPress:key x:x y:y'
+                          inverse transform x/y
+                          ----> 'self keyPress:key x:xLogical y:yLogical'
+                view has no transformation
+                    ----> 'view keyPress:key x:x y:y'
+
+    [see also:]
+        WindowGroup WindowSensor
+        DeviceWorkstation View
+        KeyboardMap KeyboardForwarder EventListener
+
 "
 ! !
 
@@ -499,5 +505,5 @@
 !WindowEvent class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/WindowEvent.st,v 1.25 1996-03-07 13:59:00 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/WindowEvent.st,v 1.26 1996-04-23 19:56:12 cg Exp $'
 ! !
--- a/WindowGroup.st	Tue Apr 23 21:41:54 1996 +0200
+++ b/WindowGroup.st	Tue Apr 23 21:57:07 1996 +0200
@@ -155,7 +155,8 @@
     doc/online directory.
 
     [see also:]
-        WindowSensor DeviceWorkstation
+        WindowSensor EventListener KeyboardForwarder
+        DeviceWorkstation
         Process ProcessorScheduler
         View StandardSystemView
         ApplicationModel
@@ -1288,6 +1289,6 @@
 !WindowGroup class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/WindowGroup.st,v 1.75 1996-04-23 19:40:52 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/WindowGroup.st,v 1.76 1996-04-23 19:57:07 cg Exp $'
 ! !
 WindowGroup initialize!
--- a/WindowSensor.st	Tue Apr 23 21:41:54 1996 +0200
+++ b/WindowSensor.st	Tue Apr 23 21:57:07 1996 +0200
@@ -61,9 +61,9 @@
     a so-called 'eventListener' to get the event before it is entered into
     the queue. There are 3 possible listening hooks available:
 
-	a global EventListener - gets keybd/mouse events for all views
-	a per-sensor eventListener - gets only keybd/mouse events for this sensors wGroup
-	a per-sensor keyboardListener - only gets keyboard events for this sensors wGroup
+        a global EventListener - gets keybd/mouse events for all views
+        a per-sensor eventListener - gets only keybd/mouse events for this sensors wGroup
+        a per-sensor keyboardListener - only gets keyboard events for this sensors wGroup
 
     (actually, there are two more mechanisms, event delegation which allows
      delegation of key- and buttonEvents of a specific view,
@@ -87,85 +87,91 @@
     Read the documentation in WindowEvent for more info.
 
 
-    instance variables:
-	eventSemaphore          <Semaphore>     the semaphore to be signalled when an event
-						(or damage) arrives
+    [instance variables:]
+        eventSemaphore          <Semaphore>     the semaphore to be signalled when an event
+                                                (or damage) arrives
 
-	damage                  <Collection>    collection of damage events
+        damage                  <Collection>    collection of damage events
 
-	mouseAndKeyboard        <Collection>    collection of user events
+        mouseAndKeyboard        <Collection>    collection of user events
 
-	compressMotionEvents    <Boolean>       if true, multiple motion events are
-						compressed to one event. If false, each
-						event is handled individual.
-						(should be set to false when doing free-hand drawing)
+        compressMotionEvents    <Boolean>       if true, multiple motion events are
+                                                compressed to one event. If false, each
+                                                event is handled individual.
+                                                (should be set to false when doing free-hand drawing)
 
-	ignoreUserInput         <Boolean>       if true, key & button events are ignored
-						(usually set to true by WindowGroup, while a
-						 modalbox covers a view)
+        ignoreUserInput         <Boolean>       if true, key & button events are ignored
+                                                (usually set to true by WindowGroup, while a
+                                                 modalbox covers a view)
 
-	shiftDown               <Boolean>       true while shift/meta/control-key is pressed
-	metaDown                                (to support ST-80 style query: sensor shiftDown)
-	ctrlDown
-	altDown                                 (notice, that on most systems, alt and meta key is
-						 the same, both reported as #Alt)
+        shiftDown               <Boolean>       true while shift/meta/control-key is pressed
+        metaDown                                (to support ST-80 style query: sensor shiftDown)
+        ctrlDown
+        altDown                                 (notice, that on most systems, alt and meta key is
+                                                 the same, both reported as #Alt)
 
-	exposeEventSemaphore    <Semaphore>     X-special: semaphore to be signalled when
-						expose event arrives after a copyArea.
+        exposeEventSemaphore    <Semaphore>     X-special: semaphore to be signalled when
+                                                expose event arrives after a copyArea.
 
-	catchExpose             <Boolean>       true, while waiting for an expose event 
-						(after a copyArea)
+        catchExpose             <Boolean>       true, while waiting for an expose event 
+                                                (after a copyArea)
 
-	gotExpose               <Boolean>       set to true, when an expose event arrives
-						(after a copyarea)
+        gotExpose               <Boolean>       set to true, when an expose event arrives
+                                                (after a copyarea)
 
-	gotOtherEvent           <Boolean>       set to true if other events arrive while
-						waiting for expose (after a copyarea).
+        gotOtherEvent           <Boolean>       set to true if other events arrive while
+                                                waiting for expose (after a copyarea).
 
-	translateKeyboardEvents <Boolean>       if true, keyboard events are translated via
-						the devices leyboardMap; if false, they
-						are reported as raw-keys. Default is true.
+        translateKeyboardEvents <Boolean>       if true, keyboard events are translated via
+                                                the devices leyboardMap; if false, they
+                                                are reported as raw-keys. Default is true.
 
-	eventListener           <Object>        if non nil, this one will get all pointer
-						and keyboard events for this sensors views first.
-						If it returns true, the event is supposed to
-						be already handled by the listener and not sent to
-						the view. If false, the event is handled as usual.
-						This allows applications to catch events for any of
-						its views.
+        eventListener           <Object>        if non nil, this one will get all pointer
+                                                and keyboard events for this sensors views first.
+                                                If it returns true, the event is supposed to
+                                                be already handled by the listener and not sent to
+                                                the view. If false, the event is handled as usual.
+                                                This allows applications to catch events for any of
+                                                its views.
 
-	keyboardListener        <Object>        if non nil, this one will get all keyboard events 
-						for this sensors views first (but after the eventListener,
-						if any).
-						If it returns true, the event is supposed to
-						be already handled by the listener and not sent to
-						the view. If false, the event is handled as usual.
-						This allows applications to catch events for any of
-						its views.
-						ApplicationModels can catch keyboard input with:
-						    postOpenWith:aBuilder
-							aBuilder window sensor keyboardListener:self
+        keyboardListener        <Object>        if non nil, this one will get all keyboard events 
+                                                for this sensors views first (but after the eventListener,
+                                                if any).
+                                                If it returns true, the event is supposed to
+                                                be already handled by the listener and not sent to
+                                                the view. If false, the event is handled as usual.
+                                                This allows applications to catch events for any of
+                                                its views.
+                                                ApplicationModels can catch keyboard input with:
+                                                    postOpenWith:aBuilder
+                                                        aBuilder window sensor keyboardListener:self
 
 
-    class variables:
+    [class variables:]
 
-	ControlCEnabled         <Boolean>       if true (which is the default) Control-C
-						will interrupt the process handling the
-						view.
-						For secure stand-alone applications,
-						this can be set to false, in which case 
-						Control-C does NOT interrupt the process.
+        ControlCEnabled         <Boolean>       if true (which is the default) Control-C
+                                                will interrupt the process handling the
+                                                view.
+                                                For secure stand-alone applications,
+                                                this can be set to false, in which case 
+                                                Control-C does NOT interrupt the process.
 
-	EventListener           <Object>        if non nil, this one will get all pointer
-						and keyboard events for ALL views first.
-						If it returns true, the event is supposed to
-						be already handled by the listener and not enqueued. 
-						If false, the event is handled as usual.
-						This allows overall event catchers to be
-						installed for example to implement event
-						recorders, active help managers etc.
+        EventListener           <Object>        if non nil, this one will get all pointer
+                                                and keyboard events for ALL views first.
+                                                If it returns true, the event is supposed to
+                                                be already handled by the listener and not enqueued. 
+                                                If false, the event is handled as usual.
+                                                This allows overall event catchers to be
+                                                installed for example to implement event
+                                                recorders, active help managers etc.
 
-	ComposeTable            <Array>         compose-key translation table
+        ComposeTable            <Array>         compose-key translation table
+
+
+    [see also:]
+        WindowGroup 
+        WindowEvent KeyboardMap KeyboardForwarder EventListener
+        DeviceWorkstation View
 "
 ! !
 
@@ -1792,6 +1798,6 @@
 !WindowSensor class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/WindowSensor.st,v 1.51 1996-04-22 14:23:27 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/WindowSensor.st,v 1.52 1996-04-23 19:56:32 cg Exp $'
 ! !
 WindowSensor initialize!