diff --git a/desmume/src/ctrlssdl.c b/desmume/src/ctrlssdl.c index 826393481..40a180cdd 100644 --- a/desmume/src/ctrlssdl.c +++ b/desmume/src/ctrlssdl.c @@ -25,20 +25,10 @@ /* Keypad key names */ const char *key_names[NB_KEYS] = { - "A", - "B", - "Select", - "Start", - "Right", - "Left", - "Up", - "Down", - "R", - "L", - "X", - "Y", - "Debug", - "Boost" + "A", "B", "Select", "Start", + "Right", "Left", "Up", "Down", + "R", "L", "X", "Y", + "Debug", "Boost" }; /* Default joypad configuration */ @@ -47,10 +37,10 @@ const u16 default_joypad_cfg[NB_KEYS] = 0, // B 5, // select 8, // start - -1, // Right -- Start cheating abit... - -1, // Left - -1, // Up - -1, // Down -- End of cheating. + 256, // Right -- Start cheating abit... + 256, // Left + 512, // Up + 512, // Down -- End of cheating. 7, // R 6, // L 4, // X @@ -61,20 +51,20 @@ const u16 default_joypad_cfg[NB_KEYS] = 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 + 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 */ @@ -154,6 +144,34 @@ u16 inline lookup_key (u16 keyval) { return Key; } +/* Empty SDL Events' queue */ +void clear_events() +{ + SDL_Event event; + /* IMPORTANT: Reenable joystick events iif needed. */ + if(SDL_JoystickEventState(SDL_QUERY) == SDL_IGNORE) + SDL_JoystickEventState(SDL_ENABLE); + +#ifndef GTK_UI + sdl_quit = FALSE; +#endif + + /* There's an event waiting to be processed? */ + while (SDL_PollEvent(&event)) + { +#ifndef GTK_UI + switch (event.type) + { + case SDL_QUIT: + sdl_quit = TRUE; + break; + } +#endif // !GTK_UI + } + + return; +} + /* Get and set a new joystick key */ u16 get_set_joy_key(int index) { BOOL done = FALSE; @@ -175,12 +193,47 @@ u16 get_set_joy_key(int index) { break; } } - SDL_JoystickEventState(SDL_IGNORE); + + if( SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE ) + SDL_JoystickEventState(SDL_IGNORE); joypad_cfg[index] = key; return key; } +/* Get and set a new joystick axis */ +void get_set_joy_axis(int index, int index_o) { + BOOL done = FALSE; + SDL_Event event; + u16 key = joypad_cfg[index]; + + /* Clear events */ + clear_events(); + /* Enable joystick events if needed */ + if( SDL_JoystickEventState(SDL_QUERY) == SDL_IGNORE ) + SDL_JoystickEventState(SDL_ENABLE); + + while(SDL_WaitEvent(&event) && !done) + { + switch(event.type) + { + case SDL_JOYAXISMOTION: + /* Discriminate small movements */ + if( (event.jaxis.value >> 5) != 0 ) + { + key = JOY_AXIS_(event.jaxis.axis); + done = TRUE; + } + break; + } + } + if( SDL_JoystickEventState(SDL_QUERY) == SDL_ENABLE ) + SDL_JoystickEventState(SDL_IGNORE); + /* Update configuration */ + joypad_cfg[index] = key; + joypad_cfg[index_o] = joypad_cfg[index]; +} + #ifndef GTK_UI /* Set mouse coordinates */ void set_mouse_coord(signed long x,signed long y) @@ -215,7 +268,6 @@ u16 get_keypad() u16 process_ctrls_events(u16 keypad) { u16 key; - SDL_Event event; /* IMPORTANT: Reenable joystick events iif needed. */ @@ -234,32 +286,35 @@ u16 process_ctrls_events(u16 keypad) /* Joystick axis motion Note: button constants have a 1bit offset. */ case SDL_JOYAXISMOTION: - /* Horizontal */ - if (event.jaxis.axis == 0) - if( event.jaxis.value == 0 ) - { - key = KEYMASK_( KEY_RIGHT-1 ) | KEYMASK_( KEY_LEFT-1 ); - RM_KEY( keypad, key ); - } - else - { - if( event.jaxis.value > 0 ) key = KEYMASK_( KEY_RIGHT-1 ); - else key = KEYMASK_( KEY_LEFT-1 ); + key = lookup_joy_key( JOY_AXIS_(event.jaxis.axis) ); + if( key != 0 ) + { + if( event.jaxis.value == 0 ) + { + switch(key) + { + case KEYMASK_( KEY_RIGHT-1 ): + key |= KEYMASK_( KEY_LEFT-1 ); + break; + case KEYMASK_( KEY_UP-1 ): + key |= KEYMASK_( KEY_DOWN-1 ); + break; + default: + printf("Unknown joystick state!\n"); + break; + } + RM_KEY( keypad, key ); + } + else if( (event.jaxis.value > 0) && + (key == KEYMASK_( KEY_UP-1 )) ) + key = KEYMASK_( KEY_DOWN-1 ); + else if( (event.jaxis.value < 0) && + (key == KEYMASK_( KEY_RIGHT-1 )) ) + key = KEYMASK_( KEY_LEFT-1 ); + + if( (event.jaxis.value >> 5) != 0 ) ADD_KEY( keypad, key ); - } - /* Vertical */ - else if (event.jaxis.axis == 1) - if( event.jaxis.value == 0 ) - { - key = KEYMASK_( KEY_UP-1 ) | KEYMASK_( KEY_DOWN-1 ); - RM_KEY( keypad, key ); - } - else - { - if( event.jaxis.value > 0 ) key = KEYMASK_( KEY_DOWN-1 ); - else key = KEYMASK_( KEY_UP-1 ); - ADD_KEY( keypad, key ); - } + } break; /* Joystick button pressed */ @@ -312,6 +367,7 @@ u16 process_ctrls_events(u16 keypad) break; } } + return keypad; } diff --git a/desmume/src/ctrlssdl.h b/desmume/src/ctrlssdl.h index f69dcd224..74241d681 100644 --- a/desmume/src/ctrlssdl.h +++ b/desmume/src/ctrlssdl.h @@ -35,6 +35,7 @@ #define ADD_KEY(keypad,key) ( (keypad) |= (key) ) #define RM_KEY(keypad,key) ( (keypad) &= ~(key) ) #define KEYMASK_(k) (1 << k) +#define JOY_AXIS_(k) ((k+1) << 8) #define NB_KEYS 14 #define KEY_NONE 0 @@ -84,6 +85,7 @@ void uninit_joy(); void set_joy_keys(u16 joyCfg[]); void set_kb_keys(u16 kbCfg[]); u16 get_set_joy_key(int index); +void get_set_joy_axis(int index, int index_opp); void update_keypad(u16 keys); u16 get_keypad(); u16 inline lookup_key (u16 keyval); diff --git a/desmume/src/gtk-glade/callbacks_IO.c b/desmume/src/gtk-glade/callbacks_IO.c index fbdb1bd9c..3ea016cca 100755 --- a/desmume/src/gtk-glade/callbacks_IO.c +++ b/desmume/src/gtk-glade/callbacks_IO.c @@ -251,20 +251,8 @@ void init_joy_labels() { int i; char text[50], bname[30]; GtkButton *b; - for (i=0; i<4; i++) { - /* Key not configured */ - if( joypad_cfg[i] == (u16)(-1) ) continue; - - 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; iTrue GTK_RELIEF_NORMAL True - + 4 @@ -1543,7 +1543,7 @@ True GTK_RELIEF_NORMAL True - + 5 @@ -1563,7 +1563,7 @@ True GTK_RELIEF_NORMAL True - + 6 @@ -1583,7 +1583,7 @@ True GTK_RELIEF_NORMAL True - + 5 @@ -1603,7 +1603,7 @@ True GTK_RELIEF_NORMAL True - + 3 @@ -1623,7 +1623,7 @@ True GTK_RELIEF_NORMAL True - + 0 @@ -1643,7 +1643,7 @@ True GTK_RELIEF_NORMAL True - + 5 @@ -1656,14 +1656,14 @@ - + True True Debug : True GTK_RELIEF_NORMAL True - + 2 @@ -1683,7 +1683,7 @@ True GTK_RELIEF_NORMAL True - + 3 @@ -1703,7 +1703,7 @@ True GTK_RELIEF_NORMAL True - + 4 @@ -1716,18 +1716,78 @@ - + True - False True Axis : True GTK_RELIEF_NORMAL True + 1 2 + 2 + 3 + fill + + + + + + + True + True + Axis : + True + GTK_RELIEF_NORMAL + True + + + + 1 + 2 + 4 + 5 + fill + + + + + + + True + True + Axis : + True + GTK_RELIEF_NORMAL + True + + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + True + Axis : + True + GTK_RELIEF_NORMAL + True + + + + 2 + 3 3 4 fill