You might be able to fiddle around with the newlines at the end of the buffer 
to get something to work with the textview.

Eric


//gcc -Wall text_space1.c -o text_space1 `pkg-config --cflags --libs gtk+-3.0`

#include <gtk/gtk.h>

static void value_changed(GtkAdjustment *v_adjust, GtkWidget **widgets)
  {
    static gint s_line=0;

    GtkTextIter iter, end_iter;
    GtkTextBuffer *buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(widgets[0]));
    GtkTextMark *mark=gtk_text_buffer_get_mark(buffer, "insert");
    gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark);
    gtk_text_buffer_get_end_iter(buffer, &end_iter);
    gint line=gtk_text_iter_get_line(&iter);
    //Check if cursor line is below a certain line in the buffer.
    gint below=gtk_text_buffer_get_line_count(buffer)-6;
    
    if(s_line!=line&&line>below)
      {
        g_print("Scroll Line\n");
        gint count=0;
        gint i=0;
        //Check for newlines.
        gtk_text_iter_backward_char(&end_iter);
        for(i=0;i<4;i++)
          {
            if('\n'==gtk_text_iter_get_char(&end_iter)) count++;
            if(!gtk_text_iter_backward_char(&end_iter))
              {
                g_print("Break\n");
                break;
              }
          }
        //Add newlines if needed.
        if(count>0)
          {
            GtkTextMark *mark2=gtk_text_buffer_create_mark(buffer, "back", 
&iter, TRUE);
            gint newlines=4-count;
            gtk_text_buffer_get_end_iter(buffer, &end_iter);
            gchar string[newlines];
            for(i=0;i<newlines;i++) string[i]='\n';
            gtk_text_buffer_insert(buffer, &end_iter, string, newlines);
            gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark2);
            gtk_text_buffer_place_cursor(buffer, &iter);
            gtk_range_set_value(GTK_RANGE(widgets[1]), 
gtk_adjustment_get_upper(v_adjust));
            gtk_text_buffer_delete_mark(buffer, mark2);
          }
        s_line=line;
      }
  }
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), "Text Space");
    gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_container_set_border_width(GTK_CONTAINER(window), 20);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    GtkWidget *textview=gtk_text_view_new();
    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
    gtk_widget_set_hexpand(textview, TRUE);
    gtk_widget_set_vexpand(textview, TRUE); 

    GtkTextBuffer *buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
    GtkTextIter iter;
    gtk_text_buffer_get_end_iter(buffer, &iter);
    GtkTextMark *mark=gtk_text_buffer_create_mark(buffer, "back", &iter, TRUE);
    //Append 4 newlines to the buffer.
    gtk_text_buffer_insert(buffer, &iter, "\n\n\n\n", -1);
    gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark);
    gtk_text_buffer_place_cursor(buffer, &iter);
    gtk_text_buffer_delete_mark(buffer, mark); 

    GtkWidget *scroll=gtk_scrolled_window_new(NULL, NULL);
    GtkAdjustment 
*v_adjust=gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scroll)); 
    gtk_container_add(GTK_CONTAINER(scroll), textview);

    GtkWidget 
*range=gtk_scrolled_window_get_vscrollbar(GTK_SCROLLED_WINDOW(scroll));
    GtkWidget *widgets[2]={textview, range};
    g_signal_connect(v_adjust, "value-changed", G_CALLBACK(value_changed), 
widgets); 

    GtkWidget *grid=gtk_grid_new();
    gtk_grid_attach(GTK_GRID(grid), scroll, 0, 0, 1, 1);

    gtk_container_add(GTK_CONTAINER(window), grid);

    gtk_widget_show_all(window);
    
    gtk_main();

    return 0;
  }


 

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to