X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=freeglut-1.3%2Ffreeglut_main.c;h=86ee47c8bb99713045b20fcaf1c502f27102891b;hb=40ae798d4238bae52cb70f01894b47482a478cc8;hp=682e316725a8198d9aeb0a33760e46fab2d8a160;hpb=56d746d5a727b7a5fb489e81b1f19816f4ab9b9d;p=freeglut diff --git a/freeglut-1.3/freeglut_main.c b/freeglut-1.3/freeglut_main.c index 682e316..86ee47c 100644 --- a/freeglut-1.3/freeglut_main.c +++ b/freeglut-1.3/freeglut_main.c @@ -698,17 +698,32 @@ void FGAPIENTRY glutMainLoop( void ) } break; + case KeyRelease: case KeyPress: { + FGCBkeyboard keyboard_cb; + FGCBspecial special_cb; + /* * A key has been pressed, find the window that had the focus: */ 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? */ - if( (window->Callbacks.Keyboard != NULL) || (window->Callbacks.Special != NULL) ) + if( (keyboard_cb != NULL) || (special_cb != NULL) ) { XComposeStatus composeStatus; char asciiCode[ 32 ]; @@ -733,7 +748,7 @@ void FGAPIENTRY glutMainLoop( void ) /* * ...one for the ASCII translateable keypresses... */ - if( window->Callbacks.Keyboard != NULL ) + if( keyboard_cb != NULL ) { /* * Remember the current modifiers state @@ -750,7 +765,7 @@ void FGAPIENTRY glutMainLoop( void ) /* * 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 @@ -790,13 +805,24 @@ void FGAPIENTRY glutMainLoop( void ) case XK_Right: special = GLUT_KEY_RIGHT; break; case XK_Up: special = GLUT_KEY_UP; 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), * 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 @@ -810,7 +836,7 @@ void FGAPIENTRY glutMainLoop( void ) modifiers |= GLUT_ACTIVE_ALT; 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 @@ -900,7 +926,7 @@ void FGAPIENTRY glutMainLoop( void ) /* * We need to terminate the main loop if no windows are left */ - bLoop = (g_list_length( fgStructure.Windows ) != 0); + bLoop = (fgStructure.Windows.First != NULL); } }