Mercurial > sdl-ios-xcode
changeset 1420:2405517b5eab
Added preliminary support for MiNT /dev/mouse driver (disabled atm)
author | Patrice Mandin <patmandin@gmail.com> |
---|---|
date | Thu, 23 Feb 2006 21:51:10 +0000 |
parents | 36a5068bf7df |
children | 638da75f9ab8 |
files | 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 |
diffstat | 8 files changed, 256 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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)