DisplaySurface.st
changeset 5081 8902ec02fcea
parent 5009 27278b9816f7
child 5136 f94308afc935
--- a/DisplaySurface.st	Thu Nov 06 12:00:33 2008 +0100
+++ b/DisplaySurface.st	Sun Nov 09 12:30:41 2008 +0100
@@ -12,8 +12,8 @@
 "{ Package: 'stx:libview' }"
 
 GraphicsMedium subclass:#DisplaySurface
-	instanceVariableNames:'viewBackground cursor eventMask moreAttributes unused1
-		uuid backed flags delegate updateRegion'
+	instanceVariableNames:'viewBackground cursor eventMask moreAttributes unused1 uuid
+		backed flags delegate updateRegion'
 	classVariableNames:'SaveUnderFlagMask GotExposeFlagMask'
 	poolDictionaries:''
 	category:'Graphics-Support'
@@ -785,12 +785,6 @@
     ^ flags bitTest:GotExposeFlagMask.
 !
 
-setGotExposeFlag
-    "internal; used to wait for an expose-event after a scroll operation"
-
-    flags := flags bitOr:GotExposeFlagMask.
-!
-
 setAttribute:key to:newValue
     newValue isNil ifTrue:[
 	moreAttributes notNil ifTrue:[
@@ -805,6 +799,12 @@
 	].
 	moreAttributes at:key put:newValue.
     ].
+!
+
+setGotExposeFlag
+    "internal; used to wait for an expose-event after a scroll operation"
+
+    flags := flags bitOr:GotExposeFlagMask.
 ! !
 
 !DisplaySurface methodsFor:'button menus'!
@@ -1378,100 +1378,104 @@
      rect x y w h delegatedEvent rgn|
 
     type == #damage ifTrue:[
-	"/ OLDdamage scheme - this will vanish
-	self shown ifTrue:[
-	    rect := argArray.
-	    x := rect left.
-	    y := rect top.
-	    w := rect width.
-	    h := rect height.
-	    transformation notNil ifTrue:[
-		self deviceExposeX:x y:y width:w height:h
-	    ] ifFalse:[
-		self exposeX:x y:y width:w height:h
-	    ]
-	].
-	^ self
+        "/ OLDdamage scheme - this will vanish
+        self shown ifTrue:[
+            rect := argArray.
+            x := rect left.
+            y := rect top.
+            w := rect width.
+            h := rect height.
+            transformation notNil ifTrue:[
+                self deviceExposeX:x y:y width:w height:h
+            ] ifFalse:[
+                self exposeX:x y:y width:w height:h
+            ]
+        ].
+        ^ self
     ].
 
     type == #newDamage ifTrue:[
