X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=libchimara%2Fglk.c;h=58b9c00e73cf11cd73ef8606a714607948d1409f;hb=4b0bbd6bb235b4cad89d321cdd7f570610a97712;hp=4304aefae2aa0c80500df836f136f3817d65a693;hpb=5bec9bc0e9bea45cd553116e5d7fd125564d8dbe;p=rodin%2Fchimara.git diff --git a/libchimara/glk.c b/libchimara/glk.c index 4304aef..58b9c00 100644 --- a/libchimara/glk.c +++ b/libchimara/glk.c @@ -5,6 +5,7 @@ #include "chimara-glk.h" #include "chimara-glk-private.h" #include "gi_blorb.h" +#include "window.h" G_GNUC_INTERNAL GPrivate *glk_data_key = NULL; @@ -42,7 +43,50 @@ G_GNUC_INTERNAL GPrivate *glk_data_key = NULL; void glk_exit(void) { - shutdown_glk(); + ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key); + + shutdown_glk_pre(); + + /* Find the biggest text buffer window */ + winid_t win, largewin = NULL; + glui32 largearea = 0; + for(win = glk_window_iterate(NULL, NULL); win; win = glk_window_iterate(win, NULL)) { + if(win->type == wintype_TextBuffer) { + glui32 w, h; + if(!largewin) { + largewin = win; + glk_window_get_size(largewin, &w, &h); + largearea = w * h; + } else { + glk_window_get_size(win, &w, &h); + if(w * h > largearea) { + largewin = win; + largearea = w * h; + } + } + } + } + if(largewin) { + glk_set_window(largewin); + glk_set_style(style_Alert); + glk_put_string("\n"); + glk_put_string(glk_data->final_message); + glk_put_string("\n"); + flush_window_buffer(largewin); + } + + g_mutex_lock(glk_data->shutdown_lock); + for(win = glk_window_iterate(NULL, NULL); win; win = glk_window_iterate(win, NULL)) { + if(win->type == wintype_TextGrid || win->type == wintype_TextBuffer) + g_signal_handler_unblock(win->widget, win->shutdown_keypress_handler); + } + g_cond_wait(glk_data->shutdown_key_pressed, glk_data->shutdown_lock); + g_mutex_unlock(glk_data->shutdown_lock); + + shutdown_glk_post(); + + g_signal_emit_by_name(glk_data->self, "stopped"); + g_thread_exit(NULL); }