Added preliminary support for MiNT /dev/mouse driver (disabled atm)
--HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401424
This commit is contained in:
parent
9deda87010
commit
e32e1fa965
8 changed files with 256 additions and 10 deletions
|
@ -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 <pmandin@caramail.com>
|
||||
http://membres.lycos.fr/pmandin/
|
||||
http://pmandin.atari.org/
|
||||
|
|
159
src/video/ataricommon/SDL_ataridevmouse.c
Normal file
159
src/video/ataricommon/SDL_ataridevmouse.c
Normal file
|
@ -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);
|
||||
}
|
||||
}
|
42
src/video/ataricommon/SDL_ataridevmouse_c.h
Normal file
42
src/video/ataricommon/SDL_ataridevmouse_c.h
Normal file
|
@ -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_ */
|
|
@ -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 @@ void AtariBios_InitOSKeymap(_THIS)
|
|||
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 @@ void AtariBios_PumpEvents(_THIS)
|
|||
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 @@ static SDL_keysym *TranslateKey(int scancode, int asciicode, SDL_keysym *keysym,
|
|||
void AtariBios_ShutdownEvents(void)
|
||||
{
|
||||
SDL_AtariXbios_RestoreVectors();
|
||||
if (use_dev_mouse) {
|
||||
SDL_AtariDevMouse_Close();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 @@ void AtariGemdos_InitOSKeymap(_THIS)
|
|||
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 @@ void AtariGemdos_PumpEvents(_THIS)
|
|||
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 @@ static SDL_keysym *TranslateKey(int scancode, int asciicode, SDL_keysym *keysym,
|
|||
void AtariGemdos_ShutdownEvents(void)
|
||||
{
|
||||
SDL_AtariXbios_RestoreVectors();
|
||||
if (use_dev_mouse) {
|
||||
SDL_AtariDevMouse_Close();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 @@ static void do_mouse(_THIS, short mx, short my, short mb, short ks)
|
|||
|
||||
/* 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;
|
||||
|
|
|
@ -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 @@ static SDL_VideoDevice *GEM_CreateDevice(int devindex)
|
|||
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 @@ static int GEM_ToggleFullScreen(_THIS, int on)
|
|||
void GEM_VideoQuit(_THIS)
|
||||
{
|
||||
SDL_AtariXbios_RestoreVectors();
|
||||
if (GEM_usedevmouse) {
|
||||
SDL_AtariDevMouse_Close();
|
||||
}
|
||||
|
||||
GEM_FreeBuffers(this);
|
||||
|
||||
|
|
|
@ -81,6 +81,7 @@ struct SDL_PrivateVideoData {
|
|||
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 @@ struct SDL_PrivateVideoData {
|
|||
#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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue