MenuStatusCallback when menu was closed did not return location of pointer relative...
authorDiederick Niehorster <dcnieho@gmail.com>
Mon, 4 Mar 2013 09:54:55 +0000 (09:54 +0000)
committerDiederick Niehorster <dcnieho@gmail.com>
Mon, 4 Mar 2013 09:54:55 +0000 (09:54 +0000)
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
src/mswin/fg_cursor_mswin.c
src/mswin/fg_main_mswin.c
src/x11/fg_cursor_x11.c

index d44c6f4..853c1b4 100644 (file)
@@ -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);
         }
index d14da59..7bc5cae 100644 (file)
@@ -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;
index 1e14b2a..4ee9008 100644 (file)
@@ -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 */
index ab5e015..fcadb00 100644 (file)
@@ -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;
 }