From a014ef63402b1166eb0fd6bc25fbc8dda39b6731 Mon Sep 17 00:00:00 2001 From: Darkvater Date: Fri, 8 Jul 2005 00:14:19 +0000 Subject: [PATCH] (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 | 22 ++++++++-------------- window.c | 17 +++++++++++++---- window.h | 2 +- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/widget.c b/widget.c index 1ef1701ddd..1e5aa52be5 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 1641b0cea8..e069cbedfd 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 145137eb48..25a0c6c904 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);