X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=src%2Fmain.c;h=1a1867f50357c398f3c6c323bd0fff74698a2937;hb=1d98f490554273292d4ce29e4ea42e843c2f0c20;hp=30a7bdfed65ee3ee4c4cab9663c2ec200ac9ccfd;hpb=6a9f71ee1be9500a421a96014627f569e115ecf1;p=projects%2Fchimara%2Fchimara.git diff --git a/src/main.c b/src/main.c index 30a7bdf..1a1867f 100644 --- a/src/main.c +++ b/src/main.c @@ -36,10 +36,12 @@ #include #include +#include #include #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; }