#BUGFIX by Stefan Reise
care about user defined scaling
class: DeviceWorkstation
class definition
added: #rectangleFromUser:keepExtent:scaleFactor:
changed: #rectangleFromUser:keepExtent:
class: DeviceWorkstation class
added: #scaleFactorForRootDisplayCoordinates
--- a/DeviceWorkstation.st Sat Nov 02 15:27:40 2019 +0100
+++ b/DeviceWorkstation.st Thu Nov 14 13:46:37 2019 +0100
@@ -22,15 +22,15 @@
resolutionHor resolutionVer lastId lastView knownViews
dispatching dispatchProcess exitOnLastClose ctrlDown leftCtrlDown
rightCtrlDown shiftDown leftShiftDown rightShiftDown metaDown
- altDown superDown motionEventCompression keyboardMap modifiedMap rootView
- isSlow activeKeyboardGrab activePointerGrab buttonTranslation
- multiClickTimeDelta altModifiers metaModifiers ctrlModifiers
- shiftModifiers superModifiers buttonModifiers supportsDeepIcons
- preferredIconSize ditherColors fixColors numFixRed numFixGreen
- numFixBlue fixGrayColors copyBuffer blackColor whiteColor
- focusMode activeView clipBoardEncoding maxClipBoardSize focusView
- focusWindowGroup deviceErrorSignal deviceIOErrorSignal
- mayOpenDebugger suppressDebugger eventSema
+ altDown superDown motionEventCompression keyboardMap modifiedMap
+ rootView isSlow activeKeyboardGrab activePointerGrab
+ buttonTranslation multiClickTimeDelta altModifiers metaModifiers
+ ctrlModifiers shiftModifiers superModifiers buttonModifiers
+ supportsDeepIcons preferredIconSize ditherColors fixColors
+ numFixRed numFixGreen numFixBlue fixGrayColors copyBuffer
+ blackColor whiteColor focusMode activeView clipBoardEncoding
+ maxClipBoardSize focusView focusWindowGroup deviceErrorSignal
+ deviceIOErrorSignal mayOpenDebugger suppressDebugger eventSema
buttonLongPressedHandlerProcess buttonPressTimeForMenu
aboutToOpenModalWindowHooks aboutToOpenNonModalWindowHooks'
classVariableNames:'AllScreens ButtonTranslation CopyBufferHistory
@@ -957,6 +957,19 @@
^ #unknown
"Modified (comment): / 17-05-2017 / 18:25:06 / mawalch"
+!
+
+scaleFactorForRootDisplayCoordinates
+ "this is the factor we need to adopt for the root display coordinates,
+ if windows did scale the application"
+
+ "
+ self scaleFactorForRootDisplayCoordinates
+ "
+
+ ^ 1@1
+
+ "Created: / 14-11-2019 / 13:43:12 / Stefan Reise"
! !
!DeviceWorkstation class methodsFor:'standalone setup'!
@@ -6912,7 +6925,24 @@
"Modified: 24.7.1997 / 16:04:54 / cg"
!
-rectangleFromUser:initialRectangle keepExtent:keepExtent
+rectangleFromUser:initialRectangle
+ keepExtent:keepExtent
+
+ ^ self
+ rectangleFromUser:initialRectangle
+ keepExtent:keepExtent
+ scaleFactor:self class scaleFactorForRootDisplayCoordinates
+
+ "Created: / 24-07-1997 / 15:26:47 / cg"
+ "Modified: / 10-09-1998 / 17:38:41 / cg"
+ "Modified: / 23-02-2017 / 13:30:21 / stefan"
+ "Modified: / 14-11-2019 / 13:43:28 / Stefan Reise"
+!
+
+rectangleFromUser:initialRectangle
+ keepExtent:keepExtent
+ scaleFactor:scaleFactor
+
"{ Pragma: +optSpace }"
"let user specify a rectangle on the screen, return the rectangle.
@@ -6927,9 +6957,9 @@
doRegrab := self class ~~ WinWorkstation.
keepExtent ifTrue:[
- curs1 := Cursor origin
+ curs1 := Cursor origin
] ifFalse:[
- curs1 := Cursor corner
+ curs1 := Cursor corner
].
curs1 := curs1 onDevice:self.
root := self rootView.
@@ -6945,91 +6975,91 @@
delay := Delay forSeconds:0.05.
root xoring:[
- |left right top bottom newOrigin newCorner p curs|
-
- keepExtent ifFalse:[
- corner := origin.
- rect := origin corner:corner.
- root displayRectangle:rect.
- ].
-
- prevGrab := activePointerGrab.
- self grabPointerInView:root withCursor:curs1.
-
- "
- just in case; wait for button to be down ...
- "
- [self leftButtonPressed] whileFalse:[delay wait].
-
- keepExtent ifTrue:[
- p := self pointerPosition.
- origin := p.
- corner := origin + initialRectangle extent.
- rect := origin corner:corner.
- root displayRectangle:rect.
- ].
-
- [self leftButtonPressed] whileTrue:[
- left := initialRectangle origin x.
- top := initialRectangle origin y.
- right := initialRectangle corner x.
- bottom := initialRectangle corner y.
-
- p := self pointerPosition.
- keepExtent ifTrue:[
- newOrigin := p.
- newCorner := newOrigin + initialRectangle extent.
- curs := curs1.
- ] ifFalse:[
- p x < initialRectangle left ifTrue:[
- p y < initialRectangle top ifTrue:[
- curs := Cursor topLeft.
- left := p x.
- top := p y.
- ] ifFalse:[
- curs := Cursor bottomLeft.
- left := p x.
- bottom := p y
- ]
- ] ifFalse:[
- p y < initialRectangle top ifTrue:[
- curs := Cursor topRight.
- right := p x.
- top := p y
- ] ifFalse:[
- curs := Cursor bottomRight.
- right := p x.
- bottom := p y
- ]
- ].
-
- newOrigin := left @ top.
- newCorner := right @ bottom.
- ].
-
- ((newOrigin ~= origin) or:[newCorner ~= corner]) ifTrue:[
- root displayRectangle:rect.
- doRegrab ifTrue:[
- self grabPointerInView:root withCursor:curs1.
- ].
-
- origin := newOrigin.
- corner := newCorner.
- rect := origin corner:corner.
- root displayRectangle:rect.
- self disposeButtonEventsFor:nil.
- self flush.
- ] ifFalse:[
- delay wait.
- ]
- ].
- root displayRectangle:rect.
+ |left right top bottom newOrigin newCorner p curs|
+
+ keepExtent ifFalse:[
+ corner := origin.
+ rect := origin corner:corner.
+ root displayRectangle:rect.
+ ].
+
+ prevGrab := activePointerGrab.
+ self grabPointerInView:root withCursor:curs1.
+
+ "
+ just in case; wait for button to be down ...
+ "
+ [self leftButtonPressed] whileFalse:[delay wait].
+
+ keepExtent ifTrue:[
+ p := (self pointerPosition * scaleFactor) rounded.
+ origin := p.
+ corner := origin + initialRectangle extent.
+ rect := origin corner:corner.
+ root displayRectangle:rect.
+ ].
+
+ [self leftButtonPressed] whileTrue:[
+ left := initialRectangle origin x.
+ top := initialRectangle origin y.
+ right := initialRectangle corner x.
+ bottom := initialRectangle corner y.
+
+ p := (self pointerPosition * scaleFactor) rounded.
+ keepExtent ifTrue:[
+ newOrigin := p.
+ newCorner := newOrigin + initialRectangle extent.
+ curs := curs1.
+ ] ifFalse:[
+ p x < initialRectangle left ifTrue:[
+ p y < initialRectangle top ifTrue:[
+ curs := Cursor topLeft.
+ left := p x.
+ top := p y.
+ ] ifFalse:[
+ curs := Cursor bottomLeft.
+ left := p x.
+ bottom := p y
+ ]
+ ] ifFalse:[
+ p y < initialRectangle top ifTrue:[
+ curs := Cursor topRight.
+ right := p x.
+ top := p y
+ ] ifFalse:[
+ curs := Cursor bottomRight.
+ right := p x.
+ bottom := p y
+ ]
+ ].
+
+ newOrigin := left @ top.
+ newCorner := right @ bottom.
+ ].
+
+ ((newOrigin ~= origin) or:[newCorner ~= corner]) ifTrue:[
+ root displayRectangle:rect.
+ doRegrab ifTrue:[
+ self grabPointerInView:root withCursor:curs1.
+ ].
+
+ origin := newOrigin.
+ corner := newCorner.
+ rect := origin corner:corner.
+ root displayRectangle:rect.
+ self disposeButtonEventsFor:nil.
+ self flush.
+ ] ifFalse:[
+ delay wait.
+ ]
+ ].
+ root displayRectangle:rect.
].
self ungrabPointer.
prevGrab notNil ifTrue:[
- self grabPointerInView:prevGrab
+ self grabPointerInView:prevGrab
].
"flush all events pending on my display"
@@ -7047,9 +7077,7 @@
Display rectangleFromUser:(100@100 corner:300@300) keepExtent:true
"
- "Created: / 24-07-1997 / 15:26:47 / cg"
- "Modified: / 10-09-1998 / 17:38:41 / cg"
- "Modified: / 23-02-2017 / 13:30:21 / stefan"
+ "Created: / 14-11-2019 / 13:40:45 / Stefan Reise"
!
topviewFromUser