summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarkvater <Darkvater@openttd.org>2006-11-18 00:44:09 +0000
committerDarkvater <Darkvater@openttd.org>2006-11-18 00:44:09 +0000
commita448474f2123c0561f8760a07bcde665212e2dbc (patch)
treebac5c95b27ebac6a4aa144483b16d23bf0ffa5f1
parent1a87a33911c26b69a1143709410a7837d84e24cd (diff)
downloadopenttd-a448474f2123c0561f8760a07bcde665212e2dbc.tar.xz
(svn r7201) -Codechange: Use goto's to loop _windows when there is a change you need to start over
-rw-r--r--window.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/window.c b/window.c
index ec3589951..47fde1a57 100644
--- a/window.c
+++ b/window.c
@@ -337,12 +337,13 @@ void DeleteWindowByClass(WindowClass cls)
{
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 @@ void DeletePlayerWindows(PlayerID id)
{
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 @@ void DeleteNonVitalWindows(void)
{
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 @@ void DeleteNonVitalWindows(void)
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 @@ void DeleteAllNonVitalWindows(void)
{
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;
}
}
}