Re: gtk_text_buffer_set_text and remember cursor/adjustments



It seems the attachment got lost so I put it here in plain text:

-- Steffen

/* 
** gcc -o textview textview.c -Wall `pkg-config gtk+-2.0 --cflags --libs`
*/

#include <string.h>
#include <gtk/gtk.h>

static void reload(GtkWidget *tv)
{
    static char text[200000];
    char *s = text;
    int i;

    for(i=0; i < 5000; i++) {
        sprintf(s, "%*sLine %d\n", i%20, "", i);
        s += strlen(s);
    }
    
    GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tv));
    GtkTextMark *cursor = gtk_text_buffer_get_insert(buffer);
    GtkTextIter iter;
    gint offset;

    gtk_text_buffer_get_iter_at_mark(buffer, &iter, cursor);
    offset = gtk_text_iter_get_offset(&iter);

    gtk_text_buffer_set_text(buffer, text, -1);

    gtk_text_buffer_get_iter_at_offset(buffer, &iter, offset);
    gtk_text_buffer_place_cursor(buffer, &iter);
    gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(tv), 
            gtk_text_buffer_get_insert(buffer));
}

int main(int argc, char **argv)
{
    gtk_init(&argc, &argv);

    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 500, 500);
    g_signal_connect(window, "destroy", gtk_main_quit, NULL);

    GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    GtkWidget *sw = gtk_scrolled_window_new(NULL, NULL);
    gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 5);

    GtkWidget *tv = gtk_text_view_new();
    gtk_container_add(GTK_CONTAINER(sw), tv);

    GtkWidget *button = gtk_button_new_with_label("Reload");
    gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, TRUE, 5);
    GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS);
    g_signal_connect_swapped(button, "clicked", G_CALLBACK(reload), tv);

    reload(tv);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}



      



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]