X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=freeglut-1.3%2Ffreeglut_main.c;h=86ee47c8bb99713045b20fcaf1c502f27102891b;hb=3ee42232404c505950f2d616a983a304582e15a7;hp=b002dabafc59ac049afc156e7e1c24265268e1d3;hpb=4402b1a528a4335fd640650692d33be241ce2497;p=freeglut diff --git a/freeglut-1.3/freeglut_main.c b/freeglut-1.3/freeglut_main.c index b002dab..86ee47c 100644 --- a/freeglut-1.3/freeglut_main.c +++ b/freeglut-1.3/freeglut_main.c @@ -72,7 +72,7 @@ static void fghRedrawWindowByHandle /* * Return if the window is not visible */ - freeglut_return_if_fail( window->State.Visible != TRUE ); + freeglut_return_if_fail( window->State.Visible == TRUE ); /* * Set the window as the current one. Calling glutSetWindow() @@ -139,9 +139,8 @@ static void fghcbDisplayWindow( SFG_Window *window, SFG_Enumerator *enumerator ) /* * Check if there is an idle callback hooked */ -# warning there is a redisplay hack here (see the code commented out) if( (window->Callbacks.Display != NULL) && - /*(window->State.Redisplay == TRUE) &&*/ + (window->State.Redisplay == TRUE) && (window->State.Visible == TRUE) ) { /* @@ -369,6 +368,7 @@ void FGAPIENTRY glutMainLoop( void ) #if TARGET_HOST_UNIX_X11 SFG_Window* window; XEvent event; + int modifiers; /* * This code was repeated constantly, so here it goes into a definition: @@ -672,7 +672,14 @@ void FGAPIENTRY glutMainLoop( void ) /* * Remember the current modifiers state */ - window->State.Modifiers = event.xbutton.state; + modifiers = 0; + if (event.xbutton.state & (ShiftMask|LockMask)) + modifiers |= GLUT_ACTIVE_SHIFT; + if (event.xbutton.state & ControlMask) + modifiers |= GLUT_ACTIVE_CTRL; + if (event.xbutton.state & Mod1Mask) + modifiers |= GLUT_ACTIVE_ALT; + window->State.Modifiers = modifiers; /* * Finally execute the mouse callback @@ -691,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 ]; @@ -726,17 +748,24 @@ void FGAPIENTRY glutMainLoop( void ) /* * ...one for the ASCII translateable keypresses... */ - if( window->Callbacks.Keyboard != NULL ) + if( keyboard_cb != NULL ) { /* * Remember the current modifiers state */ - window->State.Modifiers = event.xkey.state; + modifiers = 0; + if (event.xkey.state & (ShiftMask|LockMask)) + modifiers |= GLUT_ACTIVE_SHIFT; + if (event.xkey.state & ControlMask) + modifiers |= GLUT_ACTIVE_CTRL; + if (event.xkey.state & Mod1Mask) + modifiers |= GLUT_ACTIVE_ALT; + window->State.Modifiers = modifiers; /* * 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 @@ -776,25 +805,43 @@ 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 - */ - window->State.Modifiers = event.xkey.state; + /* + * Remember the current modifiers state + */ + modifiers = 0; + if (event.xkey.state & (ShiftMask|LockMask)) + modifiers |= GLUT_ACTIVE_SHIFT; + if (event.xkey.state & ControlMask) + modifiers |= GLUT_ACTIVE_CTRL; + if (event.xkey.state & Mod1Mask) + 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 - */ - window->State.Modifiers = 0xffffffff; + /* + * Trash the modifiers state + */ + window->State.Modifiers = 0xffffffff; } } } @@ -879,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); } }