X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=libchimara%2Fchimara-glk.c;h=b3d414678d20f950c925266d810bf368bb180e1c;hb=476e8909f7b56201452e6c967fc6839a64fa92b0;hp=eba6a23d8944c9fd2732ba72b329ac9fe7b342f9;hpb=b57624149a9c9d937f91f4c7838d9d68f11f7e10;p=projects%2Fchimara%2Fchimara.git diff --git a/libchimara/chimara-glk.c b/libchimara/chimara-glk.c index eba6a23..b3d4146 100644 --- a/libchimara/chimara-glk.c +++ b/libchimara/chimara-glk.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "chimara-glk.h" #include "chimara-glk-private.h" #include "chimara-marshallers.h" @@ -31,7 +32,6 @@ * SECTION:chimara-glk * @short_description: Widget which executes a Glk program * @stability: Unstable - * @include: libchimara/chimara-glk.h * * The #ChimaraGlk widget opens and runs a Glk program. The program must be * compiled as a plugin module, with a function glk_main() @@ -178,9 +178,12 @@ chimara_glk_init(ChimaraGlk *self) priv->char_input_queue = g_async_queue_new(); priv->line_input_queue = g_async_queue_new(); /* Should be g_async_queue_new_full(g_free); but only in GTK >= 2.16 */ + priv->resource_map = NULL; priv->resource_lock = g_mutex_new(); priv->resource_loaded = g_cond_new(); priv->resource_info_available = g_cond_new(); + priv->resource_load_callback = NULL; + priv->resource_load_callback_data = NULL; priv->image_cache = NULL; priv->program_name = NULL; priv->program_info = NULL; @@ -809,7 +812,7 @@ chimara_glk_class_init(ChimaraGlkClass *klass) _chimara_marshal_VOID__UINT_STRING, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_STRING); /** - * ChimaraGlk::iliad-update-screen: + * ChimaraGlk::iliad-screen-update: * @self: The widget that received the signal * @typing: Whether to perform a typing or full screen update * @@ -1059,8 +1062,9 @@ chimara_glk_set_css_from_file(ChimaraGlk *glk, const gchar *filename, GError **e int fd = open(filename, O_RDONLY); if(fd == -1) { - *error = g_error_new(G_IO_ERROR, g_io_error_from_errno(errno), - _("Error opening file \"%s\": %s"), filename, g_strerror(errno)); + if(error) + *error = g_error_new(G_IO_ERROR, g_io_error_from_errno(errno), + _("Error opening file \"%s\": %s"), filename, g_strerror(errno)); return FALSE; } @@ -1070,8 +1074,9 @@ chimara_glk_set_css_from_file(ChimaraGlk *glk, const gchar *filename, GError **e scan_css_file(scanner, glk); if(close(fd) == -1) { - *error = g_error_new(G_IO_ERROR, g_io_error_from_errno(errno), - _("Error closing file \"%s\": %s"), filename, g_strerror(errno)); + if(error) + *error = g_error_new(G_IO_ERROR, g_io_error_from_errno(errno), + _("Error closing file \"%s\": %s"), filename, g_strerror(errno)); return FALSE; } return TRUE; @@ -1411,16 +1416,16 @@ chimara_glk_is_line_input_pending(ChimaraGlk *glk) /** * chimara_glk_get_tag: - * @glk: a #ChimarGlk widget + * @glk: a #ChimaraGlk widget * @window: The type of window to retrieve the tag for * @name: The name of the tag to retrieve * * Use this function to get a #GtkTextTag so style properties can be changed. - * See also #chimara_glk_set_css_from_string. + * See also chimara_glk_set_css_from_string(). * * The layout of the text in Chimara is controlled by two sets of tags: one set * describing the style in text buffers and one for text grids. See also the - * GLK specification for the difference between the two. The main narrative of + * Glk specification for the difference between the two. The main narrative of * a game is usually rendered in text buffers, whereas text grids are mostly * used for status bars and in game menus. * @@ -1439,9 +1444,9 @@ chimara_glk_is_line_input_pending(ChimaraGlk *glk) * user2 * hyperlink * pager - * + * */ -GtkTextTag* +GtkTextTag * chimara_glk_get_tag(ChimaraGlk *glk, ChimaraGlkWindowType window, const gchar *name) { CHIMARA_GLK_USE_PRIVATE(glk, priv); @@ -1460,12 +1465,12 @@ chimara_glk_get_tag(ChimaraGlk *glk, ChimaraGlkWindowType window, const gchar *n } /** - * chimara_glk_get_tag: - * @glk: a #ChimarGlk widget + * chimara_glk_get_tag_names: + * @glk: a #ChimaraGlk widget * - * Retrieves the possible tag names to use in #chimara_glk_get_tag. + * Retrieves the possible tag names to use in chimara_glk_get_tag(). */ -const gchar** +const gchar ** chimara_glk_get_tag_names(ChimaraGlk *glk) { return style_get_tag_names(); @@ -1475,7 +1480,7 @@ chimara_glk_get_tag_names(ChimaraGlk *glk) * chimara_glk_get_num_tag_names: * @glk: a #ChimaraGlk widget * - * Retrieves the number of style tags returned by #chimara_glk_get_tag_names. + * Retrieves the number of style tags returned by chimara_glk_get_tag_names(). */ gint chimara_glk_get_num_tag_names(ChimaraGlk *glk) @@ -1489,7 +1494,7 @@ chimara_glk_get_num_tag_names(ChimaraGlk *glk) * * Processes style updates and updates the widget to reflect the new style. * Call this every time you change a property of a #GtkTextTag retrieved by - * #chimara_glk_get_tag. + * chimara_glk_get_tag(). */ void chimara_glk_update_style(ChimaraGlk *glk) @@ -1504,3 +1509,30 @@ chimara_glk_update_style(ChimaraGlk *glk) g_mutex_unlock(priv->arrange_lock); gtk_widget_queue_resize( GTK_WIDGET(priv->self) ); } + +/** + * chimara_glk_set_resource_load_callback: + * @glk: a #ChimaraGlk widget + * @func: a function to call for loading resources, or %NULL + * @user_data: user data to pass to @func, 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 + * the Blorb + * specification allows for this possibility. This function sets @func + * to be called when the Glk program requests loading an image or sound without + * a Blorb resource map having been loaded, optionally passing @user_data as an + * extra parameter. + * + * Note that @func is only called if no Blorb resource map has been set; having + * a resource map in place overrides this function. + * + * 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_USE_PRIVATE(glk, priv); + priv->resource_load_callback = func; + priv->resource_load_callback_data = user_data; +}