projects
/
freeglut
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Takeshi Nishimura\'s changes to make the Windows mouse wheel/button mapping match...
[freeglut]
/
src
/
freeglut_main.c
diff --git
a/src/freeglut_main.c
b/src/freeglut_main.c
index
36faaf9
..
7f62b84
100644
(file)
--- a/
src/freeglut_main.c
+++ b/
src/freeglut_main.c
@@
-29,12
+29,16
@@
#include "freeglut_internal.h"
#include <errno.h>
#include <stdarg.h>
#include "freeglut_internal.h"
#include <errno.h>
#include <stdarg.h>
-#if HAVE_VPRINTF
+#if TARGET_HOST_WIN32
# define VFPRINTF(s,f,a) vfprintf((s),(f),(a))
# define VFPRINTF(s,f,a) vfprintf((s),(f),(a))
-#elif HAVE_DOPRNT
-# define VFPRINTF(s,f,a) _doprnt((f),(a),(s))
#else
#else
-# define VFPRINTF(s,f,a)
+# if HAVE_VPRINTF
+# define VFPRINTF(s,f,a) vfprintf((s),(f),(a))
+# elif HAVE_DOPRNT
+# define VFPRINTF(s,f,a) _doprnt((f),(a),(s))
+# else
+# define VFPRINTF(s,f,a)
+# endif
#endif
#if TARGET_HOST_WINCE
#endif
#if TARGET_HOST_WINCE
@@
-100,9
+104,7
@@
static void fghReshapeWindow ( SFG_Window *window, int width, int height )
width, height );
XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
width, height );
XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
-#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
-
-#if !TARGET_HOST_WINCE
+#elif TARGET_HOST_WIN32
{
RECT winRect;
int x, y, w, h;
{
RECT winRect;
int x, y, w, h;
@@
-152,7
+154,7
@@
static void fghReshapeWindow ( SFG_Window *window, int width, int height )
SWP_NOZORDER
);
}
SWP_NOZORDER
);
}
-#endif /* TARGET_HOST_WINCE */
+#endif
/*
* XXX Should update {window->State.OldWidth, window->State.OldHeight}
/*
* XXX Should update {window->State.OldWidth, window->State.OldHeight}
@@
-166,8
+168,6
@@
static void fghReshapeWindow ( SFG_Window *window, int width, int height )
glViewport( 0, 0, width, height );
}
glViewport( 0, 0, width, height );
}
-#endif
-
/*
* Force a window redraw. In Windows at least this is only a partial
* solution: if the window is increasing in size in either dimension,
/*
* Force a window redraw. In Windows at least this is only a partial
* solution: if the window is increasing in size in either dimension,
@@
-458,7
+458,7
@@
static void fghSleepForEvents( void )
msec = fghNextTimer( );
/* XXX Use GLUT timers for joysticks... */
/* XXX Dumb; forces granularity to .01sec */
msec = fghNextTimer( );
/* XXX Use GLUT timers for joysticks... */
/* XXX Dumb; forces granularity to .01sec */
- if( fghHaveJoystick( ) && ( msec < 10 ) )
+ if( fghHaveJoystick( ) && ( msec > 10 ) )
msec = 10;
#if TARGET_HOST_UNIX_X11
msec = 10;
#if TARGET_HOST_UNIX_X11
@@
-588,6
+588,8
@@
void FGAPIENTRY glutMainLoopEvent( void )
if( ( width != window->State.OldWidth ) ||
( height != window->State.OldHeight ) )
{
if( ( width != window->State.OldWidth ) ||
( height != window->State.OldHeight ) )
{
+ SFG_Window *current_window = fgStructure.CurrentWindow;
+
window->State.OldWidth = width;
window->State.OldHeight = height;
if( FETCH_WCB( *window, Reshape ) )
window->State.OldWidth = width;
window->State.OldHeight = height;
if( FETCH_WCB( *window, Reshape ) )
@@
-598,6
+600,8
@@
void FGAPIENTRY glutMainLoopEvent( void )
glViewport( 0, 0, width, height );
}
glutPostRedisplay( );
glViewport( 0, 0, width, height );
}
glutPostRedisplay( );
+ if( window->IsMenu )
+ fgSetWindow( current_window );
}
}
break;
}
}
break;
@@
-624,8
+628,7
@@
void FGAPIENTRY glutMainLoopEvent( void )
if( event.xexpose.count == 0 )
{
GETWINDOW( xexpose );
if( event.xexpose.count == 0 )
{
GETWINDOW( xexpose );
- fgSetWindow( window );
- glutPostRedisplay( );
+ window->State.Redisplay = GL_TRUE;
}
break;
}
break;
@@
-691,6
+694,10
@@
void FGAPIENTRY glutMainLoopEvent( void )
case LeaveNotify:
GETWINDOW( xcrossing );
GETMOUSE( xcrossing );
case LeaveNotify:
GETWINDOW( xcrossing );
GETMOUSE( xcrossing );
+ if( ( event.type == LeaveNotify ) && window->IsMenu &&
+ window->ActiveMenu && window->ActiveMenu->IsActive )
+ fgUpdateMenuHighlight( window->ActiveMenu );
+
INVOKE_WCB( *window, Entry, ( ( EnterNotify == event.type ) ?
GLUT_ENTERED :
GLUT_LEFT ) );
INVOKE_WCB( *window, Entry, ( ( EnterNotify == event.type ) ?
GLUT_ENTERED :
GLUT_LEFT ) );
@@
-710,8
+717,8
@@
void FGAPIENTRY glutMainLoopEvent( void )
window->ActiveMenu->Window->State.MouseY =
event.xmotion.y_root - window->ActiveMenu->Y;
}
window->ActiveMenu->Window->State.MouseY =
event.xmotion.y_root - window->ActiveMenu->Y;
}
- window->ActiveMenu->Window->State.Redisplay = GL_TRUE ;
- fgSetWindow( window->ActiveMenu->ParentWindow );
+
+ fgUpdateMenuHighlight( window->ActiveMenu );
break;
}
break;
}
@@
-777,12
+784,8
@@
void FGAPIENTRY glutMainLoopEvent( void )
fgState.Modifiers = fghGetXModifiers( &event );
fgState.Modifiers = fghGetXModifiers( &event );
- /*
- * Finally execute the mouse or mouse wheel callback
- *
- * XXX Use a symbolic constant, *not* "4"! ("3, sire!")
- */
- if( ( button < 3 ) || ( ! FETCH_WCB( *window, MouseWheel ) ) )
+ /* Finally execute the mouse or mouse wheel callback */
+ if( ( button < glutDeviceGet ( GLUT_NUM_MOUSE_BUTTONS ) ) || ( ! FETCH_WCB( *window, MouseWheel ) ) )
INVOKE_WCB( *window, Mouse, ( button,
pressed ? GLUT_DOWN : GLUT_UP,
event.xbutton.x,
INVOKE_WCB( *window, Mouse, ( button,
pressed ? GLUT_DOWN : GLUT_UP,
event.xbutton.x,
@@
-802,7
+805,7
@@
void FGAPIENTRY glutMainLoopEvent( void )
* XXX Note that {button} has already been decremeted
* XXX in mapping from X button numbering to GLUT.
*/
* XXX Note that {button} has already been decremeted
* XXX in mapping from X button numbering to GLUT.
*/
- int wheel_number = (button - 3) / 2;
+ int wheel_number = (button - glutDeviceGet ( GLUT_NUM_MOUSE_BUTTONS )) / 2;
int direction = -1;
if( button % 2 )
direction = 1;
int direction = -1;
if( button % 2 )
direction = 1;
@@
-862,13
+865,13
@@
void FGAPIENTRY glutMainLoopEvent( void )
if( event.type == KeyPress )
{
if( event.type == KeyPress )
{
- keyboard_cb = FETCH_WCB( *window, Keyboard );
- special_cb = FETCH_WCB( *window, Special );
+ keyboard_cb = (FGCBKeyboard)( FETCH_WCB( *window, Keyboard ));
+ special_cb = (FGCBSpecial) ( FETCH_WCB( *window, Special ));
}
else
{
}
else
{
- keyboard_cb = FETCH_WCB( *window, KeyboardUp );
- special_cb = FETCH_WCB( *window, SpecialUp );
+ keyboard_cb = (FGCBKeyboard)( FETCH_WCB( *window, KeyboardUp ));
+ special_cb = (FGCBSpecial) ( FETCH_WCB( *window, SpecialUp ));
}
/* Is there a keyboard/special callback hooked for this window? */
}
/* Is there a keyboard/special callback hooked for this window? */
@@
-1056,7
+1059,13
@@
void FGAPIENTRY glutMainLoop( void )
else
{
if( fgState.IdleCallback )
else
{
if( fgState.IdleCallback )
+ {
+ if( fgStructure.CurrentWindow &&
+ fgStructure.CurrentWindow->IsMenu )
+ /* fail safe */
+ fgSetWindow( window );
fgState.IdleCallback( );
fgState.IdleCallback( );
+ }
fghSleepForEvents( );
}
fghSleepForEvents( );
}
@@
-1272,6
+1281,10
@@
LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
* XXX if the flag is false we invoke the Entry callback and set the flag to true.
*/
case 0x02a2: /* This is the message we get when the mouse is leaving the window */
* XXX if the flag is false we invoke the Entry callback and set the flag to true.
*/
case 0x02a2: /* This is the message we get when the mouse is leaving the window */
+ if( window->IsMenu &&
+ window->ActiveMenu && window->ActiveMenu->IsActive )
+ fgUpdateMenuHighlight( window->ActiveMenu );
+
INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) );
break ;
INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) );
break ;
@@
-1291,8
+1304,7
@@
LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
if ( window->ActiveMenu )
{
if ( window->ActiveMenu )
{
- window->State.Redisplay = GL_TRUE;
- fgSetWindow ( window->ActiveMenu->ParentWindow );
+ fgUpdateMenuHighlight( window->ActiveMenu );
break;
}
break;
}
@@
-1465,11
+1477,14
@@
LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
else /* No mouse wheel, call the mouse button callback twice */
{
/*
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.
*/
* XXX The below assumes that you have no more than 3 mouse
* XXX buttons. Sorry.
*/
- int button = wheel_number*2 + 4;
- if( direction > 0 )
+ int button = wheel_number * 2 + 3;
+ if( direction < 0 )
++button;
INVOKE_WCB( *window, Mouse,
( button, GLUT_DOWN,
++button;
INVOKE_WCB( *window, Mouse,
( button, GLUT_DOWN,
@@
-1477,7
+1492,7
@@
LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
);
INVOKE_WCB( *window, Mouse,
( button, GLUT_UP,
);
INVOKE_WCB( *window, Mouse,
( button, GLUT_UP,
- window->State.MouseX, window->State.MouseX )
+ window->State.MouseX, window->State.MouseY )
);
}
);
}