From 29ce77740209818d54bdea174d193307314f4084 Mon Sep 17 00:00:00 2001 From: Diederick Niehorster Date: Mon, 4 Mar 2013 09:54:55 +0000 Subject: [PATCH] MenuStatusCallback when menu was closed did not return location of pointer relative to child window's top-left, it only worked for top level windows. To make this work, fghPlatformGetCursorPos now can return cursor pos relative to top-left of a specified window's client area (this is untested on X11) git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1550 7f0cb862-5218-0410-a997-914c9d46530a --- src/fg_menu.c | 11 ++++------- src/mswin/fg_cursor_mswin.c | 9 +++++++-- src/mswin/fg_main_mswin.c | 2 +- src/x11/fg_cursor_x11.c | 21 +++++++++++++++------ 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/fg_menu.c b/src/fg_menu.c index d44c6f4..853c1b4 100644 --- a/src/fg_menu.c +++ b/src/fg_menu.c @@ -76,7 +76,7 @@ static float menu_pen_hback [4] = FREEGLUT_MENU_PEN_HBACK_COLORS; extern GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y ); -extern void fghPlatformGetCursorPos(SFG_XYUse *mouse_pos); +extern void fghPlatformGetCursorPos(const SFG_Window *window, GLboolean client, SFG_XYUse *mouse_pos); /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ @@ -534,7 +534,7 @@ static void fghActivateMenu( SFG_Window* window, int button ) * origin when looking at a child window * for parent windows: window->State.MouseX + glutGet( GLUT_WINDOW_X ) == mouse_pos.X */ - fghPlatformGetCursorPos(&mouse_pos); + fghPlatformGetCursorPos(NULL, GL_FALSE, &mouse_pos); menu->X = mouse_pos.X; menu->Y = mouse_pos.Y; @@ -744,12 +744,9 @@ void fgDeactivateMenu( SFG_Window *window ) fgState.MenuStateCallback(GLUT_MENU_NOT_IN_USE); if (fgState.MenuStatusCallback) { - /* Get cursor position on screen and convert to relative to parent_window's client area */ + /* Get cursor position relative to parent_window's client area */ SFG_XYUse mouse_pos; - fghPlatformGetCursorPos(&mouse_pos); - - mouse_pos.X -= glutGet( GLUT_WINDOW_X ); - mouse_pos.Y -= glutGet( GLUT_WINDOW_Y ); + fghPlatformGetCursorPos(parent_window, GL_TRUE, &mouse_pos); fgState.MenuStatusCallback(GLUT_MENU_NOT_IN_USE, mouse_pos.X, mouse_pos.Y); } diff --git a/src/mswin/fg_cursor_mswin.c b/src/mswin/fg_cursor_mswin.c index d14da59..7bc5cae 100644 --- a/src/mswin/fg_cursor_mswin.c +++ b/src/mswin/fg_cursor_mswin.c @@ -128,13 +128,18 @@ void fgPlatformWarpPointer ( int x, int y ) } -void fghPlatformGetCursorPos(SFG_XYUse *mouse_pos) +void fghPlatformGetCursorPos(const SFG_Window *window, GLboolean client, SFG_XYUse *mouse_pos) { - /* Get current pointer location in screen coordinates + /* Get current pointer location in screen coordinates (if client is false or window is NULL), else + * Get current pointer location relative to top-left of client area of window (if client is true and window is not NULL) */ POINT pos; GetCursorPos(&pos); + /* convert to client coords if wanted */ + if (client && window && window->Window.Handle) + ScreenToClient(window->Window.Handle,&pos); + mouse_pos->X = pos.x; mouse_pos->Y = pos.y; mouse_pos->Use = GL_TRUE; diff --git a/src/mswin/fg_main_mswin.c b/src/mswin/fg_main_mswin.c index 1e14b2a..4ee9008 100644 --- a/src/mswin/fg_main_mswin.c +++ b/src/mswin/fg_main_mswin.c @@ -349,7 +349,7 @@ static SFG_Window* fghWindowUnderCursor(SFG_Window *window) */ if (window && window->Children.First) /* This window has childs */ { - SFG_WindowHandleType hwnd; + HWND hwnd; SFG_Window* child_window; /* Get mouse position at time of message */ diff --git a/src/x11/fg_cursor_x11.c b/src/x11/fg_cursor_x11.c index ab5e015..fcadb00 100644 --- a/src/x11/fg_cursor_x11.c +++ b/src/x11/fg_cursor_x11.c @@ -149,18 +149,27 @@ void fgPlatformWarpPointer ( int x, int y ) XFlush( fgDisplay.pDisplay.Display ); } -void fghPlatformGetCursorPos(SFG_XYUse *mouse_pos) +void fghPlatformGetCursorPos(const SFG_Window *window, GLboolean client, SFG_XYUse *mouse_pos) { - /* Get current pointer location in screen coordinates + /* Get current pointer location in screen coordinates (if client is false or window is NULL), else + * Get current pointer location relative to top-left of client area of window (if client is true and window is not NULL) */ + Window w = (client && window && window->Window.Handle)? window->Window.Handle: fgDisplay.pDisplay.RootWindow; Window junk_window; unsigned int junk_mask; - int junk_pos; + int clientX, clientY; - XQueryPointer(fgDisplay.pDisplay.Display, fgDisplay.pDisplay.RootWindow, + XQueryPointer(fgDisplay.pDisplay.Display, w, &junk_window, &junk_window, - &mouse_pos->X, &mouse_pos->Y, - &junk_pos, &junk_pos, &junk_mask); + &mouse_pos->X, &mouse_pos->Y, /* Screen coords relative to root window's top-left */ + &clientX, &clientY, /* Client coords relative to window's top-left */ + &junk_mask); + + if (client && window && window->Window.Handle) + { + mouse_pos->X = clientX; + mouse_pos->Y = clientY; + } mouse_pos->Use = GL_TRUE; } -- 1.7.10.4