changeset 14048:014650278d9e draft

(svn r18591) -Fix [FS#3399]: FindScrollbar could trigger an assert if the next widget (in the widget array) was a container-ish (e.g. selection) widget
author rubidium <rubidium@openttd.org>
date Mon, 21 Dec 2009 18:12:25 +0000
parents 41dee6877371
children d7bb77a690b4
files src/widget.cpp
diffstat 1 files changed, 5 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/widget.cpp
+++ b/src/widget.cpp
@@ -1601,7 +1601,11 @@
 Scrollbar *NWidgetBackground::FindScrollbar(Window *w, bool allow_next) const
 {
 	if (this->index >= 0 && allow_next && this->child == NULL && (uint)(this->index) + 1 < w->nested_array_size) {
-		const NWidgetCore *next_wid = w->GetWidget<NWidgetCore>(this->index + 1);
+		/* GetWidget ensures that the widget is of the given type.
+		 * As we might have cases where the next widget in the array
+		 * is a non-Core widget (e.g. NWID_SELECTION) we first get
+		 * the base class and then dynamic_cast that. */
+		const NWidgetCore *next_wid = dynamic_cast<NWidgetCore>(w->GetWidget<NWidgetBase>(this->index + 1));
 		if (next_wid != NULL) return next_wid->FindScrollbar(w, false);
 	}
 	return NULL;