(svn r9111) -Feature: [OSX] mighty mice and touchpads can now scroll the map (in all directions)
authorbjarni
Sun, 11 Mar 2007 10:55:35 +0000
changeset 6289 9f468eccc674
parent 6288 f8103e0d58ba
child 6290 a3ca06710eeb
(svn r9111) -Feature: [OSX] mighty mice and touchpads can now scroll the map (in all directions)
It has to be enabled first (in patches->interface) first and this will disable scrollwheel zooming
Note: patch setting "Map scrollwheel speed" might need to be changed since the "correct" setting
appears to depend on what kind of mouse is in use (mighty mouse or touchpad)
src/gfx.h
src/lang/english.txt
src/settings.cpp
src/settings_gui.cpp
src/variables.h
src/video/cocoa_v.mm
src/window.cpp
--- a/src/gfx.h	Sun Mar 11 02:53:44 2007 +0000
+++ b/src/gfx.h	Sun Mar 11 10:55:35 2007 +0000
@@ -5,6 +5,7 @@
 #ifndef GFX_H
 #define GFX_H
 
+#include "openttd.h"
 
 enum WindowKeyCodes {
 	WKC_SHIFT = 0x8000,
@@ -115,6 +116,12 @@
 	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
--- a/src/lang/english.txt	Sun Mar 11 02:53:44 2007 +0000
+++ b/src/lang/english.txt	Sun Mar 11 10:55:35 2007 +0000
@@ -1090,6 +1090,10 @@
 STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Own company
 STR_CONFIG_PATCHES_LIVERIES_ALL                                 :All companies
 STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Prefer team chat with <ENTER>: {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}
--- a/src/settings.cpp	Sun Mar 11 02:53:44 2007 +0000
+++ b/src/settings.cpp	Sun Mar 11 10:55:35 2007 +0000
@@ -1283,6 +1283,8 @@
 	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 */
--- a/src/settings_gui.cpp	Sun Mar 11 02:53:44 2007 +0000
+++ b/src/settings_gui.cpp	Sun Mar 11 10:55:35 2007 +0000
@@ -575,6 +575,13 @@
 	"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[] = {
--- a/src/variables.h	Sun Mar 11 02:53:44 2007 +0000
+++ b/src/variables.h	Sun Mar 11 10:55:35 2007 +0000
@@ -221,6 +221,8 @@
 	/** YAPF settings */
 	YapfSettings  yapf;
 
+	uint8 scrollwheel_scrolling;
+	uint8 scrollwheel_multiplier;
 };
 
 VARDEF Patches _patches;
--- a/src/video/cocoa_v.mm	Sun Mar 11 02:53:44 2007 +0000
+++ b/src/video/cocoa_v.mm	Sun Mar 11 10:55:35 2007 +0000
@@ -68,6 +68,7 @@
 #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 @@
 			} 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:
--- a/src/window.cpp	Sun Mar 11 02:53:44 2007 +0000
+++ b/src/window.cpp	Sun Mar 11 10:55:35 2007 +0000
@@ -1390,11 +1390,13 @@
 	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 @@
 		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 @@
 	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 @@
 	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 @@
 		/* 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);