VLC_CONFIG_LIST,
/* possible values list
* (args=size_t, const <type> *, const char *const *) */
+
+ VLC_CONFIG_ADD_ACTION,
+ /* add value change callback (args=vlc_callback_t, const char *) */
};
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)
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, \
#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: \
{
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;
}
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);