Added stroke fonts.
[freeglut] / freeglut-1.3 / freeglut_main.c
index b002dab..86ee47c 100644 (file)
@@ -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);
         }
     }