# HG changeset patch # User Darkvater # Date 1163810649 0 # Node ID e45de1152730102fed53cc130e438b2d46037d27 # Parent 1ff65e874ce3328fd603cf52f83104db407892e3 (svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over diff -r 1ff65e874ce3 -r e45de1152730 window.c --- a/window.c Sat Nov 18 00:14:43 2006 +0000 +++ b/window.c Sat Nov 18 00:44:09 2006 +0000 @@ -337,12 +337,13 @@ { Window *w; - for (w = _windows; w != _last_window;) { +restart_search: + /* When we find the window to delete, we need to restart the search + * as deleting this window could cascade in deleting (many) others */ + for (w = _windows; w != _last_window; w++) { if (w->window_class == cls) { DeleteWindow(w); - w = _windows; - } else { - w++; + goto restart_search; } } } @@ -355,12 +356,13 @@ { Window *w; - for (w = _windows; w != _last_window;) { +restart_search: + /* When we find the window to delete, we need to restart the search + * as deleting this window could cascade in deleting (many) others */ + for (w = _windows; w != _last_window; w++) { if (w->caption_color == id) { DeleteWindow(w); - w = _windows; - } else { - w++; + goto restart_search; } } @@ -1756,7 +1758,10 @@ { Window *w; - for (w = _windows; w != _last_window;) { +restart_search: + /* When we find the window to delete, we need to restart the search + * as deleting this window could cascade in deleting (many) others */ + for (w = _windows; w != _last_window; w++) { if (w->window_class != WC_MAIN_WINDOW && w->window_class != WC_SELECT_GAME && w->window_class != WC_MAIN_TOOLBAR && @@ -1765,9 +1770,7 @@ w->window_class != WC_TOOLTIPS && (w->flags4 & WF_STICKY) == 0) { // do not delete windows which are 'pinned' DeleteWindow(w); - w = _windows; - } else { - w++; + goto restart_search; } } } @@ -1781,15 +1784,15 @@ { Window *w; - // Delete every window except for stickied ones + /* Delete every window except for stickied ones, then sticky ones as well */ DeleteNonVitalWindows(); - // Delete all sticked windows - for (w = _windows; w != _last_window;) { +restart_search: + /* When we find the window to delete, we need to restart the search + * as deleting this window could cascade in deleting (many) others */ + for (w = _windows; w != _last_window; w++) { if (w->flags4 & WF_STICKY) { DeleteWindow(w); - w = _windows; - } else { - w++; + goto restart_search; } } }