X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_main.c;h=cc2aca015100bb02e11ab800545117936fee00a8;hb=12518ea3f1e251120bc666d2d6e8e26632b65eda;hp=1ef3d2b4960cdb4e5c8c9845cd1869f0549b7fba;hpb=54e835334fb3e039ad92236fc88801ec485c8152;p=freeglut diff --git a/src/freeglut_main.c b/src/freeglut_main.c index 1ef3d2b..cc2aca0 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 ) { @@ -454,6 +455,23 @@ static int fgHaveJoystick( void ) fgEnumWindows( fgCheckJoystickCallback, &enumerator ); return !!enumerator.data; } +static void fgHavePendingRedisplaysCallback( SFG_Window* w, SFG_Enumerator* e) +{ + if( w->State.Redisplay ) + { + e->found = TRUE; + e->data = w; + } + fgEnumSubWindows( w, fgHavePendingRedisplaysCallback, e ); +} +static int fgHavePendingRedisplays (void) +{ + SFG_Enumerator enumerator; + enumerator.found = FALSE; + enumerator.data = NULL; + fgEnumWindows( fgHavePendingRedisplaysCallback, &enumerator ); + return !!enumerator.data; +} /* * Indicates whether there are any outstanding timers. */ @@ -490,6 +508,9 @@ static void fgSleepForEvents( void ) struct timeval wait; long msec; + if( fgState.IdleCallback || + fgHavePendingRedisplays() ) + return; socket = ConnectionNumber( fgDisplay.Display ); FD_ZERO( &fdset ); FD_SET( socket, &fdset ); @@ -731,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 */ } /* @@ -803,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. @@ -837,13 +853,19 @@ 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 ; SFG_Menu *save_menu = fgStructure.Menu ; SFG_Window *parent_window = window->ActiveMenu->ParentWindow ; - fgSetWindow ( window ) ; + fgSetWindow ( parent_window ) ; fgStructure.Menu = window->ActiveMenu ; /* Execute the menu callback */ @@ -870,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. @@ -1227,7 +1250,7 @@ void FGAPIENTRY glutMainLoop( void ) */ if ( fgStructure.Windows.First == NULL ) fgState.ExecState = GLUT_EXEC_STATE_STOP ; - else if( !fgState.IdleCallback ) + else fgSleepForEvents(); } @@ -1620,7 +1643,7 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara SFG_Window *save_window = fgStructure.Window ; SFG_Menu *save_menu = fgStructure.Menu ; SFG_Window *parent_window = window->ActiveMenu->ParentWindow ; - fgSetWindow ( window ) ; + fgSetWindow ( parent_window ) ; fgStructure.Menu = window->ActiveMenu ; /* Execute the menu callback */