extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
unsigned char layer_type );
+extern void fgPlatformCheckMenuDeactivate();
+
#ifdef WM_TOUCH
typedef BOOL (WINAPI *pGetTouchInputInfo)(HTOUCHINPUT,UINT,PTOUCHINPUT,int);
typedef BOOL (WINAPI *pCloseTouchInputHandle)(HTOUCHINPUT);
* and the window rect from the client area given the style of the window
* (or a valid window pointer from which the style can be queried).
*/
-extern void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside );
-extern RECT fghGetClientArea ( const SFG_Window *window, BOOL wantPosOutside );
+extern void fghComputeWindowRectFromClientArea_QueryWindow( RECT *clientRect, const SFG_Window *window, BOOL posIsOutside );
+extern void fghGetClientArea ( RECT *clientRect, const SFG_Window *window, BOOL wantPosOutside );
void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )
* For windowed mode, get the current position of the
* window and resize taking the size of the frame
* decorations into account.
+ *
+ * Note on maximizing behavior of Windows: the resize borders are off
+ * the screen such that the client area extends all the way from the
+ * leftmost corner to the rightmost corner to maximize screen real
+ * estate. A caption is still shown however to allow interaction with
+ * the window controls. This is default behavior of Windows that
+ * FreeGLUT sticks with. To alter, one would have to check if
+ * WS_MAXIMIZE style is set when a resize event is triggered, and
+ * then manually correct the windowRect to put the borders back on
+ * screen.
*/
/* "GetWindowRect" returns the pixel coordinates of the outside of the window */
if (window->Parent == NULL)
/* get the window rect from this to feed to SetWindowPos, correct for window decorations */
- fghComputeWindowRectFromClientArea_QueryWindow(window,&windowRect,TRUE);
+ fghComputeWindowRectFromClientArea_QueryWindow(&windowRect,window,TRUE);
else
{
/* correct rect for position client area of parent window
* for them.
*/
RECT parentRect;
- parentRect = fghGetClientArea( window->Parent, FALSE );
- windowRect.left -= parentRect.left;
- windowRect.right -= parentRect.left;
- windowRect.top -= parentRect.top;
- windowRect.bottom -= parentRect.top;
+ fghGetClientArea( &parentRect, window->Parent, FALSE );
+ OffsetRect(&windowRect,-parentRect.left,-parentRect.top);
}
/* Do the actual resizing */
uMsg, wParam, lParam ); */
/* Some events only sent to main window. Check if the current window that
- * the mouse is over is a child window. Below whn handling some messages,
+ * the mouse is over is a child window. Below when handling some messages,
* we make sure that we process callbacks on the child window instead.
* This mirrors how GLUT does things.
*/
case WM_KILLFOCUS:
{
- SFG_Menu* menu = NULL;
+ SFG_Window* saved_window = fgStructure.CurrentWindow;
/* printf("WM_KILLFOCUS: %p\n", window ); */
lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) );
+ fgSetWindow(saved_window);
- /* If we have an open menu, see if the open menu should be closed
- * when focus was lost because user either switched
- * application or FreeGLUT window (if one is running multiple
- * windows). If so, close menu the active menu.
- */
- if ( fgStructure.Menus.First )
- menu = fgGetActiveMenu();
-
- if ( menu )
- {
- SFG_Window* wnd = NULL;
- HWND hwnd = GetFocus(); /* Get window with current focus - NULL for non freeglut windows */
- if (hwnd)
- /* See which of our windows it is */
- wnd = fgWindowByHandle(hwnd);
-
- if (!hwnd || !wnd)
- /* User switched to another application*/
- fgDeactivateMenu(menu->ParentWindow);
- else if (!wnd->IsMenu && wnd!=menu->ParentWindow) /* Make sure we don't kill the menu when trying to enter a submenu */
- /* User switched to another FreeGLUT window */
- fgDeactivateMenu(menu->ParentWindow);
- else
- {
- /* Check if focus lost because non-client area of
- * window was pressed (pressing on client area is
- * handled in fgCheckActiveMenu)
- */
- POINT mouse_pos;
- RECT clientArea = fghGetClientArea(menu->ParentWindow, GL_FALSE);
- GetCursorPos(&mouse_pos);
- if ( !PtInRect( &clientArea, mouse_pos ) )
- fgDeactivateMenu(menu->ParentWindow);
- }
- }
+ /* Check if there are any open menus that need to be closed */
+ fgPlatformCheckMenuDeactivate();
}
break;
case WM_PAINT:
/* Turn on the visibility in case it was turned off somehow */
window->State.Visible = GL_TRUE;
+ InvalidateRect( hWnd, NULL, GL_FALSE ); /* Make sure whole window is repainted. Bit of a hack, but a safe on from what google turns up... */
BeginPaint( hWnd, &ps );
fghRedrawWindow( window );
EndPaint( hWnd, &ps );