X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=libchimara%2Fchimara-glk.c;h=19925569823b16569e2246a0f457a74f974348cb;hb=f7db20369cdd1b699742a2037ca3ab99afe47ab2;hp=7b4a63d0ac2a9ea7a4aca9dd74776d93c7f8eae1;hpb=82e93fc5bfc07db718bd299a3985281d57460ab9;p=projects%2Fchimara%2Fchimara.git diff --git a/libchimara/chimara-glk.c b/libchimara/chimara-glk.c index 7b4a63d..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); @@ -861,7 +864,10 @@ chimara_glk_class_init(ChimaraGlkClass *klass) /** * ChimaraGlk:spacing: * - * The amount of space between the Glk windows. + * The amount of space between the Glk windows. This space forms a visible + * border between windows; however, if you open a window using the + * %winmethod_NoBorder flag, there will be no spacing between it and its + * sibling window, no matter what the value of this property is. */ g_object_class_install_property(object_class, PROP_SPACING, g_param_spec_uint("spacing", _("Spacing"), @@ -1447,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) @@ -1469,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(); } /** @@ -1517,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 @@ -1529,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; }