Re: turn on italics in TextView




Have you tried gtk_text_buffer_insert_with_tags_by_name() to insert text with a tag at an iter?

What tag combo do you use to get the cursor to bounce around? If I test having two indent tags on the same 
line, the first one applied wins out. This is what I tested with.

Eric


/*
  gcc -Wall move_cursor1.c -o move_cursor1 `pkg-config --cflags --libs gtk+-3.0`
  Tested on GTK3.18 and Ubuntu16.04
*/

#include<gtk/gtk.h>

static void get_style(GtkTextView *tv, GtkMovementStep step, gint count, gboolean extend, gpointer *user_data)
  {
    static int i=1;
    GtkTextIter start;
    GtkTextMark *mark;
    GtkTextBuffer *buf;

    buf=gtk_text_view_get_buffer(GTK_TEXT_VIEW(tv));

    mark=gtk_text_buffer_get_insert(buf);
    gtk_text_buffer_get_iter_at_mark (buf, &start, mark);
    g_print("Iter %i\n", gtk_text_iter_get_offset(&start));

    GSList *tlist=NULL;
    GSList *p=NULL;
    tlist=gtk_text_iter_get_tags(&start);
    g_print("%i. List %p p %p\n", i, tlist, p);
    i++;
    for(p=tlist;p;p=p->next)
      {
        gchar *string=NULL;
        g_object_get(G_OBJECT(p->data), "name", &string, NULL);
        g_print("p %p %s\n", p, string);
        g_free(string);
      }

    g_print("List %p\n", tlist);
    if(tlist!=NULL) g_slist_free(tlist);
  }
int main (int argc, char *argv[])
  {
    gtk_init(&argc, &argv);

    GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Move Cursor");
    gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    GtkWidget *textview=gtk_text_view_new();
    gtk_widget_set_vexpand(textview, TRUE);
    gtk_widget_set_hexpand(textview, TRUE);
    g_signal_connect(textview, "move-cursor", G_CALLBACK(get_style), NULL);

    GtkTextBuffer *buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
    gtk_text_buffer_create_tag(buffer, "ital", "style", PANGO_STYLE_ITALIC, NULL);
    gtk_text_buffer_create_tag(buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL);
    gtk_text_buffer_create_tag(buffer, "uline", "underline", PANGO_UNDERLINE_SINGLE, NULL);
    gtk_text_buffer_create_tag(buffer, "indent", "indent", 20, NULL);
    gtk_text_buffer_create_tag(buffer, "indent2", "indent", 40, NULL);
    gtk_text_buffer_create_tag(buffer, "left-margin", "left-margin", 20, NULL); 
    gtk_text_buffer_create_tag(buffer, "left-margin2", "left-margin", 40, NULL);     

    GtkTextIter iter;
    gtk_text_buffer_get_start_iter(buffer, &iter);
    gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "ital ", -1, "ital", NULL);
    gtk_text_buffer_get_end_iter(buffer, &iter);
    gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "bold ", -1, "bold", NULL);
    gtk_text_buffer_get_end_iter(buffer, &iter);
    //Check a newline for a tag.
    gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "uline \n", -1, "uline", NULL);
    gtk_text_buffer_get_end_iter(buffer, &iter);
    gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "all\n", -1, "ital", "bold", "uline", NULL);
    //Check indents in the same line.
    gtk_text_buffer_get_end_iter(buffer, &iter);
    gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "indent ", -1, "indent", NULL);
    gtk_text_buffer_get_end_iter(buffer, &iter);
    gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "indent2\n", -1, "indent2", NULL);
    gtk_text_buffer_get_end_iter(buffer, &iter);
    gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "indent2\n", -1, "indent2", NULL);
    //Check left-margin in the same line.
    gtk_text_buffer_get_end_iter(buffer, &iter);
    gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "left-margin ", -1, "left-margin", NULL);
    gtk_text_buffer_get_end_iter(buffer, &iter);
    gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "left-margin2\n", -1, "left-margin2", NULL);
    gtk_text_buffer_get_end_iter(buffer, &iter);
    gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, "left-margin2", -1, "left-margin2", NULL);

    GtkWidget *grid=gtk_grid_new();
    gtk_container_set_border_width(GTK_CONTAINER(grid), 8);
    gtk_grid_attach(GTK_GRID(grid), textview, 0, 0, 1, 1);
    
    gtk_container_add(GTK_CONTAINER(window), grid);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
  }


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