typedef BOOL (WINAPI *pRegisterTouchWindow)(HWND,ULONG);
static pRegisterTouchWindow fghRegisterTouchWindow = (pRegisterTouchWindow)0xDEADBEEF;
#endif
+extern void fghNotifyWindowStatus(SFG_Window *window);
/*
}
}
-
/* Computes position of corners of window Rect (outer position including
* decorations) based on the provided client rect and based on the style
* of the window in question.
fghComputeWindowRectFromClientArea_UseStyle(clientRect, windowStyle, windowExStyle, posIsOutside);
}
-
/* Gets the rect describing the client area (drawable area) of the
* specified window. Output is position of corners of client area (drawable area) on the screen.
- * Returns an empty rect if window pointer or window handle is NULL.
- * If wantPosOutside is set to true, the output client Rect
- * will follow freeGLUT's window specification convention in which the
- * top-left corner is at the outside of the window, while the size
- * (rect.right-rect.left,rect.bottom-rect.top) is the size of the drawable
- * area.
+ * Does not touch clientRect if window pointer or window handle is NULL.
+ * (rect.right-rect.left,rect.bottom-rect.top) is the size of the drawable area.
*/
-void fghGetClientArea( RECT *clientRect, const SFG_Window *window, BOOL wantPosOutside )
+void fghGetClientArea( RECT *clientRect, const SFG_Window *window )
{
POINT topLeftClient = {0,0};
- POINT topLeftWindow = {0,0};
freeglut_return_if_fail((window && window->Window.Handle));
- /*
- * call GetWindowRect()
- * (this returns the pixel coordinates of the outside of the window)
- * cannot use GetClientRect as it returns a rect relative to
- * the top-left point of the client area (.top and .left are thus always 0)
- * and is thus only useful for querying the size of the client area, not
- * its position.
- */
- GetWindowRect( window->Window.Handle, clientRect );
- topLeftWindow.x = clientRect->top;
- topLeftWindow.y = clientRect->left;
-
/* Get size of client rect */
GetClientRect(window->Window.Handle, clientRect);
/* Get position of top-left of client area on the screen */
ClientToScreen(window->Window.Handle,&topLeftClient);
/* Add top-left offset */
OffsetRect(clientRect,topLeftClient.x,topLeftClient.y);
-
- /* replace top and left with top and left of window, if wanted */
- if (wantPosOutside)
- {
- clientRect->left = topLeftWindow.x;
- clientRect->top = topLeftWindow.y;
- }
}
+
#if(WINVER >= 0x500)
typedef struct
{
if( !( window->Window.Handle ) )
fgError( "Failed to create a window (%s)!", title );
+ /* Store title */
+ {
+ window->State.pWState.WindowTitle = malloc (strlen(title) + 1);
+ strcpy(window->State.pWState.WindowTitle, title);
+ }
+
#if !defined(_WIN32_WCE)
/* Need to set requested style again, apparently Windows doesn't listen when requesting windows without title bar or borders */
SetWindowLong(window->Window.Handle, GWL_STYLE, flags);
fgState.ForceIconic ? SW_SHOWMINIMIZED : SW_SHOWNORMAL );
#endif /* defined(_WIN32_WCE) */
- UpdateWindow( window->Window.Handle );
- ShowCursor( TRUE ); /* XXX Old comments say "hide cursor"! */
+ ShowCursor( TRUE );
}
void fgPlatformDisplayWindow ( SFG_Window *window )
{
+ /* This immediately generates a WM_PAINT message upon which we call the display callbacks to redraw the window */
RedrawWindow(
window->Window.Handle, NULL, NULL,
RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW
RECT windowRect;
/*
+ * HACK HACK HACK:
+ * Before we do anything else, check if this is a newly created window
+ * that did not have its windowStatus/visibility func called yet
+ * we do that on first paint, but because I want to keep the paint
+ * operation as lean as possible, we do it here. The first paint
+ * goes together with a first resize call before the display callback
+ * is called, so this is just in time. Shitty place to do it, but this
+ * is the only reliable way I can think of to call the callback upon
+ * first draw of the window.
+ * More broadly speaking, I know this is an ugly hack, but I'm not sure
+ * what else to do about it. Depending on WM_ACTIVATE would not work
+ * as not all windows get this when you are opening multiple before the
+ * mainloop starts. WM_SHOWWINDOW looked like an interesting candidate,
+ * but it is generated and processed before glutCreate(Sub)Window
+ * returns, so no callback can yet be set on the window.
+ */
+ /* Check windowStatus/visibility func has been notified that window is visible (deferred from creation time to give user opportunity to register callbacks) */
+ if (!window->State.pWState.WindowFuncCalled)
+ {
+ fghNotifyWindowStatus(window);
+ window->State.pWState.WindowFuncCalled = GL_TRUE;
+ }
+
+ /*
* For windowed mode, get the current position of the
* window and resize taking the size of the frame
* decorations into account.
* for them.
*/
RECT parentRect;
- fghGetClientArea( &parentRect, window->Parent, FALSE );
+ fghGetClientArea( &parentRect, window->Parent );
OffsetRect(&windowRect,-parentRect.left,-parentRect.top);
}
}
DestroyWindow( window->Window.Handle );
+
+ /* clean up copied title text(s) */
+ if (window->State.pWState.WindowTitle)
+ free(window->State.pWState.WindowTitle);
+ if (window->State.pWState.IconTitle)
+ free(window->State.pWState.IconTitle);
}
*/
void fgPlatformGlutIconifyWindow( void )
{
- ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_MINIMIZE );
+ SFG_Window *win = fgStructure.CurrentWindow;
+
+ /* Call on parent window */
+ while (win->Parent)
+ win = win->Parent;
+
+ /* Visibility status of window gets updated in the WM_SHOWWINDOW handler */
+ ShowWindow(win->Window.Handle, SW_MINIMIZE);
}
/*
#else
SetWindowText( fgStructure.CurrentWindow->Window.Handle, title );
#endif
+
+ /* Make copy of string to refer to later */
+ if (fgStructure.CurrentWindow->State.pWState.WindowTitle)
+ free(fgStructure.CurrentWindow->State.pWState.WindowTitle);
+ fgStructure.CurrentWindow->State.pWState.WindowTitle = malloc (strlen(title) + 1);
+ strcpy(fgStructure.CurrentWindow->State.pWState.WindowTitle, title);
}
/*
* Set the current window's iconified title
- * There really isn't a way to set the icon name separate from the
- * windows name in Win32, so, just set the windows name.
*/
void fgPlatformGlutSetIconTitle( const char* title )
{
-#ifdef _WIN32_WCE
- {
- wchar_t* wstr = fghWstrFromStr(title);
- SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr );
- free(wstr);
- }
-#else
- SetWindowText( fgStructure.CurrentWindow->Window.Handle, title );
-#endif
+ /* Make copy of string to refer to later */
+ if (fgStructure.CurrentWindow->State.pWState.IconTitle)
+ free(fgStructure.CurrentWindow->State.pWState.IconTitle);
+ fgStructure.CurrentWindow->State.pWState.IconTitle = malloc (strlen(title) + 1);
+ strcpy(fgStructure.CurrentWindow->State.pWState.IconTitle, title);
}
/*