# HG changeset patch # User nkeynes # Date 1192943756 0 # Node ID 50622730f226d446faae7f6ca07ef3c668305d9b # Parent 207461e79f21a4d299c2a9c6440bfcec5e47b34e Unregister keys on controller detach --- a/src/display.c Wed Oct 17 11:26:45 2007 +0000 +++ b/src/display.c Sun Oct 21 05:15:56 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: display.c,v 1.10 2007-10-09 08:12:29 nkeynes Exp $ + * $Id: display.c,v 1.11 2007-10-21 05:15:56 nkeynes Exp $ * * Generic support for keyboard and other input sources. The active display * driver is expected to deliver events here, where they're translated and @@ -38,9 +38,9 @@ { GL_UNSIGNED_SHORT_1_5_5_5_REV, GL_BGRA, GL_RGB5_A1, 2 }, { GL_UNSIGNED_SHORT_5_6_5, GL_RGB, GL_RGB5, 2 }, { GL_UNSIGNED_SHORT_4_4_4_4_REV, GL_BGRA, GL_RGBA4, 2 }, - { GL_UNSIGNED_INT_8_8_8_8_REV, GL_BGRA, GL_RGBA8, 4 }, /* YUV decoded to ARGB8888 */ + { GL_UNSIGNED_BYTE, GL_BGRA, GL_RGBA8, 4 }, /* YUV decoded to ARGB8888 */ { GL_UNSIGNED_BYTE, GL_BGR, GL_RGB, 3 }, - { GL_UNSIGNED_INT_8_8_8_8_REV, GL_BGRA, GL_RGBA8, 4 }, + { GL_UNSIGNED_BYTE, GL_BGRA, GL_RGBA8, 4 }, }; @@ -62,10 +62,11 @@ return key; } -static void input_delete_key( uint16_t keycode ) +static void input_delete_key( uint16_t keycode, input_key_callback_t callback, void *data, + uint32_t value ) { struct keymap_entry *key = keymap[keycode]; - if( key != NULL ) { + if( key != NULL && key->callback == callback && key->data == data && key->value == value ) { free( key ); keymap[keycode] = NULL; } @@ -98,14 +99,15 @@ return TRUE; } -void input_unregister_key( const gchar *keysym ) +void input_unregister_key( const gchar *keysym, input_key_callback_t callback, + void *data, uint32_t value ) { if( display_driver == NULL || keysym == NULL ) return; uint16_t keycode = display_driver->resolve_keysym(keysym); if( keycode == 0 ) return; - input_delete_key( keycode ); + input_delete_key( keycode, callback, data, value ); } --- a/src/display.h Wed Oct 17 11:26:45 2007 +0000 +++ b/src/display.h Sun Oct 21 05:15:56 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: display.h,v 1.9 2007-10-08 11:49:35 nkeynes Exp $ + * $Id: display.h,v 1.10 2007-10-21 05:15:56 nkeynes Exp $ * * The PC side of the video support (responsible for actually displaying / * rendering frames) @@ -165,7 +165,8 @@ gboolean input_register_key( const gchar *keysym, input_key_callback_t callback, void *data, uint32_t value ); -void input_unregister_key( const gchar *keysym ); +void input_unregister_key( const gchar *keysym, input_key_callback_t callback, + void *data, uint32_t value ); gboolean input_is_key_valid( const gchar *keysym ); --- a/src/maple/controller.c Wed Oct 17 11:26:45 2007 +0000 +++ b/src/maple/controller.c Sun Oct 21 05:15:56 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: controller.c,v 1.7 2007-10-17 11:26:45 nkeynes Exp $ + * $Id: controller.c,v 1.8 2007-10-21 05:15:56 nkeynes Exp $ * * Implements the standard dreamcast controller * @@ -154,8 +154,24 @@ input_register_key( dev->config[14].value, controller_key_callback, dev, BUTTON_START ); } -void controller_detach( maple_device_t dev ) +void controller_detach( maple_device_t mdev ) { + controller_device_t dev = (controller_device_t)mdev; + input_unregister_key( dev->config[0].value, controller_key_callback, dev, BUTTON_DPAD_LEFT ); + input_unregister_key( dev->config[1].value, controller_key_callback, dev, BUTTON_DPAD_RIGHT ); + input_unregister_key( dev->config[2].value, controller_key_callback, dev, BUTTON_DPAD_UP ); + input_unregister_key( dev->config[3].value, controller_key_callback, dev, BUTTON_DPAD_DOWN ); + input_unregister_key( dev->config[4].value, controller_key_callback, dev, JOY_LEFT ); + input_unregister_key( dev->config[5].value, controller_key_callback, dev, JOY_RIGHT ); + input_unregister_key( dev->config[6].value, controller_key_callback, dev, JOY_UP ); + input_unregister_key( dev->config[7].value, controller_key_callback, dev, JOY_DOWN ); + input_unregister_key( dev->config[8].value, controller_key_callback, dev, BUTTON_X ); + input_unregister_key( dev->config[9].value, controller_key_callback, dev, BUTTON_Y ); + input_unregister_key( dev->config[10].value, controller_key_callback, dev, BUTTON_A ); + input_unregister_key( dev->config[11].value, controller_key_callback, dev, BUTTON_B ); + input_unregister_key( dev->config[12].value, controller_key_callback, dev, BUTTON_LEFT_TRIGGER ); + input_unregister_key( dev->config[13].value, controller_key_callback, dev, BUTTON_RIGHT_TRIGGER ); + input_unregister_key( dev->config[14].value, controller_key_callback, dev, BUTTON_START ); }