I wrote an short example, that consists only of the important things:
/*
I want, that the TextView is scrolled to its end.
"scroll_to_end_markmethode" works only, if i call it in main BEFORE gtk_main. But then, when I try
to call it via button, it fails and the text is not scrolled.
"scroll_to_end_itermethode" doesn't work at all.
I tried, to delete the Content of the Textbuffer, before I fill it with new data. But this shows no effect.
So I removed that code from this example-code here.
*/
#include <stdbool.h>
#include <gtk/gtk.h>
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
GtkWidget *gText_view;
GtkTextBuffer *gText_buffer;
char gTestbuffer[1000];
void scroll_to_end_markmethode(GtkWidget *text_view,GtkTextBuffer *text_buffer);
void scroll_to_end_itermethode(GtkWidget *text_view,GtkTextBuffer *text_buffer);
bool callback_buttonMarkTest(void);
// This function doesn't work at all !
void scroll_to_end_itermethode(GtkWidget *text_view,GtkTextBuffer *text_buffer)
{
GtkTextIter enditer;
gtk_text_buffer_get_end_iter(text_buffer,&enditer);
gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(text_view),&enditer,0.0,TRUE,0.0,0.0);
}
// This function doesn't work if it is called via button and after gtk_main in main is called !
void scroll_to_end_markmethode(GtkWidget *text_view,GtkTextBuffer *text_buffer)
{
GtkTextIter iterend;
GtkTextMark *mark;
gtk_text_buffer_get_end_iter(text_buffer,&iterend);
mark = gtk_text_buffer_create_mark(text_buffer,NULL,&iterend,TRUE);
gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(text_view),mark,0.0,TRUE,0.0,0.0);
gtk_text_buffer_delete_mark(text_buffer,mark);
}
bool callback_buttonMarkTest(void)
{
int i;
gTestbuffer[0] = 0;
for(i=0;i!=30;i++)
{
strcat(gTestbuffer,"Mark-Test per Button\n");
}
gText_buffer=gtk_text_view_get_buffer((GtkTextView*)gText_view);
gtk_text_buffer_set_text(gText_buffer,gTestbuffer, -1); // buffer
scroll_to_end_markmethode(gText_view,gText_buffer);
return true;
}
bool callback_buttonIterTest(void)
{
int i;
gTestbuffer[0] = 0;
for(i=0;i!=30;i++)
{
strcat(gTestbuffer,"Iter-Test per Button\n");
}
gText_buffer=gtk_text_view_get_buffer((GtkTextView*)gText_view);
gtk_text_buffer_set_text(gText_buffer,gTestbuffer, -1); // buffer
scroll_to_end_itermethode(gText_view,gText_buffer);
return true; // No matter whether true or false is given
}
int main ( void )
{
GtkWidget *window;
GtkWidget *scroll_window;
GtkWidget *grid_window;
GtkWidget *buttonMarkTest,*buttonIterTest;
int i;
gtk_init ( NULL, NULL );
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window),600,200);
g_signal_connect(window,"delete-event",gtk_main_quit,NULL);
g_signal_connect(window,"destroy",gtk_main_quit,NULL);
grid_window = gtk_grid_new();
gtk_container_add( GTK_CONTAINER ( window ), (GtkWidget*)grid_window );
buttonMarkTest = gtk_button_new_with_label("Mark-Test");
gtk_grid_attach((GtkGrid*)grid_window,buttonMarkTest,1,1,10,10);
g_signal_connect(buttonMarkTest,"clicked",(GCallback)callback_buttonMarkTest,NULL);
buttonIterTest = gtk_button_new_with_label("Iter-Test");
gtk_grid_attach((GtkGrid*)grid_window,buttonIterTest,1,15,10,10);
g_signal_connect(buttonIterTest,"clicked",(GCallback)callback_buttonIterTest,NULL);
scroll_window = gtk_scrolled_window_new(NULL,NULL);
gtk_widget_set_size_request(scroll_window, 500, 100);
gtk_grid_attach((GtkGrid*)grid_window,scroll_window,11,1,150,150);
gText_view = gtk_text_view_new();
gtk_container_add(GTK_CONTAINER(scroll_window),gText_view);
gText_buffer=gtk_text_view_get_buffer((GtkTextView*)gText_view);
gTestbuffer[0] = 0;
for(i=0;i!=30;i++)
{
strcat(gTestbuffer,"Test: This works.\n");
}
gtk_text_buffer_set_text(gText_buffer,gTestbuffer, -1);
// This function doesn't work at all!
// scroll_to_end_itermethode(gText_view,gText_buffer);
// This function only work, when called here on this position.
scroll_to_end_markmethode(gText_view,gText_buffer);
gtk_widget_show_all(window);
gtk_main();
}