- More keyboard input handling centralization.

- Added save/load joystick configuration support to gtk and gtk-glade UIs.
This commit is contained in:
evilynux 2007-01-17 20:16:58 +00:00
parent 3a42f10cae
commit abe99a1e16
10 changed files with 266 additions and 356 deletions

View File

@ -25,21 +25,22 @@ SoundInterface_struct *SNDCoreList[] = {
NULL
};
const u16 Default_Joypad_Config[NB_KEYS] =
{ 1, // A
0, // B
5, // select
8, // start
20, // Right -- Start cheating abit...
21, // Left
22, // Up
23, // Down -- End of cheating.
7, // R
6, // L
4, // X
3, // Y
-1, // BOOST
-1 // DEBUG
/* Our keyboard config is different because of the directional keys */
const u16 cli_kb_cfg[NB_KEYS] =
{ SDLK_c, // A
SDLK_x, // B
SDLK_BACKSPACE, // select
SDLK_RETURN, // start
SDLK_RIGHT, // Right
SDLK_LEFT, // Left
SDLK_UP, // Up
SDLK_DOWN, // Down
SDLK_e, // R
SDLK_w, // L
SDLK_d, // X
SDLK_s, // Y
SDLK_p, // DEBUG
SDLK_o // BOOST
};
int Draw() {
@ -92,7 +93,9 @@ int main(int argc, char ** argv) {
SDL_WM_SetCaption("Desmume SDL", NULL);
/* Initialize joysticks */
if(!init_joy(Default_Joypad_Config)) return 1;
if(!init_joy()) return 1;
/* Load our own keyboard configuration */
set_kb_keys(cli_kb_cfg);
surface = SDL_SetVideoMode(256, 384, 32, SDL_SWSURFACE);

View File

@ -22,12 +22,73 @@
#include "ctrlssdl.h"
/* Keypad key names */
const char *key_names[NB_KEYS] =
{
"A",
"B",
"Select",
"Start",
"Right",
"Left",
"Up",
"Down",
"R",
"L",
"X",
"Y",
"Debug",
"Boost"
};
/* Default joypad configuration */
const u16 default_joypad_cfg[NB_KEYS] =
{ 1, // A
0, // B
5, // select
8, // start
-1, // Right -- Start cheating abit...
-1, // Left
-1, // Up
-1, // Down -- End of cheating.
7, // R
6, // L
4, // X
3, // Y
-1, // DEBUG
-1 // BOOST
};
const u16 default_keyboard_cfg[NB_KEYS] =
{
97, // a
98, // b
65288, // backspace
65293, // enter
65363, // directional arrows
65361,
65362,
65364,
65454, // numeric .
65456, // numeric 0
120, // x
121, // y
112,
113
};
/* Load default joystick and keyboard configurations */
void load_default_config()
{
memcpy(keyboard_cfg, default_keyboard_cfg, sizeof(keyboard_cfg));
memcpy(joypad_cfg, default_joypad_cfg, sizeof(joypad_cfg));
}
/* Initialize joysticks */
BOOL init_joy(u16 joyCfg[]) {
int i;
/* Joystick configuration */
memcpy(joypadCfg, joyCfg, sizeof(joypadCfg));
set_joy_keys(default_joypad_cfg);
if(SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1)
{
@ -48,6 +109,20 @@ BOOL init_joy(u16 joyCfg[]) {
printf("Trackballs: %d\n", SDL_JoystickNumBalls(joy));
printf("Hats: %d\n\n", SDL_JoystickNumHats(joy));
}
return TRUE;
}
/* Set all buttons at once */
void set_joy_keys(u16 joyCfg[])
{
memcpy(joypad_cfg, joyCfg, sizeof(joypad_cfg));
}
/* Set all buttons at once */
void set_kb_keys(u16 kbCfg[])
{
memcpy(keyboard_cfg, kbCfg, sizeof(keyboard_cfg));
}
/* Unload joysticks */
@ -59,11 +134,22 @@ void uninit_joy()
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
}
u16 inline lookup_joykey (u16 keyval) {
/* Return keypad vector with given key set to 1 */
u16 inline lookup_joy_key (u16 keyval) {
int i;
u16 Key = 0;
for(i = 0; i < NB_KEYS; i++)
if(keyval == joypadCfg[i]) break;
if(keyval == joypad_cfg[i]) break;
if(i < NB_KEYS) Key = KEYMASK_(i);
return Key;
}
/* Return keypad vector with given key set to 1 */
u16 inline lookup_key (u16 keyval) {
int i;
u16 Key = 0;
for(i = 0; i < NB_KEYS; i++)
if(keyval == keyboard_cfg[i]) break;
if(i < NB_KEYS) Key = KEYMASK_(i);
return Key;
}
@ -72,7 +158,7 @@ u16 inline lookup_joykey (u16 keyval) {
u16 get_set_joy_key(int index) {
BOOL done = FALSE;
SDL_Event event;
u16 key = joypadCfg[index];
u16 key = joypad_cfg[index];
/* Enable joystick events if needed */
if( SDL_JoystickEventState(SDL_QUERY) == SDL_IGNORE )
@ -90,7 +176,7 @@ u16 get_set_joy_key(int index) {
}
}
SDL_JoystickEventState(SDL_IGNORE);
joypadCfg[index] = key;
joypad_cfg[index] = key;
return key;
}
@ -151,26 +237,26 @@ u16 process_ctrls_events(u16 keypad)
if (event.jaxis.axis == 0)
if( event.jaxis.value == 0 )
{
key = lookup_joykey( 20 ) | lookup_joykey( 21 );
key = KEYMASK_( 4 ) | KEYMASK_( 5 );
RM_KEY( keypad, key );
}
else
{
if( event.jaxis.value > 0 ) key = lookup_joykey( 20 );
else key = lookup_joykey( 21 );
if( event.jaxis.value > 0 ) key = KEYMASK_( 4 );
else key = KEYMASK_( 5 );
ADD_KEY( keypad, key );
}
/* Vertical */
else if (event.jaxis.axis == 1)
if( event.jaxis.value == 0 )
{
key = lookup_joykey( 22 ) | lookup_joykey( 23 );
key = KEYMASK_( 6 ) | KEYMASK_( 7 );
RM_KEY( keypad, key );
}
else
{
if( event.jaxis.value > 0 ) key = lookup_joykey( 23 );
else key = lookup_joykey( 22 );
if( event.jaxis.value > 0 ) key = KEYMASK_( 7 );
else key = KEYMASK_( 6 );
ADD_KEY( keypad, key );
}
break;
@ -178,13 +264,13 @@ u16 process_ctrls_events(u16 keypad)
/* Joystick button pressed */
/* FIXME: Add support for BOOST */
case SDL_JOYBUTTONDOWN:
key = lookup_joykey( event.jbutton.button );
key = lookup_joy_key( event.jbutton.button );
ADD_KEY( keypad, key );
break;
/* Joystick button released */
case SDL_JOYBUTTONUP:
key = lookup_joykey(event.jbutton.button);
key = lookup_joy_key(event.jbutton.button);
RM_KEY( keypad, key );
break;
@ -192,39 +278,13 @@ u16 process_ctrls_events(u16 keypad)
mouse, keyboard and quit events. */
#ifndef GTK_UI
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_c: ADD_KEY( keypad, 0x1); break;
case SDLK_x: ADD_KEY( keypad, 0x2); break;
case SDLK_BACKSPACE:ADD_KEY( keypad, 0x4); break;
case SDLK_RETURN: ADD_KEY( keypad, 0x8); break;
case SDLK_e: ADD_KEY( keypad, 0x100); break; // R
case SDLK_w: ADD_KEY( keypad, 0x200); break; // L
case SDLK_d: ADD_KEY( keypad, 0x400); break; // X
case SDLK_s: ADD_KEY( keypad, 0x800); break; // Y
}
key = lookup_key(event.key.keysym.sym);
ADD_KEY( keypad, key );
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_c: RM_KEY( keypad, 0x1); break;
case SDLK_x: RM_KEY( keypad, 0x2); break;
case SDLK_BACKSPACE:RM_KEY( keypad, 0x4); break;
case SDLK_RETURN: RM_KEY( keypad, 0x8); break;
case SDLK_e: RM_KEY( keypad, 0x100); break; // R
case SDLK_w: RM_KEY( keypad, 0x200); break; // L
case SDLK_d: RM_KEY( keypad, 0x400); break; // X
case SDLK_s: RM_KEY( keypad, 0x800); break; // Y
}
key = lookup_key(event.key.keysym.sym);
RM_KEY( keypad, key );
break;
case SDL_MOUSEBUTTONDOWN:

View File

@ -32,13 +32,34 @@
#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];
#define NB_KEYS 14
#define KEY_NONE 0
#define KEY_A 1
#define KEY_B 2
#define KEY_SELECT 3
#define KEY_START 4
#define KEY_RIGHT 5
#define KEY_LEFT 6
#define KEY_UP 7
#define KEY_DOWN 8
#define KEY_R 9
#define KEY_L 10
#define KEY_X 11
#define KEY_Y 12
#define KEY_DEBUG 13
#define KEY_BOOST 14
/* Keypad key names */
const char *key_names[NB_KEYS];
/* Current keyboard configuration */
u16 keyboard_cfg[NB_KEYS];
/* Current joypad configuration */
u16 joypad_cfg[NB_KEYS];
/* Number of detected joypads */
u16 nbr_joy;
#ifndef GTK_UI
@ -57,11 +78,16 @@ BOOL sdl_quit;
void set_mouse_coord(signed long x,signed long y);
#endif // !GTK_UI
BOOL init_joy(u16 joyCfg[]);
void load_default_config();
BOOL init_joy();
void uninit_joy();
void set_joy_keys(u16 joyCfg[]);
void set_kb_keys(u16 kbCfg[]);
u16 get_set_joy_key(int index);
void update_keypad(u16 keys);
u16 get_keypad();
u16 inline lookup_key (u16 keyval);
u16 inline lookup_joy_key (u16 keyval);
u16 process_ctrls_events(u16 oldkeypad);
#endif /* CTRLSSDL_H */

View File

@ -182,7 +182,7 @@ void on_size3x_activate (GtkMenuItem *menuitem, gpointer user_data) { resize(3)
/* MENU CONFIG ***** ***** ***** ***** */
gint Keypad_Temp[DESMUME_NB_KEYS];
u16 Keypad_Temp[NB_KEYS];
void on_menu_controls_activate (GtkMenuItem *menuitem, gpointer user_data) {
edit_controls();

View File

@ -29,41 +29,23 @@ int BoostFS=20;
int saveFS;
/* ***** ***** INPUT BUTTONS / KEYBOARD ***** ***** */
u16 inline lookup_key (guint keyval) {
int i;
u16 Key = 0;
for(i = 0; i < DESMUME_NB_KEYS; i++)
if(keyval == Keypad_Config[i]) break;
if(i < DESMUME_NB_KEYS)
Key = DESMUME_KEYMASK_(i);
//fprintf(stderr,"K:%d(%d)->%X => [%X]\n", e->keyval, e->hardware_keycode, Key, Cur_Keypad);
return Key;
}
gboolean on_wMainW_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) {
u16 Key = lookup_key(event->keyval);
if (event->keyval == Keypad_Config[DESMUME_KEY_BOOST-1]) {
if (event->keyval == keyboard_cfg[KEY_BOOST-1]) {
Boost != Boost;
saveFS=Frameskip;
if (Boost) Frameskip = BoostFS;
else Frameskip = saveFS;
}
else if (Key != 0) {
Cur_Keypad |= Key;
if(desmume_running()) update_keypad(Cur_Keypad);
}
ADD_KEY( Cur_Keypad, Key );
if(desmume_running()) update_keypad(Cur_Keypad);
return 1;
}
gboolean on_wMainW_key_release_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) {
u16 Key = lookup_key(event->keyval);
if (Key != 0) {
Cur_Keypad &= ~Key;
if(desmume_running()) update_keypad(Cur_Keypad);
}
RM_KEY( Cur_Keypad, Key );
if(desmume_running()) update_keypad(Cur_Keypad);
return 1;
}
@ -249,24 +231,16 @@ gboolean on_wDraw_Sub_motion_notify_event (GtkWidget *widget, GdkEventMotion
/* ***** ***** KEYBOARD CONFIG / KEY DEFINITION ***** ***** */
const char * DESMUME_KEY_NAMES[DESMUME_NB_KEYS]={
"A", "B",
"Select", "Start",
"Right", "Left", "Up", "Down",
"R", "L", "X", "Y", "DEBUG", "Boost"
};
gint Keypad_Temp[DESMUME_NB_KEYS];
u16 Keypad_Temp[NB_KEYS];
guint temp_Key=0;
void init_labels() {
int i;
char text[50], bname[20];
GtkButton *b;
for (i=0; i<DESMUME_NB_KEYS; i++) {
sprintf(text,"%s : %s\0\0",DESMUME_KEY_NAMES[i],KEYNAME(Keypad_Config[i]));
sprintf(bname,"button_%s\0\0",DESMUME_KEY_NAMES[i]);
for (i=0; i<NB_KEYS; i++) {
sprintf(text,"%s : %s\0\0",key_names[i],KEYNAME(keyboard_cfg[i]));
sprintf(bname,"button_%s\0\0",key_names[i]);
b = (GtkButton*)glade_xml_get_widget(xml, bname);
gtk_button_set_label(b,text);
}
@ -279,20 +253,20 @@ void init_joy_labels() {
GtkButton *b;
for (i=0; i<4; i++) {
/* Key not configured */
if( joypadCfg[i] == (u16)(-1) ) continue;
if( joypad_cfg[i] == (u16)(-1) ) continue;
sprintf(text,"%s : %d\0\0",DESMUME_KEY_NAMES[i],joypadCfg[i]);
sprintf(bname,"button_joy_%s\0\0",DESMUME_KEY_NAMES[i]);
sprintf(text,"%s : %d\0\0",key_names[i],joypad_cfg[i]);
sprintf(bname,"button_joy_%s\0\0",key_names[i]);
b = (GtkButton*)glade_xml_get_widget(xml, bname);
gtk_button_set_label(b,text);
}
/* Skipping Axis */
for (i=8; i<DESMUME_NB_KEYS; i++) {
for (i=8; i<NB_KEYS; i++) {
/* Key not configured */
if( joypadCfg[i] == (u16)(-1) ) continue;
if( joypad_cfg[i] == (u16)(-1) ) continue;
sprintf(text,"%s : %d\0\0",DESMUME_KEY_NAMES[i],joypadCfg[i]);
sprintf(bname,"button_joy_%s\0\0",DESMUME_KEY_NAMES[i]);
sprintf(text,"%s : %d\0\0",key_names[i],joypad_cfg[i]);
sprintf(bname,"button_joy_%s\0\0",key_names[i]);
b = (GtkButton*)glade_xml_get_widget(xml, bname);
gtk_button_set_label(b,text);
}
@ -300,7 +274,7 @@ void init_joy_labels() {
void edit_controls() {
GtkDialog * dlg = (GtkDialog*)glade_xml_get_widget(xml, "wKeybConfDlg");
memcpy(&Keypad_Temp, &Keypad_Config, sizeof(Keypad_Config));
memcpy(&Keypad_Temp, &keyboard_cfg, sizeof(keyboard_cfg));
/* we change the labels so we know keyb def */
init_labels();
gtk_widget_show((GtkWidget*)dlg);
@ -309,7 +283,7 @@ void edit_controls() {
void on_wKeybConfDlg_response (GtkDialog *dialog, gint arg1, gpointer user_data) {
/* overwrite keyb def if user selected ok */
if (arg1 == GTK_RESPONSE_OK)
memcpy(&Keypad_Config, &Keypad_Temp, sizeof(Keypad_Config));
memcpy(&keyboard_cfg, &Keypad_Temp, sizeof(keyboard_cfg));
gtk_widget_hide((GtkWidget*)dialog);
}
@ -334,7 +308,7 @@ void ask(GtkButton*b, int key) {
{
case GTK_RESPONSE_OK:
Keypad_Temp[key]=temp_Key;
sprintf(text,"%s : %s\0\0",DESMUME_KEY_NAMES[key],KEYNAME(temp_Key));
sprintf(text,"%s : %s\0\0",key_names[key],KEYNAME(temp_Key));
gtk_button_set_label(b,text);
break;
case GTK_RESPONSE_CANCEL:
@ -344,23 +318,23 @@ void ask(GtkButton*b, int key) {
gtk_widget_hide((GtkWidget*)dlg);
}
void on_button_Left_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Left); }
void on_button_Up_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Up); }
void on_button_Right_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Right); }
void on_button_Down_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Down); }
void on_button_Left_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_LEFT); }
void on_button_Up_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_UP); }
void on_button_Right_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_RIGHT); }
void on_button_Down_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_DOWN); }
void on_button_L_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_L); }
void on_button_R_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_R); }
void on_button_L_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_L); }
void on_button_R_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_R); }
void on_button_Y_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Y); }
void on_button_X_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_X); }
void on_button_A_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_A); }
void on_button_B_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_B); }
void on_button_Y_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_Y); }
void on_button_X_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_X); }
void on_button_A_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_A); }
void on_button_B_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_B); }
void on_button_Start_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Start); }
void on_button_Select_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Select); }
void on_button_Debug_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_DEBUG); }
void on_button_Boost_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_BOOST); }
void on_button_Start_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_START); }
void on_button_Select_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_SELECT); }
void on_button_Debug_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_DEBUG); }
void on_button_Boost_clicked (GtkButton *b, gpointer user_data) { ask(b,KEY_BOOST); }
/* Joystick configuration / Key definition */
void ask_joy_key(GtkButton*b, int key)
@ -374,28 +348,28 @@ void ask_joy_key(GtkButton*b, int key)
/* Need to force event processing. Otherwise, popup won't show up. */
while ( gtk_events_pending() ) gtk_main_iteration();
joykey = get_set_joy_key(key);
sprintf(text,"%s : %d\0\0",DESMUME_KEY_NAMES[key],joykey);
sprintf(text,"%s : %d\0\0",key_names[key],joykey);
gtk_button_set_label(b,text);
gtk_widget_hide((GtkWidget*)dlg);
}
void on_joy_button_A_clicked (GtkButton *b, gpointer user_data)
{ ask_joy_key(b,DESMUME_KEY_A); }
{ ask_joy_key(b,KEY_A); }
void on_joy_button_B_clicked (GtkButton *b, gpointer user_data)
{ ask_joy_key(b,DESMUME_KEY_B); }
{ ask_joy_key(b,KEY_B); }
void on_joy_button_X_clicked (GtkButton *b, gpointer user_data)
{ ask_joy_key(b,DESMUME_KEY_X); }
{ ask_joy_key(b,KEY_X); }
void on_joy_button_Y_clicked (GtkButton *b, gpointer user_data)
{ ask_joy_key(b,DESMUME_KEY_Y); }
{ ask_joy_key(b,KEY_Y); }
void on_joy_button_L_clicked (GtkButton *b, gpointer user_data)
{ ask_joy_key(b,DESMUME_KEY_L); }
{ ask_joy_key(b,KEY_L); }
void on_joy_button_R_clicked (GtkButton *b, gpointer user_data)
{ ask_joy_key(b,DESMUME_KEY_R); }
{ ask_joy_key(b,KEY_R); }
void on_joy_button_Select_clicked (GtkButton *b, gpointer user_data)
{ ask_joy_key(b,DESMUME_KEY_Select); }
{ ask_joy_key(b,KEY_SELECT); }
void on_joy_button_Start_clicked (GtkButton *b, gpointer user_data)
{ ask_joy_key(b,DESMUME_KEY_Start); }
{ ask_joy_key(b,KEY_START); }
void on_joy_button_Boost_clicked (GtkButton *b, gpointer user_data)
{ ask_joy_key(b,DESMUME_KEY_BOOST); }
{ ask_joy_key(b,KEY_BOOST); }
void on_joy_button_Debug_clicked (GtkButton *b, gpointer user_data)
{ ask_joy_key(b,DESMUME_KEY_DEBUG); }
{ ask_joy_key(b,KEY_DEBUG); }

