X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=libchimara%2Fchimara-glk.c;h=19925569823b16569e2246a0f457a74f974348cb;hb=f7db20369cdd1b699742a2037ca3ab99afe47ab2;hp=86522e53ace85d1019a0ade6c41d806ea4bc685e;hpb=2dea59cff08d5cd7654fbf470db7f4512608dc58;p=projects%2Fchimara%2Fchimara.git
diff --git a/libchimara/chimara-glk.c b/libchimara/chimara-glk.c
index 86522e5..1992556 100644
--- a/libchimara/chimara-glk.c
+++ b/libchimara/chimara-glk.c
@@ -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);
@@ -1450,6 +1453,9 @@ chimara_glk_is_line_input_pending(ChimaraGlk *glk)
* hyperlink
* pager
*
+ *
+ * Returns: (transfer none): The #GtkTextTag corresponding to @name in the
+ * styles of @window.
*/
GtkTextTag *
chimara_glk_get_tag(ChimaraGlk *glk, ChimaraGlkWindowType window, const gchar *name)
@@ -1472,25 +1478,21 @@ 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().
+ *
+ * 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)
+chimara_glk_get_tag_names(ChimaraGlk *glk, unsigned int *num_tags)
{
- return style_get_tag_names();
-}
+ g_return_val_if_fail(num_tags != NULL, NULL);
-/**
- * chimara_glk_get_num_tag_names:
- * @glk: a #ChimaraGlk widget
- *
- * Retrieves the number of style tags returned by chimara_glk_get_tag_names().
- */
-gint
-chimara_glk_get_num_tag_names(ChimaraGlk *glk)
-{
- return CHIMARA_NUM_STYLES;
+ *num_tags = CHIMARA_NUM_STYLES;
+ return style_get_tag_names();
}
/**
@@ -1520,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
@@ -1532,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;
}