GtkTextView에서요.. 어느 방법을 써야 이전에 있던 내용들이 보존이 되면서 새로운 내용이 아래에 써지나요?
간단한 채팅프로그램을 만들고 있는데.. 엔트리에서 값을 받아다가 텍스트뷰에 올리면 이전내용이 지워져 버려서요..
어느걸 참조해야 할까요.
아래 소스좀 봐주시구요.. 아무리 해도 않되네요.. 텍스트뷰에 있는 내용을 계속 가지고 가려면 어떻게 해야하는지.. 소스는 제가 워낙 초보라서 엉망일텐데... 부탁드립니다부탁드립니다 서버는 따로 있구요.. 아랜 클라이언트 소스입니다..
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <arpa/inet.h> 6 #include <sys/types.h> 7 #include <sys/socket.h> 8 #include <pthread.h> 9 #include <gtk/gtk.h> 10 #include <locale.h> 11 12 #define _(text) gettext(text) 13 14 #define BUFSIZE 1024 15 #define NAMESIZE 20 16 #define PORT 9999 17 18 void* send_message(void* arg); 19 void* recv_message(void* arg); 20 void error_message(char* message); 21 22 void w_get_text(GtkWidget *widget, gpointer data); 23 24 GtkWidget* create_window1(void); 25 26 char s_message[BUFSIZE]; 27 char r_message[BUFSIZE]; 28 //char *s_message; 29 //char *r_message; 30 31 // 윈도우 생성 관련 위젯들 32 GtkWidget *window1; 33 GtkWidget *vbox1; 34 GtkWidget *scrolledwindow1; 35 GtkWidget *textview1; 36 GtkWidget *entry1; 37 38 39 int main(int argc, char *argv[]) 40 { 41 int sock; 42 struct sockaddr_in serv_addr; 43 pthread_t snd_thread, rcv_thread, gtkmain_thread; 44 void* thread_result; 45 46 GtkWidget *window; 47 48 gtk_init(&argc, &argv); 49 50 window = create_window1(); 51 gtk_widget_show(window); 52 53 54 sock = socket(PF_INET, SOCK_STREAM, 0); 55 if(sock < 0) 56 error_message("socket() error"); 57 58 memset(&serv_addr, 0, sizeof(serv_addr)); 59 serv_addr.sin_family=AF_INET; 60 serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); 61 serv_addr.sin_port=htons(PORT); 62 63 if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) 64 error_message("connect() error"); 65 66 67 pthread_create(&snd_thread, NULL, send_message, (void*)sock); 68 pthread_create(&rcv_thread, NULL, recv_message, (void*)sock); 69 pthread_create(>kmain_thread, NULL, (void*)gtk_main, NULL); 70 71 pthread_join(snd_thread, &thread_result); 72 pthread_join(rcv_thread, &thread_result); 73 pthread_join(gtkmain_thread, &thread_result); 74 75 close(sock); 76 //free(&r_message); 77 //free(&s_message); 78 return 0; 79 } 80 81 GtkWidget* create_window1(void) 82 { 83 window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL); 84 g_signal_connect(window1, "delete_event", G_CALLBACK(gtk_main_quit), NULL); 85 gtk_window_set_title(GTK_WINDOW(window1), "client"); 86 gtk_window_set_resizable (GTK_WINDOW (window1), FALSE); 87 88 vbox1 = gtk_vbox_new (FALSE, 0); 89 gtk_widget_show (vbox1); 90 gtk_container_add (GTK_CONTAINER (window1), vbox1); 91 92 scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL); 93 gtk_widget_show (scrolledwindow1); 94 gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow1, TRUE, TRUE, 0); 95 96 textview1 = gtk_text_view_new (); 97 gtk_widget_show (textview1); 98 gtk_container_add (GTK_CONTAINER (scrolledwindow1), textview1); 99 gtk_widget_set_size_request (textview1, 200, 300); 100 gtk_text_view_set_editable (GTK_TEXT_VIEW (textview1), FALSE); 101 //gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (textview1), GTK_WRAP_WORD); 102 103 entry1 = gtk_entry_new (); 104 g_signal_connect(entry1, "activate", G_CALLBACK(w_get_text), entry1); 105 106 gtk_widget_show (entry1); 107 gtk_box_pack_start (GTK_BOX (vbox1), entry1, FALSE, FALSE, 0); 108 109 return window1; 110 } 111 112 113 void w_get_text(GtkWidget *widget, gpointer data) 114 { 115 GtkTextBuffer *buffer; 116 GtkTextIter iter; 117 GtkTextIter start, end; 118 GtkTextMark mark; 119 int str_len; 120 121 122 123 memset(&s_message, 0, sizeof(s_message)); 124 sprintf(s_message, "%s", gtk_entry_get_text(GTK_ENTRY(data))); 125 str_len = strlen(s_message); 126 s_message[str_len] = '\n'; 127 gtk_entry_set_text(GTK_ENTRY(data), ""); 128 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview1)); 129 //gtk_text_buffer_get_end_iter(buffer, &end); 130 gtk_text_buffer_get_iter_at_offset(buffer, &iter, -1); 131 gtk_text_buffer_insert(buffer, &iter, s_message, -1); 132 gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(textview1), gtk_text_buffer_get_insert(buffer), 0.02, FA 133 //gtk_text_buffer_set_text(buffer, s_message, -1); 134 } 135 136 137 138 //메제지 전송 쓰레드 실행 함수 139 void* send_message(void* arg) 140 { 141 int sock = (int)arg; 142 int str_len; 143 144 while(1){ 145 if( (str_len=strlen(s_message)) != 0 ){ 146 write(sock, s_message, strlen(s_message)); 147 memset(&s_message, 0, sizeof(s_message)); 148 } 149 } 150 } 151 152 void* recv_message(void* arg) 153 { 154 GtkTextBuffer *buffer; 155 int sock = (int)arg; 156 int str_len; 157 while(1){ 158 memset(&r_message, 0, sizeof(r_message)); 159 str_len = read(sock, r_message, BUFSIZE-1); 160 if(str_len == -1) 161 continue; 162 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview1)); 163 gtk_text_buffer_set_text(buffer, r_message, strlen(r_message)); 164 } 165 } 166 167 void error_message(char *message) 168 { 169 fputs(message, stderr); 170 fputc('\n', stderr); 171 exit(1); 172 }
바람이분다.. 그래 살아야겠다..
gtk_text_buffer_set_text와 같이 gtk에서 set_text 이름을 가진 함수의 경우 이전의 내용을 모두 지우고 새로운 text값을 집어 넣을때 사용합니다. 아마도 insert_text 이름을 가진 함수들를 사용해야 할 것 같은데...
gtk사이트에 들어가서 API Reference Manual를 참조하세요. 아마 거기에 insert_text 어쩌고 저쩌고 있을 것 같은데...
text buffer에서 iterator를 만들고, 이 것이 text buffer 끝을 가리키게 한 다음, text view에서 insert text with iterator와 비슷한 함수를 써서 집어 넣으면 됩니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html Korean Ver: http://cinsk.github.io/cfaqs/
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
소스 올려요..
아래 소스좀 봐주시구요..
아무리 해도 않되네요.. 텍스트뷰에 있는 내용을 계속 가지고 가려면 어떻게 해야하는지..
소스는 제가 워낙 초보라서 엉망일텐데... 부탁드립니다부탁드립니다
서버는 따로 있구요.. 아랜 클라이언트 소스입니다..
바람이분다..
그래 살아야겠다..
gtk_text_buffer_set_text와 같이 gtk에서 set_t
gtk_text_buffer_set_text와 같이 gtk에서 set_text 이름을 가진 함수의 경우 이전의 내용을 모두 지우고 새로운 text값을 집어 넣을때 사용합니다.
아마도 insert_text 이름을 가진 함수들를 사용해야 할 것 같은데...
gtk사이트에 들어가서 API Reference Manual를 참조하세요. 아마 거기에 insert_text 어쩌고 저쩌고 있을 것 같은데...
text buffer에서 iterator를 만들고, 이 것이 text b
text buffer에서 iterator를 만들고, 이 것이 text buffer 끝을 가리키게 한 다음, text view에서 insert text with iterator와 비슷한 함수를 써서 집어 넣으면 됩니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기