Added preliminary support for MiNT /dev/mouse driver (disabled atm)
authorPatrice Mandin <patmandin@gmail.com>
Thu, 23 Feb 2006 21:51:10 +0000
changeset 1420 2405517b5eab
parent 1419 36a5068bf7df
child 1421 638da75f9ab8
Added preliminary support for MiNT /dev/mouse driver (disabled atm)
README.MiNT
src/video/ataricommon/SDL_ataridevmouse.c
src/video/ataricommon/SDL_ataridevmouse_c.h
src/video/ataricommon/SDL_biosevents.c
src/video/ataricommon/SDL_gemdosevents.c
src/video/gem/SDL_gemevents.c
src/video/gem/SDL_gemvideo.c
src/video/gem/SDL_gemvideo.h
--- a/README.MiNT	Thu Feb 23 04:16:08 2006 +0000
+++ b/README.MiNT	Thu Feb 23 21:51:10 2006 +0000
@@ -55,7 +55,7 @@
 IV.  What is supported:
 
 Keyboard (GEMDOS, BIOS, GEM, Ikbd)
-Mouse (XBIOS, GEM, Ikbd)
+Mouse (XBIOS, GEM, Ikbd, /dev/mouse (non working atm, disabled))
 Video (XBIOS (Fullscreen), GEM (Windowed and Fullscreen))
 Timer (VBL vector, GNU pth library)
 Joysticks and joypads (Ikbd, Hardware)
@@ -88,6 +88,8 @@
 
 (1) GEM does not report relative mouse motion, so xbios mouse driver is used
 to report this type event. Under MiNT, using XBIOS mouse driver is not possible.
+A preliminary driver for /dev/mouse device driver is present, but is disabled
+till it can be used with other applications simultaneously.
 
 (2) If you build SDL with threads using the GNU pth library, timers are
 supported via the pth library.
@@ -246,4 +248,4 @@
 
 -- 
 Patrice Mandin <pmandin@caramail.com>
