X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_main.c;h=c6eaa64baf48510a3c97c01c2d71c4375dfc804e;hb=fa43a255b9778016ce78123712b8ff89efd2fb34;hp=0c90e2182536c9e5572a9f666fbd48400f71d52a;hpb=988bc68f9a26bf18ebaee77067ddc87fd13c7016;p=freeglut diff --git a/src/freeglut_main.c b/src/freeglut_main.c index 0c90e21..c6eaa64 100644 --- a/src/freeglut_main.c +++ b/src/freeglut_main.c @@ -445,6 +445,7 @@ static void fgCheckJoystickCallback( SFG_Window* w, SFG_Enumerator* e) e->found = TRUE; e->data = w; } + fgEnumSubWindows( w, fgCheckJoystickCallback, e ); } static int fgHaveJoystick( void ) { @@ -461,6 +462,7 @@ static void fgHavePendingRedisplaysCallback( SFG_Window* w, SFG_Enumerator* e) e->found = TRUE; e->data = w; } + fgEnumSubWindows( w, fgHavePendingRedisplaysCallback, e ); } static int fgHavePendingRedisplays (void) { @@ -750,17 +752,23 @@ void FGAPIENTRY glutMainLoopEvent( void ) */ if( window->ActiveMenu != NULL ) { + if ( window == window->ActiveMenu->ParentWindow ) + { + window->ActiveMenu->Window->State.MouseX = event.xmotion.x_root - window->ActiveMenu->X ; + window->ActiveMenu->Window->State.MouseY = event.xmotion.y_root - window->ActiveMenu->Y ; + } + /* * Let's make the window redraw as a result of the mouse motion. */ - window->State.Redisplay = TRUE ; + window->ActiveMenu->Window->State.Redisplay = TRUE ; /* * Since the window is a menu, make the parent window current */ fgSetWindow ( window->ActiveMenu->ParentWindow ) ; - break; + break; /* I think this should stay in -- an active menu should absorb the mouse motion */ } /* @@ -822,26 +830,15 @@ void FGAPIENTRY glutMainLoopEvent( void ) */ GETWINDOW( xbutton ); GETMOUSE( xbutton ); - /* - * GLUT API assumes that you can't have more than three mouse buttons, so: - */ - switch( event.xbutton.button ) - { - /* - * WARNING: this might be wrong, if we only have two mouse buttons, - * Button2 might mean the right button, isn't that right? - */ - case Button1: button = GLUT_LEFT_BUTTON; break; - case Button2: button = GLUT_MIDDLE_BUTTON; break; - case Button3: button = GLUT_RIGHT_BUTTON; break; - default: button = -1; break; - } - - /* - * Skip the unwanted mouse buttons... - */ - if( button == -1 ) - break; + /* + * An X button (at least in XFree86) is numbered from 1. + * A GLUT button is numbered from 0. + * Old GLUT passed through buttons other than just the first + * three, though it only gave symbolic names and official + * support to the first three. + * + */ + button = event.xbutton.button - 1; /* * Do not execute the application's mouse callback if a menu is hooked to this button. @@ -856,7 +853,13 @@ void FGAPIENTRY glutMainLoopEvent( void ) */ if ( window->ActiveMenu != NULL ) /* Window has an active menu, it absorbs any mouse click */ { - if ( fgCheckActiveMenu ( window, window->ActiveMenu ) == TRUE ) /* Inside the menu, invoke the callback and deactivate the menu*/ + if ( window == window->ActiveMenu->ParentWindow ) + { + window->ActiveMenu->Window->State.MouseX = event.xbutton.x_root - window->ActiveMenu->X ; + window->ActiveMenu->Window->State.MouseY = event.xbutton.y_root - window->ActiveMenu->Y ; + } + + if ( fgCheckActiveMenu ( window->ActiveMenu->Window, window->ActiveMenu ) == TRUE ) /* Inside the menu, invoke the callback and deactivate the menu*/ { /* Save the current window and menu and set the current window to the window whose menu this is */ SFG_Window *save_window = fgStructure.Window ; @@ -889,7 +892,8 @@ void FGAPIENTRY glutMainLoopEvent( void ) /* * No active menu, let's check whether we need to activate one. */ - if ( ( window->Menu[ button ] != NULL ) && ( pressed == TRUE ) ) + if (( 0 <= button ) && ( 2 >= button ) && + ( window->Menu[ button ] != NULL ) && ( pressed == TRUE ) ) { /* * Let's make the window redraw as a result of the mouse click.