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:
parent
f46574e263
commit
1d9ec8e1e9
@ -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 () ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 :
|
||||||
|
@ -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 );
|
||||||
|
Reference in New Issue
Block a user