CALLBACK_2V(reshape,width,height);
CALLBACK_2V(position,top,left);
CALLBACK_1V(visibility,vis);
+CALLBACK_1V(windowStatus,state);
CALLBACK_4V(key,key,x,y,mod);
CALLBACK_4V(keyup,key,x,y,mod);
CALLBACK_4V(special,key,x,y,mod);
bitmapPrintf ( "Visibility %d: %d\n", visibility_seq[winIdx], visibility_vis[winIdx] );
}
+ if ( windowStatus_called[winIdx] )
+ {
+ bitmapPrintf ( "WindowStatus %d: %d\n", windowStatus_seq[winIdx], windowStatus_state[winIdx] );
+ }
+
if ( reshape_called[winIdx] )
{
bitmapPrintf ( "Reshape %d: %d %d\n", reshape_seq[winIdx], reshape_width[winIdx], reshape_height[winIdx] );
}
static void
-Visibility(int vis)
-{
- int winIdx;
- int window = getWindowAndIdx(&winIdx);
- printf ( "%6d Window %d Visibility Callback: %d\n",
- ++sequence_number, window, vis ) ;
- visibility_called[winIdx] = 1 ;
- visibility_vis[winIdx] = vis ;
- visibility_seq[winIdx] = sequence_number ;
- glutPostRedisplay () ;
-}
-
-static void
Reshape(int width, int height)
{
int winIdx;
}
static void
+Visibility(int vis)
+{
+ int winIdx;
+ int window = getWindowAndIdx(&winIdx);
+ printf ( "%6d Window %d Visibility Callback: %d\n",
+ ++sequence_number, window, vis ) ;
+ visibility_called[winIdx] = 1 ;
+ visibility_vis[winIdx] = vis ;
+ visibility_seq[winIdx] = sequence_number ;
+ glutPostRedisplay () ;
+}
+
+static void
WindowStatus(int state)
{
- int window = getWindowAndIdx(NULL);
+ int winIdx;
+ int window = getWindowAndIdx(&winIdx);
printf ( "%6d Window %d WindowStatus Callback: %d\n",
++sequence_number, window, state ) ;
+ windowStatus_called[winIdx] = 1 ;
+ windowStatus_state[winIdx] = state ;
+ windowStatus_seq[winIdx] = sequence_number ;
glutPostRedisplay () ;
}
+static void fghUpdateWindowStatus(SFG_Window *window, GLboolean visState)
+{
+ SFG_Window* child;
+
+ if (window->State.Visible != visState)
+ {
+ window->State.Visible = visState;
+ INVOKE_WCB( *window, WindowStatus, ( visState ? GLUT_FULLY_RETAINED:GLUT_HIDDEN ) );
+ }
+
+ /* Also notify children */
+ for( child = ( SFG_Window * )window->Children.First;
+ child;
+ child = ( SFG_Window * )child->Node.Next )
+ {
+ fghUpdateWindowStatus(child, visState);
+ }
+}
+
+static void fghNotifyWindowStatus(SFG_Window *window)
+{
+ SFG_Window* child;
+
+ INVOKE_WCB( *window, WindowStatus, ( window->State.Visible?GLUT_FULLY_RETAINED:GLUT_HIDDEN ) );
+
+ /* Also notify children */
+ for( child = ( SFG_Window * )window->Children.First;
+ child;
+ child = ( SFG_Window * )child->Node.Next )
+ {
+ fghNotifyWindowStatus(child);
+ }
+}
+
void fgPlatformMainLoopPreliminaryWork ( void )
{
SFG_Window *window = (SFG_Window *)fgStructure.Windows.First ;
{
SFG_Window *current_window = fgStructure.CurrentWindow ;
- INVOKE_WCB( *window, WindowStatus, ( window->State.Visible?GLUT_FULLY_RETAINED:GLUT_HIDDEN ) );
+ fghNotifyWindowStatus(window);
fgSetWindow( current_window );
}
break;
case WM_SIZE:
+ //printf("WM_SIZE (ID: %i): wParam: %i, new size: %ix%i \n",window->ID,wParam,LOWORD(lParam),HIWORD(lParam));
/*
* If the window is visible, then it is the user manually resizing it.
* If it is not, then it is the system sending us a dummy resize with
window->State.NeedToResize = GL_TRUE;
}
+ /* according to docs, should return 0 */
+ lRet = 0;
break;
case WM_MOVE:
{
SFG_Window* saved_window = fgStructure.CurrentWindow;
RECT windowRect;
- GetWindowRect( window->Window.Handle, &windowRect );
-
- if (window->Parent)
+
+ /* Check window visible, we don't want to call the position callback when the user minimized the window */
+ if (window->State.Visible)
{
- /* For child window, we should return relative to upper-left
- * of parent's client area.
- */
- POINT topleft = {windowRect.left,windowRect.top};
-
- ScreenToClient(window->Parent->Window.Handle,&topleft);
- windowRect.left = topleft.x;
- windowRect.top = topleft.y;
- }
+ GetWindowRect( window->Window.Handle, &windowRect );
+
+ if (window->Parent)
+ {
+ /* For child window, we should return relative to upper-left
+ * of parent's client area.
+ */
+ POINT topleft = {windowRect.left,windowRect.top};
- INVOKE_WCB( *window, Position, ( windowRect.left, windowRect.top ) );
- fgSetWindow(saved_window);
+ ScreenToClient(window->Parent->Window.Handle,&topleft);
+ windowRect.left = topleft.x;
+ windowRect.top = topleft.y;
+ }
+
+ INVOKE_WCB( *window, Position, ( windowRect.left, windowRect.top ) );
+ fgSetWindow(saved_window);
+ }
}
break;
#if 0
case WM_ACTIVATE:
- //printf("WM_ACTIVATE: %x %d %d\n",lParam, HIWORD(wParam), LOWORD(wParam));
+ //printf("WM_ACTIVATE: %x (ID: %i) %d %d\n",lParam, window->ID, HIWORD(wParam), LOWORD(wParam));
if (LOWORD(wParam) != WA_INACTIVE)
{
/* printf("WM_ACTIVATE: fgSetCursor( %p, %d)\n", window,
break;
case WM_SHOWWINDOW:
- window->State.Visible = GL_TRUE;
+ //printf("WM_SHOWWINDOW\n");
+ fghUpdateWindowStatus(window, GL_TRUE);
window->State.Redisplay = GL_TRUE;
break;
PAINTSTRUCT ps;
/* 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 one from what google turns up... */
BeginPaint( hWnd, &ps );
fghRedrawWindow( window );
case SC_MINIMIZE :
/* User has clicked on the "-" to minimize the window */
/* Turn off the visibility */
- window->State.Visible = GL_FALSE ;
+ fghUpdateWindowStatus(window, GL_FALSE);
break ;
break ;
case SC_RESTORE :
+ fghUpdateWindowStatus(window, GL_TRUE);
break ;
case SC_TASKLIST :