-http://membres.lycos.fr/pmandin/
+http://pmandin.atari.org/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/ataricommon/SDL_ataridevmouse.c	Thu Feb 23 21:51:10 2006 +0000
@@ -0,0 +1,159 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2006 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/*
+	MiNT /dev/mouse driver
+
+	Patrice Mandin
+*/
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "../../events/SDL_events_c.h"
+#include "SDL_ataridevmouse_c.h"
+
+/* Defines */
+
+#define DEVICE_NAME	"/dev/mouse"
+
+/* Local variables */
+
+static int handle = -1;
+static int mouseb, prev_mouseb;
+
+/* Functions */
+
+int SDL_AtariDevMouse_Open(void)
+{
+	int r;
+	const char *mousedev;
+
+	/*
+		TODO: Fix the MiNT device driver, that locks mouse for other
+		applications, so this is disabled till fixed
+	 */
+	return 0;
+
+	/* First, try SDL_MOUSEDEV device */
+	mousedev = SDL_getenv("SDL_MOUSEDEV");
+	if (!mousedev) {
+		handle = open(mousedev, 0);
+	}
+
+	/* Failed, try default device */
+	if (handle<0) {
+		handle = open(DEVICE_NAME, 0);
+	}
+
+	if (handle<0) {
+		handle = -1;
+		return 0;
+	}
+
+	/* Set non blocking mode */
+	r = fcntl(handle, F_GETFL, 0);
+	if (r<0) {
+		close(handle);
+		handle = -1;
+		return 0;
+	}
+
+	r |= O_NDELAY;
+
+	r = fcntl(handle, F_SETFL, r);
+	if (r<0) {
+		close(handle);
+		handle = -1;
+		return 0;
+	}
+
+	prev_mouseb = 7;
+	return 1;
+}
+
+void SDL_AtariDevMouse_Close(void)
+{
+	if (handle>0) {
+		close(handle);
+		handle = -1;
+	}
+}
+
+static int atari_GetButton(int button)
+{
+	switch(button)
+	{
+		case 0:
+			return SDL_BUTTON_RIGHT;
+		case 1:
+			return SDL_BUTTON_MIDDLE;
+		default:
+			break;
+	}
+
+	return SDL_BUTTON_LEFT;
+}
+
+void SDL_AtariDevMouse_PostMouseEvents(_THIS, SDL_bool buttonEvents)
+{
+	unsigned char buffer[3];
+	int mousex, mousey;
+
+	if (handle<0) {
+		return;
+	}
+
+	mousex = mousey = 0;
+	while (read(handle, buffer, sizeof(buffer))==sizeof(buffer)) {
+		mouseb = buffer[0] & 7;
+		mousex += (char) buffer[1];
+		mousey += (char) buffer[2];
+
+		/* Mouse button events */
+		if (buttonEvents && (mouseb != prev_mouseb)) {
+			int i;
+
+			for (i=0;i<3;i++) {
+				int curbutton, prevbutton;
+
+				curbutton = mouseb & (1<<i);
+				prevbutton = prev_mouseb & (1<<i);
+			
+				if (curbutton && !prevbutton) {
+					SDL_PrivateMouseButton(SDL_RELEASED, atari_GetButton(i), 0, 0);
+				}
+				if (!curbutton && prevbutton) {
+					SDL_PrivateMouseButton(SDL_PRESSED, atari_GetButton(i), 0, 0);
+				}
+			}
+
+			prev_mouseb = mouseb;
+		}
+	}
+
+	/* Mouse motion event */
+	if (mousex || mousey) {
+		SDL_PrivateMouseMotion(0, 1, mousex, -mousey);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/ataricommon/SDL_ataridevmouse_c.h	Thu Feb 23 21:51:10 2006 +0000
@@ -0,0 +1,42 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2006 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/*
+	MiNT /dev/mouse driver
+
+	Patrice Mandin
+*/
+
+#ifndef _SDL_ATARI_DEVMOUSE_H_
+#define _SDL_ATARI_DEVMOUSE_H_
+
+#include "../SDL_sysvideo.h"
+
+/* Hidden "this" pointer for the video functions */
+#define _THIS	SDL_VideoDevice *this
+
+extern int SDL_AtariDevMouse_Open(void);
+extern void SDL_AtariDevMouse_Close(void);
+extern void SDL_AtariDevMouse_PostMouseEvents(_THIS, SDL_bool buttonEvents);
+
+#endif /* _SDL_ATARI_DEVMOUSE_H_ */
--- a/src/video/ataricommon/SDL_biosevents.c	Thu Feb 23 04:16:08 2006 +0000
+++ b/src/video/ataricommon/SDL_biosevents.c	Thu Feb 23 21:51:10 2006 +0000
@@ -37,6 +37,7 @@
 #include "SDL_atarikeys.h"
 #include "SDL_atarievents_c.h"
 #include "SDL_xbiosevents_c.h"
+#include "SDL_ataridevmouse_c.h"
 
 /* To save state of keyboard */
 #define ATARIBIOS_MAXKEYS 128
@@ -44,6 +45,7 @@
 static unsigned char bios_currentkeyboard[ATARIBIOS_MAXKEYS];
 static unsigned char bios_previouskeyboard[ATARIBIOS_MAXKEYS];
 static unsigned char bios_currentascii[ATARIBIOS_MAXKEYS];
+static SDL_bool use_dev_mouse = SDL_FALSE;
 
 /* Special keys state */
 enum {
@@ -101,7 +103,12 @@
 	keymap[SCANCODE_LEFTALT] = SDLK_LALT;
 	keymap[SCANCODE_CAPSLOCK] = SDLK_CAPSLOCK;
 
-	vectors_mask = ATARI_XBIOS_MOUSEEVENTS|ATARI_XBIOS_JOYSTICKEVENTS;
+	use_dev_mouse = (SDL_AtariDevMouse_Open()!=0) ? SDL_TRUE : SDL_FALSE;
+
+	vectors_mask = ATARI_XBIOS_JOYSTICKEVENTS;	/* XBIOS joystick events */
+	if (!use_dev_mouse) {
+		vectors_mask |= ATARI_XBIOS_MOUSEEVENTS;	/* XBIOS mouse events */
+	}
 	if (Getcookie(C_MiNT, &dummy)==C_FOUND) {
 		vectors_mask = 0;
 	}
@@ -146,7 +153,11 @@
 				TranslateKey(i, bios_currentascii[i], &keysym, SDL_FALSE));
 	}
 
-	SDL_AtariXbios_PostMouseEvents(this, SDL_TRUE);
+	if (use_dev_mouse) {
+		SDL_AtariDevMouse_PostMouseEvents(this, SDL_TRUE);
+	} else {
+		SDL_AtariXbios_PostMouseEvents(this, SDL_TRUE);
+	}
 
 	/* Will be previous table */
 	SDL_memcpy(bios_previouskeyboard, bios_currentkeyboard, ATARIBIOS_MAXKEYS);
@@ -192,4 +203,7 @@
 void AtariBios_ShutdownEvents(void)
 {
 	SDL_AtariXbios_RestoreVectors();
+	if (use_dev_mouse) {
+		SDL_AtariDevMouse_Close();
+	}
 }
--- a/src/video/ataricommon/SDL_gemdosevents.c	Thu Feb 23 04:16:08 2006 +0000
+++ b/src/video/ataricommon/SDL_gemdosevents.c	Thu Feb 23 21:51:10 2006 +0000
@@ -37,6 +37,7 @@
 #include "SDL_atarikeys.h"
 #include "SDL_atarievents_c.h"
 #include "SDL_xbiosevents_c.h"
+#include "SDL_ataridevmouse_c.h"
 
 /* To save state of keyboard */
 #define ATARIBIOS_MAXKEYS 128
@@ -44,6 +45,7 @@
 static unsigned char gemdos_currentkeyboard[ATARIBIOS_MAXKEYS];
 static unsigned char gemdos_previouskeyboard[ATARIBIOS_MAXKEYS];
 static unsigned char gemdos_currentascii[ATARIBIOS_MAXKEYS];
+static SDL_bool use_dev_mouse = SDL_FALSE;
 
 /* Special keys state */
 enum {
@@ -106,11 +108,15 @@
 	keymap[SCANCODE_LEFTALT] = SDLK_LALT;
 	keymap[SCANCODE_CAPSLOCK] = SDLK_CAPSLOCK;
 
-	vectors_mask = ATARI_XBIOS_MOUSEEVENTS|ATARI_XBIOS_JOYSTICKEVENTS;
+	use_dev_mouse = (SDL_AtariDevMouse_Open()!=0) ? SDL_TRUE : SDL_FALSE;
+
+	vectors_mask = ATARI_XBIOS_JOYSTICKEVENTS;	/* XBIOS joystick events */
+	if (!use_dev_mouse) {
+		vectors_mask |= ATARI_XBIOS_MOUSEEVENTS;	/* XBIOS mouse events */
+	}
 	if (Getcookie(C_MiNT, &dummy)==C_FOUND) {
 		vectors_mask = 0;
 	}
-
 	SDL_AtariXbios_InstallVectors(vectors_mask);
 }
 
@@ -151,7 +157,11 @@
 				TranslateKey(i, gemdos_currentascii[i], &keysym, SDL_FALSE));
 	}
 
