Unified device controls. Both gtk and gtk-glade UIs uses this for joystick support.
This commit is contained in:
parent
8002f6b129
commit
9a6a3a36f7
|
@ -0,0 +1,167 @@
|
||||||
|
/* joysdl.c - this file is part of DeSmuME
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Pascal Giard
|
||||||
|
*
|
||||||
|
* Author: Pascal Giard <evilynux@gmail.com>
|
||||||
|
*
|
||||||
|
* This file is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This file 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ctrlssdl.h"
|
||||||
|
|
||||||
|
/* Initialize joysticks */
|
||||||
|
BOOL init_joy(u16 joyCfg[]) {
|
||||||
|
int i, nbJoysticks;
|
||||||
|
|
||||||
|
/* Joystick configuration */
|
||||||
|
memcpy(joypadCfg, joyCfg, sizeof(joypadCfg));
|
||||||
|
|
||||||
|
if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error trying to initialize joystick support: %s\n",
|
||||||
|
SDL_GetError());
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nbJoysticks = SDL_NumJoysticks();
|
||||||
|
printf("Nbr of joysticks: %d\n\n", nbJoysticks);
|
||||||
|
|
||||||
|
for (i = 0; i < nbJoysticks; i++)
|
||||||
|
{
|
||||||
|
SDL_Joystick * joy = SDL_JoystickOpen(i);
|
||||||
|
printf("Joystick %s\n", i, SDL_JoystickName(i));
|
||||||
|
printf("Axes: %d\n", SDL_JoystickNumAxes(joy));
|
||||||
|
printf("Buttons: %d\n", SDL_JoystickNumButtons(joy));
|
||||||
|
printf("Trackballs: %d\n", SDL_JoystickNumBalls(joy));
|
||||||
|
printf("Hats: %d\n\n", SDL_JoystickNumHats(joy));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unload joysticks */
|
||||||
|
void uninit_joy()
|
||||||
|
{
|
||||||
|
/* FIXME: Should we Close all joysticks?
|
||||||
|
SDL_JoystickClose( ... );
|
||||||
|
*/
|
||||||
|
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 inline lookup_joykey (u16 keyval) {
|
||||||
|
int i;
|
||||||
|
u16 Key = 0;
|
||||||
|
for(i = 0; i < NB_KEYS; i++)
|
||||||
|
if(keyval == joypadCfg[i]) break;
|
||||||
|
if(i < NB_KEYS)
|
||||||
|
Key = KEYMASK_(i);
|
||||||
|
printf("Lookup key %d from joypad...%x\n", keyval, Key);
|
||||||
|
return Key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Manage joystick events */
|
||||||
|
u16 process_ctrls_events(u16 keypad)
|
||||||
|
{
|
||||||
|
u16 key;
|
||||||
|
|
||||||
|
SDL_Event event;
|
||||||
|
/* There's an event waiting to be processed? */
|
||||||
|
while (SDL_PollEvent(&event))
|
||||||
|
{
|
||||||
|
switch (event.type)
|
||||||
|
{
|
||||||
|
/* Joystick axis motion */
|
||||||
|
case SDL_JOYAXISMOTION:
|
||||||
|
/* Horizontal */
|
||||||
|
if (event.jaxis.axis == 0)
|
||||||
|
if( event.jaxis.value == 0 )
|
||||||
|
{
|
||||||
|
key = lookup_joykey( 20 ) | lookup_joykey( 21 );
|
||||||
|
RM_KEY( keypad, key );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( event.jaxis.value > 0 ) key = lookup_joykey( 20 );
|
||||||
|
else key = lookup_joykey( 21 );
|
||||||
|
ADD_KEY( keypad, key );
|
||||||
|
}
|
||||||
|
/* Vertical */
|
||||||
|
else if (event.jaxis.axis == 1)
|
||||||
|
if( event.jaxis.value == 0 )
|
||||||
|
{
|
||||||
|
key = lookup_joykey( 22 ) | lookup_joykey( 23 );
|
||||||
|
RM_KEY( keypad, key );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( event.jaxis.value > 0 ) key = lookup_joykey( 23 );
|
||||||
|
else key = lookup_joykey( 22 );
|
||||||
|
ADD_KEY( keypad, key );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Joystick button pressed */
|
||||||
|
/* FIXME: Add support for BOOST */
|
||||||
|
case SDL_JOYBUTTONDOWN:
|
||||||
|
key = lookup_joykey( event.jbutton.button );
|
||||||
|
ADD_KEY( keypad, key );
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Joystick button released */
|
||||||
|
case SDL_JOYBUTTONUP:
|
||||||
|
key = lookup_joykey(event.jbutton.button);
|
||||||
|
RM_KEY( keypad, key );
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* When GTK is in use, the keyboard, mouse and quit events are handled by GTK. */
|
||||||
|
#ifndef GTK
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
switch (event.key.keysym.sym)
|
||||||
|
{
|
||||||
|
case SDLK_UP: ADD_KEY( keypad, 0x40); break;
|
||||||
|
case SDLK_DOWN: ADD_KEY( keypad, 0x80); break;
|
||||||
|
case SDLK_RIGHT: ADD_KEY( keypad, 0x10); break;
|
||||||
|
case SDLK_LEFT: ADD_KEY( keypad, 0x20); break;
|
||||||
|
case SDLK_SPACE: ADD_KEY( keypad, 0x1); break;
|
||||||
|
case 'b': ADD_KEY( keypad, 0x2); break;
|
||||||
|
case SDLK_BACKSPACE:ADD_KEY( keypad, 0x4); break;
|
||||||
|
case SDLK_RETURN: ADD_KEY( keypad, 0x8); break;
|
||||||
|
case '0': ADD_KEY( keypad, 0x200); break;
|
||||||
|
case '.': ADD_KEY( keypad, 0x100); break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_KEYUP:
|
||||||
|
switch (event.key.keysym.sym)
|
||||||
|
{
|
||||||
|
case SDLK_UP: RM_KEY( keypad, 0x40); break;
|
||||||
|
case SDLK_DOWN: RM_KEY( keypad, 0x80); break;
|
||||||
|
case SDLK_RIGHT: RM_KEY( keypad, 0x10); break;
|
||||||
|
case SDLK_LEFT: RM_KEY( keypad, 0x20); break;
|
||||||
|
case SDLK_SPACE: RM_KEY( keypad, 0x1); break;
|
||||||
|
case 'b': RM_KEY( keypad, 0x2); break;
|
||||||
|
case SDLK_BACKSPACE:RM_KEY( keypad, 0x4); break;
|
||||||
|
case SDLK_RETURN: RM_KEY( keypad, 0x8); break;
|
||||||
|
case '0': RM_KEY( keypad, 0x200); break;
|
||||||
|
case '.': RM_KEY( keypad, 0x100); break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return keypad;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
/* joysdl.h - this file is part of DeSmuME
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Pascal Giard
|
||||||
|
*
|
||||||
|
* Author: Pascal Giard <evilynux@gmail.com>
|
||||||
|
*
|
||||||
|
* This file is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This file 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CTRLSSDL_H
|
||||||
|
#define CTRLSSDL_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
#define NB_KEYS 14
|
||||||
|
|
||||||
|
#define ADD_KEY(keypad,key) ( (keypad) |= (key) )
|
||||||
|
#define RM_KEY(keypad,key) ( (keypad) &= ~(key) )
|
||||||
|
#define KEYMASK_(k) (1 << k)
|
||||||
|
|
||||||
|
u16 joypadCfg[NB_KEYS];
|
||||||
|
|
||||||
|
BOOL init_joy(u16 joyCfg[]);
|
||||||
|
void uninit_joy();
|
||||||
|
u16 process_ctrls_events(u16 oldkeypad);
|
||||||
|
|
||||||
|
#endif /* CTRLSSDL_H */
|
Loading…
Reference in New Issue