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 ---------------------------------------------------- */
* 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;
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);
}
}
-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;
*/
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 */
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;
}