From: Ben J. <ma...@us...> - 2007-05-23 16:36:15
|
Update of /cvsroot/desmume/desmume/src In directory sc8-pr-cvs12.sourceforge.net:/tmp/cvs-serv4545/src Modified Files: ctrlssdl.c ctrlssdl.h Log Message: Split SDL joystick events processing out into a seperate function. Index: ctrlssdl.h =================================================================== RCS file: /cvsroot/desmume/desmume/src/ctrlssdl.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- ctrlssdl.h 23 Feb 2007 19:34:08 -0000 1.11 +++ ctrlssdl.h 23 May 2007 16:35:54 -0000 1.12 @@ -34,8 +34,8 @@ #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 KEYMASK_(k) (1 << (k)) +#define JOY_AXIS_(k) (((k)+1) << 8) #define NB_KEYS 14 #define KEY_NONE 0 @@ -74,22 +74,26 @@ struct mouse_status mouse; -BOOL sdl_quit; - void set_mouse_coord(signed long x,signed long y); #endif // !GTK_UI -void load_default_config(); -BOOL init_joy(); -void uninit_joy(); +void load_default_config( void); +BOOL init_joy( void); +void uninit_joy( void); void set_joy_keys(const 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); -u16 inline lookup_joy_key (u16 keyval); -u16 process_ctrls_events(u16 oldkeypad); +u16 get_keypad( void); +u16 lookup_key (u16 keyval); +u16 lookup_joy_key (u16 keyval); +int +process_ctrls_events( u16 *keypad, + void (*external_videoResizeFn)( u16 width, u16 height), + float nds_screen_size_ratio); + +void +process_joystick_events( u16 *keypad); #endif /* CTRLSSDL_H */ Index: ctrlssdl.c =================================================================== RCS file: /cvsroot/desmume/desmume/src/ctrlssdl.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- ctrlssdl.c 21 Apr 2007 17:34:03 -0000 1.15 +++ ctrlssdl.c 23 May 2007 16:35:54 -0000 1.16 @@ -22,6 +22,8 @@ #include "ctrlssdl.h" +static SDL_Joystick **open_joysticks = NULL; + /* Keypad key names */ const char *key_names[NB_KEYS] = { @@ -68,15 +70,16 @@ }; /* Load default joystick and keyboard configurations */ -void load_default_config() +void load_default_config( void) { 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[]) { +BOOL init_joy( void) { int i; + BOOL joy_init_good = TRUE; set_joy_keys(default_joypad_cfg); @@ -90,17 +93,27 @@ nbr_joy = SDL_NumJoysticks(); printf("Nbr of joysticks: %d\n\n", nbr_joy); - for (i = 0; i < nbr_joy; 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)); + if ( nbr_joy > 0) { + open_joysticks = + calloc( sizeof ( SDL_Joystick *), nbr_joy); + + if ( open_joysticks != NULL) { + for (i = 0; i < nbr_joy; i++) + { + SDL_Joystick * joy = SDL_JoystickOpen(i); + printf("Joystick %d %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)); + } + } + else { + joy_init_good = FALSE; } + } - return TRUE; + return joy_init_good; } /* Set all buttons at once */ @@ -116,17 +129,25 @@ } /* Unload joysticks */ -void uninit_joy() +void uninit_joy( void) { int i; printf("Disabling joystick support.\n"); - for (i = 0; i < SDL_NumJoysticks(); i++) - SDL_JoystickClose(i); + + if ( open_joysticks != NULL) { + for (i = 0; i < SDL_NumJoysticks(); i++) { + SDL_JoystickClose( open_joysticks[i]); + } + + free( open_joysticks); + } + + open_joysticks = NULL; SDL_QuitSubSystem(SDL_INIT_JOYSTICK); } /* Return keypad vector with given key set to 1 */ -u16 inline lookup_joy_key (u16 keyval) { +u16 lookup_joy_key (u16 keyval) { int i; u16 Key = 0; for(i = 0; i < NB_KEYS; i++) @@ -136,7 +157,7 @@ } /* Return keypad vector with given key set to 1 */ -u16 inline lookup_key (u16 keyval) { +u16 lookup_key (u16 keyval) { int i; u16 Key = 0; for(i = 0; i < NB_KEYS; i++) @@ -146,28 +167,16 @@ } /* Empty SDL Events' queue */ -void clear_events() +static void clear_events( void) { 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; @@ -249,7 +258,20 @@ joypad_cfg[index_o] = joypad_cfg[index]; } -#ifndef GTK_UI +static signed long +screen_to_touch_range_x( signed long scr_x, float size_ratio) { + signed long touch_x = (signed long)((float)scr_x * size_ratio); + + return touch_x; +} + +static signed long +screen_to_touch_range_y( signed long scr_y, float size_ratio) { + signed long touch_y = (signed long)((float)scr_y * size_ratio); + + return touch_y; +} + /* Set mouse coordinates */ void set_mouse_coord(signed long x,signed long y) { @@ -258,7 +280,6 @@ mouse.x = x; mouse.y = y; } -#endif // !GTK_UI /* Update NDS keypad */ void update_keypad(u16 keys) @@ -270,7 +291,7 @@ } /* Retrieve current NDS keypad */ -u16 get_keypad() +u16 get_keypad( void) { u16 keypad; keypad = ~((u16 *)MMU.ARM7_REG)[0x130>>1]; @@ -279,100 +300,150 @@ return keypad; } -/* Manage input events */ -u16 process_ctrls_events(u16 keypad) -{ +/* + * The internal joystick events processing function + */ +static int +do_process_joystick_events( u16 *keypad, SDL_Event *event) { + int processed = 1; u16 key; + + switch ( event->type) + { + /* Joystick axis motion + Note: button constants have a 1bit offset. */ + case SDL_JOYAXISMOTION: + key = lookup_joy_key( JOY_AXIS_(event->jaxis.axis) ); + if( key == 0 ) break; /* Not an axis of interest? */ + + /* Axis is back to initial position */ + if( event->jaxis.value == 0 ) + RM_KEY( *keypad, key | get_joy_axis_twin(key) ); + /* Key should have been down but its currently set to up? */ + else if( (event->jaxis.value > 0) && + (key == KEYMASK_( KEY_UP-1 )) ) + key = KEYMASK_( KEY_DOWN-1 ); + /* Key should have been left but its currently set to right? */ + else if( (event->jaxis.value < 0) && + (key == KEYMASK_( KEY_RIGHT-1 )) ) + key = KEYMASK_( KEY_LEFT-1 ); + + /* Remove some sensitivity before checking if different than zero... + Fixes some badly behaving joypads [like one of mine]. */ + if( (event->jaxis.value >> 5) != 0 ) + ADD_KEY( *keypad, key ); + break; + + /* Joystick button pressed */ + /* FIXME: Add support for BOOST */ + case SDL_JOYBUTTONDOWN: + key = lookup_joy_key( event->jbutton.button ); + ADD_KEY( *keypad, key ); + break; + + /* Joystick button released */ + case SDL_JOYBUTTONUP: + key = lookup_joy_key(event->jbutton.button); + RM_KEY( *keypad, key ); + break; + + default: + processed = 0; + break; + } + + return processed; +} + +/* + * Process only the joystick events + */ +void +process_joystick_events( u16 *keypad) { 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)) { - switch (event.type) - { - /* Joystick axis motion - Note: button constants have a 1bit offset. */ - case SDL_JOYAXISMOTION: - key = lookup_joy_key( JOY_AXIS_(event.jaxis.axis) ); - if( key == 0 ) break; /* Not an axis of interest? */ + do_process_joystick_events( keypad, &event); + } +} - /* Axis is back to initial position */ - if( event.jaxis.value == 0 ) - RM_KEY( keypad, key | get_joy_axis_twin(key) ); - /* Key should have been down but its currently set to up? */ - else if( (event.jaxis.value > 0) && - (key == KEYMASK_( KEY_UP-1 )) ) - key = KEYMASK_( KEY_DOWN-1 ); - /* Key should have been left but its currently set to right? */ - else if( (event.jaxis.value < 0) && - (key == KEYMASK_( KEY_RIGHT-1 )) ) - key = KEYMASK_( KEY_LEFT-1 ); - - /* Remove some sensitivity before checking if different than zero... - Fixes some badly behaving joypads [like one of mine]. */ - if( (event.jaxis.value >> 5) != 0 ) - ADD_KEY( keypad, key ); - break; +/* Manage input events */ +int +process_ctrls_events( u16 *keypad, + void (*external_videoResizeFn)( u16 width, u16 height), + float nds_screen_size_ratio) +{ + u16 key; + int cause_quit = 0; + SDL_Event event; - /* Joystick button pressed */ - /* FIXME: Add support for BOOST */ - case SDL_JOYBUTTONDOWN: - key = lookup_joy_key( event.jbutton.button ); - ADD_KEY( keypad, key ); - break; + /* IMPORTANT: Reenable joystick events iif needed. */ + if(SDL_JoystickEventState(SDL_QUERY) == SDL_IGNORE) + SDL_JoystickEventState(SDL_ENABLE); - /* Joystick button released */ - case SDL_JOYBUTTONUP: - key = lookup_joy_key(event.jbutton.button); - RM_KEY( keypad, key ); - break; + /* There's an event waiting to be processed? */ + while (SDL_PollEvent(&event)) + { + if ( !do_process_joystick_events( keypad, &event)) { + switch (event.type) + { + case SDL_VIDEORESIZE: + if ( external_videoResizeFn != NULL) { + external_videoResizeFn( event.resize.w, event.resize.h); + } + break; - /* GTK only needs joystick support. For others, we here provide the - mouse, keyboard and quit events. */ -#ifndef GTK_UI - case SDL_KEYDOWN: - key = lookup_key(event.key.keysym.sym); - ADD_KEY( keypad, key ); - break; + case SDL_KEYDOWN: + key = lookup_key(event.key.keysym.sym); + ADD_KEY( *keypad, key ); + break; - case SDL_KEYUP: - key = lookup_key(event.key.keysym.sym); - RM_KEY( keypad, key ); - break; + case SDL_KEYUP: + key = lookup_key(event.key.keysym.sym); + RM_KEY( *keypad, key ); + break; - case SDL_MOUSEBUTTONDOWN: - if(event.button.button==1) - mouse.down = TRUE; + case SDL_MOUSEBUTTONDOWN: + if(event.button.button==1) + mouse.down = TRUE; - case SDL_MOUSEMOTION: - if(!mouse.down) break; - if(event.button.y>=192) - set_mouse_coord(event.button.x, event.button.y - 192); - break; + case SDL_MOUSEMOTION: + if(!mouse.down) + break; + else { + signed long scaled_x = + screen_to_touch_range_x( event.button.x, + nds_screen_size_ratio); + signed long scaled_y = + screen_to_touch_range_y( event.button.y, + nds_screen_size_ratio); - case SDL_MOUSEBUTTONUP: - if(mouse.down) mouse.click = TRUE; - mouse.down = FALSE; - break; + if( scaled_y >= 192) + set_mouse_coord( scaled_x, scaled_y - 192); + } + break; - case SDL_QUIT: - sdl_quit = TRUE; - break; -#endif // !GTK_UI + case SDL_MOUSEBUTTONUP: + if(mouse.down) mouse.click = TRUE; + mouse.down = FALSE; + break; - default: - break; + case SDL_QUIT: + cause_quit = 1; + break; + + default: + break; + } } } - return keypad; + return cause_quit; } |