first.c compilet en draait!
[projects/chimara/chimara.git] / src / main.c
index 30a7bdfed65ee3ee4c4cab9663c2ec200ac9ccfd..1a1867f50357c398f3c6c323bd0fff74698a2937 100644 (file)
 #include <string.h>
 #include <stdio.h>
 
+#include <glib.h>
 #include <gtk/gtk.h>
 
 #include "callbacks.h"
 #include "error.h"
+#include "event.h"
 #include "glk.h"
 
 /*
@@ -69,7 +71,7 @@
 /* The global builder object to be used to request handles to widgets */
 GtkBuilder *builder = NULL;
        
-GtkWidget*
+static GtkWidget*
 create_window(void)
 {
        GtkWidget *window;
@@ -84,12 +86,25 @@ create_window(void)
        return window;
 }
 
+/**
+ * glk_enter:
+ *
+ * Is called to create a new thread in which glk_main() runs.
+ */
+static gpointer
+glk_enter(gpointer data)
+{
+       glk_main();
+       return NULL;
+}
+
 
 int
 main(int argc, char *argv[])
 {
        GError *error = NULL;
        GtkWidget *window;
+       GThread *glk_thread;
 
 #ifdef ENABLE_NLS
        bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
@@ -97,6 +112,11 @@ main(int argc, char *argv[])
        textdomain(GETTEXT_PACKAGE);
 #endif
 
+       if( !g_thread_supported() )
+               g_thread_init(NULL);
+
+       gdk_threads_init();
+
        gtk_set_locale();
        gtk_init(&argc, &argv);
 
@@ -109,9 +129,24 @@ main(int argc, char *argv[])
        window = create_window();
        gtk_widget_show(window);
 
-       glk_main();
+       events_init();
+
+       /* In een aparte thread of proces */
+       if( (glk_thread = g_thread_create(glk_enter, NULL, TRUE, &error)) == NULL ) {
+               error_dialog(NULL, error, "Error while creating glk thread: "); 
+               g_object_unref( G_OBJECT(builder) );
+               return 1;
+       }
+
+       gdk_threads_enter();
+       gtk_main();
+       gdk_threads_leave();
+
+       event_throw(EVENT_TYPE_QUIT, NULL, 0, 0);       
+       g_thread_join(glk_thread);
 
        g_object_unref( G_OBJECT(builder) );
+       events_free();
 
        return 0;
 }