X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=tests%2Fplugin-loader.c;h=c011d547face4c65fd8621712106a9cae07a7b06;hb=0c5e51127206d26290a8e1e1349ab37d847d1d84;hp=1c560ac93875e5d4ddb054cef2d8a45ac0cf7b32;hpb=f945dd447b55c34d88683ff48d7ffb0b7c3c2ad8;p=projects%2Fchimara%2Fchimara.git diff --git a/tests/plugin-loader.c b/tests/plugin-loader.c index 1c560ac..c011d54 100644 --- a/tests/plugin-loader.c +++ b/tests/plugin-loader.c @@ -40,6 +40,7 @@ #include #include +#include #include /* Global pointers to widgets */ @@ -61,23 +62,64 @@ create_window(void) g_signal_connect(window, "delete-event", G_CALLBACK(quit), NULL); glk = chimara_glk_new(); g_object_ref(glk); - g_signal_connect(glk, "stopped", G_CALLBACK(gtk_main_quit), NULL); gtk_container_add(GTK_CONTAINER(window), glk); } +static gchar * +resource_load(ChimaraResourceType usage, guint32 resnum) +{ + char *resstr; + if(usage == CHIMARA_RESOURCE_IMAGE) + resstr = "PIC"; + else if(usage == CHIMARA_RESOURCE_SOUND) + resstr = "SND"; + else + resstr = "FCK"; + return g_strdup_printf("%s%d", resstr, resnum); +} + +static GFile * +libname_from_la_file(char *la_filename) +{ + GFile *la_file = g_file_new_for_commandline_arg(la_filename); + GFile *parentdir = g_file_get_parent(la_file); + GFile *objdir = g_file_get_child(parentdir, LT_OBJDIR); + g_object_unref(parentdir); + + GFileInputStream *istream = g_file_read(la_file, NULL, NULL); + if(istream == NULL) + return NULL; + GDataInputStream *stream = g_data_input_stream_new( G_INPUT_STREAM(istream) ); + + char *line; + char *dlname = NULL; + while( (line = g_data_input_stream_read_line(stream, NULL, NULL, NULL)) ) { + if( g_str_has_prefix(line, "dlname=") ) { + dlname = g_strdup( line + strlen("dlname='") ); + *(strrchr(dlname, '\'')) = '\0'; + g_free(line); + break; + } + g_free(line); + } + if(dlname == NULL) + return NULL; + + g_input_stream_close(G_INPUT_STREAM (stream), NULL, NULL); + + GFile *libfile = g_file_get_child(objdir, dlname); + g_free(dlname); + + g_object_unref(la_file); + g_object_unref(objdir); + return libfile; +} + int main(int argc, char *argv[]) { GError *error = NULL; -#ifdef ENABLE_NLS - bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); - bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); - textdomain(GETTEXT_PACKAGE); -#endif - - if( !g_thread_supported() ) - g_thread_init(NULL); gdk_threads_init(); gtk_init(&argc, &argv); @@ -86,9 +128,19 @@ main(int argc, char *argv[]) if(argc < 2) g_error("Must provide a plugin\n"); - - if( !chimara_glk_run(CHIMARA_GLK(glk), argv[1], argc - 1, argv + 1, &error) ) + + GFile *plugin_file; + if( g_str_has_suffix(argv[1], ".la") ) + plugin_file = libname_from_la_file(argv[1]); + else + plugin_file = g_file_new_for_commandline_arg(argv[1]); + + chimara_glk_set_resource_load_callback(CHIMARA_GLK(glk), (ChimaraResourceLoadFunc)resource_load, NULL, NULL); + + if( !chimara_glk_run_file(CHIMARA_GLK(glk), plugin_file, + argc - 1, argv + 1, &error) ) g_error("Error starting Glk library: %s\n", error->message); + g_object_unref(plugin_file); gdk_threads_enter(); gtk_main();