Beginning work on graphic windows. Hopelessly broken still....
[rodin/chimara.git] / libchimara / input.c
index a2e0e4a8bd49d88d0f017a1efda711c4569b4b0a..2730e230a2f4a804b159ab2a9185ec966ac0f023 100644 (file)
@@ -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;
 }