(svn r2530) - Fix: [ 1219829 ] Mouse-wheel crashes OTTD. Widget detection failed to detect the most-right and most-bottom pixels of a widget. If scrollwheel is used on a not-found widget (such as the background of the toolbar), it will now fail correctly (glx)
authorDarkvater
Fri, 08 Jul 2005 00:14:19 +0000
changeset 2021 3a8c59ea3fbe
parent 2020 89335f8943cb
child 2022 082a0ff41e72
(svn r2530) - Fix: [ 1219829 ] Mouse-wheel crashes OTTD. Widget detection failed to detect the most-right and most-bottom pixels of a widget. If scrollwheel is used on a not-found widget (such as the background of the toolbar), it will now fail correctly (glx)
widget.c
window.c
window.h
--- a/widget.c	Thu Jul 07 22:15:34 2005 +0000
+++ b/widget.c	Fri Jul 08 00:14:19 2005 +0000
@@ -125,14 +125,11 @@
 	SetWindowDirty(w);
 }
 
-/*****************************************************
- * Returns the index for the widget located at the given
- * position relative to the window.
- * Parameters:
- *   w   - Window
- *   x/y - Window client coordinates
- * Returns:
- *   A widget index, or -1 if no widget was found.
+/** Returns the index for the widget located at the given position
+ * relative to the window. It includes all widget-corner pixels as well.
+ * @param *w Window to look inside
+ * @param  x,y Window client coordinates
+ * @return A widget index, or -1 if no widget was found.
  */
 int GetWidgetFromPos(Window *w, int x, int y)
 {
@@ -141,19 +138,16 @@
 
 	// Go through the widgets and check if we find the widget that the coordinate is
 	// inside.
-	for(index=0,wi=w->widget; wi->type != WWT_LAST; index++, wi++) {
+	for (index = 0,wi = w->widget; wi->type != WWT_LAST; index++, wi++) {
 		if (wi->type == WWT_EMPTY || wi->type == WWT_FRAME)
 			continue;
 
-		if (x >= wi->left &&
-		    x < wi->right &&
-				y >= wi->top &&
-				y < wi->bottom && !HASBIT(w->hidden_state,index)) {
+		if (x >= wi->left && x <= wi->right && y >= wi->top &&  y <= wi->bottom &&
+				!HASBIT(w->hidden_state,index)) {
 				found_index = index;
 		}
 	}
 
-	// Return the index
 	return found_index;
 }
 
--- a/window.c	Thu Jul 07 22:15:34 2005 +0000
+++ b/window.c	Fri Jul 08 00:14:19 2005 +0000
@@ -98,13 +98,22 @@
 	w->wndproc(w, &e);
 }
 
-
-void DispatchMouseWheelEvent(Window *w, uint widget, int wheel)
+/** Dispatch the mousewheel-action to the window which will scroll any
+ * compatible scrollbars if the mouse is pointed over the bar or its contents
+ * @param *w Window
+ * @param widget the widget where the scrollwheel was used
+ * @param wheel scroll up or down
+ */
+void DispatchMouseWheelEvent(Window *w, int widget, int wheel)
 {
-	const Widget *wi1 = &w->widget[widget];
-	const Widget *wi2 = &w->widget[widget + 1];
+	const Widget *wi1, *wi2;
 	Scrollbar *sb;
 
+	if (widget < 0) return;
+
+	wi1 = &w->widget[widget];
+	wi2 = &w->widget[widget + 1];
+
 	/* The listbox can only scroll if scrolling was done on the scrollbar itself,
 	 * or on the listbox (and the next item is (must be) the scrollbar)
 	 * XXX - should be rewritten as a widget-dependent scroller but that's
--- a/window.h	Thu Jul 07 22:15:34 2005 +0000
+++ b/window.h	Fri Jul 08 00:14:19 2005 +0000
@@ -546,7 +546,7 @@
 
 void DispatchLeftClickEvent(Window *w, int x, int y);
 void DispatchRightClickEvent(Window *w, int x, int y);
-void DispatchMouseWheelEvent(Window *w, uint widget, int wheel);
+void DispatchMouseWheelEvent(Window *w, int widget, int wheel);
 
 /* window.c */
 void DrawOverlappedWindow(Window *w, int left, int top, int right, int bottom);