diff --git a/src/gfx.h b/src/gfx.h index 3a3269d417..ed5046e329 100644 --- a/src/gfx.h +++ b/src/gfx.h @@ -5,6 +5,7 @@ #ifndef GFX_H #define GFX_H +#include "openttd.h" enum WindowKeyCodes { WKC_SHIFT = 0x8000, @@ -115,6 +116,12 @@ struct CursorVars { SpriteID pal; int wheel; ///< mouse wheel movement + + /* We need two different vars to keep track of how far the scrollwheel moved. + * OSX uses this for scrolling around the map. */ + int v_wheel; + int h_wheel; + const AnimCursor *animate_list; ///< in case of animated cursor, list of frames const AnimCursor *animate_cur; ///< in case of animated cursor, current frame uint animate_timeout; ///< in case of animated cursor, number of ticks to show the current cursor diff --git a/src/lang/english.txt b/src/lang/english.txt index e1e8b9c7bd..b1f6012e01 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1090,6 +1090,10 @@ STR_CONFIG_PATCHES_LIVERIES_NONE :None STR_CONFIG_PATCHES_LIVERIES_OWN :Own company STR_CONFIG_PATCHES_LIVERIES_ALL :All companies STR_CONFIG_PATCHES_PREFER_TEAMCHAT :{LTBLUE}Prefer team chat with : {ORANGE}{STRING1} +STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING :{LTBLUE}Function of scrollwheel: {ORANGE}{STRING1} +STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM :Zoom map +STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Scroll map +STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Map scrollwheel speed: {ORANGE}{STRING1} STR_CONFIG_PATCHES_MAX_TRAINS :{LTBLUE}Max trains per player: {ORANGE}{STRING1} STR_CONFIG_PATCHES_MAX_ROADVEH :{LTBLUE}Max road vehicles per player: {ORANGE}{STRING1} diff --git a/src/settings.cpp b/src/settings.cpp index 6131569450..78b7338575 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1283,6 +1283,8 @@ const SettingDesc _patch_settings[] = { SDT_BOOL(Patches, link_terraform_toolbar, S, 0, false, STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR,NULL), SDT_VAR(Patches, liveries, SLE_UINT8, S,MS, 2, 0, 2, 0, STR_CONFIG_PATCHES_LIVERIES, RedrawScreen), SDT_BOOL(Patches, prefer_teamchat, S, 0, false, STR_CONFIG_PATCHES_PREFER_TEAMCHAT, NULL), + SDT_VAR(Patches, scrollwheel_scrolling,SLE_UINT8,S,MS, 1, 0, 1, 0, STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING, NULL), + SDT_VAR(Patches,scrollwheel_multiplier,SLE_UINT8,S, 0, 5, 1, 15, 1, STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER,NULL), /***************************************************************************/ /* Construction section of the GUI-configure patches window */ diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 53cf595752..93b0cf78da 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -575,6 +575,13 @@ static const char *_patches_ui[] = { "link_terraform_toolbar", "liveries", "prefer_teamchat", +#if defined(__APPLE__) + /* While the horizontal scrollwheel scrolling is written as general code, only + * the cocoa (OSX) driver generates input for it. + * Until some other driver will read this input, we will hide the GUI to control this from other systems. */ + "scrollwheel_scrolling", + "scrollwheel_multiplier", +#endif }; static const char *_patches_construction[] = { diff --git a/src/variables.h b/src/variables.h index 4607947d13..ef5e9b73c9 100644 --- a/src/variables.h +++ b/src/variables.h @@ -221,6 +221,8 @@ struct Patches { /** YAPF settings */ YapfSettings yapf; + uint8 scrollwheel_scrolling; + uint8 scrollwheel_multiplier; }; VARDEF Patches _patches; diff --git a/src/video/cocoa_v.mm b/src/video/cocoa_v.mm index e7531edbf4..d4ae4c3e06 100644 --- a/src/video/cocoa_v.mm +++ b/src/video/cocoa_v.mm @@ -68,6 +68,7 @@ extern "C" void HideMenuBar(); #include "../debug.h" #include "../macros.h" #include "../os/macosx/splash.h" +#include "../variables.h" #include "cocoa_v.h" #include "cocoa_keys.h" @@ -653,6 +654,10 @@ static bool QZ_PollEvent() } else if ([ event deltaY ] < 0.0) { /* Scroll down */ _cursor.wheel++; } /* else: deltaY was 0.0 and we don't want to do anything */ + + /* Set the scroll count for scrollwheel scrolling */ + _cursor.h_wheel -= (int)([ event deltaX ]* 5 * _patches.scrollwheel_multiplier); + _cursor.v_wheel -= (int)([ event deltaY ]* 5 * _patches.scrollwheel_multiplier); break; default: diff --git a/src/window.cpp b/src/window.cpp index 9e26bee1d4..41653e9263 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1390,11 +1390,13 @@ static bool HandleViewportScroll() WindowEvent e; Window *w; + bool scrollwheel_scrolling = _patches.scrollwheel_scrolling == 1 && (_cursor.v_wheel != 0 || _cursor.h_wheel != 0); + if (!_scrolling_viewport) return true; w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y); - if (!_right_button_down || w == NULL) { + if (!(_right_button_down || scrollwheel_scrolling) || w == NULL) { _cursor.fix_at = false; _scrolling_viewport = false; return true; @@ -1408,6 +1410,14 @@ static bool HandleViewportScroll() e.we.scroll.delta.y = _cursor.delta.y; } + if (scrollwheel_scrolling) { + /* We are using scrollwheels for scrolling */ + e.we.scroll.delta.x = _cursor.h_wheel; + e.we.scroll.delta.y = _cursor.v_wheel; + _cursor.v_wheel = 0; + _cursor.h_wheel = 0; + } + /* Create a scroll-event and send it to the window */ e.event = WE_SCROLL; w->wndproc(w, &e); @@ -1628,6 +1638,7 @@ void MouseLoop(int click, int mousewheel) int x,y; Window *w; ViewPort *vp; + bool scrollwheel_scrolling = _patches.scrollwheel_scrolling == 1 && (_cursor.v_wheel != 0 || _cursor.h_wheel != 0); DecreaseWindowCounters(); HandlePlacePresize(); @@ -1643,7 +1654,7 @@ void MouseLoop(int click, int mousewheel) x = _cursor.pos.x; y = _cursor.pos.y; - if (click == 0 && mousewheel == 0) return; + if (click == 0 && mousewheel == 0 && !scrollwheel_scrolling) return; w = FindWindowFromPt(x, y); if (w == NULL) return; @@ -1659,13 +1670,14 @@ void MouseLoop(int click, int mousewheel) /* Send WE_MOUSEWHEEL event to window */ e.event = WE_MOUSEWHEEL; e.we.wheel.wheel = mousewheel; - w->wndproc(w, &e); + if (!scrollwheel_scrolling) 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 (scrollwheel_scrolling) click = 2; // we are using the scrollwheel in a viewport, so we emulate right mouse button switch (click) { case 1: DEBUG(misc, 2, "Cursor: 0x%X (%d)", _cursor.sprite, _cursor.sprite);