X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_main.c;h=c28658f35bd795f94307f1c79ade3dcd476be85c;hb=8756c552d99adeed03a7bdd7c8b0da8c77f5c475;hp=0c90e2182536c9e5572a9f666fbd48400f71d52a;hpb=988bc68f9a26bf18ebaee77067ddc87fd13c7016;p=freeglut diff --git a/src/freeglut_main.c b/src/freeglut_main.c index 0c90e21..c28658f 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) { @@ -566,12 +568,6 @@ void FGAPIENTRY glutMainLoopEvent( void ) */ switch( event.type ) { - case CreateNotify: - /* - * The window creation confirmation - */ - break; - case DestroyNotify: /* * This is sent to confirm the XDestroyWindow call. @@ -617,6 +613,19 @@ void FGAPIENTRY glutMainLoopEvent( void ) fghRedrawWindowByHandle( event.xexpose.window ); break; + /* + * CreateNotify causes a configure-event so that sub-windows are + * handled compatibly with GLUT. + * + * NOTE that it is possible that you will more than one Reshape + * event for your top-level window, but something like this appears + * to be required for compatbility. + * + * GLUT presumably does this because it generally tries to treat + * sub-windows the same as windows. + * + */ + case CreateNotify: case ConfigureNotify: /* * The window gets resized @@ -750,17 +759,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 +837,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,13 +860,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 */ @@ -889,7 +899,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. @@ -1639,7 +1650,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 */