GTK+ Forums Forum Index GTK+ Forums
Discussion forum for GTK+ and Programming. Ask questions, troubleshoot problems, view and post example code, or express your opinions.
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Problem. Automatically scroll to end of GtkTextView

 
Post new topic   Reply to topic    GTK+ Forums Forum Index -> General GTK+ Discussion
Author Message
bes



Joined: 08 Feb 2010
Posts: 2
Location: Russia

PostPosted: Tue Mar 16, 2010 9:38 pm    Post subject: Problem. Automatically scroll to end of GtkTextView Reply with quote

Hello. I can not. Three examples are not working.

Code: (C)
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>

void
scroll_to_end(GtkWidget *textview)
{
    GtkTextBuffer *buffer;
    GtkTextIter iter;
    GtkTextMark *mark;
//example 1
   
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(textview));
    gtk_text_buffer_get_end_iter(buffer, &iter );
    gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(textview), &iter, 0.0, FALSE, 0, 0);
//example 2
   
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(textview));
    gtk_text_buffer_get_end_iter (buffer, &iter);
    mark = gtk_text_buffer_get_insert (buffer);
    gtk_text_buffer_place_cursor(buffer, &iter);
    gtk_text_view_scroll_to_mark( GTK_TEXT_VIEW (textview),    mark, 0.0, FALSE, 0.0, 1.0);
//example 3
   
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
    mark = gtk_text_buffer_get_insert(buffer);
    gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark);
    gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(textview), mark);
//this all not works :(
}

gboolean
send_message (GtkWidget *widget, GdkEventKey *event, GtkWidget *chat_textview)
{

    if(event->keyval == GDK_Return)
    {
        gchar             *msg;
        GtkTextBuffer     *buffer;
        GtkTextIter         start_iter;
        GtkTextIter         end_iter;
       
        buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));

        if(gtk_text_buffer_get_char_count(buffer)!=0)
        {
            gtk_text_buffer_get_end_iter(buffer,&end_iter);
            gtk_text_buffer_get_start_iter(buffer,&start_iter);
           
            msg = gtk_text_buffer_get_text (buffer,
                                            &start_iter,
                                            &end_iter,
                                            TRUE);
           
            gtk_text_buffer_delete (buffer,
                                    &start_iter,
                                    &end_iter);

            /* adding sended message to chat_textview*/
           
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(chat_textview));

            gtk_text_buffer_get_end_iter(buffer,&end_iter);
            gtk_text_buffer_insert(buffer,&end_iter, msg,-1);
            gtk_text_buffer_insert(buffer,&end_iter, "\n",-1);

            /* scroll to end of the chat_textview */
           
scroll_to_end(chat_textview);
        }
    return TRUE;
    }
return FALSE;
}

int main(int argc, char** argv)
{
    GtkWidget *window;
    GtkWidget *vbox;
    GtkWidget *chat_textview;
    GtkWidget *input_textview;
    GtkWidget *scroll_win;
   
    gtk_init (&argc, &argv);
   
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 130);
   
    vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    /* chat_textview */
   
chat_textview = gtk_text_view_new();
    scroll_win = gtk_scrolled_window_new(NULL, NULL);
    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll_win), chat_textview);
    gtk_box_pack_start(GTK_BOX(vbox), scroll_win, TRUE, TRUE, 2);
   
    /* input_textview */
   
input_textview = gtk_text_view_new();
    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(input_textview), GTK_WRAP_WORD);
    g_signal_connect(input_textview,
                    "key-press-event",
                    G_CALLBACK(send_message),
                    chat_textview);
    gtk_box_pack_start(GTK_BOX(vbox), input_textview, FALSE, FALSE , 2);
   
    gtk_widget_show_all(window);
    gtk_main ();
    return 0;
}
Back to top
tadeboro
Never Seen the Sunlight


Joined: 23 Jul 2008
Posts: 2114
Location: Slovenia

PostPosted: Tue Mar 16, 2010 9:55 pm    Post subject: Reply with quote

Hello.

Text view has native scrolling ability, so you should add it to viewport using gtk_container_add(). gtk_scrolled_window_add_with_viewport() should be used for non-scrollable widgets.

BTW, for future reference, widgets with native scrolling ability are GtkTextView, GtkTreeView, GtkIconView and GtkViewport.

Tadej
Back to top
bes



Joined: 08 Feb 2010
Posts: 2
Location: Russia

PostPosted: Tue Mar 16, 2010 10:03 pm    Post subject: Reply with quote

Thank you!
Back to top
Display posts from previous:   
Post new topic   Reply to topic    GTK+ Forums Forum Index -> General GTK+ Discussion All times are GMT
Page 1 of 1

 


Powered by phpBB © 2001, 2005 phpBB Group
CodeBB 1.0 Beta 2
Protected by Anti-Spam ACP