* contributor may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
- * main.c IS PROVIDED BY Philip en Marijn ``AS IS'' AND ANY EXPRESS
+ * plugin-loader.c IS PROVIDED BY Philip en Marijn ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL Philip en Marijn OR ANY OTHER CONTRIBUTORS
#include <glib/gi18n.h>
#include <gtk/gtk.h>
+#include <config.h>
#include <libchimara/chimara-glk.h>
/* Global pointers to widgets */
gtk_widget_set_size_request(window, 400, 400);
g_signal_connect(window, "delete-event", G_CALLBACK(quit), NULL);
glk = chimara_glk_new();
- g_signal_connect(glk, "stopped", G_CALLBACK(gtk_main_quit), NULL);
+ g_object_ref(glk);
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);
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();
chimara_glk_stop(CHIMARA_GLK(glk));
chimara_glk_wait(CHIMARA_GLK(glk));
+ g_object_unref(glk);
return 0;
}