Working with my MacBook Air (Sierra 10.12.1)
When I move slowly the mouse wheel on a control, MouseWheel event fires. As it should be.
But deltaX and deltaY (both) are equal to zero.
Is it normal? I am not a regular Mac user and probably I should configure something.
Any hint about what I am doing wrong?
If I move the wheel quickly everything works as expected, although what really happens is this:
one call to Function MouseWheel with deltaX = deltaY = 0 and a second call to the same function with deltaY = something
Here’s some code I found to read the deltas off the mouse wheel NSEvent, which come in as Singles. This is tested only in 32bit, my guess to work in 64bit is all ‘Single’ types should be changed to ‘CGFloat’. In a quick test it runs through the HasPreciseScrollingDeltas code but the logged deltas are still integral values so ymmv. Also, I can’t tell if this is my code because some aspects are not my usual style (deep if nesting, "End If"s, capitalized keywords,…). Also not sure if the pragmas are necessary or what.
[code]Function MouseWheel(X As Integer, Y As Integer, DeltaX as Integer, DeltaY as Integer) As Boolean #Pragma DisableBackgroundTasks #Pragma DisableBoundsChecking
Dim CorrectX As Single = DeltaX
Dim CorrectY As Single = DeltaY
Dim UsesPixelDeltas As Boolean
Try
Declare Function objc_getClass Lib “Cocoa.framework” (aClassName As CString) As Ptr
Declare Function sel_registerName Lib “/usr/lib/libobjc.dylib” (Name As CString) As Ptr
Declare Function GetSharedApplication Lib “Cocoa.framework” Selector “sharedApplication” (Target As Ptr) As Ptr
Declare Function GetCurrentEvent Lib “Cocoa.framework” Selector “currentEvent” (Target As Ptr) As Ptr
Declare Function RespondsToSelector Lib “Cocoa.framework” Selector “respondsToSelector:” (Target As Ptr, Sel As Ptr) As Boolean
Declare Function HasPreciseScrollingDeltas Lib “Cocoa.framework” Selector “hasPreciseScrollingDeltas” (Target As Ptr) As Boolean
Declare Function ScrollingDeltaX Lib “Cocoa.framework” Selector “scrollingDeltaX” (Target As Ptr) As Single
Declare Function ScrollingDeltaY Lib “Cocoa.framework” Selector “scrollingDeltaY” (Target As Ptr) As Single
Dim NSApplication As Ptr = objc_getClass("NSApplication")
If NSApplication <> Nil Then
Dim SharedApplication As Ptr = GetSharedApplication(NSApplication)
If SharedApplication <> Nil Then
Dim EventObject As Ptr = GetCurrentEvent(SharedApplication)
If EventObject <> Nil Then
If RespondsToSelector(EventObject,sel_registerName("hasPreciseScrollingDeltas")) Then
UsesPixelDeltas = HasPreciseScrollingDeltas(EventObject)
CorrectX = ScrollingDeltaX(EventObject) * -1
CorrectY = ScrollingDeltaY(EventObject) * -1
End If
End If
End If
End If
Catch Err As RuntimeException
UsesPixelDeltas = False
CorrectX = DeltaX * -1
CorrectY = DeltaY * -1
End Try
//…CorrectX and CorrectY now contain the wheel deltas
Thank you, Will.
I’ve took the code, changed Single by CGFloat, but unfortunately it didn’t work because “HasPreciseScrollingDeltas” returns False.
However I noticed something strange:
If you create a break in the middle of the code, for example at “CorrectY = ScrollingDeltaY(EventObject) * -1”, in the variables panel you can not see CorrectX, CorrectY, both declared as CGFloat. Is it the expected behaviour?[quote=305141:@Norman Palardy]
I think I filed a feature request for us to move a fair number of things to doubles
Pixel X and Y would be nice, Mouse X, Y, Deltas (like this)[/quote]
I could not find this request. I will create one.
Perhaps ScrollingDeltaX/Y is wrong. I tried with deltaX/Y and get floating point values now. The change is a rename in these lines…
[code]
vvvvvv vvvvvv
Declare Function deltaX Lib “Cocoa.framework” Selector “deltaX” (Target As Ptr) As Single
Declare Function deltaY Lib “Cocoa.framework” Selector “deltaY” (Target As Ptr) As Single
Please post the link. I have a few points to spend and think this is a very good place for them.
In that context, did you consider a new or enhanced Color datatype using (probably optionally to not break old code) doubles instead of integers too? Especially with 10 bits per pixel and even more HDR screens we are losing a lot of dynamics with fixed 8 bit colors.
I always read this as the quality of the pointing device. As far as I know, floating point deltas are always available, just that they might be less precise when scrolling.
Some improvements! However I had to change Function deltaX and deltaY by deltaXX and deltaYY, since these words are parameters of the Function MouseWheel and can not be used.
Now CorrectY has a value 0.1 or -0.1 which is perfect to know if I must zoom in or out.
Curiously, the first wheel rotation in any direction doesn’t rise MouseWheel event, but the following do. When you change rotation direction, you must rotate once for nothing and then it works.
[quote=305240:@Ulrich Bogun]Please post the link. I have a few points to spend and think this is a very good place for them.
[/quote]
<https://xojo.com/issue/46419>
[quote=305240:@Ulrich Bogun]In that context, did you consider a new or enhanced Color datatype using (probably optionally to not break old code) doubles instead of integers too? Especially with 10 bits per pixel and even more HDR screens we are losing a lot of dynamics with fixed 8 bit colors.
[/quote]
I think there is one for that too <https://xojo.com/issue/25846>
Not sure if its public or not