diff --git a/trunk/desmume/src/cli/main.c b/trunk/desmume/src/cli/main.c index 45f665e4e..3bd42d4cc 100644 --- a/trunk/desmume/src/cli/main.c +++ b/trunk/desmume/src/cli/main.c @@ -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); diff --git a/trunk/desmume/src/ctrlssdl.c b/trunk/desmume/src/ctrlssdl.c index a4db265bc..d0bb2f4b2 100644 --- a/trunk/desmume/src/ctrlssdl.c +++ b/trunk/desmume/src/ctrlssdl.c @@ -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: diff --git a/trunk/desmume/src/ctrlssdl.h b/trunk/desmume/src/ctrlssdl.h index 8b0fdfb17..f69dcd224 100644 --- a/trunk/desmume/src/ctrlssdl.h +++ b/trunk/desmume/src/ctrlssdl.h @@ -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 */ diff --git a/trunk/desmume/src/gtk-glade/callbacks.c b/trunk/desmume/src/gtk-glade/callbacks.c index 4ba5593eb..1525e8d88 100755 --- a/trunk/desmume/src/gtk-glade/callbacks.c +++ b/trunk/desmume/src/gtk-glade/callbacks.c @@ -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(); diff --git a/trunk/desmume/src/gtk-glade/callbacks_IO.c b/trunk/desmume/src/gtk-glade/callbacks_IO.c index 12aac632a..fbdb1bd9c 100755 --- a/trunk/desmume/src/gtk-glade/callbacks_IO.c +++ b/trunk/desmume/src/gtk-glade/callbacks_IO.c @@ -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; ikeyval == 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