Make chimara_glk_get_tag_names() a class method
[projects/chimara/chimara.git] / libchimara / chimara-glk.c
index a200b6ba46ad8f8189a71efb8f8ac1032b5ccb28..49ef33fbbe1ff2106bb4eae09c8e4c6b94c523fc 100644 (file)
@@ -302,6 +302,9 @@ chimara_glk_finalize(GObject *object)
        /* Unref input queues (this should destroy them since any Glk thread has stopped by now */
        g_async_queue_unref(priv->char_input_queue);
        g_async_queue_unref(priv->line_input_queue);
+       /* Destroy callback data if ownership retained */
+       if(priv->resource_load_callback_destroy_data)
+               priv->resource_load_callback_destroy_data(priv->resource_load_callback_data);
        
        /* Free other stuff */
        g_free(priv->current_dir);
@@ -1474,17 +1477,17 @@ chimara_glk_get_tag(ChimaraGlk *glk, ChimaraGlkWindowType window, const gchar *n
 
 /**
  * chimara_glk_get_tag_names:
- * @glk: a #ChimaraGlk widget
  * @num_tags: Return location for the number of tag names retrieved.
  *
- * Retrieves the possible tag names to use in chimara_glk_get_tag().
+ * Class method. Retrieves the possible tag names to use in
+ * chimara_glk_get_tag().
  *
  * Returns: (transfer none) (array length=num_tags) (element-type utf8):
  * Array of strings containing the tag names. This array is owned by Chimara,
  * do not free it.
  */
 const gchar **
-chimara_glk_get_tag_names(ChimaraGlk *glk, unsigned int *num_tags)
+chimara_glk_get_tag_names(unsigned int *num_tags)
 {
        g_return_val_if_fail(num_tags != NULL, NULL);
 
@@ -1519,6 +1522,7 @@ chimara_glk_update_style(ChimaraGlk *glk)
  * @glk: a #ChimaraGlk widget
  * @func: a function to call for loading resources, or %NULL
  * @user_data: user data to pass to @func, or %NULL
+ * @destroy_user_data: a function to call for freeing @user_data, or %NULL
  *
  * Sometimes it is preferable to load image and sound resources from somewhere
  * else than a Blorb file, for example while developing a game. Section 14 of
@@ -1531,12 +1535,27 @@ chimara_glk_update_style(ChimaraGlk *glk)
  * Note that @func is only called if no Blorb resource map has been set; having
  * a resource map in place overrides this function.
  *
+ * If you pass non-%NULL for @destroy_user_data, then @glk takes ownership of
+ * @user_data. When it is not needed anymore, it will be freed by calling
+ * @destroy_user_data on it. If you wish to retain ownership of @user_data, pass
+ * %NULL for @destroy_user_data.
+ *
  * To deactivate the callback, call this function with @func set to %NULL.
  */
 void
-chimara_glk_set_resource_load_callback(ChimaraGlk *glk, ChimaraResourceLoadFunc func, gpointer user_data)
+chimara_glk_set_resource_load_callback(ChimaraGlk *glk, ChimaraResourceLoadFunc func, gpointer user_data, GDestroyNotify destroy_user_data)
 {
        CHIMARA_GLK_USE_PRIVATE(glk, priv);
+
+       if(priv->resource_load_callback == func
+               && priv->resource_load_callback_data == user_data
+               && priv->resource_load_callback_destroy_data == destroy_user_data)
+               return;
+
+       if(priv->resource_load_callback_destroy_data)
+               priv->resource_load_callback_destroy_data(priv->resource_load_callback_data);
+
        priv->resource_load_callback = func;
        priv->resource_load_callback_data = user_data;
+       priv->resource_load_callback_destroy_data = destroy_user_data;
 }