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:
parent
e8ab11f1f2
commit
0b9beccf1a
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user