diff -r 1974c938a923 -r 8902ec02fcea DisplaySurface.st --- 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!