summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordarkvater <darkvater@openttd.org>2005-01-13 16:50:20 +0000
committerdarkvater <darkvater@openttd.org>2005-01-13 16:50:20 +0000
commit61cae70fe53653dab79ed90cb9418f6c88c2145a (patch)
tree75199ad8fbca21b3b52f2f5e212fe0ee70d9aa0e
parent06cc62f40d84c91bba41510bbeab0ba8df7106b9 (diff)
downloadopenttd-61cae70fe53653dab79ed90cb9418f6c88c2145a.tar.xz
(svn r1497) -Fix: [1101179] Crash if generating land while industry window is open. This also happened for towns and the land information window
-Added DeleteWindowByClass() function that deletes all windows of a given class
-rw-r--r--functions.h1
-rw-r--r--main_gui.c9
-rw-r--r--window.c12
3 files changed, 19 insertions, 3 deletions
diff --git a/functions.h b/functions.h
index 6ddcf05ba..b3e99906f 100644
--- a/functions.h
+++ b/functions.h
@@ -201,6 +201,7 @@ void InvalidateWindow(byte cls, WindowNumber number);
void InvalidateWindowWidget(byte cls, WindowNumber number, byte widget_index);
void InvalidateWindowClasses(byte cls);
void DeleteWindowById(WindowClass cls, WindowNumber number);
+void DeleteWindowByClass(WindowClass cls);
void SetObjectToPlaceWnd(int icon, byte mode, Window *w);
void SetObjectToPlace(int icon, byte mode, WindowClass window_class, WindowNumber window_num);
diff --git a/main_gui.c b/main_gui.c
index 63937fe6a..023a645a3 100644
--- a/main_gui.c
+++ b/main_gui.c
@@ -1097,10 +1097,13 @@ static void AskResetLandscapeWndProc(Window *w, WindowEvent *e)
break;
case 4:
DeleteWindow(w);
- if(mode) { // reset landscape
+ DeleteWindowByClass(WC_INDUSTRY_VIEW);
+ DeleteWindowByClass(WC_TOWN_VIEW);
+ DeleteWindowByClass(WC_LAND_INFO);
+
+ if (mode) { // reset landscape
ResetLandscape();
- }
- else { // make random landscape
+ } else { // make random landscape
SndPlayFx(SND_15_BEEP);
_switch_mode = SM_GENRANDLAND;
}
diff --git a/window.c b/window.c
index 86af083e0..96f5a1902 100644
--- a/window.c
+++ b/window.c
@@ -262,6 +262,18 @@ void DeleteWindowById(WindowClass cls, WindowNumber number)
DeleteWindow(FindWindowById(cls, number));
}
+void DeleteWindowByClass(WindowClass cls)
+{
+ Window *w;
+ for (w = _windows; w != _last_window;) {
+ if (w->window_class == cls) {
+ DeleteWindow(w);
+ w = _windows;
+ } else
+ w++;
+ }
+}
+
Window *BringWindowToFrontById(WindowClass cls, WindowNumber number)
{
Window *w = FindWindowById(cls, number);