priv->self = self;
priv->interactive = TRUE;
- priv->protect = FALSE;
priv->styles = g_new0(StyleSet,1);
priv->glk_styles = g_new0(StyleSet,1);
priv->final_message = g_strdup("[ The game has finished ]");
- priv->running = FALSE;
- priv->program = NULL;
- priv->thread = NULL;
priv->event_queue = g_queue_new();
priv->event_lock = g_mutex_new();
priv->event_queue_not_empty = g_cond_new();
priv->event_queue_not_full = g_cond_new();
priv->abort_lock = g_mutex_new();
- priv->abort_signalled = FALSE;
priv->shutdown_lock = g_mutex_new();
priv->shutdown_key_pressed = g_cond_new();
priv->arrange_lock = g_mutex_new();
priv->rearranged = g_cond_new();
- priv->needs_rearrange = FALSE;
- priv->ignore_next_arrange_event = FALSE;
priv->char_input_queue = g_async_queue_new();
priv->line_input_queue = g_async_queue_new();
/* FIXME 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;
- priv->story_name = NULL;
- priv->interrupt_handler = NULL;
- priv->root_window = NULL;
- priv->fileref_list = NULL;
- priv->current_stream = NULL;
- priv->stream_list = NULL;
- priv->timer_id = 0;
- priv->in_startup = FALSE;
- priv->current_dir = NULL;
style_init(self);
}
while(i < startup->args.argc)
g_free(startup->args.argv[i++]);
g_free(startup->args.argv);
+ g_free(startup);
}
-/* glk_enter() is the actual function called in the new thread in which glk_main() runs. */
+/* glk_enter() is the actual function called in the new thread in which
+glk_main() runs. Takes ownership of @startup and will free it. */
static gpointer
glk_enter(struct StartupData *startup)
{
extern GPrivate *glk_data_key;
g_private_set(glk_data_key, startup->glk_data);
-
+
/* Acquire the Glk thread's references to the input queues */
g_async_queue_ref(startup->glk_data->char_input_queue);
g_async_queue_ref(startup->glk_data->line_input_queue);
-
+
/* Run startup function */
if(startup->glkunix_startup_code) {
startup->glk_data->in_startup = TRUE;
return NULL;
}
}
-
+
/* Run main function */
glk_main_t glk_main = startup->glk_main;
-
+
/* COMPAT: avoid usage of slices */
- g_free(startup);
- g_signal_emit_by_name(startup->glk_data->self, "started");
+ g_signal_emit_by_name(startup->glk_data->self, "started");
glk_main();
free_startup_data(startup);
glk_exit(); /* Run shutdown code in glk_exit() even if glk_main() returns normally */
g_assert_not_reached(); /* because glk_exit() calls g_thread_exit() */
- return NULL;
+ return NULL;
}
/**