-	SDL_AtariXbios_PostMouseEvents(this, SDL_TRUE);
+	if (use_dev_mouse) {
+		SDL_AtariDevMouse_PostMouseEvents(this, SDL_TRUE);
+	} else {
+		SDL_AtariXbios_PostMouseEvents(this, SDL_TRUE);
+	}
 
 	/* Will be previous table */
 	SDL_memcpy(gemdos_previouskeyboard, gemdos_currentkeyboard, ATARIBIOS_MAXKEYS);
@@ -197,4 +207,7 @@
 void AtariGemdos_ShutdownEvents(void)
 {
 	SDL_AtariXbios_RestoreVectors();
+	if (use_dev_mouse) {
+		SDL_AtariDevMouse_Close();
+	}
 }
--- a/src/video/gem/SDL_gemevents.c	Thu Feb 23 04:16:08 2006 +0000
+++ b/src/video/gem/SDL_gemevents.c	Thu Feb 23 21:51:10 2006 +0000
@@ -39,6 +39,7 @@
 #include "../ataricommon/SDL_atarikeys.h"	/* for keyboard scancodes */
 #include "../ataricommon/SDL_atarievents_c.h"
 #include "../ataricommon/SDL_xbiosevents_c.h"
+#include "../ataricommon/SDL_ataridevmouse_c.h"
 
 /* Defines */
 
