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;
} |