]> granicus.if.org Git - libass/commitdiff
Allow passing user data to callback
authorGrigori Goronzy <greg@blackbox>
Sun, 12 Jul 2009 06:01:23 +0000 (08:01 +0200)
committerGrigori Goronzy <greg@blackbox>
Sun, 12 Jul 2009 06:02:52 +0000 (08:02 +0200)
It is often useful or necessary to pass custom data to a callback.
Add an argument to the callback registering function to pass a void
pointer object to the callback each time it is called.

libass/ass.h
libass/ass_library.c
libass/ass_library.h
libass/ass_utils.c
test/test.c

index e0160d62cc6542bfdb70bf0562db1818fb080200..0a03ec2a0cea1698f6e7336a4c9246a3143f6457 100644 (file)
@@ -71,7 +71,8 @@ void ass_set_style_overrides(ass_library_t *priv, char **list);
 void ass_process_force_style(ass_track_t *track);
 
 void ass_set_message_cb(ass_library_t *priv,
-                        void (*msg_cb)(int, char *, va_list *));
+                        void (*msg_cb)(int, char *, va_list *, void *),
+                        void *data);
 
 /**
  * \brief initialize the renderer
index 2a8f5b25164fb7783e0135b0bd5c8745813dbdd4..9b6da02c4a8ff6e68ad8c1f05f7cc055b8ca6d3d 100644 (file)
@@ -28,7 +28,7 @@
 #include "ass_library.h"
 #include "ass_utils.h"
 
-static void ass_msg_handler(int level, char *fmt, va_list *va)
+static void ass_msg_handler(int level, char *fmt, va_list *va, void *data)
 {
     if (level > MSGL_INFO)
         return;
@@ -132,11 +132,17 @@ void ass_clear_fonts(ass_library_t *priv)
  * Register a message callback function with libass.  Without setting one,
  * a default handler is used which prints everything with MSGL_INFO or
  * higher to the standard output.
+ *
+ * \param msg_cb the callback function
+ * \param data additional data that will be passed to the callback
  */
 void ass_set_message_cb(ass_library_t *priv,
-                        void (*msg_cb)(int, char *, va_list *))
+                        void (*msg_cb)(int, char *, va_list *, void *),
+                        void *data)
 {
-    if (msg_cb)
+    if (msg_cb) {
         priv->msg_callback = msg_cb;
+        priv->msg_callback_data = data;
+    }
 }
 
index a73dd6c0d745f959903436576e79006a2629d044..85b0842db4bf45397a989e3df32a9fc31957f9bc 100644 (file)
@@ -36,7 +36,8 @@ struct ass_library_s {
 
     ass_fontdata_t *fontdata;
     int num_fontdata;
-    void (*msg_callback)(int, char *, va_list *);
+    void (*msg_callback)(int, char *, va_list *, void *);
+    void *msg_callback_data;
 };
 
 #endif                          /* LIBASS_LIBRARY_H */
index 0592d33e65a3baccc5f5f148f4b5d69e5a641885..56ca0ef63d2acfb75c035f6198729245e8af9bcc 100644 (file)
@@ -126,7 +126,7 @@ void ass_msg(ass_library_t *priv, int lvl, char *fmt, ...)
 {
     va_list va;
     va_start(va, fmt);
-    priv->msg_callback(lvl, fmt, &va);
+    priv->msg_callback(lvl, fmt, &va, priv->msg_callback_data);
     va_end(va);
 }
 
index 47b7f292f053f1ce1a78ebf24e88ee07e655ac3b..8c7b6021abdb57d038b7508f118469ad21b948e5 100644 (file)
@@ -12,7 +12,7 @@ typedef struct image_s {
 ass_library_t *ass_library;
 ass_renderer_t *ass_renderer;
 
-void msg_callback(int level, char *fmt, va_list * va)
+void msg_callback(int level, char *fmt, va_list * va, void *data)
 {
     if (level > 6)
         return;
@@ -81,7 +81,7 @@ static void init(int frame_w, int frame_h)
     ass_set_fonts_dir(ass_library, "");
     ass_set_extract_fonts(ass_library, 0);
     ass_set_style_overrides(ass_library, NULL);
-    ass_set_message_cb(ass_library, msg_callback);
+    ass_set_message_cb(ass_library, msg_callback, NULL);
 
     ass_renderer = ass_renderer_init(ass_library);
     if (!ass_renderer) {