On trouve à pas mal d'endroits (FAQ,...) que gtk_text_view_scroll_mark_onscreen() permet de garder la fin du texte visible dans une "scrolled_window", mais j'ai fait pas mal d'essais infructueux avant de trouver ce message:
http://mail.gnome.org/archives/gtk-a.../msg00151.html qui m'a donné la raison pour laquelle cela ne marchait pas chez moi.
Je pense donc utile de le signaler ici et de proposer un test qui fonctionne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 
/** File scrolled_text.c
 *   Essai pour rendre visible la fin du texte
 *   dans une scrolled window
 */
 
#include <gtk/gtk.h>
 
static gint width = 450 ,height = 150;
 
static GtkWidget *w_text = NULL;
 
/* Le callback pour "scroller" la fenetre */
static void scroll_CB (GtkTextBuffer *t_buf ,gpointer p)
{
  GtkTextMark *mark = gtk_text_buffer_get_insert (t_buf);
  /*
   *  NE MARCHE PAS avec gtk_scrolled_window_add_with_viewport(). Voir:
    *     http://mail.gnome.org/archives/gtk-app-devel-list/2006-December/msg00151.html
 
   */
  gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW(w_text) ,mark);
  printf ("scroll: mark = %p \n" ,mark);
}
 
 
int main( int argc ,char *argv[] )
{
  GtkWidget *w_main ,*w_box ,*w_label ,*w_sw;
  GtkTextBuffer *t_buf;
  GtkTextIter start ,end;
  char msg[64];
  int i;
  GtkObject *hadjust ,*vadjust;
 
  /* Fenetre principale */
  gtk_init (&argc, &argv);
  w_main = gtk_window_new (GTK_WINDOW_TOPLEVEL);  
  gtk_widget_set_size_request (w_main, 300, 200);
 
  /* Boite VBox contenant la scrolled_window */
  w_box = gtk_vbox_new (FALSE, 2);
  w_label = gtk_label_new_with_mnemonic ("Essai pour voir la fin du text");
  gtk_box_pack_start (GTK_BOX (w_box) ,w_label, FALSE, FALSE, 1);
 
  /* La scrolled_window */
  w_sw = gtk_scrolled_window_new (NULL,NULL);
  gtk_scrolled_window_set_policy  (GTK_SCROLLED_WINDOW(w_sw)
				   ,GTK_POLICY_AUTOMATIC
				   ,GTK_POLICY_AUTOMATIC);
  gtk_widget_set_size_request (w_sw ,width ,height);
 
  /* Le gtk_buffer et la gtk_textview */
  w_text = gtk_text_view_new ();
  t_buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (w_text));
  gtk_widget_show (w_text);
 
  /* gtk_scrolled_window_add_with_viewport  (GTK_SCROLLED_WINDOW(w_sw) ,w_text);
   * est INCOMPATIBLE avec gtk_text_view_scroll_mark_onscreen(). 
   */
  hadjust = gtk_adjustment_new  (0.0 ,0.0 ,200.0 ,1.0 ,10.0 ,100.);
  vadjust = gtk_adjustment_new  (0.0 ,0.0 ,100.0 ,1.0 ,10.0 ,50.);
  w_sw = gtk_scrolled_window_new ( (GtkAdjustment *)hadjust ,(GtkAdjustment *)vadjust);
  gtk_container_add (GTK_CONTAINER (w_sw) ,w_text);
  gtk_box_pack_start (GTK_BOX (w_box) ,w_sw ,TRUE , TRUE, 1);    
 
  gtk_container_add (GTK_CONTAINER (w_main) ,w_box);
  g_signal_connect (w_main ,"delete_event" ,G_CALLBACK (gtk_main_quit) ,NULL);
  g_signal_connect (t_buf  ,"changed"      ,G_CALLBACK (scroll_CB)     ,NULL);
 
  gtk_widget_show_all (w_main);
 
  /* On remplit la fenetre */
  for (i = 0; i < 30; i++) {
    sprintf (msg ,"Ligne \t %d\n" ,i);
    gtk_text_buffer_get_bounds (t_buf ,&start ,&end);
    gtk_text_buffer_insert     (t_buf ,&end ,msg ,-1);
  }
  gtk_main ();
  return 0;
}