changeset 4337:ed31c273defc draft

(svn r6038) -Codechange: move mousewheel code to event WE_MOUSEWHEEL instead of a general function that handles that -Codechange: use always 'e' for WindowsEvent, neverr 'we'
author truelight <truelight@openttd.org>
date Mon, 21 Aug 2006 14:59:58 +0000
parents f6a365bc9a6a
children d09df2d70157
files main_gui.c smallmap_gui.c window.c window.h
diffstat 4 files changed, 60 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/main_gui.c
+++ b/main_gui.c
@@ -2329,6 +2329,10 @@
 			WP(w, vp_d).scrollpos_x += e->scroll.delta.x << vp->zoom;
 			WP(w, vp_d).scrollpos_y += e->scroll.delta.y << vp->zoom;
 		} break;
+
+		case WE_MOUSEWHEEL:
+			ZoomInOrOutToCursorWindow(e->wheel.wheel < 0, w);
+			break;
 	}
 }
 
--- a/smallmap_gui.c
+++ b/smallmap_gui.c
@@ -1052,6 +1052,10 @@
 			WP(w, vp_d).scrollpos_x += e->scroll.delta.x << vp->zoom;
 			WP(w, vp_d).scrollpos_y += e->scroll.delta.y << vp->zoom;
 		} break;
+
+		case WE_MOUSEWHEEL:
+			ZoomInOrOutToCursorWindow(e->wheel.wheel < 0, w);
+			break;
 	}
 }
 
--- a/window.c
+++ b/window.c
@@ -1146,7 +1146,7 @@
 
 static bool HandleViewportScroll(void)
 {
-	WindowEvent we;
+	WindowEvent e;
 	Window *w;
 
 	if (!_scrolling_viewport) return true;
@@ -1160,16 +1160,16 @@
 	}
 
 	if (_patches.reverse_scroll) {
-		we.scroll.delta.x = -_cursor.delta.x;
-		we.scroll.delta.y = -_cursor.delta.y;
+		e.scroll.delta.x = -_cursor.delta.x;
+		e.scroll.delta.y = -_cursor.delta.y;
 	} else {
-		we.scroll.delta.x = _cursor.delta.x;
-		we.scroll.delta.y = _cursor.delta.y;
+		e.scroll.delta.x = _cursor.delta.x;
+		e.scroll.delta.y = _cursor.delta.y;
 	}
 
 	/* Create a scroll-event and send it to the window */
-	we.event = WE_SCROLL;
-	w->wndproc(w, &we);
+	e.event = WE_SCROLL;
+	w->wndproc(w, &e);
 
 	_cursor.delta.x = 0;
 	_cursor.delta.y = 0;
@@ -1339,44 +1339,50 @@
 	if (w == NULL) return;
 	w = MaybeBringWindowToFront(w);
 	vp = IsPtInWindowViewport(w, x, y);
-	if (vp != NULL) {
-		if (_game_mode == GM_MENU || IsGeneratingWorld()) return;
+
+	/* Don't allow any action in a viewport if either in menu of in generating world */
+	if (vp != NULL && (_game_mode == GM_MENU || IsGeneratingWorld())) return;
+
+	if (mousewheel != 0) {
+		WindowEvent e;
 
-		// only allow zooming in-out in main window, or in viewports
-		if (mousewheel &&
-				!(w->flags4 & WF_DISABLE_VP_SCROLL) && (
-					w->window_class == WC_MAIN_WINDOW ||
-					w->window_class == WC_EXTRA_VIEW_PORT
-				)) {
-			ZoomInOrOutToCursorWindow(mousewheel < 0,w);
-		}
+		/* Send WE_MOUSEWHEEL event to window */
+		e.event = WE_MOUSEWHEEL;
+		e.wheel.wheel = mousewheel;
+		w->wndproc(w, &e);
+
+		/* Dispatch a MouseWheelEvent for widgets if it is not a viewport */
+		if (vp == NULL) DispatchMouseWheelEvent(w, GetWidgetFromPos(w, x - w->left, y - w->top), mousewheel);
+	}
 
-		if (click == 1) {
-			DEBUG(misc, 2) ("cursor: 0x%X (%d)", _cursor.sprite, _cursor.sprite);
-			if (_thd.place_mode != 0 &&
-					// query button and place sign button work in pause mode
-					_cursor.sprite != SPR_CURSOR_QUERY &&
-					_cursor.sprite != SPR_CURSOR_SIGN &&
-					_pause != 0 &&
-					!_cheats.build_in_pause.value) {
-				return;
-			}
+	if (vp != NULL) {
+		switch (click) {
+			case 1:
+				DEBUG(misc, 2) ("cursor: 0x%X (%d)", _cursor.sprite, _cursor.sprite);
+				if (_thd.place_mode != 0 &&
+						// query button and place sign button work in pause mode
+						_cursor.sprite != SPR_CURSOR_QUERY &&
+						_cursor.sprite != SPR_CURSOR_SIGN &&
+						_pause != 0 &&
+						!_cheats.build_in_pause.value) {
+					return;
+				}
 
-			if (_thd.place_mode == 0) {
-				HandleViewportClicked(vp, x, y);
-			} else {
-				PlaceObject();
-			}
-		} else if (click == 2) {
-			if (!(w->flags4 & WF_DISABLE_VP_SCROLL)) {
-				_scrolling_viewport = true;
-				_cursor.fix_at = true;
-			}
+				if (_thd.place_mode == 0) {
+					HandleViewportClicked(vp, x, y);
+				} else {
+					PlaceObject();
+				}
+				break;
+
+			case 2:
+				if (!(w->flags4 & WF_DISABLE_VP_SCROLL)) {
+					_scrolling_viewport = true;
+					_cursor.fix_at = true;
+				}
+				break;
 		}
 	} else {
-		if (mousewheel)
-			DispatchMouseWheelEvent(w, GetWidgetFromPos(w, x - w->left, y - w->top), mousewheel);
-
 		switch (click) {
 			case 1: DispatchLeftClickEvent(w, x - w->left, y - w->top);  break;
 			case 2: DispatchRightClickEvent(w, x - w->left, y - w->top); break;
--- a/window.h
+++ b/window.h
@@ -141,6 +141,11 @@
 		byte event;
 		Point delta; // delta position against position of last call
 	} scroll;
+
+	struct {
+		byte event;
+		int wheel;   // how much was 'wheel'd'
+	} wheel;
 };
 
 enum WindowKeyCodes {
@@ -513,6 +518,7 @@
 	WE_RESIZE = 22,
 	WE_MESSAGE = 23,
 	WE_SCROLL = 24,
+	WE_MOUSEWHEEL = 25,
 };