implemented somewhat better visibility/windowstatus support, some small

cleanup


git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1536 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
dcnieho 2013-03-01 05:53:51 +00:00
parent f46574e263
commit 1d9ec8e1e9
3 changed files with 87 additions and 32 deletions

View File

@ -25,6 +25,7 @@ int windows[CALLBACKMAKER_N_WINDOWS] = {0};
CALLBACK_2V(reshape,width,height); CALLBACK_2V(reshape,width,height);
CALLBACK_2V(position,top,left); CALLBACK_2V(position,top,left);
CALLBACK_1V(visibility,vis); CALLBACK_1V(visibility,vis);
CALLBACK_1V(windowStatus,state);
CALLBACK_4V(key,key,x,y,mod); CALLBACK_4V(key,key,x,y,mod);
CALLBACK_4V(keyup,key,x,y,mod); CALLBACK_4V(keyup,key,x,y,mod);
CALLBACK_4V(special,key,x,y,mod); CALLBACK_4V(special,key,x,y,mod);
@ -122,6 +123,11 @@ Display(void)
bitmapPrintf ( "Visibility %d: %d\n", visibility_seq[winIdx], visibility_vis[winIdx] ); 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] ) if ( reshape_called[winIdx] )
{ {
bitmapPrintf ( "Reshape %d: %d %d\n", reshape_seq[winIdx], reshape_width[winIdx], reshape_height[winIdx] ); bitmapPrintf ( "Reshape %d: %d %d\n", reshape_seq[winIdx], reshape_width[winIdx], reshape_height[winIdx] );
@ -232,19 +238,6 @@ Error(const char *fmt, va_list ap)
exit(1); exit(1);
} }
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 static void
Reshape(int width, int height) Reshape(int width, int height)
{ {
@ -448,12 +441,29 @@ OverlayDisplay(void)
glutPostRedisplay () ; glutPostRedisplay () ;
} }
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 static void
WindowStatus(int state) WindowStatus(int state)
{ {
int window = getWindowAndIdx(NULL); int winIdx;
int window = getWindowAndIdx(&winIdx);
printf ( "%6d Window %d WindowStatus Callback: %d\n", printf ( "%6d Window %d WindowStatus Callback: %d\n",
++sequence_number, window, state ) ; ++sequence_number, window, state ) ;
windowStatus_called[winIdx] = 1 ;
windowStatus_state[winIdx] = state ;
windowStatus_seq[winIdx] = sequence_number ;
glutPostRedisplay () ; glutPostRedisplay () ;
} }

View File

@ -128,6 +128,40 @@ void fgPlatformProcessSingleEvent ( void )
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 ) void fgPlatformMainLoopPreliminaryWork ( void )
{ {
SFG_Window *window = (SFG_Window *)fgStructure.Windows.First ; SFG_Window *window = (SFG_Window *)fgStructure.Windows.First ;
@ -147,7 +181,7 @@ void fgPlatformMainLoopPreliminaryWork ( void )
{ {
SFG_Window *current_window = fgStructure.CurrentWindow ; SFG_Window *current_window = fgStructure.CurrentWindow ;
INVOKE_WCB( *window, WindowStatus, ( window->State.Visible?GLUT_FULLY_RETAINED:GLUT_HIDDEN ) ); fghNotifyWindowStatus(window);
fgSetWindow( current_window ); fgSetWindow( current_window );
} }
@ -466,6 +500,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
break; break;
case WM_SIZE: 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 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 * If it is not, then it is the system sending us a dummy resize with
@ -488,28 +523,35 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
window->State.NeedToResize = GL_TRUE; window->State.NeedToResize = GL_TRUE;
} }
/* according to docs, should return 0 */
lRet = 0;
break; break;
case WM_MOVE: case WM_MOVE:
{ {
SFG_Window* saved_window = fgStructure.CurrentWindow; SFG_Window* saved_window = fgStructure.CurrentWindow;
RECT windowRect; 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 GetWindowRect( window->Window.Handle, &windowRect );
* of parent's client area.
*/
POINT topleft = {windowRect.left,windowRect.top};
ScreenToClient(window->Parent->Window.Handle,&topleft); if (window->Parent)
windowRect.left = topleft.x; {
windowRect.top = topleft.y; /* 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;
}
INVOKE_WCB( *window, Position, ( windowRect.left, windowRect.top ) );
fgSetWindow(saved_window);
} }
INVOKE_WCB( *window, Position, ( windowRect.left, windowRect.top ) );
fgSetWindow(saved_window);
} }
break; break;
@ -535,7 +577,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
#if 0 #if 0
case WM_ACTIVATE: 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) if (LOWORD(wParam) != WA_INACTIVE)
{ {
/* printf("WM_ACTIVATE: fgSetCursor( %p, %d)\n", window, /* printf("WM_ACTIVATE: fgSetCursor( %p, %d)\n", window,
@ -596,7 +638,8 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
break; break;
case WM_SHOWWINDOW: case WM_SHOWWINDOW:
window->State.Visible = GL_TRUE; //printf("WM_SHOWWINDOW\n");
fghUpdateWindowStatus(window, GL_TRUE);
window->State.Redisplay = GL_TRUE; window->State.Redisplay = GL_TRUE;
break; break;
@ -605,6 +648,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
PAINTSTRUCT ps; PAINTSTRUCT ps;
/* Turn on the visibility in case it was turned off somehow */ /* Turn on the visibility in case it was turned off somehow */
window->State.Visible = GL_TRUE; 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... */ 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 ); BeginPaint( hWnd, &ps );
fghRedrawWindow( window ); fghRedrawWindow( window );
@ -939,7 +983,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
case SC_MINIMIZE : case SC_MINIMIZE :
/* User has clicked on the "-" to minimize the window */ /* User has clicked on the "-" to minimize the window */
/* Turn off the visibility */ /* Turn off the visibility */
window->State.Visible = GL_FALSE ; fghUpdateWindowStatus(window, GL_FALSE);
break ; break ;
@ -972,6 +1016,7 @@ LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPAR
break ; break ;
case SC_RESTORE : case SC_RESTORE :
fghUpdateWindowStatus(window, GL_TRUE);
break ; break ;
case SC_TASKLIST : case SC_TASKLIST :

View File

@ -751,7 +751,7 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
ShowWindow( window->Window.Handle, SW_SHOW ); ShowWindow( window->Window.Handle, SW_SHOW );
#else #else
ShowWindow( window->Window.Handle, ShowWindow( window->Window.Handle,
fgState.ForceIconic ? SW_SHOWMINIMIZED : SW_SHOW ); fgState.ForceIconic ? SW_SHOWMINIMIZED : SW_SHOWNORMAL );
#endif /* defined(_WIN32_WCE) */ #endif /* defined(_WIN32_WCE) */
UpdateWindow( window->Window.Handle ); UpdateWindow( window->Window.Handle );