+ GtkTextBuffer *buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(win->widget) );
+
+ if(win->type == wintype_TextGrid)
+ {
+ GtkTextMark *cursor = gtk_text_buffer_get_mark(buffer, "cursor_position");
+ GtkTextIter start_iter, end_iter;
+ gtk_text_buffer_get_iter_at_mark(buffer, &start_iter, cursor);
+
+ /* Determine the maximum length of the line input */
+ gint cursorpos = gtk_text_iter_get_line_offset(&start_iter);
+ gint input_length = MIN(win->width - 1 - cursorpos, win->line_input_buffer_max_len);
+ end_iter = start_iter;
+ gtk_text_iter_set_line_offset(&end_iter, cursorpos + input_length);
+
+ /* Insert pre-entered text if needed */
+ gchar *text;
+ if(!insert)
+ text = g_strnfill(input_length, ' ');
+ else
+ {
+ gchar *blanks = g_strnfill(input_length - g_utf8_strlen(inserttext, -1), ' ');
+ text = g_strconcat(inserttext, blanks, NULL);
+ g_free(blanks);
+ }
+
+ /* Erase the text currently in the input field and replace it with blanks or the insert text, with the editable "input_field" tag */
+ GtkTextIter text_start, text_end;
+ GtkTextTag *uneditable = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(buffer), "uneditable");
+ gtk_text_buffer_delete(buffer, &start_iter, &end_iter);
+ gtk_text_buffer_get_start_iter(buffer, &text_start);
+ gtk_text_buffer_apply_tag(buffer, uneditable, &text_start, &start_iter);
+ gtk_text_buffer_insert_with_tags_by_name(buffer, &start_iter, text, -1, "input_field", NULL);
+ g_free(text);
+ gtk_text_buffer_get_end_iter(buffer, &text_end);
+ gtk_text_buffer_apply_tag(buffer, uneditable, &start_iter, &text_end);
+
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(win->widget), TRUE);
+ g_signal_handler_unblock(GTK_TEXT_VIEW(win->widget), win->insert_text_handler);
+ }
+ else if(win->type == wintype_TextBuffer)
+ {
+ /* Move the input_position mark to the end of the window_buffer */
+ GtkTextMark *input_position = gtk_text_buffer_get_mark(buffer, "input_position");
+ GtkTextIter end_iter;
+ gtk_text_buffer_get_end_iter(buffer, &end_iter);
+ gtk_text_buffer_move_mark(buffer, input_position, &end_iter);
+
+ /* Set the entire contents of the window_buffer as uneditable
+ * (so input can only be entered at the end) */
+ GtkTextIter start_iter;
+ gtk_text_buffer_get_start_iter(buffer, &start_iter);
+ gtk_text_buffer_remove_tag_by_name(buffer, "uneditable", &start_iter, &end_iter);
+ gtk_text_buffer_apply_tag_by_name(buffer, "uneditable", &start_iter, &end_iter);
+
+ /* Insert pre-entered text if needed */
+ if(insert)
+ gtk_text_buffer_insert(buffer, &end_iter, inserttext, -1);
+
+ /* Scroll to input point */
+ gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(win->widget), input_position);
+
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(win->widget), TRUE);
+ g_signal_handler_unblock(buffer, win->insert_text_handler);
+ }
+}