-	"/ New damage scheme
-	rgn := updateRegion.
-	updateRegion := nil.
-	self shown ifTrue:[
-	    rgn notNil ifTrue:[
-		rgn do:[:rect |
-		    x := rect left.
-		    y := rect top.
-		    w := rect width.
-		    h := rect height.
-		    transformation notNil ifTrue:[
-			self deviceExposeX:x y:y width:w height:h
-		    ] ifFalse:[
-			self exposeX:x y:y width:w height:h
-		    ]
-		]
-	    ]
-	].
-	^ self
+        "/ New damage scheme
+        rgn := updateRegion.
+        updateRegion := nil.
+        self shown ifTrue:[
+            rgn notNil ifTrue:[
+                rgn do:[:rect |
+                    "/ cg: I think the check for being realized may not be enough;
+                    "/ there is a race here, if the view gets closed, while in the loop...
+                    realized ifTrue:[
+                        x := rect left.
+                        y := rect top.
+                        w := rect width.
+                        h := rect height.
+                        transformation notNil ifTrue:[
+                            self deviceExposeX:x y:y width:w height:h
+                        ] ifFalse:[
+                            self exposeX:x y:y width:w height:h
+                        ]
+                    ]
+                ]
+            ]
+        ].
+        ^ self
     ].
 
     isKeyEvent := isButtonEvent := isPointerEvent := false.
 
     (type == #'keyPress:x:y:') ifTrue:[
-	isKeyEvent := true.
-	deviceMessage := #'deviceKeyPress:x:y:'.
-	delegateMessage := #'keyPress:x:y:view:'.
-	delegateQuery := #'handlesKeyPress:inView:'.
+        isKeyEvent := true.
+        deviceMessage := #'deviceKeyPress:x:y:'.
+        delegateMessage := #'keyPress:x:y:view:'.
+        delegateQuery := #'handlesKeyPress:inView:'.
     ] ifFalse:[ (type == #'keyRelease:x:y:') ifTrue:[
-	isKeyEvent := true.
-	deviceMessage := #'deviceKeyRelease:x:y:'.
-	delegateMessage := #'keyRelease:x:y:view:'.
-	delegateQuery := #'handlesKeyRelease:inView:'.
+        isKeyEvent := true.
+        deviceMessage := #'deviceKeyRelease:x:y:'.
+        delegateMessage := #'keyRelease:x:y:view:'.
+        delegateQuery := #'handlesKeyRelease:inView:'.
     ] ifFalse:[ (type == #'buttonMotion:x:y:') ifTrue:[
-	isButtonEvent := true.
-	deviceMessage := #'deviceButtonMotion:x:y:'.
-	delegateMessage := #'buttonMotion:x:y:view:'.
-	delegateQuery := #'handlesButtonMotion:inView:'.
+        isButtonEvent := true.
+        deviceMessage := #'deviceButtonMotion:x:y:'.
+        delegateMessage := #'buttonMotion:x:y:view:'.
+        delegateQuery := #'handlesButtonMotion:inView:'.
     ] ifFalse:[ (type == #'buttonPress:x:y:') ifTrue:[
-	isButtonEvent := true.
-	deviceMessage := #'deviceButtonPress:x:y:'.
-	delegateMessage := #'buttonPress:x:y:view:'.
-	delegateQuery := #'handlesButtonPress:inView:'.
+        isButtonEvent := true.
+        deviceMessage := #'deviceButtonPress:x:y:'.
+        delegateMessage := #'buttonPress:x:y:view:'.
+        delegateQuery := #'handlesButtonPress:inView:'.
     ] ifFalse:[ (type == #'buttonRelease:x:y:') ifTrue:[
-	isButtonEvent := true.
-	deviceMessage := #'deviceButtonRelease:x:y:'.
-	delegateMessage := #'buttonRelease:x:y:view:'.
-	delegateQuery := #'handlesButtonRelease:inView:'.
+        isButtonEvent := true.
+        deviceMessage := #'deviceButtonRelease:x:y:'.
+        delegateMessage := #'buttonRelease:x:y:view:'.
+        delegateQuery := #'handlesButtonRelease:inView:'.
     ] ifFalse:[ (type == #'buttonShiftPress:x:y:') ifTrue:[
-	isButtonEvent := true.
-	deviceMessage := #'deviceButtonShiftPress:x:y:'.
-	delegateMessage := #'buttonShiftPress:x:y:view:'.
-	delegateQuery := #'handlesButtonShiftPress:inView:'.
+        isButtonEvent := true.
+        deviceMessage := #'deviceButtonShiftPress:x:y:'.
+        delegateMessage := #'buttonShiftPress:x:y:view:'.
+        delegateQuery := #'handlesButtonShiftPress:inView:'.
     ] ifFalse:[ (type == #'buttonMultiPress:x:y:') ifTrue:[
-	isButtonEvent := true.
-	deviceMessage := #'deviceButtonMultiPress:x:y:'.
-	delegateMessage := #'buttonMultiPress:x:y:view:'.
-	delegateQuery := #'handlesButtonMultiPress:inView:'.
+        isButtonEvent := true.
+        deviceMessage := #'deviceButtonMultiPress:x:y:'.
+        delegateMessage := #'buttonMultiPress:x:y:view:'.
+        delegateQuery := #'handlesButtonMultiPress:inView:'.
     ] ifFalse:[ (type == #mouseWheelMotion:x:y:amount:deltaTime:) ifTrue:[
-	isButtonEvent := true.
-	deviceMessage := type.
-	delegateMessage := #mouseWheelMotion:x:y:amount:deltaTime:view:.
-	delegateQuery := #handlesMouseWheelMotion:inView:.
+        isButtonEvent := true.
+        deviceMessage := type.
+        delegateMessage := #mouseWheelMotion:x:y:amount:deltaTime:view:.
+        delegateQuery := #handlesMouseWheelMotion:inView:.
     ] ifFalse:[ (type == #'pointerEnter:x:y:') ifTrue:[
-	isPointerEvent := true.
-	deviceMessage := #'devicePointerEnter:x:y:'.
-	delegateMessage := #'pointerEnter:x:y:view:'.
-	delegateQuery := #'handlesPointerEnter:inView:'.
+        isPointerEvent := true.
+        deviceMessage := #'devicePointerEnter:x:y:'.
+        delegateMessage := #'pointerEnter:x:y:view:'.
+        delegateQuery := #'handlesPointerEnter:inView:'.
     ] ifFalse:[ (type == #'pointerLeave:') ifTrue:[
-	isPointerEvent := true.
-	deviceMessage := type.
-	delegateMessage := #'pointerLeave:view:'.
-	delegateQuery := #'handlesPointerLeave:inView:'.
+        isPointerEvent := true.
+        deviceMessage := type.
+        delegateMessage := #'pointerLeave:view:'.
+        delegateQuery := #'handlesPointerLeave:inView:'.
     ] ifFalse:[ (type == #'exposeX:y:width:height:') ifTrue:[
-	deviceMessage := #'deviceExposeX:y:width:height:'.
+        deviceMessage := #'deviceExposeX:y:width:height:'.
     ] ifFalse:[ (type == #'graphicsExposeX:y:width:height:final:') ifTrue:[
-	deviceMessage := #'deviceGraphicsExposeX:y:width:height:final:'.
+        deviceMessage := #'deviceGraphicsExposeX:y:width:height:final:'.
     ]]]]]]]]]]]].
 
     "
