X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=libchimara%2Finput.c;h=2730e230a2f4a804b159ab2a9185ec966ac0f023;hb=65f88142d8843d16c203efad8830fbebba888f0f;hp=a2e0e4a8bd49d88d0f017a1efda711c4569b4b0a;hpb=603af762db13e7b95a7c0931e7178ce44ff8ee21;p=rodin%2Fchimara.git diff --git a/libchimara/input.c b/libchimara/input.c index a2e0e4a..2730e23 100644 --- a/libchimara/input.c +++ b/libchimara/input.c @@ -368,6 +368,7 @@ glk_cancel_line_event(winid_t win, event_t *event) int chars_written = 0; + gdk_threads_enter(); if(win->type == wintype_TextGrid) { chars_written = finish_text_grid_line_input(win, FALSE); } else if(win->type == wintype_TextBuffer) { @@ -376,6 +377,7 @@ glk_cancel_line_event(winid_t win, event_t *event) g_signal_handler_block(window_buffer, win->insert_text_handler); chars_written = finish_text_buffer_line_input(win, FALSE); } + gdk_threads_leave(); ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key); if(glk_data->unregister_arr) @@ -392,6 +394,35 @@ glk_cancel_line_event(winid_t win, event_t *event) } } +/* Helper function: Turn off shutdown key-press-event signal handler */ +static gboolean +turn_off_handler(GNode *node) +{ + winid_t win = node->data; + g_signal_handler_block(win->widget, win->shutdown_keypress_handler); + return FALSE; /* don't stop */ +} + +/* Internal function: Callback for signal key-press-event while waiting for shutdown. */ +gboolean +on_shutdown_key_press_event(GtkWidget *widget, GdkEventKey *event, winid_t win) +{ + ChimaraGlk *glk = CHIMARA_GLK(gtk_widget_get_ancestor(widget, CHIMARA_TYPE_GLK)); + g_assert(glk); + CHIMARA_GLK_USE_PRIVATE(glk, priv); + + /* Turn off all the signal handlers */ + if(priv->root_window) + g_node_traverse(priv->root_window, G_IN_ORDER, G_TRAVERSE_LEAVES, -1, (GNodeTraverseFunc)turn_off_handler, NULL); + + /* Signal the Glk library that it can shut everything down now */ + g_mutex_lock(priv->shutdown_lock); + g_cond_signal(priv->shutdown_key_pressed); + g_mutex_unlock(priv->shutdown_lock); + + return TRUE; /* block the event */ +} + /* Internal function: General callback for signal key-press-event on a text buffer or text grid window. Used in character input on both text buffers and grids. Blocked when not in use. */ gboolean on_char_input_key_press_event(GtkWidget *widget, GdkEventKey *event, winid_t win) @@ -405,7 +436,7 @@ on_char_input_key_press_event(GtkWidget *widget, GdkEventKey *event, winid_t win /* Only one keypress will be handled */ win->input_request_type = INPUT_REQUEST_NONE; - g_signal_handler_block( win->widget, win->char_input_keypress_handler ); + g_signal_handler_block(win->widget, win->char_input_keypress_handler); return TRUE; }