summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main_gui.c4
-rw-r--r--smallmap_gui.c4
-rw-r--r--window.c86
-rw-r--r--window.h6
4 files changed, 60 insertions, 40 deletions
diff --git a/main_gui.c b/main_gui.c
index 2e0653de9..23c9523ce 100644
--- a/main_gui.c
+++ b/main_gui.c
@@ -2329,6 +2329,10 @@ static void MainWindowWndProc(Window *w, WindowEvent *e)
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;
}
}
diff --git a/smallmap_gui.c b/smallmap_gui.c
index dbec6036d..de733d576 100644
--- a/smallmap_gui.c
+++ b/smallmap_gui.c
@@ -1052,6 +1052,10 @@ static void ExtraViewPortWndProc(Window *w, WindowEvent *e)
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;
}
}
diff --git a/window.c b/window.c
index c28172462..1e011e645 100644
--- a/window.c
+++ b/window.c
@@ -1146,7 +1146,7 @@ static bool HandleScrollbarScrolling(void)
static bool HandleViewportScroll(void)
{
- WindowEvent we;
+ WindowEvent e;
Window *w;
if (!_scrolling_viewport) return true;
@@ -1160,16 +1160,16 @@ static bool HandleViewportScroll(void)
}
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 @@ static void MouseLoop(int click, int mousewheel)
if (w == NULL) return;
w = MaybeBringWindowToFront(w);
vp = IsPtInWindowViewport(w, x, y);
+
+ /* 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;
+
+ /* 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 (vp != NULL) {
- if (_game_mode == GM_MENU || IsGeneratingWorld()) return;
-
- // 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);
- }
+ 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 (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 (_thd.place_mode == 0) {
+ HandleViewportClicked(vp, x, y);
+ } else {
+ PlaceObject();
+ }
+ break;
- 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;
- }
+ 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;
diff --git a/window.h b/window.h
index 9bdfc1bce..7e2b9a467 100644
--- a/window.h
+++ b/window.h
@@ -141,6 +141,11 @@ union WindowEvent {
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 @@ enum WindowEvents {
WE_RESIZE = 22,
WE_MESSAGE = 23,
WE_SCROLL = 24,
+ WE_MOUSEWHEEL = 25,
};