Eliminated most of the say-nothing-new comments.

Fit most of the code to no more than 80 columns.

Raised some issues about completeness/correctness of trying to
decrement the max-window-ID (apparently in order to partially
recycle some window IDs to slightly slow the rate of growth of
window IDs).  (I didn't change what the code does, though.)


The functionality of the code should be unchanged.


git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@270 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
rkrolib 2003-10-30 04:36:54 +00:00
parent 3eec065016
commit 191ff25528

View File

@ -60,7 +60,8 @@ SFG_Structure fgStructure = { { NULL, NULL }, /* The list of windows */
* *
* If parent is set to NULL, the window created will be a topmost one. * If parent is set to NULL, the window created will be a topmost one.
*/ */
SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, int x, int y, int w, int h, GLboolean gameMode ) SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title,
int x, int y, int w, int h, GLboolean gameMode )
{ {
/* /*
* Have the window object created * Have the window object created
@ -80,29 +81,14 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, int x, int y,
*/ */
window->ID = ++fgStructure.WindowID; window->ID = ++fgStructure.WindowID;
/*
* Initialize the children list
*/
fgListInit( &window->Children ); fgListInit( &window->Children );
/*
* Does this window have a parent?
*/
if( parent != NULL ) if( parent != NULL )
{ {
/* fgListAppend( &parent->Children, &window->Node );
* That's quite right, attach this windows as a child window
*/
fgListAppend( &parent->Children, &window->Node );
window->Parent = parent; window->Parent = parent;
} }
else else
{ fgListAppend( &fgStructure.Windows, &window->Node );
/*
* Otherwise add the newly created window to the topmost windows list
*/
fgListAppend( &fgStructure.Windows, &window->Node );
}
/* /*
* Set the default mouse cursor and reset the modifiers value * Set the default mouse cursor and reset the modifiers value
@ -110,21 +96,16 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, int x, int y,
window->State.Cursor = GLUT_CURSOR_INHERIT; window->State.Cursor = GLUT_CURSOR_INHERIT;
window->State.Modifiers = 0xffffffff; window->State.Modifiers = 0xffffffff;
/*
* If this window is a menu, set IsMenu in the structure
*/
window->IsMenu = fgState.BuildingAMenu ; window->IsMenu = fgState.BuildingAMenu ;
/* /*
* Open the window now. The fgOpenWindow() function is system * Open the window now. The fgOpenWindow() function is system
* dependant, and resides in freeglut_window.c. Uses fgState. * dependant, and resides in freeglut_window.c. Uses fgState.
*/ */
fgOpenWindow( window, title, x, y, w, h, gameMode, (parent != NULL) ? TRUE : FALSE ); fgOpenWindow( window, title, x, y, w, h, gameMode,
(parent != NULL) ? TRUE : FALSE );
/* return window;
* Return a pointer to the newly created window
*/
return( window );
} }
/* /*
@ -132,8 +113,8 @@ SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, int x, int y,
*/ */
SFG_Menu* fgCreateMenu( FGCBmenu menuCallback ) SFG_Menu* fgCreateMenu( FGCBmenu menuCallback )
{ {
int x = 100, y = 100, w = 100, h = 100 ; int x = 100, y = 100, w = 100, h = 100 ;
SFG_Window *current_window = fgStructure.Window ; SFG_Window *current_window = fgStructure.Window ;
/* /*
* Have the menu object created * Have the menu object created
@ -162,8 +143,8 @@ SFG_Menu* fgCreateMenu( FGCBmenu menuCallback )
glutDisplayFunc ( fgDisplayMenu ) ; glutDisplayFunc ( fgDisplayMenu ) ;
/* /*
* While BuildingAMenu is true, all windows built have no decorations. That's * While BuildingAMenu is true, all windows built have no decorations.
* not a good default behavior, so let's set it false again. * That's not a good default behavior, so let's set it false again.
*/ */
fgState.BuildingAMenu = FALSE ; fgState.BuildingAMenu = FALSE ;
@ -177,14 +158,7 @@ SFG_Menu* fgCreateMenu( FGCBmenu menuCallback )
menu->Callback = menuCallback; menu->Callback = menuCallback;
menu->ActiveEntry = NULL ; menu->ActiveEntry = NULL ;
/*
* Initialize the entries list
*/
fgListInit( &menu->Entries ); fgListInit( &menu->Entries );
/*
* Add it to the menu structure hierarchy
*/
fgListAppend( &fgStructure.Menus, &menu->Node ); fgListAppend( &fgStructure.Menus, &menu->Node );
/* /*
@ -192,26 +166,26 @@ SFG_Menu* fgCreateMenu( FGCBmenu menuCallback )
*/ */
fgStructure.Menu = menu; fgStructure.Menu = menu;
/* return menu;
* Return the result to the caller
*/
return( menu );
} }
/* /*
* Linked list of windows to destroy ... this is so we don't destroy a window from the middle of * Linked list of windows to destroy ... this is so we don't destroy a
* its callback. Some C compilers take an extremely dim view of this. * window from the middle of its callback. Some C compilers take an
* extremely dim view of this.
*/ */
static SFG_WindowList* WindowsToDestroy = (SFG_WindowList*)NULL ; static SFG_WindowList* WindowsToDestroy = (SFG_WindowList*)NULL ;
/* /*
* Function to add a window to the linked list of windows to destroy. Subwindows are automatically * Function to add a window to the linked list of windows to destroy.
* added because they hang from the window structure. * Subwindows are automatically added because they hang from the window
* structure.
*/ */
void fgAddToWindowDestroyList ( SFG_Window* window, GLboolean needToClose ) void fgAddToWindowDestroyList ( SFG_Window* window, GLboolean needToClose )
{ {
SFG_WindowList *new_list_entry = (SFG_WindowList*)malloc ( sizeof(SFG_WindowList) ) ; SFG_WindowList *new_list_entry =
(SFG_WindowList*)malloc ( sizeof(SFG_WindowList) ) ;
new_list_entry->window = window ; new_list_entry->window = window ;
new_list_entry->needToClose = needToClose ; new_list_entry->needToClose = needToClose ;
new_list_entry->next = WindowsToDestroy ; new_list_entry->next = WindowsToDestroy ;
@ -224,13 +198,25 @@ void fgAddToWindowDestroyList ( SFG_Window* window, GLboolean needToClose )
fgStructure.Window = NULL; fgStructure.Window = NULL;
/* /*
* If the destroyed window has the highest window ID number, decrement the window ID number * If the destroyed window has the highest window ID number, decrement
* the window ID number.
*
* XXX Do we REALLY want to *ever* recycle window IDs? Integers are
* XXX plentiful, and clients may rely upon the implied promise in
* XXX the GLUT docs to not recycle these. (I can't remember if it
* XXX is explicit.)
*
* XXX If we *do* want to do this, we should actually recompute the
* XXX highest window-ID; the new highest may not in fact be one less
* XXX than what we have just deleted.
*/ */
if ( window->ID == fgStructure.WindowID ) fgStructure.WindowID-- ; if ( window->ID == fgStructure.WindowID )
fgStructure.WindowID-- ;
/* /*
* Check the execution state. If this has been called from "glutDestroyWindow", * Check the execution state. If this has been called from
* a statement in that function will reset the "ExecState" after this function returns. * "glutDestroyWindow", a statement in that function will reset the
* "ExecState" after this function returns.
*/ */
if ( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION ) if ( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION )
{ {
@ -248,7 +234,8 @@ void fgAddToWindowDestroyList ( SFG_Window* window, GLboolean needToClose )
void fgCloseWindows () void fgCloseWindows ()
{ {
SFG_WindowList *window_ptr = WindowsToDestroy ; SFG_WindowList *window_ptr = WindowsToDestroy ;
WindowsToDestroy = (SFG_WindowList*)NULL ; /* In case the destroy callbacks cause more windows to be closed */ WindowsToDestroy = (SFG_WindowList*)NULL ;
/* In case the destroy callbacks cause more windows to be closed */
while ( window_ptr ) while ( window_ptr )
{ {
@ -278,22 +265,9 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose )
assert( window != NULL ); assert( window != NULL );
freeglut_assert_ready; freeglut_assert_ready;
/*
* Does this window have any subwindows?
*/
while ( (subWindow = (SFG_Window *)window->Children.First) != NULL ) while ( (subWindow = (SFG_Window *)window->Children.First) != NULL )
{
/*
* Destroy the first window in the list (possibly destroying
* its subwindows too). This is not very effective, but works
*/
fgDestroyWindow( subWindow, needToClose ); fgDestroyWindow( subWindow, needToClose );
}
/*
* If the programmer defined a destroy callback, call it
* A. Donev: But first make this the active window
*/
if ( window->Callbacks.Destroy != NULL ) if ( window->Callbacks.Destroy != NULL )
{ {
SFG_Window *activeWindow = fgStructure.Window ; SFG_Window *activeWindow = fgStructure.Window ;
@ -302,9 +276,6 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose )
fgSetWindow ( activeWindow ) ; fgSetWindow ( activeWindow ) ;
} }
/*
* Now we should remove the reference to this window from its parent
*/
if ( window->Parent != NULL ) if ( window->Parent != NULL )
fgListRemove( &window->Parent->Children, &window->Node ); fgListRemove( &window->Parent->Children, &window->Node );
else else
@ -319,19 +290,11 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose )
window->Menu[menu_index]->ParentWindow = NULL ; window->Menu[menu_index]->ParentWindow = NULL ;
} }
/*
* OK, this window seems disconnected from the structure enough
* in order to be closed without any bigger risks...
*/
if( needToClose == TRUE ) if( needToClose == TRUE )
fgCloseWindow( window ); fgCloseWindow( window );
/*
* Finally, we can delete the window's object. It hopefully does
* have everything inside it freed and we do not have to care...
*/
free( window ); free( window );
if ( fgStructure.Window == window ) fgStructure.Window = NULL ; if ( fgStructure.Window == window )
fgStructure.Window = NULL ;
} }
/* /*
@ -348,19 +311,15 @@ static void fghRemoveMenuFromWindow( SFG_Window* window, SFG_Menu* menu )
* if so, have it detached (by overwriting with a NULL): * if so, have it detached (by overwriting with a NULL):
*/ */
for( i=0; i<3; i++ ) for( i=0; i<3; i++ )
{
if( window->Menu[ i ] == menu ) if( window->Menu[ i ] == menu )
window->Menu[ i ] = NULL; window->Menu[ i ] = NULL;
}
/* /*
* Call this function for all of the window's children recursively: * Call this function for all of the window's children recursively:
*/ */
for( subWindow = (SFG_Window *)window->Children.First; subWindow; for( subWindow = (SFG_Window *)window->Children.First; subWindow;
subWindow = (SFG_Window *)subWindow->Node.Next) subWindow = (SFG_Window *)subWindow->Node.Next)
{
fghRemoveMenuFromWindow( subWindow, menu ); fghRemoveMenuFromWindow( subWindow, menu );
}
} }
/* /*
@ -371,13 +330,11 @@ static void fghRemoveMenuFromMenu( SFG_Menu* from, SFG_Menu* menu )
{ {
SFG_MenuEntry *entry; SFG_MenuEntry *entry;
for( entry = (SFG_MenuEntry *)from->Entries.First; entry; entry = (SFG_MenuEntry *)entry->Node.Next ) for( entry = (SFG_MenuEntry *)from->Entries.First;
{ entry;
entry = (SFG_MenuEntry *)entry->Node.Next )
if (entry->SubMenu == menu) if (entry->SubMenu == menu)
{
entry->SubMenu = NULL; entry->SubMenu = NULL;
}
}
} }
/* /*
@ -396,18 +353,18 @@ void fgDestroyMenu( SFG_Menu* menu )
/* /*
* First of all, have all references to this menu removed from all windows: * First of all, have all references to this menu removed from all windows:
*/ */
for( window = (SFG_Window *)fgStructure.Windows.First; window; window = (SFG_Window *)window->Node.Next ) for( window = (SFG_Window *)fgStructure.Windows.First;
{ window;
window = (SFG_Window *)window->Node.Next )
fghRemoveMenuFromWindow( window, menu ); fghRemoveMenuFromWindow( window, menu );
}
/* /*
* Now proceed with removing menu entries that lead to this menu * Now proceed with removing menu entries that lead to this menu
*/ */
for( from = (SFG_Menu *)fgStructure.Menus.First; from; from = (SFG_Menu *)from->Node.Next ) for( from = (SFG_Menu *)fgStructure.Menus.First;
{ from;
from = (SFG_Menu *)from->Node.Next )
fghRemoveMenuFromMenu( from, menu ); fghRemoveMenuFromMenu( from, menu );
}
/* /*
* If the programmer defined a destroy callback, call it * If the programmer defined a destroy callback, call it
@ -429,39 +386,21 @@ void fgDestroyMenu( SFG_Menu* menu )
{ {
fgListRemove(&menu->Entries, &entry->Node); fgListRemove(&menu->Entries, &entry->Node);
/* if( entry->Text )
* There might be a string allocated, have it freed: free( entry->Text );
*/ entry->Text = NULL;
free( entry->Text );
/*
* Deallocate the entry itself:
*/
free( entry ); free( entry );
entry = NULL;
} }
/*
* Destroy the window associated with the menu
*/
if ( fgStructure.Window == menu->Window ) if ( fgStructure.Window == menu->Window )
fgSetWindow ( menu->ParentWindow ) ; fgSetWindow ( menu->ParentWindow ) ;
fgDestroyWindow ( menu->Window, TRUE ) ; fgDestroyWindow ( menu->Window, TRUE ) ;
/*
* Remove the menu from the menus list
*/
fgListRemove( &fgStructure.Menus, &menu->Node ); fgListRemove( &fgStructure.Menus, &menu->Node );
/*
* If that menu was the current one...
*/
if( fgStructure.Menu == menu ) if( fgStructure.Menu == menu )
fgStructure.Menu = NULL; fgStructure.Menu = NULL;
/*
* Have the menu structure freed
*/
free( menu ); free( menu );
} }
@ -484,17 +423,15 @@ void fgCreateStructure( void )
} }
/* /*
* This function is automatically called on glutMainLoop() return. It should deallocate * This function is automatically called on glutMainLoop() return.
* and destroy all remnants of previous glutInit()-enforced structure initialization... * It should deallocate and destroy all remnants of previous
* glutInit()-enforced structure initialization...
*/ */
void fgDestroyStructure( void ) void fgDestroyStructure( void )
{ {
SFG_Window *window; SFG_Window *window;
SFG_Menu *menu; SFG_Menu *menu;
/*
* Just make sure we are not called in vain...
*/
freeglut_assert_ready; freeglut_assert_ready;
/* /*
@ -520,45 +457,33 @@ void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator )
/* /*
* Check every of the top-level windows * Check every of the top-level windows
*/ */
for( window = (SFG_Window *)fgStructure.Windows.First; window; for( window = (SFG_Window *)fgStructure.Windows.First;
window;
window = (SFG_Window *)window->Node.Next ) window = (SFG_Window *)window->Node.Next )
{ {
/*
* Execute the callback...
*/
enumCallback( window, enumerator ); enumCallback( window, enumerator );
/*
* If it has been marked as 'found', stop searching
*/
if( enumerator->found == TRUE ) if( enumerator->found == TRUE )
return; return;
} }
} }
/* /*
* Helper function to enumerate through all a window's subwindows (single level descent) * Helper function to enumerate through all a window's subwindows
* (single level descent)
*/ */
void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, SFG_Enumerator* enumerator ) void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback,
SFG_Enumerator* enumerator )
{ {
SFG_Window *child; SFG_Window *child;
assert( (enumCallback != NULL) && (enumerator != NULL) ); assert( (enumCallback != NULL) && (enumerator != NULL) );
freeglut_assert_ready; freeglut_assert_ready;
/* for( child = (SFG_Window *)window->Children.First;
* Check every of the window's children: child;
*/ child = (SFG_Window *)child->Node.Next )
for( child = (SFG_Window *)window->Children.First; child; child = (SFG_Window *)child->Node.Next )
{ {
/*
* Execute the callback...
*/
enumCallback( child, enumerator ); enumCallback( child, enumerator );
/*
* If it has been marked as 'found', stop searching
*/
if( enumerator->found == TRUE ) if( enumerator->found == TRUE )
return; return;
} }
@ -567,11 +492,9 @@ void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, SFG_Enum
/* /*
* A static helper function to look for a window given its handle * A static helper function to look for a window given its handle
*/ */
static void fghcbWindowByHandle( SFG_Window *window, SFG_Enumerator *enumerator ) static void fghcbWindowByHandle( SFG_Window *window,
SFG_Enumerator *enumerator )
{ {
/*
* Make sure we do not overwrite our precious results...
*/
freeglut_return_if_fail( enumerator->found == FALSE ); freeglut_return_if_fail( enumerator->found == FALSE );
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
@ -618,22 +541,11 @@ SFG_Window* fgWindowByHandle
*/ */
enumerator.found = FALSE; enumerator.found = FALSE;
enumerator.data = (void *)hWindow; enumerator.data = (void *)hWindow;
/*
* Start the enumeration now:
*/
fgEnumWindows( fghcbWindowByHandle, &enumerator ); fgEnumWindows( fghcbWindowByHandle, &enumerator );
/*
* Check if the window has been found or not:
*/
if( enumerator.found == TRUE ) if( enumerator.found == TRUE )
return( (SFG_Window *) enumerator.data ); return( SFG_Window *) enumerator.data;
return NULL;
/*
* Otherwise return NULL to mark the failure
*/
return( NULL );
} }
/* /*
@ -677,22 +589,10 @@ SFG_Window* fgWindowByID( int windowID )
*/ */
enumerator.found = FALSE; enumerator.found = FALSE;
enumerator.data = (void *) windowID; enumerator.data = (void *) windowID;
/*
* Start the enumeration now:
*/
fgEnumWindows( fghcbWindowByID, &enumerator ); fgEnumWindows( fghcbWindowByID, &enumerator );
/*
* Check if the window has been found or not:
*/
if( enumerator.found == TRUE ) if( enumerator.found == TRUE )
return( (SFG_Window *) enumerator.data ); return( SFG_Window *) enumerator.data;
return NULL;
/*
* Otherwise return NULL to mark the failure
*/
return( NULL );
} }
/* /*