Changeset - r2021:429904c4db14
[Not reviewed]
master
0 3 0
Darkvater - 19 years ago 2005-07-08 00:14:19
darkvater@openttd.org
(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)
3 files changed with 22 insertions and 19 deletions:
0 comments (0 inline, 0 general)
widget.c
Show inline comments
 
@@ -125,14 +125,11 @@ void ScrollbarClickHandler(Window *w, co
 
	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, i
 

	
 
	// 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;
 
}
 

	
window.c
Show inline comments
 
@@ -98,13 +98,22 @@ void DispatchRightClickEvent(Window *w, 
 
	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
window.h
Show inline comments
 
@@ -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);
0 comments (0 inline, 0 general)