GtkTextView 질문..

wonmanajji의 이미지

GtkTextView에서요.. 어느 방법을 써야
이전에 있던 내용들이 보존이 되면서 새로운 내용이 아래에 써지나요?

간단한 채팅프로그램을 만들고 있는데.. 엔트리에서 값을 받아다가
텍스트뷰에 올리면 이전내용이 지워져 버려서요..

어느걸 참조해야 할까요.

wonmanajji의 이미지

아래 소스좀 봐주시구요..
아무리 해도 않되네요.. 텍스트뷰에 있는 내용을 계속 가지고 가려면 어떻게 해야하는지..
소스는 제가 워낙 초보라서 엉망일텐데... 부탁드립니다부탁드립니다
서버는 따로 있구요.. 아랜 클라이언트 소스입니다..

      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(&gtkmain_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 }

바람이분다..
그래 살아야겠다..

ins878의 이미지

gtk_text_buffer_set_text와 같이 gtk에서 set_text 이름을 가진 함수의 경우 이전의 내용을 모두 지우고 새로운 text값을 집어 넣을때 사용합니다.
아마도 insert_text 이름을 가진 함수들를 사용해야 할 것 같은데...

gtk사이트에 들어가서 API Reference Manual를 참조하세요. 아마 거기에 insert_text 어쩌고 저쩌고 있을 것 같은데...

cinsk의 이미지

text buffer에서 iterator를 만들고, 이 것이 text buffer 끝을 가리키게 한 다음, text view에서 insert text with iterator와 비슷한 함수를 써서 집어 넣으면 됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.