X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffg_menu.c;h=4f8e1a6b2918cbddb9ae54386f034429fcaae44b;hb=12e86920286ff7c8ae5e650284535bac920eacee;hp=6a7d96d00c7999ec9f3a539eb3af99b49c7ed107;hpb=d9de8ec42b076f875059acf8c02299689c9aa756;p=freeglut diff --git a/src/fg_menu.c b/src/fg_menu.c index 6a7d96d..4f8e1a6 100644 --- a/src/fg_menu.c +++ b/src/fg_menu.c @@ -509,6 +509,7 @@ void fgDisplayMenu( void ) static void fghActivateMenu( SFG_Window* window, int button ) { int max_x, max_y; + SFG_XYUse mouse_pos; /* We'll be referencing this menu a lot, so remember its address: */ SFG_Menu* menu = window->Menu[ button ]; @@ -527,9 +528,17 @@ static void fghActivateMenu( SFG_Window* window, int button ) /* Set up the initial menu position now: */ fghGetVMaxExtent(menu->ParentWindow, &max_x, &max_y); fgSetWindow( window ); - menu->X = window->State.MouseX + glutGet( GLUT_WINDOW_X ); - menu->Y = window->State.MouseY + glutGet( GLUT_WINDOW_Y ); + /* get mouse position on screen (window->State.MouseX and window->State.MouseY + * are relative to client area origin), and not easy to correct given that + * glutGet( GLUT_WINDOW_X ) and glutGet( GLUT_WINDOW_Y ) return relative to parent + * origin when looking at a child window + * for parent windows: window->State.MouseX + glutGet( GLUT_WINDOW_X ) == mouse_pos.X + */ + fghPlatformGetCursorPos(&mouse_pos); + menu->X = mouse_pos.X; + menu->Y = mouse_pos.Y; + /* Make sure the whole menu is on the screen */ if( menu->X + menu->Width > max_x ) menu->X -=menu->Width; @@ -540,10 +549,9 @@ static void fghActivateMenu( SFG_Window* window, int button ) menu->Y = 0; } - menu->Window->State.MouseX = - window->State.MouseX + glutGet( GLUT_WINDOW_X ) - menu->X; - menu->Window->State.MouseY = - window->State.MouseY + glutGet( GLUT_WINDOW_Y ) - menu->Y; + /* Set position of mouse relative to top-left menu in menu's window state (could as well set 0 at creation time...) */ + menu->Window->State.MouseX = mouse_pos.X - menu->X; + menu->Window->State.MouseY = mouse_pos.Y - menu->Y; /* Menu status callback */ if (fgState.MenuStateCallback || fgState.MenuStatusCallback) @@ -553,6 +561,7 @@ static void fghActivateMenu( SFG_Window* window, int button ) if (fgState.MenuStateCallback) fgState.MenuStateCallback(GLUT_MENU_IN_USE); if (fgState.MenuStatusCallback) + /* window->State.MouseX and window->State.MouseY are relative to client area origin, as needed */ fgState.MenuStatusCallback(GLUT_MENU_IN_USE, window->State.MouseX, window->State.MouseY); } @@ -782,7 +791,7 @@ void fghCalculateMenuBoxSize( void ) /* * Creates a new menu object, adding it to the freeglut structure */ -int FGAPIENTRY glutCreateMenu( void(* callback)( int ) ) +int FGAPIENTRY glutCreateMenu( FGCBMenu callback ) { /* The menu object creation code resides in freeglut_structure.c */ FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateMenu" );