@@ -376,7 +377,11 @@
 
 	/* Mouse motion ? */
 	if (GEM_mouse_relative) {
-		SDL_AtariXbios_PostMouseEvents(this, SDL_FALSE);
+		if (GEM_usedevmouse) {
+			SDL_AtariDevMouse_PostMouseEvents(this, SDL_FALSE);
+		} else {
+			SDL_AtariXbios_PostMouseEvents(this, SDL_FALSE);
+		}
 	} else {
 		if ((prevmousex!=mx) || (prevmousey!=my)) {
 			int posx, posy;
--- a/src/video/gem/SDL_gemvideo.c	Thu Feb 23 04:16:08 2006 +0000
+++ b/src/video/gem/SDL_gemvideo.c	Thu Feb 23 21:51:10 2006 +0000
@@ -53,6 +53,7 @@
 #include "SDL_gemmouse_c.h"
 #include "SDL_gemwm_c.h"
 #include "../ataricommon/SDL_xbiosevents_c.h"
+#include "../ataricommon/SDL_ataridevmouse_c.h"
 
 /* Defines */
 
@@ -189,8 +190,13 @@
 	device->GL_SwapBuffers = GEM_GL_SwapBuffers;
 #endif
 
-	/* Joystick + Mouse relative motion */
-	vectors_mask = ATARI_XBIOS_MOUSEEVENTS|ATARI_XBIOS_JOYSTICKEVENTS;
+	device->hidden->use_dev_mouse =
+		(SDL_AtariDevMouse_Open()!=0) ? SDL_TRUE : SDL_FALSE;
+
+	vectors_mask = ATARI_XBIOS_JOYSTICKEVENTS;	/* XBIOS joystick events */
+	if (!(device->hidden->use_dev_mouse)) {
+		vectors_mask |= ATARI_XBIOS_MOUSEEVENTS;	/* XBIOS mouse events */
+	}
 	if (Getcookie(C_MiNT, &dummy)==C_FOUND) {
 		vectors_mask = 0;
 	}
@@ -1094,6 +1100,9 @@
 void GEM_VideoQuit(_THIS)
 {
 	SDL_AtariXbios_RestoreVectors();
+	if (GEM_usedevmouse) {
+		SDL_AtariDevMouse_Close();
+	}
 
 	GEM_FreeBuffers(this);
 
--- a/src/video/gem/SDL_gemvideo.h	Thu Feb 23 04:16:08 2006 +0000
+++ b/src/video/gem/SDL_gemvideo.h	Thu Feb 23 21:51:10 2006 +0000
@@ -81,6 +81,7 @@
 	SDL_bool lock_redraw;		/* Prevent redraw till buffers are setup */
 	short message[8];			/* To self-send an AES message */
 	void *menubar;				/* Menu bar save buffer when going fullscreen */
+	SDL_bool use_dev_mouse;		/* Use /dev/mouse ? */
 
 	SDL_bool fullscreen;		/* Fullscreen or windowed mode ? */
 	SDL_Rect *SDL_modelist[SDL_NUMMODES+1];	/* Mode list */
@@ -129,6 +130,7 @@
 #define GEM_icon			(this->hidden->icon)
 #define GEM_fullscreen		(this->hidden->fullscreen)
 #define GEM_menubar			(this->hidden->menubar)
+#define GEM_usedevmouse		(this->hidden->use_dev_mouse)
 
 #define GEM_buffer1			(this->hidden->buffer1)
 #define GEM_buffer2			(this->hidden->buffer2)