extern GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y );
+extern void fghPlatformGetCursorPos(SFG_XYUse *mouse_pos);
/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
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 ];
/* 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;
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 */
- printf("Menu status callback: %p\n",fgState.MenuStatusCallback);
if (fgState.MenuStateCallback || fgState.MenuStatusCallback)
{
fgStructure.CurrentMenu = menu;
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);
}
if (fgState.MenuStatusCallback)
{
/* Get cursor position on screen and convert to relative to parent_window's client area */
- POINT mouse_pos;
- GetCursorPos(&mouse_pos);
- mouse_pos.x -= glutGet( GLUT_WINDOW_X );
- mouse_pos.y -= glutGet( GLUT_WINDOW_Y );
+ SFG_XYUse mouse_pos;
+ fghPlatformGetCursorPos(&mouse_pos);
+
+ mouse_pos.X -= glutGet( GLUT_WINDOW_X );
+ mouse_pos.Y -= glutGet( GLUT_WINDOW_Y );
- fgState.MenuStatusCallback(GLUT_MENU_NOT_IN_USE, mouse_pos.x, mouse_pos.y);
+ fgState.MenuStatusCallback(GLUT_MENU_NOT_IN_USE, mouse_pos.X, mouse_pos.Y);
}
}
}
/*
* 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" );