#include "charset.h"
+#include "magic.h"
#include "input.h"
/**
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);
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);
}
/* 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) );
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);
}
/* 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) );
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);
case wintype_TextGrid:
text_grid_request_line_event_common(win, maxlen, (initlen > 0), inserttext);
break;
- default:
- g_assert_not_reached();
}
g_free(inserttext);
}
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);
case wintype_TextGrid:
text_grid_request_line_event_common(win, maxlen, (initlen > 0), utf8);
break;
- default:
- g_assert_not_reached();
}
g_free(utf8);
}
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;
}