From f6ea294cd25dd68f98cea1f51ebf2587ce134d5f Mon Sep 17 00:00:00 2001 From: Patrice Mandin Date: Thu, 23 Feb 2006 21:51:10 +0000 Subject: [PATCH] Added preliminary support for MiNT /dev/mouse driver (disabled atm) --- README.MiNT | 6 +- src/video/ataricommon/SDL_ataridevmouse.c | 159 ++++++++++++++++++++ src/video/ataricommon/SDL_ataridevmouse_c.h | 42 ++++++ src/video/ataricommon/SDL_biosevents.c | 18 ++- src/video/ataricommon/SDL_gemdosevents.c | 19 ++- src/video/gem/SDL_gemevents.c | 7 +- src/video/gem/SDL_gemvideo.c | 13 +- src/video/gem/SDL_gemvideo.h | 2 + 8 files changed, 256 insertions(+), 10 deletions(-) create mode 100644 src/video/ataricommon/SDL_ataridevmouse.c create mode 100644 src/video/ataricommon/SDL_ataridevmouse_c.h diff --git a/README.MiNT b/README.MiNT index 0d8c06021..25a7d5658 100644 --- a/README.MiNT +++ b/README.MiNT @@ -55,7 +55,7 @@ III. Enjoy! :) 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 @@ OpenGL driver always uses OSMesa. (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 @@ Audio drivers: -- Patrice Mandin -http://membres.lycos.fr/pmandin/ +http://pmandin.atari.org/ diff --git a/src/video/ataricommon/SDL_ataridevmouse.c b/src/video/ataricommon/SDL_ataridevmouse.c new file mode 100644 index 000000000..b1e735727 --- /dev/null +++ b/src/video/ataricommon/SDL_ataridevmouse.c @@ -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 +#include + +#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<