static void insert_function_into_syntax_area (GtkTreeIter iter, GtkWidget *text_view, GtkTreeModel *model, gpointer data ) { GString *string; GValue name_value = {0}; GValue arity_value = {0}; gint arity; gint i; GtkTextBuffer *buffer ; g_return_if_fail (GTK_IS_TEXT_VIEW (text_view)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); gtk_tree_model_get_value (model, &iter, COMPUTE_COL_NAME, &name_value); gtk_tree_model_get_value (model, &iter, COMPUTE_COL_ARITY, &arity_value); arity = g_value_get_int (&arity_value); string = g_string_new (g_value_get_string (&name_value)); g_string_append (string, "("); for ( i = 0 ; i < arity -1 ; ++i ) { g_string_append (string, "?,"); } g_string_append (string, "?)"); erase_selection (buffer); gtk_text_buffer_insert_at_cursor (buffer, string->str, string->len); g_value_unset (&name_value); g_value_unset (&arity_value); g_string_free (string, TRUE); /* Now position the cursor over the first '?' */ { GtkTextIter insert; GtkTextIter selectbound; GtkTextMark *cursor = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &insert, cursor); for ( i = 0 ; i < arity ; ++i ) { gtk_text_iter_backward_cursor_position (&insert); gtk_text_iter_backward_cursor_position (&insert); } selectbound = insert; gtk_text_iter_forward_cursor_position (&selectbound); gtk_text_buffer_select_range (buffer, &insert, &selectbound); } }
gboolean on_LocalText_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { gchar *outstr; gchar instr[2]; int inbytes; int outbytes; if(event->keyval==GDK_BackSpace || event->keyval==GDK_Delete) { GtkTextIter start; GtkTextIter end; chat_write_byte('\b'); gtk_text_buffer_get_iter_at_mark( gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)) ,&start ,gtk_text_buffer_get_insert( gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)) ) ); end=start; gtk_text_iter_backward_cursor_position(&end); gtk_text_buffer_delete( gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)) ,&start ,&end ); } if(event->keyval >= 32 && event->keyval < 127) { instr[1]=0; instr[0]=event->keyval; chat_write_byte(event->keyval); outstr=g_convert(instr, 1, "UTF-8", "CP437", &inbytes, &outbytes, NULL); gtk_text_buffer_insert_at_cursor( gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)) ,outstr ,1 ); g_free(outstr); } if(event->keyval == GDK_Return || event->keyval == GDK_KP_Enter) { instr[1]=0; instr[0]='\n'; chat_write_byte('\r'); outstr=g_convert(instr, 1, "UTF-8", "CP437", &inbytes, &outbytes, NULL); gtk_text_buffer_insert_at_cursor( gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)) ,outstr ,1 ); g_free(outstr); } return FALSE; }
static gboolean backward_cursor_position (GtkTextIter *iter, gboolean visible) { if (visible) { return gtk_text_iter_backward_visible_cursor_position (iter); } return gtk_text_iter_backward_cursor_position (iter); }
gint get_from_remote(gpointer data) { int ch; gchar *outstr; gchar instr[2]; int inbytes; int outbytes; instr[1]=0; switch(chat_check_remote()) { case 2: /* Chat active */ while(ch=chat_read_byte()) { if(ch==-1) { chat_close(); gtk_main_quit(); return(FALSE); } if(ch==8 || ch==127) { GtkTextIter start; GtkTextIter end; gtk_text_buffer_get_iter_at_mark( gtk_text_view_get_buffer(GTK_TEXT_VIEW(data)) ,&start ,gtk_text_buffer_get_insert( gtk_text_view_get_buffer(GTK_TEXT_VIEW(data)) ) ); end=start; gtk_text_iter_backward_cursor_position(&end); gtk_text_buffer_delete( gtk_text_view_get_buffer(GTK_TEXT_VIEW(data)) ,&start ,&end ); } else { instr[0]=ch; outstr=g_convert(instr, 1, "UTF-8", "CP437", &inbytes, &outbytes, NULL); gtk_text_buffer_insert_at_cursor( gtk_text_view_get_buffer(GTK_TEXT_VIEW(data)) ,outstr ,1 ); g_free(outstr); } } return(TRUE); } chat_close(); return(FALSE); }
/******************************************************************************* * Advance the cursor n positions on the tutor text view */ gint cursor_advance (gint n) { gint i; gboolean cursor_out_screen; GtkWidget *wg; GtkTextBuffer *buf; GtkTextIter new_start; GtkTextIter old_start; GtkTextIter end; GtkTextMark *mark; wg = get_wg ("text_tutor"); buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (wg)); /* Get current position for the iter old_start */ gtk_text_buffer_get_iter_at_mark (buf, &new_start, gtk_text_buffer_get_insert (buf)); old_start = new_start; /* Get new position for the iter new_start */ if (n > 0) for (i = 0; i < n && gtk_text_iter_forward_cursor_position (&new_start); i++); else for (i = 0; i > n && gtk_text_iter_backward_cursor_position (&new_start); i--); /* Move cursor blinking */ end = new_start; gtk_text_iter_forward_char (&end); gtk_text_buffer_apply_tag_by_name (buf, "cursor_blink", &new_start, &end); end = old_start; gtk_text_iter_forward_char (&end); gtk_text_buffer_remove_tag_by_name (buf, "cursor_blink", &old_start, &end); /* Move cursor */ gtk_text_buffer_place_cursor (buf, &new_start); /* Check need for auto-scrolling */ if (i == n) { end = new_start; gtk_text_iter_forward_line (&end); mark = gtk_text_buffer_create_mark (buf, "aux", &end, FALSE); cursor_out_screen = gtk_text_view_move_mark_onscreen (GTK_TEXT_VIEW (wg), mark); if (cursor_out_screen) { gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (wg), gtk_text_buffer_get_insert (buf), 0.0, TRUE, 0.5, 0.12); } } return (i); }
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 on_keypad_button (PsppireKeypad *kp, const gchar *syntax, gpointer data) { GtkBuilder *xml = data; GtkWidget *rhs = get_widget_assert (xml, "compute-textview1"); GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (rhs)); erase_selection (buffer); gtk_text_buffer_insert_at_cursor (buffer, syntax, strlen (syntax)); if (0 == strcmp (syntax, "()")) { GtkTextIter iter; GtkTextMark *cursor = gtk_text_buffer_get_insert (buffer); gtk_text_buffer_get_iter_at_mark (buffer, &iter, cursor); gtk_text_iter_backward_cursor_position (&iter); gtk_text_buffer_move_mark (buffer, cursor, &iter); } }