summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarkvater <Darkvater@openttd.org>2005-07-08 00:14:19 +0000
committerDarkvater <Darkvater@openttd.org>2005-07-08 00:14:19 +0000
commit5f2c7448b573c0f7c9453c4ee9b3bdabdbee74cc (patch)
tree676563459da0d4d5fad9860a275eb2b8dfb3f90b
parentbf794fad622292e09037ca32e5ff806c1db44965 (diff)
downloadopenttd-5f2c7448b573c0f7c9453c4ee9b3bdabdbee74cc.tar.xz
(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)
-rw-r--r--widget.c22
-rw-r--r--window.c17
-rw-r--r--window.h2
3 files changed, 22 insertions, 19 deletions
diff --git a/widget.c b/widget.c
index 1ef1701dd..1e5aa52be 100644
--- a/widget.c
+++ b/widget.c
@@ -125,14 +125,11 @@ void ScrollbarClickHandler(Window *w, const Widget *wi, int x, int y)
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 @@ int GetWidgetFromPos(Window *w, int x, int y)
// 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;
}
diff --git a/window.c b/window.c
index 1641b0cea..e069cbedf 100644
--- a/window.c
+++ b/window.c
@@ -98,13 +98,22 @@ void DispatchRightClickEvent(Window *w, int x, int y) {
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
diff --git a/window.h b/window.h
index 145137eb4..25a0c6c90 100644
--- a/window.h
+++ b/window.h
@@ -546,7 +546,7 @@ enum WindowFlags {
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);