X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=src%2Finput.c;h=c5134192dfeb974489fc034e96be9ecea9aaf264;hb=24aef54d7203143092c9a7c91096c54494590851;hp=8956c2c53438dad52dd3446d88acd3012c54a1f3;hpb=8bf874cd9d56a5850bc474df37642170a4c20b28;p=rodin%2Fchimara.git diff --git a/src/input.c b/src/input.c index 8956c2c..c513419 100644 --- a/src/input.c +++ b/src/input.c @@ -1,7 +1,9 @@ #include "charset.h" +#include "magic.h" #include "input.h" -/** glk_request_char_event: +/** + * glk_request_char_event: * @win: A window to request char events from. * * Request input of a Latin-1 character or special key. A window cannot have @@ -13,7 +15,7 @@ void glk_request_char_event(winid_t win) { - g_return_if_fail(win); + 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); @@ -21,7 +23,8 @@ glk_request_char_event(winid_t win) g_signal_handler_unblock( G_OBJECT(win->widget), win->keypress_handler ); } -/** glk_request_char_event_uni: +/** + * glk_request_char_event_uni: * @win: A window to request char events from. * * Request input of a Unicode character or special key. See @@ -30,7 +33,7 @@ glk_request_char_event(winid_t win) void glk_request_char_event_uni(winid_t win) { - g_return_if_fail(win); + 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); @@ -39,7 +42,7 @@ glk_request_char_event_uni(winid_t win) } /* Internal function: Request either latin-1 or unicode line input, in a text grid window. */ -void +static void text_grid_request_line_event_common(winid_t win, glui32 maxlen, gboolean insert, gchar *inserttext) { GtkTextBuffer *buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(win->widget) ); @@ -57,6 +60,17 @@ text_grid_request_line_event_common(winid_t win, glui32 maxlen, gboolean insert, end_iter = start_iter; gtk_text_iter_set_line_offset(&end_iter, cursorpos + win->input_length); + /* If the buffer currently has a selection with one bound in the middle of + the input field, then deselect it. Otherwise the input field gets trashed */ + GtkTextIter start_sel, end_sel; + if( gtk_text_buffer_get_selection_bounds(buffer, &start_sel, &end_sel) ) + { + if( gtk_text_iter_in_range(&start_sel, &start_iter, &end_iter) ) + gtk_text_buffer_place_cursor(buffer, &end_sel); + if( gtk_text_iter_in_range(&end_sel, &start_iter, &end_iter) ) + gtk_text_buffer_place_cursor(buffer, &start_sel); + } + /* Erase the text currently in the input field and replace it with a GtkEntry */ gtk_text_buffer_delete(buffer, &start_iter, &end_iter); win->input_anchor = gtk_text_buffer_create_child_anchor(buffer, &start_iter); @@ -89,7 +103,7 @@ text_grid_request_line_event_common(winid_t win, glui32 maxlen, gboolean insert, } /* Internal function: Request either latin-1 or unicode line input, in a text buffer window. */ -void +static void text_buffer_request_line_event_common(winid_t win, glui32 maxlen, gboolean insert, gchar *inserttext) { GtkTextBuffer *buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(win->widget) ); @@ -146,7 +160,7 @@ text_buffer_request_line_event_common(winid_t win, glui32 maxlen, gboolean inser void glk_request_line_event(winid_t win, char* buf, glui32 maxlen, glui32 initlen) { - g_return_if_fail(win); + VALID_WINDOW(win, return); g_return_if_fail(buf); g_return_if_fail(win->input_request_type == INPUT_REQUEST_NONE); g_return_if_fail(win->type != wintype_TextBuffer || win->type != wintype_TextGrid); @@ -165,8 +179,6 @@ glk_request_line_event(winid_t win, char* buf, glui32 maxlen, glui32 initlen) case wintype_TextGrid: text_grid_request_line_event_common(win, maxlen, (initlen > 0), inserttext); break; - default: - g_assert_not_reached(); } g_free(inserttext); } @@ -192,7 +204,7 @@ glk_request_line_event(winid_t win, char* buf, glui32 maxlen, glui32 initlen) void glk_request_line_event_uni(winid_t win, glui32 *buf, glui32 maxlen, glui32 initlen) { - g_return_if_fail(win); + VALID_WINDOW(win, return); g_return_if_fail(buf); g_return_if_fail(win->input_request_type == INPUT_REQUEST_NONE); g_return_if_fail(win->type != wintype_TextBuffer || win->type != wintype_TextGrid); @@ -219,8 +231,6 @@ glk_request_line_event_uni(winid_t win, glui32 *buf, glui32 maxlen, glui32 initl case wintype_TextGrid: text_grid_request_line_event_common(win, maxlen, (initlen > 0), utf8); break; - default: - g_assert_not_reached(); } g_free(utf8); } @@ -362,7 +372,7 @@ end_line_input_request(winid_t win, const gchar *inserted_text) event_throw(evtype_LineInput, win, copycount, 0); } else - g_warning("%s: Wrong input request type.", __func__); + WARNING("Wrong input request type"); win->input_request_type = INPUT_REQUEST_NONE; } @@ -431,3 +441,4 @@ on_input_entry_activate(GtkEntry *input_entry, winid_t win) end_line_input_request(win, text); g_free(text); } +