From e2874d343a58e5f5f94739d864545a9d80c4cd87 Mon Sep 17 00:00:00 2001
From: dscho <dscho>
Date: Thu, 12 Mar 2009 00:07:48 +0000
Subject: Teach SDLvncviewer about scroll wheel events

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 ChangeLog                      |  3 +++
 client_examples/SDLvncviewer.c | 35 +++++++++++++++++++++++++++--------
 2 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 24483cc..99a2a20 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2009-03-12  Johannes E. Schindelin  <Johannes.Schindelin@gmx.de>
+	* client_examples/SDLvncviewer.c: support mouse wheel operations
+
 2009-03-08  Johannes E. Schindelin  <Johannes.Schindelin@gmx.de>
 	* client_examples/SDLvncviewer.c: support clipboard operations
 
diff --git a/client_examples/SDLvncviewer.c b/client_examples/SDLvncviewer.c
index d905f74..a0fd1d9 100644
--- a/client_examples/SDLvncviewer.c
+++ b/client_examples/SDLvncviewer.c
@@ -6,6 +6,8 @@ struct { int sdl; int rfb; } buttonMapping[]={
 	{1, rfbButton1Mask},
 	{2, rfbButton2Mask},
 	{3, rfbButton3Mask},
+	{4, rfbButton4Mask},
+	{5, rfbButton5Mask},
 	{0,0}
 };
 
@@ -357,22 +359,39 @@ static void handleSDLEvent(rfbClient *cl, SDL_Event *e)
 #endif
 	case SDL_MOUSEBUTTONUP:
 	case SDL_MOUSEBUTTONDOWN:
-	case SDL_MOUSEMOTION: {
+	case SDL_MOUSEMOTION:
+	{
 		int x, y, state, i;
 		if (viewOnly)
 			break;
 
-		state = SDL_GetMouseState(&x, &y);
+		if (e->type == SDL_MOUSEMOTION) {
+			x = e->motion.x;
+			y = e->motion.y;
+			state = e->motion.state;
+		}
+		else {
+			x = e->button.x;
+			y = e->button.y;
+			state = e->button.button;
+			for (i = 0; buttonMapping[i].sdl; i++)
+				if (state == buttonMapping[i].sdl) {
+					state = buttonMapping[i].rfb;
+					if (e->type == SDL_MOUSEBUTTONDOWN)
+						buttonMask |= state;
+					else
+						buttonMask &= ~state;
+					break;
+				}
+		}
 		if (sdlPixels) {
 			x = x * cl->width / realWidth;
 			y = y * cl->height / realHeight;
 		}
-		for (buttonMask = 0, i = 0; buttonMapping[i].sdl; i++)
-			if (state & SDL_BUTTON(buttonMapping[i].sdl))
-					buttonMask |= buttonMapping[i].rfb;
-			SendPointerEvent(cl, x, y, buttonMask);
-			break;
-		}
+		SendPointerEvent(cl, x, y, buttonMask);
+		buttonMask &= ~(rfbButton4Mask | rfbButton5Mask);
+		break;
+	}
 	case SDL_KEYUP:
 	case SDL_KEYDOWN:
 		if (viewOnly)
-- 
cgit v1.2.3

