Adding support for partial mouse wheel turns as requested by Jason Wilkins in an e-mail dated 5/27/11 10:34 AM

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@921 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
fayjf 2011-05-27 20:37:31 +00:00
parent 25edeabab4
commit 3a5a72436b

View File

@ -1273,8 +1273,10 @@ void FGAPIENTRY glutMainLoopEvent( void )
* XXX See XFree86 configuration docs (even back in the * XXX See XFree86 configuration docs (even back in the
* XXX 3.x days, and especially with 4.x). * XXX 3.x days, and especially with 4.x).
* *
* XXX Note that {button} has already been decremeted * XXX Note that {button} has already been decremented
* XXX in mapping from X button numbering to GLUT. * XXX in mapping from X button numbering to GLUT.
*
* XXX Should add support for partial wheel turns as Windows does -- 5/27/11
*/ */
int wheel_number = (button - glutDeviceGet ( GLUT_NUM_MOUSE_BUTTONS )) / 2; int wheel_number = (button - glutDeviceGet ( GLUT_NUM_MOUSE_BUTTONS )) / 2;
int direction = -1; int direction = -1;
@ -2058,67 +2060,67 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
case 0x020a: case 0x020a:
/* Should be WM_MOUSEWHEEL but my compiler doesn't recognize it */ /* Should be WM_MOUSEWHEEL but my compiler doesn't recognize it */
{ {
int wheel_number = LOWORD( wParam );
short ticks = ( short )HIWORD( wParam );
fgState.MouseWheelTicks += ticks;
/* /*
* XXX THIS IS SPECULATIVE -- John Fay, 10/2/03
* XXX Should use WHEEL_DELTA instead of 120 * XXX Should use WHEEL_DELTA instead of 120
*/ */
int wheel_number = LOWORD( wParam ); if ( abs ( fgState.MouseWheelTicks ) > 120 )
short ticks = ( short )HIWORD( wParam ) / 120; {
int direction = 1; int direction = ( fgState.MouseWheelTicks > 0 ) ? 1 : -1;
if( ticks < 0 ) if( ! FETCH_WCB( *window, MouseWheel ) &&
{ ! FETCH_WCB( *window, Mouse ) )
direction = -1; break;
ticks = -ticks;
}
/* fgSetWindow( window );
* The mouse cursor has moved. Remember the new mouse cursor's position fgState.Modifiers = fghGetWin32Modifiers( );
*/
/* window->State.MouseX = LOWORD( lParam ); */
/* Need to adjust by window position, */
/* window->State.MouseY = HIWORD( lParam ); */
/* change "lParam" to other parameter */
if( ! FETCH_WCB( *window, MouseWheel ) && /*
! FETCH_WCB( *window, Mouse ) ) * XXX Should use WHEEL_DELTA instead of 120
break; */
while( abs ( fgState.MouseWheelTicks ) > 120 )
{
if( FETCH_WCB( *window, MouseWheel ) )
INVOKE_WCB( *window, MouseWheel,
( wheel_number,
direction,
window->State.MouseX,
window->State.MouseY
)
);
else /* No mouse wheel, call the mouse button callback twice */
{
/*
* Map wheel zero to button 3 and 4; +1 to 3, -1 to 4
* " " one +1 to 5, -1 to 6, ...
*
* XXX The below assumes that you have no more than 3 mouse
* XXX buttons. Sorry.
*/
int button = wheel_number * 2 + 3;
if( direction < 0 )
++button;
INVOKE_WCB( *window, Mouse,
( button, GLUT_DOWN,
window->State.MouseX, window->State.MouseY )
);
INVOKE_WCB( *window, Mouse,
( button, GLUT_UP,
window->State.MouseX, window->State.MouseY )
);
}
fgSetWindow( window );
fgState.Modifiers = fghGetWin32Modifiers( );
while( ticks-- )
if( FETCH_WCB( *window, MouseWheel ) )
INVOKE_WCB( *window, MouseWheel,
( wheel_number,
direction,
window->State.MouseX,
window->State.MouseY
)
);
else /* No mouse wheel, call the mouse button callback twice */
{
/* /*
* Map wheel zero to button 3 and 4; +1 to 3, -1 to 4 * XXX Should use WHEEL_DELTA instead of 120
* " " one +1 to 5, -1 to 6, ...
*
* XXX The below assumes that you have no more than 3 mouse
* XXX buttons. Sorry.
*/ */
int button = wheel_number * 2 + 3; fgState.MouseWheelTicks -= 120 * direction;
if( direction < 0 ) }
++button;
INVOKE_WCB( *window, Mouse,
( button, GLUT_DOWN,
window->State.MouseX, window->State.MouseY )
);
INVOKE_WCB( *window, Mouse,
( button, GLUT_UP,
window->State.MouseX, window->State.MouseY )
);
}
fgState.Modifiers = INVALID_MODIFIERS; fgState.Modifiers = INVALID_MODIFIERS;
}
} }
break ; break ;