Added keyup events code.

Added missing specal keys.
Made menu callbacks global.


git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@21 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
cjp 2001-08-05 22:47:35 +00:00
parent e8ab11f1f2
commit 0b9beccf1a
4 changed files with 46 additions and 19 deletions

View File

@ -223,7 +223,9 @@ void FGAPIENTRY glutEntryFunc( void (* callback)( int ) )
*/ */
void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) ) void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) )
{ {
SET_CALLBACK( MenuState ); freeglut_assert_ready;
fgState.MenuStateCallback = callback;
} }
/* /*
@ -231,7 +233,9 @@ void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) )
*/ */
void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) ) void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) )
{ {
SET_CALLBACK( MenuStatus ); freeglut_assert_ready;
fgState.MenuStatusCallback = callback;
} }
/* /*

View File

@ -698,17 +698,32 @@ void FGAPIENTRY glutMainLoop( void )
} }
break; break;
case KeyRelease:
case KeyPress: case KeyPress:
{ {
FGCBkeyboard keyboard_cb;
FGCBspecial special_cb;
/* /*
* A key has been pressed, find the window that had the focus: * A key has been pressed, find the window that had the focus:
*/ */
GETWINDOW( xkey ); GETMOUSE( xkey ); GETWINDOW( xkey ); GETMOUSE( xkey );
if( event.type == KeyPress )
{
keyboard_cb = window->Callbacks.Keyboard;
special_cb = window->Callbacks.Special;
}
else
{
keyboard_cb = window->Callbacks.KeyboardUp;
special_cb = window->Callbacks.SpecialUp;
}
/* /*
* Is there a keyboard/special callback hooked for this window? * Is there a keyboard/special callback hooked for this window?
*/ */
if( (window->Callbacks.Keyboard != NULL) || (window->Callbacks.Special != NULL) ) if( (keyboard_cb != NULL) || (special_cb != NULL) )
{ {
XComposeStatus composeStatus; XComposeStatus composeStatus;
char asciiCode[ 32 ]; char asciiCode[ 32 ];
@ -733,7 +748,7 @@ void FGAPIENTRY glutMainLoop( void )
/* /*
* ...one for the ASCII translateable keypresses... * ...one for the ASCII translateable keypresses...
*/ */
if( window->Callbacks.Keyboard != NULL ) if( keyboard_cb != NULL )
{ {
/* /*
* Remember the current modifiers state * Remember the current modifiers state
@ -750,7 +765,7 @@ void FGAPIENTRY glutMainLoop( void )
/* /*
* Execute the callback * Execute the callback
*/ */
window->Callbacks.Keyboard( asciiCode[ 0 ], event.xkey.x, event.xkey.y ); keyboard_cb( asciiCode[ 0 ], event.xkey.x, event.xkey.y );
/* /*
* Trash the modifiers state * Trash the modifiers state
@ -790,13 +805,24 @@ void FGAPIENTRY glutMainLoop( void )
case XK_Right: special = GLUT_KEY_RIGHT; break; case XK_Right: special = GLUT_KEY_RIGHT; break;
case XK_Up: special = GLUT_KEY_UP; break; case XK_Up: special = GLUT_KEY_UP; break;
case XK_Down: special = GLUT_KEY_DOWN; break; case XK_Down: special = GLUT_KEY_DOWN; break;
case XK_KP_Prior:
case XK_Prior: special = GLUT_KEY_PAGE_UP; break;
case XK_KP_Next:
case XK_Next: special = GLUT_KEY_PAGE_DOWN; break;
case XK_KP_Home:
case XK_Home: special = GLUT_KEY_HOME; break;
case XK_KP_End:
case XK_End: special = GLUT_KEY_END; break;
case XK_KP_Insert:
case XK_Insert: special = GLUT_KEY_INSERT; break;
} }
/* /*
* Execute the callback (if one has been specified), * Execute the callback (if one has been specified),
* given that the special code seems to be valid... * given that the special code seems to be valid...
*/ */
if( (window->Callbacks.Special != NULL) && (special != -1) ) if( (special_cb != NULL) && (special != -1) )
{ {
/* /*
* Remember the current modifiers state * Remember the current modifiers state
@ -810,7 +836,7 @@ void FGAPIENTRY glutMainLoop( void )
modifiers |= GLUT_ACTIVE_ALT; modifiers |= GLUT_ACTIVE_ALT;
window->State.Modifiers = modifiers; window->State.Modifiers = modifiers;
window->Callbacks.Special( special, event.xkey.x, event.xkey.y ); special_cb( special, event.xkey.x, event.xkey.y );
/* /*
* Trash the modifiers state * Trash the modifiers state

View File

@ -324,7 +324,7 @@ void fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, i
* This might speed up message processing. Is that true? * This might speed up message processing. Is that true?
*/ */
winAttr.event_mask = StructureNotifyMask | SubstructureNotifyMask | ExposureMask | winAttr.event_mask = StructureNotifyMask | SubstructureNotifyMask | ExposureMask |
ButtonPressMask | ButtonReleaseMask | KeyPressMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyRelease |
VisibilityChangeMask | EnterWindowMask | LeaveWindowMask | VisibilityChangeMask | EnterWindowMask | LeaveWindowMask |
PointerMotionMask | ButtonMotionMask; PointerMotionMask | ButtonMotionMask;
winAttr.background_pixmap = None; winAttr.background_pixmap = None;
@ -442,8 +442,8 @@ void fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, i
if( gameMode == TRUE ) if( gameMode == TRUE )
{ {
/* /*
* This somehow fixes the glutGet() GLUT_WINDOW_X and GLUT_WINDOW_Y problem... * This somehow fixes the glutGet() GLUT_WINDOW_X and GLUT_WINDOW_Y problem...
*/ */
XMoveWindow( fgDisplay.Display, window->Window.Handle, x, y ); XMoveWindow( fgDisplay.Display, window->Window.Handle, x, y );
# ifdef X_XF86VidModeSetViewPort # ifdef X_XF86VidModeSetViewPort

View File

@ -212,6 +212,9 @@ struct tagSFG_State
FGCBidle IdleCallback; /* The global idle callback */ FGCBidle IdleCallback; /* The global idle callback */
FGCBmenuState MenuStateCallback; /* Menu callbacks are global */
FGCBmenuStatus MenuStatusCallback;
SFG_XYUse GameModeSize; /* The game mode screen's dimensions */ SFG_XYUse GameModeSize; /* The game mode screen's dimensions */
int GameModeDepth; /* The pixel depth for game mode */ int GameModeDepth; /* The pixel depth for game mode */
int GameModeRefresh; /* The refresh rate for game mode */ int GameModeRefresh; /* The refresh rate for game mode */
@ -320,27 +323,21 @@ struct tagSFG_WindowCallbacks
FGCBdisplay Display; FGCBdisplay Display;
FGCBreshape Reshape; FGCBreshape Reshape;
FGCBkeyboard Keyboard; FGCBkeyboard Keyboard;
FGCBkeyboardUp KeyboardUp;
FGCBspecial Special; FGCBspecial Special;
FGCBspecialUp SpecialUp;
FGCBmouse Mouse; FGCBmouse Mouse;
FGCBmotion Motion; FGCBmotion Motion;
FGCBpassive Passive; FGCBpassive Passive;
FGCBentry Entry; FGCBentry Entry;
FGCBvisibility Visibility; FGCBvisibility Visibility;
FGCBwindowStatus WindowStatus; FGCBwindowStatus WindowStatus;
/*
* Those callbacks are required for the initial version
*/
FGCBmenuState MenuState;
FGCBmenuStatus MenuStatus;
FGCBselect Select;
FGCBjoystick Joystick; FGCBjoystick Joystick;
FGCBkeyboardUp KeyboardUp;
FGCBspecialUp SpecialUp;
/* /*
* Those callbacks are being ignored for the moment * Those callbacks are being ignored for the moment
*/ */
FGCBselect Select;
FGCBoverlayDisplay OverlayDisplay; FGCBoverlayDisplay OverlayDisplay;
FGCBspaceMotion SpaceMotion; FGCBspaceMotion SpaceMotion;
FGCBspaceRotate SpaceRotation; FGCBspaceRotate SpaceRotation;