View File

@ -20,26 +20,6 @@
#ifndef __DESMUME_H__
#define __DESMUME_H__
#define DESMUME_NB_KEYS 14
#define DESMUME_KEYMASK_(k) (1 << k)
#define DESMUME_KEY_NONE 0
#define DESMUME_KEY_A 1
#define DESMUME_KEY_B 2
#define DESMUME_KEY_Select 3
#define DESMUME_KEY_Start 4
#define DESMUME_KEY_Right 5
#define DESMUME_KEY_Left 6
#define DESMUME_KEY_Up 7
#define DESMUME_KEY_Down 8
#define DESMUME_KEY_R 9
#define DESMUME_KEY_L 10
#define DESMUME_KEY_X 11
#define DESMUME_KEY_Y 12
#define DESMUME_KEY_DEBUG 13
#define DESMUME_KEY_BOOST 14
#include "globals.h"
extern void desmume_init();

View File

@ -48,8 +48,7 @@
#include "desmume.h"
uint Frameskip;
gint Keypad_Config[DESMUME_NB_KEYS];
gint Keypad_Temp[DESMUME_NB_KEYS];
u16 Keypad_Temp[NB_KEYS];
/* main.c */
GtkWidget * pWindow;

View File

@ -60,92 +60,44 @@ void notify_Tools() {
/* ***** ***** CONFIG FILE ***** ***** */
gint Keypad_Config[DESMUME_NB_KEYS];
const u16 Default_Joypad_Config[DESMUME_NB_KEYS] =
{ 1, // A
0, // B
5, // select
8, // start
20, // Right -- Start cheating abit...
21, // Left
22, // Up
23, // Down -- End of cheating.
7, // R
6, // L
4, // X
3, // Y
-1, // DEBUG
-1 // BOOST
};
const char *Ini_Keypad_Values[DESMUME_NB_KEYS] =
{
"KEY_A",
"KEY_B",
"KEY_SELECT",
"KEY_START",
"KEY_RIGHT",
"KEY_LEFT",
"KEY_UP",
"KEY_DOWN",
"KEY_R",
"KEY_L",
"KEY_X",
"KEY_Y",
"KEY_DEBUG",
"KEY_BOOST"
};
const gint Default_Keypad_Config[DESMUME_NB_KEYS] =
{
GDK_b,
GDK_a,
GDK_BackSpace,
GDK_Return,
GDK_Right,
GDK_Left,
GDK_Up,
GDK_Down,
GDK_KP_Decimal,
GDK_KP_0,
GDK_x,
GDK_y,
GDK_p,
GDK_o
};
char * CONFIG_FILE;
void inline Load_DefaultConfig()
{
memcpy(Keypad_Config, Default_Keypad_Config, sizeof(Keypad_Config));
}
int Read_ConfigFile()
{
int i, tmp;
GKeyFile * keyfile = g_key_file_new();
GError * error = NULL;
Load_DefaultConfig();
load_default_config();
g_key_file_load_from_file(keyfile, CONFIG_FILE, G_KEY_FILE_NONE, 0);
const char *c;
for(i = 0; i < DESMUME_NB_KEYS; i++)
/* Load keypad keys */
for(i = 0; i < NB_KEYS; i++)
{
tmp = g_key_file_get_integer(keyfile, "KEYS", Ini_Keypad_Values[i], &error);
tmp = g_key_file_get_integer(keyfile, "KEYS", key_names[i], &error);
if (error != NULL) {
g_error_free(error);
error = NULL;
g_error_free(error);
error = NULL;
} else {
Keypad_Config[i] = g_key_file_get_integer(keyfile, "KEYS", Ini_Keypad_Values[i], &error);
keyboard_cfg[i] = tmp;
}
}
/* Load joypad keys */
for(i = 0; i < NB_KEYS; i++)
{
tmp = g_key_file_get_integer(keyfile, "JOYKEYS", key_names[i], &error);
if (error != NULL) {
g_error_free(error);
error = NULL;
} else {
joypad_cfg[i] = tmp;
}
}
g_key_file_free(keyfile);
return 0;
@ -158,9 +110,10 @@ int Write_ConfigFile()
keyfile = g_key_file_new();
for(i = 0; i < DESMUME_NB_KEYS; i++)
for(i = 0; i < NB_KEYS; i++)
{
g_key_file_set_integer(keyfile, "KEYS", Ini_Keypad_Values[i], Keypad_Config[i]);
g_key_file_set_integer(keyfile, "KEYS", key_names[i], keyboard_cfg[i]);
g_key_file_set_integer(keyfile, "JOYKEYS", key_names[i], joypad_cfg[i]);
}
g_file_set_contents(CONFIG_FILE, g_key_file_to_data(keyfile, 0, 0), -1, 0);
@ -204,7 +157,7 @@ int main(int argc, char *argv[]) {
}
desmume_init();
/* Initialize joysticks */
if(!init_joy(Default_Joypad_Config)) return 1;
if(!init_joy()) return 1;
CONFIG_FILE = g_build_filename(g_get_home_dir(), ".desmume.ini", NULL);
Read_ConfigFile();

View File

@ -1,25 +1,6 @@
#ifndef __DESMUME_H__
#define __DESMUME_H__
#define DESMUME_NB_KEYS 13
#define DESMUME_KEYMASK_(k) (1 << k)
#define DESMUME_KEY_A 1
#define DESMUME_KEY_B 2
#define DESMUME_KEY_Select 3
#define DESMUME_KEY_Start 4
#define DESMUME_KEY_Right 5
#define DESMUME_KEY_Left 6
#define DESMUME_KEY_Up 7
#define DESMUME_KEY_Down 8
#define DESMUME_KEY_R 9
#define DESMUME_KEY_L 10
#define DESMUME_KEY_X 11
#define DESMUME_KEY_Y 12
#define DESMUME_KEY_DEBUG 13
#include "globals.h"
extern void desmume_init();

View File

@ -27,25 +27,6 @@ static GtkActionEntry action_entries[] = {
GtkActionGroup * action_group;
static gint Keypad_Config[DESMUME_NB_KEYS];
const char *Ini_Keypad_Values[DESMUME_NB_KEYS] =
{
"KEY_A",
"KEY_B",
"KEY_SELECT",
"KEY_START",
"KEY_RIGHT",
"KEY_LEFT",
"KEY_UP",
"KEY_DOWN",
"KEY_R",
"KEY_L",
"KEY_X",
"KEY_Y",
"KEY_DEBUG",
};
char * CONFIG_FILE;
SoundInterface_struct *SNDCoreList[] = {
@ -55,6 +36,8 @@ SoundInterface_struct *SNDCoreList[] = {
NULL
};
u16 Keypad_Temp[NB_KEYS];
int Write_ConfigFile()
{
int i;
@ -62,9 +45,10 @@ int Write_ConfigFile()
keyfile = g_key_file_new();
for(i = 0; i < DESMUME_NB_KEYS; i++)
for(i = 0; i < NB_KEYS; i++)
{
g_key_file_set_integer(keyfile, "KEYS", Ini_Keypad_Values[i], Keypad_Config[i]);
g_key_file_set_integer(keyfile, "KEYS", key_names[i], keyboard_cfg[i]);
g_key_file_set_integer(keyfile, "JOYKEYS", key_names[i], joypad_cfg[i]);
}
// if(FirmwareFile[0])
@ -80,74 +64,47 @@ int Write_ConfigFile()
return 0;
}
void Load_DefaultConfig();
int Read_ConfigFile()
{
int i, tmp;
GKeyFile * keyfile = g_key_file_new();
GError * error = NULL;
Load_DefaultConfig();
load_default_config();
g_key_file_load_from_file(keyfile, CONFIG_FILE, G_KEY_FILE_NONE, 0);
const char *c;
for(i = 0; i < DESMUME_NB_KEYS; i++)
/* Load keyboard keys */
for(i = 0; i < NB_KEYS; i++)
{
tmp = g_key_file_get_integer(keyfile, "KEYS", Ini_Keypad_Values[i], &error);
tmp = g_key_file_get_integer(keyfile, "KEYS", key_names[i], &error);
if (error != NULL) {
g_error_free(error);
error = NULL;
g_error_free(error);
error = NULL;
} else {
Keypad_Config[i] = g_key_file_get_integer(keyfile, "KEYS", Ini_Keypad_Values[i], &error);
keyboard_cfg[i] = tmp;
}
}
/* Load joystick keys */
for(i = 0; i < NB_KEYS; i++)
{
tmp = g_key_file_get_integer(keyfile, "JOYKEYS", key_names[i], &error);
if (error != NULL) {
g_error_free(error);
error = NULL;
} else {
joypad_cfg[i] = tmp;
}
}
g_key_file_free(keyfile);
return 0;
}
const gint Default_Keypad_Config[DESMUME_NB_KEYS] =
{
97, // a
98, // b
65288, // backspace
65293, // enter
65363, // directional arrows
65361,
65362,
65364,
65454, // numeric .
65456, // numeric 0
120, // x
121, // y
112
};
const u16 Default_Joypad_Config[DESMUME_NB_KEYS] =
{ 1, // A
0, // B
5, // select
8, // start
20, // Right -- Start cheating abit...
21, // Left
22, // Up
23, // Down -- End of cheating.
7, // R
6, // L
4, // X
3, // Y
-1 // DEBUG
};
void Load_DefaultConfig()
{
memcpy(Keypad_Config, Default_Keypad_Config, sizeof(Keypad_Config));
}
/************************ GTK *******************************/
uint Frameskip = 0;
@ -407,24 +364,22 @@ static gboolean Stylus_Release(GtkWidget *w, GdkEventButton *e, gpointer data)
return TRUE;
}
static u16 Cur_Keypad = 0x00FFF;
static u16 Cur_Keypad = 0;
static gint Key_Press(GtkWidget *w, GdkEventKey *e)
{
int i;
u16 Key = 0;
for(i = 0; i < DESMUME_NB_KEYS; i++)
if(e->keyval == Keypad_Config[i]) break;
for(i = 0; i < NB_KEYS; i++)
if(e->keyval == keyboard_cfg[i]) break;
if(i < DESMUME_NB_KEYS)
if(i < NB_KEYS)
{
Key = DESMUME_KEYMASK_(i);
Cur_Keypad &= ~Key;
if(desmume_running()) update_keypad(~Cur_Keypad);
ADD_KEY( Cur_Keypad, KEYMASK_(i) );
if(desmume_running()) update_keypad(Cur_Keypad);
}
//fprintf(stderr,"P:%d(%d)->%X => [%X]\n", e->keyval, e->hardware_keycode, Key, Cur_Keypad);
return 1;
}
static gint Key_Release(GtkWidget *w, GdkEventKey *e)
@ -432,39 +387,20 @@ static gint Key_Release(GtkWidget *w, GdkEventKey *e)
int i;
u16 Key = 0;
for(i = 0; i < DESMUME_NB_KEYS; i++)
if(e->keyval == Keypad_Config[i]) break;
for(i = 0; i < NB_KEYS; i++)
if(e->keyval == keyboard_cfg[i]) break;
if(i < DESMUME_NB_KEYS)
if(i < NB_KEYS)
{
Key = DESMUME_KEYMASK_(i);
Cur_Keypad |= Key;
if(desmume_running()) update_keypad(~Cur_Keypad);
RM_KEY( Cur_Keypad, KEYMASK_(i) );
if(desmume_running()) update_keypad(Cur_Keypad);
}
//fprintf(stderr,"R:%d(%d)->%X => [%X]\n", e->keyval, e->hardware_keycode, Key, Cur_Keypad);
return 1;
}
/////////////////////////////// CONTROLS EDIT //////////////////////////////////////
const char *Keys_Name[DESMUME_NB_KEYS] =
{
"A",
"B",
"Select",
"Start",
"Right",
"Left",
"Up",
"Down",
"R",
"L",
"X",
"Y",
"Debug"
};
GtkWidget *mkLabel;
gint Modify_Key_Chosen = 0;
@ -476,8 +412,6 @@ void Modify_Key_Press(GtkWidget *w, GdkEventKey *e)
gtk_label_set(GTK_LABEL(mkLabel), YouPressed);
}
gint Keypad_Temp[DESMUME_NB_KEYS];
void Modify_Key(GtkWidget* widget, gpointer data)
{
gint Key = GPOINTER_TO_INT(data);
@ -486,7 +420,7 @@ void Modify_Key(GtkWidget* widget, gpointer data)
GtkWidget *mkDialog;
sprintf(Title, "Press \"%s\" key ...\n", Keys_Name[Key]);
sprintf(Title, "Press \"%s\" key ...\n", key_names[Key]);
mkDialog = gtk_dialog_new_with_buttons(Title,
GTK_WINDOW(pWindow),
GTK_DIALOG_MODAL,
@ -506,7 +440,7 @@ void Modify_Key(GtkWidget* widget, gpointer data)
case GTK_RESPONSE_OK:
Keypad_Temp[Key] = Modify_Key_Chosen;
sprintf(Key_Label, "%s (%d)", Keys_Name[Key], Keypad_Temp[Key]);
sprintf(Key_Label, "%s (%d)", key_names[Key], Keypad_Temp[Key]);
gtk_button_set_label(GTK_BUTTON(widget), Key_Label);
break;
@ -527,7 +461,7 @@ void Edit_Controls(GtkWidget* widget, gpointer data)
GtkWidget *ecDialog;
GtkWidget *ecKey;
memcpy(&Keypad_Temp, &Keypad_Config, sizeof(Keypad_Config));
memcpy(&Keypad_Temp, &keyboard_cfg, sizeof(keyboard_cfg));
ecDialog = gtk_dialog_new_with_buttons("Edit controls",
GTK_WINDOW(pWindow),
@ -537,9 +471,9 @@ void Edit_Controls(GtkWidget* widget, gpointer data)
NULL);
for(i = 0; i < DESMUME_NB_KEYS; i++)
for(i = 0; i < NB_KEYS; i++)
{
sprintf(Key_Label, "%s (%d)", Keys_Name[i], Keypad_Temp[i]);
sprintf(Key_Label, "%s (%d)", key_names[i], Keypad_Temp[i]);
ecKey = gtk_button_new_with_label(Key_Label);
g_signal_connect(G_OBJECT(ecKey), "clicked", G_CALLBACK(Modify_Key), GINT_TO_POINTER(i));
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ecDialog)->vbox), ecKey,TRUE, FALSE, 0);
@ -550,7 +484,7 @@ void Edit_Controls(GtkWidget* widget, gpointer data)
switch (gtk_dialog_run(GTK_DIALOG(ecDialog)))
{
case GTK_RESPONSE_OK:
memcpy(&Keypad_Config, &Keypad_Temp, sizeof(Keypad_Config));
memcpy(&keyboard_cfg, &Keypad_Temp, sizeof(keyboard_cfg));
case GTK_RESPONSE_CANCEL:
case GTK_RESPONSE_NONE:
break;
@ -1017,7 +951,7 @@ int main (int argc, char *argv[])
}
desmume_init();
/* Initialize joysticks */
if(!init_joy(Default_Joypad_Config)) return 1;
if(!init_joy()) return 1;
dTools_running = (BOOL*)malloc(sizeof(BOOL) * dTools_list_size);
for(i=0; i<dTools_list_size; i++) dTools_running[i]=FALSE;