static VALUE textview_backward_display_line_start(VALUE self, VALUE iter) { return CBOOL2RVAL(gtk_text_view_backward_display_line_start(_SELF(self), RVAL2ITR(iter))); }
/** * gail_text_util_get_text: * @textutil: A #GailTextUtil * @layout: A gpointer which is a PangoLayout, a GtkTreeView of NULL * @function: An enumeration specifying whether to return the text before, at, or * after the offset. * @boundary_type: The boundary type. * @offset: The offset of the text in the GailTextUtil * @start_offset: Address of location in which the start offset is returned * @end_offset: Address of location in which the end offset is returned * * This function gets the requested substring from the text in the GtkTextUtil. * The layout is used only for getting the text on a line. The value is NULL * for a GtkTextView which is not wrapped, is a GtkTextView for a GtkTextView * which is wrapped and is a PangoLayout otherwise. * * Returns: the substring requested **/ gchar* gail_text_util_get_text (GailTextUtil *textutil, gpointer layout, GailOffsetType function, AtkTextBoundary boundary_type, gint offset, gint *start_offset, gint *end_offset) { GtkTextIter start, end; gint line_number; GtkTextBuffer *buffer; g_return_val_if_fail (GAIL_IS_TEXT_UTIL (textutil), NULL); buffer = textutil->buffer; if (buffer == NULL) { *start_offset = 0; *end_offset = 0; return NULL; } if (!gtk_text_buffer_get_char_count (buffer)) { *start_offset = 0; *end_offset = 0; return g_strdup (""); } gtk_text_buffer_get_iter_at_offset (buffer, &start, offset); end = start; switch (function) { case GAIL_BEFORE_OFFSET: switch (boundary_type) { case ATK_TEXT_BOUNDARY_CHAR: gtk_text_iter_backward_char(&start); break; case ATK_TEXT_BOUNDARY_WORD_START: if (!gtk_text_iter_starts_word (&start)) gtk_text_iter_backward_word_start (&start); end = start; gtk_text_iter_backward_word_start(&start); break; case ATK_TEXT_BOUNDARY_WORD_END: if (gtk_text_iter_inside_word (&start) && !gtk_text_iter_starts_word (&start)) gtk_text_iter_backward_word_start (&start); while (!gtk_text_iter_ends_word (&start)) { if (!gtk_text_iter_backward_char (&start)) break; } end = start; gtk_text_iter_backward_word_start(&start); while (!gtk_text_iter_ends_word (&start)) { if (!gtk_text_iter_backward_char (&start)) break; } break; case ATK_TEXT_BOUNDARY_SENTENCE_START: if (!gtk_text_iter_starts_sentence (&start)) gtk_text_iter_backward_sentence_start (&start); end = start; gtk_text_iter_backward_sentence_start (&start); break; case ATK_TEXT_BOUNDARY_SENTENCE_END: if (gtk_text_iter_inside_sentence (&start) && !gtk_text_iter_starts_sentence (&start)) gtk_text_iter_backward_sentence_start (&start); while (!gtk_text_iter_ends_sentence (&start)) { if (!gtk_text_iter_backward_char (&start)) break; } end = start; gtk_text_iter_backward_sentence_start (&start); while (!gtk_text_iter_ends_sentence (&start)) { if (!gtk_text_iter_backward_char (&start)) break; } break; case ATK_TEXT_BOUNDARY_LINE_START: if (layout == NULL) { line_number = gtk_text_iter_get_line (&start); if (line_number == 0) { gtk_text_buffer_get_iter_at_offset (buffer, &start, 0); } else { gtk_text_iter_backward_line (&start); gtk_text_iter_forward_line (&start); } end = start; gtk_text_iter_backward_line (&start); } else if GTK_IS_TEXT_VIEW (layout) { GtkTextView *view = GTK_TEXT_VIEW (layout); gtk_text_view_backward_display_line_start (view, &start); end = start; gtk_text_view_backward_display_line (view, &start); } else if (PANGO_IS_LAYOUT (layout)) get_pango_text_offsets (PANGO_LAYOUT (layout), buffer, function, boundary_type, offset, start_offset, end_offset, &start, &end); break; case ATK_TEXT_BOUNDARY_LINE_END: if (layout == NULL) { line_number = gtk_text_iter_get_line (&start); if (line_number == 0) { gtk_text_buffer_get_iter_at_offset (buffer, &start, 0); end = start; } else { gtk_text_iter_backward_line (&start); end = start; while (!gtk_text_iter_ends_line (&start)) { if (!gtk_text_iter_backward_char (&start)) break; } gtk_text_iter_forward_to_line_end (&end); } } else if GTK_IS_TEXT_VIEW (layout) { GtkTextView *view = GTK_TEXT_VIEW (layout); gtk_text_view_backward_display_line_start (view, &start); if (!gtk_text_iter_is_start (&start)) { gtk_text_view_backward_display_line (view, &start); end = start; if (!gtk_text_iter_is_start (&start)) { gtk_text_view_backward_display_line (view, &start); gtk_text_view_forward_display_line_end (view, &start); } gtk_text_view_forward_display_line_end (view, &end); } else { end = start; } } else if (PANGO_IS_LAYOUT (layout)) get_pango_text_offsets (PANGO_LAYOUT (layout), buffer, function, boundary_type, offset, start_offset, end_offset, &start, &end); break; }
/* Internal function: write a Latin-1 buffer with length to a stream. */ static void write_buffer_to_stream(strid_t str, gchar *buf, glui32 len) { switch(str->type) { case STREAM_TYPE_WINDOW: /* Each window type has a different way of printing to it */ switch(str->window->type) { /* Printing to these windows' streams does nothing */ case wintype_Blank: case wintype_Pair: case wintype_Graphics: str->write_count += len; break; /* Text grid/buffer windows */ case wintype_TextGrid: { gchar *utf8 = convert_latin1_to_utf8(buf, len); if(utf8 != NULL) { /* Deal with newlines */ int i; gchar *line = utf8; for(i=0; i<len; i++) { if(utf8[i] == '\n') { utf8[i] = '\0'; write_utf8_to_window_buffer(str->window, line); flush_window_buffer(str->window); /* Move cursor position forward to the next line */ gdk_threads_enter(); GtkTextIter cursor_pos; GtkTextView *textview = GTK_TEXT_VIEW(str->window->widget); GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview); GtkTextMark *cursor_mark = gtk_text_buffer_get_mark(buffer, "cursor_position"); gtk_text_buffer_get_iter_at_mark( buffer, &cursor_pos, cursor_mark); gtk_text_view_forward_display_line(textview, &cursor_pos); gtk_text_view_backward_display_line_start(textview, &cursor_pos); gtk_text_buffer_move_mark(buffer, cursor_mark, &cursor_pos); gdk_threads_leave(); line = utf8 + (i < len-1 ? (i+1):(len-1)); } } /* No more newlines left. */ write_utf8_to_window_buffer(str->window, line); g_free(utf8); } str->write_count += len; } break; case wintype_TextBuffer: { gchar *utf8 = convert_latin1_to_utf8(buf, len); if(utf8 != NULL) { write_utf8_to_window_buffer(str->window, utf8); g_free(utf8); } } str->write_count += len; break; default: ILLEGAL_PARAM("Unknown window type: %u", str->window->type); } /* Now write the same buffer to the window's echo stream */ if(str->window->echo_stream != NULL) write_buffer_to_stream(str->window->echo_stream, buf, len); break; case STREAM_TYPE_MEMORY: if(str->unicode && str->ubuffer) { int foo = 0; while(str->mark < str->buflen && foo < len) str->ubuffer[str->mark++] = (unsigned char)buf[foo++]; } if(!str->unicode && str->buffer) { int copycount = MIN(len, str->buflen - str->mark); memmove(str->buffer + str->mark, buf, copycount); str->mark += copycount; } /* Move the EOF marker if we wrote past it */ if(str->mark > str->endmark) str->endmark = str->mark; str->write_count += len; break; case STREAM_TYPE_FILE: if(str->binary) { if(str->unicode) { gchar *writebuffer = convert_latin1_to_ucs4be_string(buf, len); ensure_file_operation(str, filemode_Write); fwrite(writebuffer, sizeof(gchar), len * 4, str->file_pointer); g_free(writebuffer); } else /* Regular file */ { ensure_file_operation(str, filemode_Write); fwrite(buf, sizeof(gchar), len, str->file_pointer); } } else /* Text mode is the same for Unicode and regular files */ { gchar *utf8 = convert_latin1_to_utf8(buf, len); if(utf8 != NULL) { ensure_file_operation(str, filemode_Write); g_fprintf(str->file_pointer, "%s", utf8); g_free(utf8); } } str->write_count += len; break; case STREAM_TYPE_RESOURCE: ILLEGAL(_("Writing to a resource stream is illegal.")); break; default: ILLEGAL_PARAM("Unknown stream type: %u", str->type); } }
static int delete_selection_in_gtk_text_view(GtkTextView *text_view, enum UTextOrigin origin, int former_req_len, int latter_req_len) { GtkTextIter current, start, end, tmp_start, tmp_end; gboolean cursor_at_beginning = FALSE; if (!gtk_text_view_get_buffer(text_view)) return -1; if (gtk_text_buffer_get_selection_bounds(gtk_text_view_get_buffer(text_view), &start, &end)) { gtk_text_buffer_get_iter_at_mark(gtk_text_view_get_buffer(text_view), ¤t, gtk_text_buffer_get_mark(gtk_text_view_get_buffer(text_view), "insert")); if (gtk_text_iter_compare(&start, ¤t) == 0) cursor_at_beginning = TRUE; } else { return -1; } if (origin == UTextOrigin_Beginning || (origin == UTextOrigin_Cursor && cursor_at_beginning)) { tmp_start = start; tmp_end = start; if (latter_req_len >= 0) { gtk_text_iter_forward_chars(&tmp_end, latter_req_len); if (gtk_text_iter_compare(&tmp_end, &end) < 0) end = tmp_end; } else { if (latter_req_len == UTextExtent_Line) { gtk_text_view_forward_display_line_end(text_view, &tmp_end); if (gtk_text_iter_compare(&tmp_end, &end) < 0) end = tmp_end; } else { if (!(latter_req_len == UTextExtent_Full)) return -1; } } } else if (origin == UTextOrigin_End || (origin == UTextOrigin_Cursor && !cursor_at_beginning)) { tmp_start = end; tmp_end = end; if (former_req_len >= 0) { gtk_text_iter_backward_chars(&tmp_start, former_req_len); if (gtk_text_iter_compare(&tmp_start, &start) > 0) start = tmp_start; } else { if (former_req_len == UTextExtent_Line) { gtk_text_view_backward_display_line_start(text_view, &tmp_start); if (gtk_text_iter_compare(&tmp_start, &start) > 0) start = tmp_start; } else { if (!(former_req_len == UTextExtent_Full)) return -1; } } } else { return -1; } gtk_text_buffer_delete_interactive(gtk_text_view_get_buffer(text_view), &start, &end, gtk_text_view_get_editable(text_view)); return 0; }
static int delete_text_in_gtk_text_view(GtkTextView *text_view, enum UTextOrigin origin, int former_req_len, int latter_req_len) { GtkTextIter current, start, end; if (!gtk_text_view_get_buffer(text_view)) return -1; gtk_text_buffer_get_iter_at_mark(gtk_text_view_get_buffer(text_view), ¤t, gtk_text_buffer_get_mark(gtk_text_view_get_buffer(text_view), "insert")); start = current; end = current; switch (origin) { case UTextOrigin_Cursor: if (former_req_len >= 0) { gtk_text_iter_backward_chars(&start, former_req_len); } else { if (former_req_len == UTextExtent_Full) gtk_text_buffer_get_start_iter(gtk_text_view_get_buffer(text_view), &start); else if (former_req_len == UTextExtent_Line) gtk_text_view_backward_display_line_start(text_view, &start); else return -1; } if (latter_req_len >= 0) gtk_text_iter_forward_chars(&end, latter_req_len); else { if (latter_req_len == UTextExtent_Full) gtk_text_buffer_get_end_iter(gtk_text_view_get_buffer(text_view), &end); else if (latter_req_len == UTextExtent_Line) gtk_text_view_forward_display_line_end(text_view, &end); else return -1; } break; case UTextOrigin_Beginning: gtk_text_buffer_get_start_iter(gtk_text_view_get_buffer(text_view), &start); end = start; if (latter_req_len >= 0) gtk_text_iter_forward_chars(&end, latter_req_len); else { if (latter_req_len == UTextExtent_Full) gtk_text_buffer_get_end_iter(gtk_text_view_get_buffer(text_view), &end); else if (latter_req_len == UTextExtent_Line) gtk_text_view_forward_display_line_end(text_view, &end); else return -1; } break; case UTextOrigin_End: gtk_text_buffer_get_end_iter(gtk_text_view_get_buffer(text_view), &end); start = end; if (former_req_len >= 0) { gtk_text_iter_backward_chars(&start, former_req_len); } else { if (former_req_len == UTextExtent_Full) gtk_text_buffer_get_start_iter(gtk_text_view_get_buffer(text_view), &start); else if (former_req_len == UTextExtent_Line) gtk_text_view_backward_display_line_start(text_view, &start); else return -1; } break; case UTextOrigin_Unspecified: default: return -1; } gtk_text_buffer_delete_interactive(gtk_text_view_get_buffer(text_view), &start, &end, gtk_text_view_get_editable(text_view)); return 0; }
static int acquire_text_in_gtk_text_view(GtkTextView *text_view, enum UTextOrigin origin, int former_req_len, int latter_req_len, char **former, char **latter) { GtkTextIter current, start, end; if (!gtk_text_view_get_buffer(text_view)) return -1; gtk_text_buffer_get_iter_at_mark(gtk_text_view_get_buffer(text_view), ¤t, gtk_text_buffer_get_mark(gtk_text_view_get_buffer(text_view), "insert")); switch (origin) { case UTextOrigin_Cursor: start = current; end = current; if (former_req_len >= 0) { gtk_text_iter_backward_chars(&start, former_req_len); } else { if (former_req_len == UTextExtent_Full) gtk_text_buffer_get_start_iter(gtk_text_view_get_buffer(text_view), &start); else if (former_req_len == UTextExtent_Line) gtk_text_view_backward_display_line_start(text_view, &start); else return -1; } *former = gtk_text_iter_get_slice(&start, ¤t); if (latter_req_len >= 0) gtk_text_iter_forward_chars(&end, latter_req_len); else { if (latter_req_len == UTextExtent_Full) gtk_text_buffer_get_end_iter(gtk_text_view_get_buffer(text_view), &end); else if (latter_req_len == UTextExtent_Line) gtk_text_view_forward_display_line_end(text_view, &end); else { g_free(*former); return -1; } } *latter = gtk_text_iter_get_slice(¤t, &end); break; case UTextOrigin_Beginning: gtk_text_buffer_get_start_iter(gtk_text_view_get_buffer(text_view), &start); end = start; *former = NULL; if (latter_req_len >= 0) gtk_text_iter_forward_chars(&end, latter_req_len); else { if (latter_req_len == UTextExtent_Full) gtk_text_buffer_get_end_iter(gtk_text_view_get_buffer(text_view), &end); else if (latter_req_len == UTextExtent_Line) gtk_text_view_forward_display_line_end(text_view, &end); else return -1; } *latter = gtk_text_iter_get_slice(&start, &end); break; case UTextOrigin_End: gtk_text_buffer_get_end_iter(gtk_text_view_get_buffer(text_view), &end); start = end; if (former_req_len >= 0) { gtk_text_iter_backward_chars(&start, former_req_len); } else { if (former_req_len == UTextExtent_Full) gtk_text_buffer_get_start_iter(gtk_text_view_get_buffer(text_view), &start); else if (former_req_len == UTextExtent_Line) gtk_text_view_backward_display_line_start(text_view, &start); else return -1; } *former = gtk_text_iter_get_slice(&start, &end); *latter = NULL; break; case UTextOrigin_Unspecified: default: return -1; } return 0; }