From 2bca4f1c7e98f40ff31e9b0474ec2a2b60d59379 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Mon, 17 Dec 2007 19:01:13 +0000 Subject: [PATCH] Add action through vlc_config_set --- include/vlc_configuration.h | 20 ++++++-------------- include/vlc_modules_macros.h | 11 +---------- src/config/core.c | 21 --------------------- src/modules/entry.c | 30 ++++++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 45 deletions(-) diff --git a/include/vlc_configuration.h b/include/vlc_configuration.h index dd7823f5ec..79982517e5 100644 --- a/include/vlc_configuration.h +++ b/include/vlc_configuration.h @@ -275,6 +275,9 @@ enum vlc_config_properties VLC_CONFIG_LIST, /* possible values list * (args=size_t, const *, const char *const *) */ + + VLC_CONFIG_ADD_ACTION, + /* add value change callback (args=vlc_callback_t, const char *) */ }; @@ -465,20 +468,9 @@ VLC_EXPORT( int, vlc_config_set, (module_config_t *, int, ...) ); vlc_config_set (p_config + i_config, VLC_CONFIG_RANGE, \ (double)(minv), (double)(maxv)) -#define change_action_add( pf_action, action_text ) \ - if( !p_config[i_config].i_action ) \ - { p_config[i_config].ppsz_action_text = 0; \ - p_config[i_config].ppf_action = 0; } \ - p_config[i_config].ppf_action = (vlc_callback_t *) \ - realloc( p_config[i_config].ppf_action, \ - (p_config[i_config].i_action + 1) * sizeof(void *) ); \ - p_config[i_config].ppsz_action_text = (char **)\ - realloc( p_config[i_config].ppsz_action_text, \ - (p_config[i_config].i_action + 1) * sizeof(void *) ); \ - p_config[i_config].ppf_action[p_config[i_config].i_action] = pf_action; \ - p_config[i_config].ppsz_action_text[p_config[i_config].i_action] = \ - action_text; \ - p_config[i_config].i_action++; +#define change_action_add( pf_action, text ) \ + vlc_config_set (p_config + i_config, VLC_CONFIG_ADD_ACTION, \ + (vlc_callback_t)(pf_action), (const char *)(text)) #define change_internal() \ vlc_config_set (p_config + i_config, VLC_CONFIG_PRIVATE) diff --git a/include/vlc_modules_macros.h b/include/vlc_modules_macros.h index 6ac7b244b4..d7011deb0d 100644 --- a/include/vlc_modules_macros.h +++ b/include/vlc_modules_macros.h @@ -110,7 +110,7 @@ E_(vlc_entry) ( module_t *p_module ); EXTERN_SYMBOL DLL_SYMBOL int CDECL_SYMBOL \ __VLC_SYMBOL(vlc_entry) ( module_t *p_module ) \ { \ - int i_shortcut = 1, res; \ + int res; \ size_t i_config = (size_t)(-1); \ module_config_t *p_config = NULL; \ if (vlc_module_set (p_module, VLC_MODULE_NAME, \ @@ -122,18 +122,9 @@ E_(vlc_entry) ( module_t *p_module ); #define vlc_module_end( ) \ } \ res = config_Duplicate( p_module, p_config, ++i_config ); \ - for( size_t i = 0; i < i_config; i++ ) \ - { \ - if( p_config[ i ].i_action ) \ - { \ - free( p_config[ i ].ppf_action ); \ - free( p_config[ i ].ppsz_action_text ); \ - } \ - } \ free( p_config ); \ if (res) \ return res; \ - (void)i_shortcut; \ return VLC_SUCCESS; \ \ error: \ diff --git a/src/config/core.c b/src/config/core.c index b8364e20f2..d5e21b6f7a 100644 --- a/src/config/core.c +++ b/src/config/core.c @@ -520,27 +520,6 @@ int config_Duplicate( module_t *p_module, const module_config_t *p_orig, { p_module->p_config[i] = p_orig[i]; p_module->p_config[i].p_lock = &p_module->object_lock; - - /* duplicate the actions list */ - if( p_orig[i].i_action ) - { - int j; - - p_module->p_config[i].ppf_action = - malloc( p_orig[i].i_action * sizeof(void *) ); - p_module->p_config[i].ppsz_action_text = - malloc( p_orig[i].i_action * sizeof(char *) ); - - for( j = 0; j < p_orig[i].i_action; j++ ) - { - p_module->p_config[i].ppf_action[j] = - p_orig[i].ppf_action[j]; - p_module->p_config[i].ppsz_action_text[j] = - strdupnull (p_orig[i].ppsz_action_text[j]); - } - } - - p_module->p_config[i].pf_callback = p_orig[i].pf_callback; } return VLC_SUCCESS; } diff --git a/src/modules/entry.c b/src/modules/entry.c index 62bb2ecb51..bb0da23f90 100644 --- a/src/modules/entry.c +++ b/src/modules/entry.c @@ -355,6 +355,36 @@ int vlc_config_set (module_config_t *restrict item, int id, ...) ret = 0; break; } + + case VLC_CONFIG_ADD_ACTION: + { + vlc_callback_t cb = va_arg (ap, vlc_callback_t), *tabcb; + const char *name = va_arg (ap, const char *); + char **tabtext; + + tabcb = realloc (item->ppf_action, + (item->i_action + 2) * sizeof (cb)); + if (tabcb == NULL) + break; + item->ppf_action = tabcb; + tabcb[item->i_action] = cb; + tabcb[item->i_action + 1] = NULL; + + tabtext = realloc (item->ppsz_action_text, + (item->i_action + 2) * sizeof (name)); + if (tabtext == NULL) + break; + item->ppsz_action_text = tabtext; + + if (name) + tabtext[item->i_action] = strdup (gettext (name)); + else + tabtext[item->i_action] = NULL; + tabtext[item->i_action + 1] = NULL; + + item->i_action++; + ret = 0; + } } va_end (ap); -- 2.39.2