Jelajahi Sumber

Added support for 5 mouse buttons. Fixes #159.

woollybah 5 tahun lalu
induk
melakukan
ca08b59aec

+ 4 - 2
polledinput.mod/polledinput.bmx

@@ -6,12 +6,14 @@ bbdoc: User input/Polled input
 End Rem
 Module BRL.PolledInput
 
-ModuleInfo "Version: 1.03"
+ModuleInfo "Version: 1.04"
 ModuleInfo "Author: Mark Sibly, Simon Armstrong"
 ModuleInfo "License: zlib/libpng"
 ModuleInfo "Copyright: Blitz Research Ltd"
 ModuleInfo "Modserver: BRL"
 
+ModuleInfo "History: 1.04"
+ModuleInfo "History: Support for 5 mouse buttons."
 ModuleInfo "History: 1.03"
 ModuleInfo "History: Improved Win32 KeyDown handling."
 ModuleInfo "History: 1.02"
@@ -31,7 +33,7 @@ Global suspended,terminate
 Global keyStates[256],keyHits[256]
 Global charGet,charPut,charQueue[256]
 
-Global mouseStates[4],mouseHits[4]
+Global mouseStates[6],mouseHits[6]
 Global mouseLocation[4],lastMouseLocation[4]
 
 Function Hook:Object( id,data:Object,context:Object )

+ 34 - 18
systemdefault.mod/system.linux.c

@@ -161,6 +161,38 @@ void bbSystemEventHandler( int(*handler)(XEvent*) ){
 	xeventhandler=handler;
 }
 
+static inline void bbHandleMouse(int event, int eventButton, int * id, int * data) {
+	*id=event;
+
+	switch (eventButton) {
+		case Button1:
+			*data = 1;
+			return;
+		case Button2:
+			*data = 3;
+			return;
+		case Button3:
+			*data = 2;
+			return;
+		case 8:
+			*data = 4;
+			return;
+		case 9:
+			*data = 5;
+			return;
+		default:
+			if (eventButton == 4) {
+				*id=BBEVENT_MOUSEWHEEL;
+				*data=1;
+				return;
+			} else if (eventButton == 5) {
+				*id=BBEVENT_MOUSEWHEEL;
+				*data=-1;
+				return;
+			}
+	}
+}
+
 void bbSystemEmitOSEvent( XEvent *xevent,BBObject *source ){
 
 	XKeyEvent	*keyevent;
@@ -217,26 +249,10 @@ void bbSystemEmitOSEvent( XEvent *xevent,BBObject *source ){
 		id=BBEVENT_KEYUP;
 		break;
 	case ButtonPress:
-		data=xevent->xbutton.button;
-		if (data==4)
-		{
-			id=BBEVENT_MOUSEWHEEL;
-			data=1;
-			break;
-		}
-		if (data==5)
-		{
-			id=BBEVENT_MOUSEWHEEL;
-			data=-1;
-			break;
-		}
-		id=BBEVENT_MOUSEDOWN;
-		if (data>1) data=5-data;
+		bbHandleMouse(BBEVENT_MOUSEDOWN, xevent->xbutton.button, &id, &data);
 		break;
 	case ButtonRelease:
-		id=BBEVENT_MOUSEUP;
-		data=xevent->xbutton.button;
-		if (data>1) data=5-data;
+		bbHandleMouse(BBEVENT_MOUSEUP, xevent->xbutton.button, &id, &data);
 		break;
 	case MotionNotify:
 		id=BBEVENT_MOUSEMOVE;

+ 36 - 4
systemdefault.mod/system.win32.c

@@ -155,17 +155,49 @@ void bbSystemEmitOSEvent( HWND hwnd,UINT msg,WPARAM wp,LPARAM lp,BBObject *sourc
 		id=BBEVENT_KEYCHAR;
 		data=wp;
 		break;
-	case WM_LBUTTONDOWN:case WM_RBUTTONDOWN:case WM_MBUTTONDOWN:
+	case WM_LBUTTONDOWN:case WM_RBUTTONDOWN:case WM_MBUTTONDOWN:case WM_XBUTTONDOWN:
 		SetCapture( hwnd );
 		id=BBEVENT_MOUSEDOWN;
-		data=(msg==WM_LBUTTONDOWN) ? 1 : (msg==WM_RBUTTONDOWN ? 2 : 3);
+		switch (msg) {
+			case WM_LBUTTONDOWN:
+				data = 1;
+				break;
+			case WM_RBUTTONDOWN:
+				data = 2;
+				break;
+			case WM_MBUTTONDOWN:
+				data = 3;
+				break;
+			case WM_XBUTTONDOWN:
+				if (GET_XBUTTON_WPARAM(wp) == XBUTTON1) {
+					data = 4;
+				} else {
+					data = 5;
+				}
+		}
 		x=(short)LOWORD(lp);
 		y=(short)HIWORD(lp);
 		break;
-	case WM_LBUTTONUP:case WM_RBUTTONUP:case WM_MBUTTONUP:
+	case WM_LBUTTONUP:case WM_RBUTTONUP:case WM_MBUTTONUP:case WM_XBUTTONUP:
 		ReleaseCapture();
 		id=BBEVENT_MOUSEUP;
-		data=(msg==WM_LBUTTONUP) ? 1 : (msg==WM_RBUTTONUP ? 2 : 3);
+		switch (msg) {
+			case WM_LBUTTONDOWN:
+				data = 1;
+				break;
+			case WM_RBUTTONDOWN:
+				data = 2;
+				break;
+			case WM_MBUTTONDOWN:
+				data = 3;
+				break;
+			case WM_XBUTTONDOWN:
+				if (GET_XBUTTON_WPARAM(wp) == XBUTTON1) {
+					data = 4;
+				} else {
+					data = 5;
+				}
+		}
 		x=(short)LOWORD(lp);
 		y=(short)HIWORD(lp);
 		break;