@@ -1481,61 +1485,61 @@
      the focusView (0 @ 0) is passed as x/y coordinates.
     "
     (focusView notNil and:[self ~~ focusView]) ifTrue:[
-	(isKeyEvent or:[type == #mouseWheelMotion:x:y:amount:deltaTime:]) ifTrue:[
-	    delegatedEvent := ev shallowCopy.
-	    delegatedEvent delegatedFrom:ev.
-
-	    isKeyEvent ifTrue:[
-		delegatedEvent arguments:(Array with:(argArray at:1) with:-1 with:-1)
-	    ].
-	    focusView
-		dispatchEvent:delegatedEvent
-		withFocusOn:nil
-		delegate:doDelegate.
-	    ^ self
-	].
+        (isKeyEvent or:[type == #mouseWheelMotion:x:y:amount:deltaTime:]) ifTrue:[
+            delegatedEvent := ev shallowCopy.
+            delegatedEvent delegatedFrom:ev.
+
+            isKeyEvent ifTrue:[
+                delegatedEvent arguments:(Array with:(argArray at:1) with:-1 with:-1)
+            ].
+            focusView
+                dispatchEvent:delegatedEvent
+                withFocusOn:nil
+                delegate:doDelegate.
+            ^ self
+        ].
     ].
 
     doDelegate ifTrue:[
-	"
-	 handle delegated messages
-	"
-	(isKeyEvent
-	 or:[isButtonEvent
-	 or:[isPointerEvent]]) ifTrue:[
-	    delegate := self delegate.
-
-	    "
-	     what a kludge - sending to delegate requires
-	     another selector and an additional argument ...
-	    "
-	    (delegate notNil
-	    and:[delegate respondsTo:delegateMessage]) ifTrue:[
-		"
-		 is the delegate interested in that event ?
-		 (if it does not respond to the handlesXXX message,
-		  we assume: NO)
-		"
-		((delegate respondsTo:delegateQuery)
-		and:[delegate perform:delegateQuery with:(argArray at:1) with:self]) ifTrue:[
-		    "
-		     mhmh ... have to convert to logical coordinates
-		    "
-		    transformation notNil ifTrue:[
-			argArray size > 2 ifTrue:[
-			    argArray at:2 put:(transformation applyInverseToX:(argArray at:2)).
-			    argArray at:3 put:(transformation applyInverseToY:(argArray at:3)).
-			].
-		    ].
-		    argArray isNil ifTrue:[
-			delegate perform:delegateMessage with:self
-		    ] ifFalse:[
-			delegate perform:delegateMessage withArguments:(argArray copyWith:self)
-		    ].
-		    ^ self
-		]
-	    ].
-	].
+        "
+         handle delegated messages
+        "
+        (isKeyEvent
+         or:[isButtonEvent
+         or:[isPointerEvent]]) ifTrue:[
+            delegate := self delegate.
+
+            "
+             what a kludge - sending to delegate requires
+             another selector and an additional argument ...
+            "
+            (delegate notNil
+            and:[delegate respondsTo:delegateMessage]) ifTrue:[
+                "
+                 is the delegate interested in that event ?
+                 (if it does not respond to the handlesXXX message,
+                  we assume: NO)
+                "
+                ((delegate respondsTo:delegateQuery)
+                and:[delegate perform:delegateQuery with:(argArray at:1) with:self]) ifTrue:[
+                    "
+                     mhmh ... have to convert to logical coordinates
+                    "
+                    transformation notNil ifTrue:[
+                        argArray size > 2 ifTrue:[
+                            argArray at:2 put:(transformation applyInverseToX:(argArray at:2)).
+                            argArray at:3 put:(transformation applyInverseToY:(argArray at:3)).
+                        ].
+                    ].
+                    argArray isNil ifTrue:[
+                        delegate perform:delegateMessage with:self
+                    ] ifFalse:[
+                        delegate perform:delegateMessage withArguments:(argArray copyWith:self)
+                    ].
+                    ^ self
+                ]
+            ].
+        ].
     ].
 
     "
@@ -1544,9 +1548,9 @@
     (isKeyEvent
      or:[isButtonEvent
      or:[isPointerEvent]]) ifTrue:[
-	realized ifFalse:[
-	    ^ self
-	]
+        realized ifFalse:[
+            ^ self
+        ]
     ].
 
     "
@@ -1554,13 +1558,13 @@
     "
     eventReceiver := self.
     (controller := self controller) notNil ifTrue:[
-	(isKeyEvent
-	 or:[isButtonEvent
-	 or:[isPointerEvent
-	 or:[(type == #focusIn)
-	 or:[(type == #focusOut)]]]]) ifTrue:[
-	    eventReceiver := controller.
-	]
+        (isKeyEvent
+         or:[isButtonEvent
+         or:[isPointerEvent
+         or:[(type == #focusIn)
+         or:[(type == #focusOut)]]]]) ifTrue:[
+            eventReceiver := controller.
+        ]
     ].
 
     "
@@ -1576,13 +1580,13 @@
     selector := type.
 
     transformation notNil ifTrue:[
-	(isKeyEvent
-	 or:[isButtonEvent
-	 or:[isPointerEvent
-	 or:[(type == #'exposeX:y:width:height:')
-	 or:[(type == #'graphicsExposeX:y:width:height:final:')]]]]) ifTrue:[
-	    selector := deviceMessage
-	]
+        (isKeyEvent
+         or:[isButtonEvent
+         or:[isPointerEvent
+         or:[(type == #'exposeX:y:width:height:')
+         or:[(type == #'graphicsExposeX:y:width:height:final:')]]]]) ifTrue:[
+            selector := deviceMessage
+        ]
     ].
 
     eventReceiver perform:selector withArguments:argArray
@@ -2506,7 +2510,7 @@
 !DisplaySurface class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/DisplaySurface.st,v 1.137 2008-07-23 12:00:52 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/DisplaySurface.st,v 1.138 2008-11-09 11:30:41 cg Exp $'
 ! !
 
 DisplaySurface initialize!