]> git.sesse.net Git - vlc/commitdiff
Add action through vlc_config_set
authorRémi Denis-Courmont <rem@videolan.org>
Mon, 17 Dec 2007 19:01:13 +0000 (19:01 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Mon, 17 Dec 2007 19:01:13 +0000 (19:01 +0000)
include/vlc_configuration.h
include/vlc_modules_macros.h
src/config/core.c
src/modules/entry.c

index dd7823f5ec6aabba28fb5ea8b94157f38198818e..79982517e514ab765cd0a9b7359e91e6c8b1ac6e 100644 (file)
@@ -275,6 +275,9 @@ enum vlc_config_properties
     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 *) */
 };
 
 
@@ -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)
index 6ac7b244b4610d126d45afb7f68e37b23c24212a..d7011deb0d60f5507923c1d1c9c98af3af492bec 100644 (file)
@@ -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:                                                                    \
index b8364e20f2500204f71cf04b70c05e8815c52c42..d5e21b6f7a47fdd08875501151d11a63cad29aa4 100644 (file)
@@ -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;
 }
index 62bb2ecb51ae43431d1b7ecd5806998d0061cc31..bb0da23f90d3fee543cfc762230718d88e50d89e 100644 (file)
@@ -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);