Changeset - r13403:a5e052986a0b
[Not reviewed]
master
0 3 0
rubidium - 15 years ago 2009-10-31 14:53:19
rubidium@openttd.org
(svn r17922) -Fix [FS#3291]: crash when closing NewGRF parameter window with no NewGRF selected
3 files changed with 13 insertions and 7 deletions:
0 comments (0 inline, 0 general)
src/newgrf_gui.cpp
Show inline comments
 
@@ -749,6 +749,7 @@ struct NewGRFWindow : public Window {
 
				this->sel = newsel;
 
				this->preset = -1;
 
				this->InvalidateData();
 
				this->DeleteChildWindows(WC_QUERY_STRING); // Remove the parameter query window
 
				break;
 
			}
 

	
 
@@ -791,6 +792,8 @@ struct NewGRFWindow : public Window {
 
				uint i = (pt.y - this->GetWidget<NWidgetBase>(SNGRFS_FILE_LIST)->pos_y) / this->resize.step_height + this->vscroll.GetPosition();
 

	
 
				for (c = this->list; c != NULL && i > 0; c = c->next, i--) {}
 

	
 
				if (this->sel != c) this->DeleteChildWindows(WC_QUERY_STRING); // Remove the parameter query window
 
				this->sel = c;
 

	
 
				this->InvalidateData();
src/window.cpp
Show inline comments
 
@@ -645,12 +645,14 @@ void Window::ReInit()
 

	
 
/** Find the Window whose parent pointer points to this window
 
 * @param w parent Window to find child of
 
 * @return a Window pointer that is the child of w, or NULL otherwise */
 
static Window *FindChildWindow(const Window *w)
 
 * @param wc Window class of the window to remove; WC_INVALID if class does not matter
 
 * @return a Window pointer that is the child of w, or NULL otherwise
 
 */
 
static Window *FindChildWindow(const Window *w, WindowClass wc)
 
{
 
	Window *v;
 
	FOR_ALL_WINDOWS_FROM_BACK(v) {
 
		if (v->parent == w) return v;
 
		if ((wc == WC_INVALID || wc == v->window_class) && v->parent == w) return v;
 
	}
 

	
 
	return NULL;
 
@@ -658,13 +660,14 @@ static Window *FindChildWindow(const Win
 

	
 
/**
 
 * Delete all children a window might have in a head-recursive manner
 
 * @param wc Window class of the window to remove; WC_INVALID if class does not matter
 
 */
 
void Window::DeleteChildWindows() const
 
void Window::DeleteChildWindows(WindowClass wc) const
 
{
 
	Window *child = FindChildWindow(this);
 
	Window *child = FindChildWindow(this, wc);
 
	while (child != NULL) {
 
		delete child;
 
		child = FindChildWindow(this);
 
		child = FindChildWindow(this, wc);
 
	}
 
}
 

	
src/window_gui.h
Show inline comments
 
@@ -621,7 +621,7 @@ public:
 
	void DrawViewport() const;
 
	void DrawSortButtonState(int widget, SortButtonState state) const;
 

	
 
	void DeleteChildWindows() const;
 
	void DeleteChildWindows(WindowClass wc = WC_INVALID) const;
 

	
 
	void SetDirty() const;
 
	void ReInit();
0 comments (0 inline, 0 general)