void cb_suppr (GtkButton *b, gpointer user_data) { const ScmCalc* self = SCM_CALC (user_data); GtkTextBuffer* buf = gtk_text_view_get_buffer (self->code); GtkTextMark* mark_insert = gtk_text_buffer_get_insert (buf); GtkTextIter pos; gtk_text_buffer_get_iter_at_mark (buf, &pos, mark_insert); gtk_text_buffer_backspace (buf, &pos, TRUE, TRUE); }
int32_t startwin_puts(const char *str) { GtkWidget *textview; GtkTextBuffer *textbuffer; GtkTextIter enditer; GtkTextMark *mark; const char *aptr, *bptr; if (!gtkenabled || !str) return 0; if (!stwidgets.startwin) return 1; if (!(textview = stwidgets.messagestext)) return -1; textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); gtk_text_buffer_get_end_iter(textbuffer, &enditer); for (aptr = bptr = str; *aptr != 0;) { switch (*bptr) { case '\b': if (bptr > aptr) gtk_text_buffer_insert(textbuffer, &enditer, (const gchar *)aptr, (gint)(bptr-aptr)-1); #if GTK_CHECK_VERSION(2,6,0) gtk_text_buffer_backspace(textbuffer, &enditer, FALSE, TRUE); #else { GtkTextIter iter2 = enditer; gtk_text_iter_backward_cursor_position(&iter2); //FIXME: this seems be deleting one too many chars somewhere! if (!gtk_text_iter_equal(&iter2, &enditer)) gtk_text_buffer_delete_interactive(textbuffer, &iter2, &enditer, TRUE); } #endif aptr = ++bptr; break; case 0: if (bptr > aptr) gtk_text_buffer_insert(textbuffer, &enditer, (const gchar *)aptr, (gint)(bptr-aptr)); aptr = bptr; break; case '\r': // FIXME default: bptr++; break; } } mark = gtk_text_buffer_create_mark(textbuffer, NULL, &enditer, 1); gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(textview), mark, 0.0, FALSE, 0.0, 1.0); gtk_text_buffer_delete_mark(textbuffer, mark); return 0; }
static void gimp_text_tool_backspace (GimpTextTool *text_tool) { GtkTextBuffer *buffer = GTK_TEXT_BUFFER (text_tool->buffer); gimp_text_tool_reset_im_context (text_tool); if (gtk_text_buffer_get_has_selection (buffer)) { gtk_text_buffer_delete_selection (buffer, TRUE, TRUE); } else { GtkTextIter cursor; gtk_text_buffer_get_iter_at_mark (buffer, &cursor, gtk_text_buffer_get_insert (buffer)); gtk_text_buffer_backspace (buffer, &cursor, TRUE, TRUE); } }
void gimp_text_buffer_post_deserialize (GimpTextBuffer *buffer, GtkTextBuffer *content) { GtkTextIter iter; g_return_if_fail (GIMP_IS_TEXT_BUFFER (buffer)); g_return_if_fail (GTK_IS_TEXT_BUFFER (content)); gtk_text_buffer_get_start_iter (content, &iter); do { GSList *tags = gtk_text_iter_get_tags (&iter); GSList *list; for (list = tags; list; list = g_slist_next (list)) { GtkTextTag *tag = list->data; if (g_list_find (buffer->kerning_tags, tag)) { GtkTextIter end; gtk_text_iter_forward_char (&iter); gtk_text_buffer_backspace (content, &iter, FALSE, TRUE); end = iter; gtk_text_iter_forward_char (&end); gtk_text_buffer_apply_tag (content, tag, &iter, &end); break; } } g_slist_free (tags); } while (gtk_text_iter_forward_char (&iter)); }
/********** 'set_chord_position' function ************************************/ gint set_chord_position(GtkWidget *t_view, GtkTextBuffer *buffer) { GtkTextTag *tag; GtkTextMark *end_chord, *start_chord; GtkTextIter ch, chord_S, chord_E, match_end, match_start, start_of_line; GtkClipboard *clipboard; gint line_num_1, line_num_2, line_count_V, line_offset_1, line_offset_2; line_count_V = gtk_text_buffer_get_line_count(buffer); clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); gtk_text_buffer_get_start_iter(buffer, &start_of_line); if(gtk_text_iter_forward_search(&start_of_line, "[", 1, &match_start, &match_end, NULL)) { gtk_text_buffer_create_mark(buffer, "start_chord", &match_start, FALSE); start_chord = gtk_text_buffer_get_mark(buffer, "start_chord"); } else { return -1; } if(gtk_text_iter_forward_search(&start_of_line, "]", 1, &match_start, &match_end, NULL)) { gtk_text_buffer_create_mark(buffer, "end_chord", &match_end, FALSE); end_chord = gtk_text_buffer_get_mark(buffer, "end_chord"); } else { return -1; } // Initializes iters at mark. gtk_text_buffer_get_iter_at_mark(buffer, &chord_S, start_chord); gtk_text_buffer_get_iter_at_mark(buffer, &chord_E, end_chord); // Get line and line offset of iter. If we just obtain the offset // within buffer then chord_S will not format as desired. line_num_1 = gtk_text_iter_get_line(&chord_S); line_offset_1 = gtk_text_iter_get_line_index(&chord_S); line_num_2 = gtk_text_iter_get_line(&chord_E); line_offset_2 = gtk_text_iter_get_line_index(&chord_E); // This returns with error if end bracket does not have a // matching start bracket. if(line_offset_1 > line_offset_2) { return -1; } //g_print("Lineoffset of start:end bracket:\n%d\n%d\n", line_offset_1, line_offset_2); // If chord found is found more than two lines down // refresh global values of 'line_count_C' and 'line_num_C'. if(line_num_1 > (line_num_C + 1)) { line_num_C = line_num_1; line_count_C = line_count_V; } // Copy, cut, and add tags to the section between the marks. gtk_text_buffer_select_range(buffer, &chord_S, &chord_E); tag = gtk_text_buffer_create_tag(buffer, NULL, "background", "gold", "weight", "500", "foreground-gdk", "black3", NULL); gtk_text_buffer_apply_tag(buffer, tag, &chord_S, &chord_E); gtk_text_buffer_cut_clipboard(buffer, clipboard, TRUE); // This finds first chord of line. if(line_count_V == line_count_C) { gtk_text_buffer_get_iter_at_line(buffer, &start_of_line, line_num_1); gtk_text_buffer_insert(buffer, &start_of_line, "\n", -1); } // This finds the rest of the chord_S on the same line as the first. if(line_num_1 == (line_num_C + 1)) { line_num_1 = line_num_1 - 1; line_num_2 = line_num_2 - 1; } gtk_text_buffer_get_iter_at_line(buffer, &ch, line_num_1); // Insert 110 blank spaces so we can insert chord_S at higher offsets than 0. // GtkTextBuffer does not allow us to insert past a newline character // so we move it with spaces to allow us to place chord_S at offsets // past a newline character. if(gtk_text_iter_get_char(&ch) == '\n') { gtk_text_buffer_insert(buffer, &ch, " ", -1); } // Place iter at the same offset one line above. gtk_text_buffer_get_iter_at_line_index(buffer, &ch, line_num_1, line_offset_1); //g_print("Position after cut: %d\n", line_offset_1); gtk_text_buffer_paste_clipboard(buffer, clipboard, &ch, TRUE); gtk_text_buffer_get_iter_at_line_offset(buffer, &ch, line_num_1, line_offset_2); // Deletes the end bracket. gtk_text_buffer_backspace(buffer, &ch, FALSE, TRUE); gtk_text_buffer_get_iter_at_line_offset(buffer, &ch, line_num_1, line_offset_1 +1); // Deletes the start bracket. gtk_text_buffer_backspace(buffer, &ch, FALSE, TRUE); gtk_text_buffer_delete_mark_by_name(buffer, "start_chord"); gtk_text_buffer_delete_mark_by_name(buffer, "end_chord"); return 0; }
/** * Handles the keypress events from webview and inputbox. */ VbResult ex_keypress(int key) { GtkTextIter start, end; GtkTextBuffer *buffer = vb.gui.buffer; GtkTextMark *mark; /* delegate call to the submode */ if (RESULT_COMPLETE == hints_keypress(key)) { return RESULT_COMPLETE; } switch (key) { case KEY_TAB: complete(1); break; case KEY_SHIFT_TAB: complete(-1); break; case CTRL('['): case CTRL('C'): mode_enter('n'); vb_set_input_text(""); break; case KEY_CR: input_activate(); break; case KEY_UP: history(true); break; case KEY_DOWN: history(false); break; /* basic command line editing */ case CTRL('H'): /* delete the last char before the cursor */ mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &start, mark); gtk_text_buffer_backspace(buffer, &start, true, true); break; case CTRL('W'): /* delete word backward from cursor */ mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &end, mark); /* copy the iter to build start and end point for deletion */ start = end; /* move the iterator to the beginning of previous word */ if (gtk_text_iter_backward_word_start(&start)) { gtk_text_buffer_delete(buffer, &start, &end); } break; case CTRL('B'): /* move the cursor direct behind the prompt */ gtk_text_buffer_get_iter_at_offset(buffer, &start, strlen(vb.state.prompt)); gtk_text_buffer_place_cursor(buffer, &start); break; case CTRL('E'): /* move the cursor to the end of line */ gtk_text_buffer_get_end_iter(buffer, &start); gtk_text_buffer_place_cursor(buffer, &start); break; case CTRL('U'): /* remove everythings between cursor and prompt */ mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &end, mark); gtk_text_buffer_get_iter_at_offset(buffer, &start, strlen(vb.state.prompt)); gtk_text_buffer_delete(buffer, &start, &end); break; default: /* if is printable ascii char, than write it at the cursor * position into input box */ if (key >= 0x20 && key <= 0x7e) { gtk_text_buffer_insert_at_cursor(buffer, (char[2]){key, 0}, 1); } else {
/** * Handles the keypress events from webview and inputbox. */ VbResult ex_keypress(int key) { GtkTextIter start, end; gboolean check_empty = false; GtkTextBuffer *buffer = vb.gui.buffer; GtkTextMark *mark; VbResult res; const char *text; /* delegate call to hint mode if this is active */ if (vb.mode->flags & FLAG_HINTING && RESULT_COMPLETE == hints_keypress(key)) { return RESULT_COMPLETE; } /* process the register */ if (info.phase == PHASE_REG) { info.reg = (char)key; info.phase = PHASE_REG; /* insert the register text at cursor position */ text = vb_register_get((char)key); if (text) { gtk_text_buffer_insert_at_cursor(buffer, text, strlen(text)); } res = RESULT_COMPLETE; } else { res = RESULT_COMPLETE; switch (key) { case KEY_TAB: complete(1); break; case KEY_SHIFT_TAB: complete(-1); break; case CTRL('['): case CTRL('C'): vb_enter('n'); vb_set_input_text(""); break; case KEY_CR: input_activate(); break; case KEY_UP: history(true); break; case KEY_DOWN: history(false); break; /* basic command line editing */ case CTRL('H'): /* delete the last char before the cursor */ mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &start, mark); gtk_text_buffer_backspace(buffer, &start, true, true); check_empty = true; break; case CTRL('W'): /* delete word backward from cursor */ mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &end, mark); /* copy the iter to build start and end point for deletion */ start = end; /* move the iterator to the beginning of previous word */ if (gtk_text_iter_backward_word_start(&start)) { gtk_text_buffer_delete(buffer, &start, &end); } check_empty = true; break; case CTRL('B'): /* move the cursor direct behind the prompt */ gtk_text_buffer_get_iter_at_offset(buffer, &start, strlen(vb.state.prompt)); gtk_text_buffer_place_cursor(buffer, &start); break; case CTRL('E'): /* move the cursor to the end of line */ gtk_text_buffer_get_end_iter(buffer, &start); gtk_text_buffer_place_cursor(buffer, &start); break; case CTRL('U'): /* remove everything between cursor and prompt */ mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &end, mark); gtk_text_buffer_get_iter_at_offset(buffer, &start, strlen(vb.state.prompt)); gtk_text_buffer_delete(buffer, &start, &end); break; case CTRL('R'): info.phase = PHASE_REG; vb.mode->flags |= FLAG_NOMAP; res = RESULT_MORE; break; default: /* if is printable ascii char, than write it at the cursor * position into input box */ if (key >= 0x20 && key <= 0x7e) { gtk_text_buffer_insert_at_cursor(buffer, (char[2]){key, 0}, 1); } else {