X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=src%2Finput.c;h=18a7ecbcb124aae33295ebde4ca27314bc8e0f44;hb=91214934fbcdfd363202a65c142194506604ff7b;hp=418e5ea1f6b2e82b6a662e40887054c146a3d345;hpb=dfd494cd3432737d846338bc5539234b7d298cf5;p=projects%2Fchimara%2Fchimara.git diff --git a/src/input.c b/src/input.c index 418e5ea..18a7ecb 100644 --- a/src/input.c +++ b/src/input.c @@ -2,6 +2,10 @@ #include "magic.h" #include "input.h" +/* Forward declarations */ +static int flush_text_buffer(winid_t win); +static int flush_text_grid(winid_t win); + /** * glk_request_char_event: * @win: A window to request char events from. @@ -276,15 +280,18 @@ glk_request_line_event_uni(winid_t win, glui32 *buf, glui32 maxlen, glui32 initl void glk_cancel_line_event(winid_t win, event_t *event) { - /* TODO: write me */ VALID_WINDOW(win, return); - g_return_if_fail(win->input_request_type != INPUT_REQUEST_NONE); g_return_if_fail(win->type != wintype_TextBuffer || win->type != wintype_TextGrid); - event->type = evtype_None; - event->win = win; - event->val1 = 0; - event->val2 = 0; + if(event != NULL) { + event->type = evtype_None; + event->win = win; + event->val1 = 0; + event->val2 = 0; + } + + if(win->input_request_type == INPUT_REQUEST_NONE) + return; g_signal_handler_block( G_OBJECT(win->widget), win->keypress_handler ); @@ -299,7 +306,7 @@ glk_cancel_line_event(winid_t win, event_t *event) chars_written = flush_text_buffer(win); } - if(chars_written > 0) { + if(event != NULL && chars_written > 0) { event->type = evtype_LineInput; event->val1 = chars_written; } @@ -450,15 +457,22 @@ flush_text_buffer(winid_t win) VALID_WINDOW(win, return 0); g_return_val_if_fail(win->type == wintype_TextBuffer, 0); - GtkTextIter start_iter, end_iter; + GtkTextIter start_iter, end_iter, last_character; GtkTextBuffer *window_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(win->widget) ); GtkTextMark *input_position = gtk_text_buffer_get_mark(window_buffer, "input_position"); gtk_text_buffer_get_iter_at_mark(window_buffer, &start_iter, input_position); gtk_text_buffer_get_end_iter(window_buffer, &end_iter); - gtk_text_iter_backward_cursor_position(&end_iter); /* don't include \n */ - + gtk_text_buffer_get_end_iter(window_buffer, &last_character); + gtk_text_iter_backward_cursor_position(&last_character); + + gchar* last_char = gtk_text_buffer_get_text(window_buffer, &last_character, &end_iter, FALSE); + + if( strchr(last_char, '\n') != NULL ) + gtk_text_iter_backward_cursor_position(&end_iter); + gchar* inserted_text = gtk_text_buffer_get_text(window_buffer, &start_iter, &end_iter, FALSE); + int chars_written = write_to_window_buffer(win, inserted_text); g_free(inserted_text);