+ /* Empty the event queue */
+ g_mutex_lock(glk_data->event_lock);
+ g_queue_foreach(glk_data->event_queue, (GFunc)g_free, NULL);
+
+ /* COMPAT: g_queue_clear could be used here, but only appeared in 2.14 */
+ // g_queue_clear(glk_data->event_queue);
+ g_list_free(glk_data->event_queue->head);
+ glk_data->event_queue->head = glk_data->event_queue->tail = NULL;
+ glk_data->event_queue->length = 0;
+
+ g_mutex_unlock(glk_data->event_lock);
+
+ /* Reset the abort signaling mechanism */
+ g_mutex_lock(glk_data->abort_lock);
+ glk_data->abort_signalled = FALSE;
+ g_mutex_unlock(glk_data->abort_lock);
+
+ /* Reset arrangement mechanism */
+ g_mutex_lock(glk_data->arrange_lock);
+ glk_data->needs_rearrange = FALSE;
+ glk_data->ignore_next_arrange_event = FALSE;
+ g_mutex_unlock(glk_data->arrange_lock);
+
+ /* Unref input queues (they are not destroyed because the main thread stil holds a ref */
+ g_async_queue_unref(glk_data->char_input_queue);
+ g_async_queue_unref(glk_data->line_input_queue);
+
+ /* Reset other stuff */
+ glk_data->interrupt_handler = NULL;
+ g_free(glk_data->current_dir);
+ glk_data->current_dir = NULL;
+ /* Remove the dispatch callbacks */
+ glk_data->register_obj = NULL;
+ glk_data->unregister_obj = NULL;
+ glk_data->register_arr = NULL;
+ glk_data->unregister_arr = NULL;