X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_main.c;h=ee20be9af5c1eacaeb96f432623ac47119ea9eaf;hb=f140efae364b87af6ddec3279b7555de8a0c91be;hp=8fddc90768808a5c8918bead47bdcca648d39d81;hpb=45881dfa9c7c9eaa9c2e88e0a357be3b6e6c2e87;p=freeglut diff --git a/src/freeglut_main.c b/src/freeglut_main.c index 8fddc90..ee20be9 100644 --- a/src/freeglut_main.c +++ b/src/freeglut_main.c @@ -396,7 +396,7 @@ void fgError( const char *fmt, ... ) va_start( ap, fmt ); - fprintf( stderr, "freeglut: "); + fprintf( stderr, "freeglut (%s): ", fgState.ProgramName || ""); vfprintf( stderr, fmt, ap ); fprintf( stderr, "\n" ); @@ -411,7 +411,7 @@ void fgWarning( const char *fmt, ... ) va_start( ap, fmt ); - fprintf( stderr, "freeglut: "); + fprintf( stderr, "freeglut (%s): ", fgState.ProgramName || ""); vfprintf( stderr, fmt, ap ); fprintf( stderr, "\n" ); @@ -568,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. @@ -619,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 @@ -752,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 */ } /* @@ -847,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 */ @@ -1631,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 */