Recently,I  am working on a configuration for an graphical application,which 
contains strings ,pixbuf(image).When I add double click function for the node 
,it's can work.But  the top node in response to "double click" too.How can I 
set the top node insensitive.See the function "void view_onRowActivated 
(GtkTreeView *treeview,GtkTreePath *path,GtkTreeViewColumn *col,gpointer 
userdata)" in the attachment.
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <gtk/gtk.h>
#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <gdk/gdkx.h>
#define SERVER_PORT 3333
#define MAX_MSG_SIZE 1024 
char msg[MAX_MSG_SIZE];
void PackNewlabel(GtkWidget *box,char *sLabel);
void PackNewcombo(GtkWidget *box);
GtkWidget* PackNewentry_chat(GtkWidget *box);
void PackNewbatton0(GtkWidget *box,char *button_name);
void PackNewbatton1(GtkWidget *box,char *button_name);
GtkWidget *create_view_and_model ();
GtkTreeModel *create_and_fill_model ();
void  on_changed(GtkWidget *widget, gpointer statusbar) ;
void event_close();
//void select_file_activated(GtkWidget *widget);
void view_onRowActivated (GtkTreeView *treeview,GtkTreePath 
*path,GtkTreeViewColumn *col,gpointer userdata);
const char* button_event_chat(GtkWidget *widget,gpointer *data);
GtkWidget *name_chat;
GtkWidget *button1;
GtkTreeStore *treestore;  
GtkTreeIter toplevel, child; 
void udp_server(void);
void udps_respon(int sockfd);
void treeclose(GtkWidget *widget,gpointer *data);


extern const char* getip();
extern void UIGetUsrInfo(void *arg);
extern int UIGetUsrInfo_auto(void *arg);
extern int Mysql_newtable (char *a);
extern int  Mysql_find_p();
extern int Mysql_insert_p(char *friendip);
extern void showmsg(char * msg,char*c);
extern int clientrecvfile();
//extern int udp_client_logout();
extern int udp_client(char *text,const char *IP) ;
GData *widget_chat_dlg;
extern struct Widgets_Chat
{
        
        GtkWidget *chat_dlg;
        GtkWidget *textview_output, *textview_input;
}arg2;
void redraw();
void redelete();
enum
{  
        LIST_ICON=0,//explain picture
        LIST_NAME,//explain name 
        COLUMN , // explain text
        NUM_COLS
};
struct argument
{
    char valueip[17];
}arg1;
int tree_view()
{
          gdk_threads_enter();
          int res;
          pthread_t b_thread;
    res=pthread_create(&b_thread,NULL,udp_server,NULL);
    if(res<0)
    {
                printf("pthread create failed");
                exit(1);
    }
    GtkWidget *window;
    GtkWidget *box;
    GtkWidget *view;  
          GtkTreeSelection *selection;
          GtkWidget *statusbar;    
    
   
  
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    
gtk_signal_connect(GTK_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
 /*µÇ¼ÇdestroyÐźţ¬µ÷ÓÃÍ˳öº¯Êý*/
    
    box=gtk_vbox_new(FALSE,2);
    PackNewlabel(box,"NO.6_chat_program");
    PackNewcombo(box);
    PackNewlabel(box,"Please Input IP");
    PackNewentry_chat(box);
    PackNewbatton1(box,"add");
    
gtk_signal_connect(GTK_OBJECT(button1),"pressed",G_CALLBACK(button_event_chat),NULL);
    
    
    gtk_container_add(GTK_CONTAINER(window),box); /*°Ñ×é×°ºÐ·ÅÈë´°Ìå*/
    gtk_widget_set_size_request(window, 250, 400);
    view = create_view_and_model();  
          selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));  
          gtk_box_pack_start(GTK_BOX(box), view, TRUE, TRUE, 1);  
          PackNewbatton0(box,"set");
          
          statusbar = gtk_statusbar_new();  
          gtk_box_pack_start(GTK_BOX(box), statusbar, FALSE, TRUE, 1);  
           

          g_signal_connect(selection, "changed",G_CALLBACK(on_changed), 
statusbar); 
    
    g_signal_connect(view, "row-activated", G_CALLBACK(view_onRowActivated), 
NULL);


    gtk_widget_show(box); /*ʹ×é×°ºÐ¿ÉÊÓ*/
    gtk_widget_show_all(window);/*ʹ´°Ìå¿É¼û*/

    gtk_main();
    gdk_threads_leave();
    
    return 1;

}
void PackNewlabel(GtkWidget *box,char *sLabel)
{
        
        GtkWidget *label;
        label=gtk_label_new(sLabel);/*½¨Á¢±êºÅ*/
        gtk_box_pack_start(GTK_BOX(box),label,FALSE,FALSE,0); 
/*°Ñ±êÇ©¿Ø¼þ¼ÓÈë×é×°ºÐ*/
  gtk_widget_show(label);
}
void PackNewcombo(GtkWidget *box)
{
        GtkWidget *combo;
        combo=gtk_combo_new();
        GList *glist=NULL;
  glist=g_list_append(glist,"please choose your station"); /*Ìí¼Ó×Ö·û´®µ½Á´±í*/
  glist=g_list_append(glist,"online");
  glist=g_list_append(glist,"busy");
  glist=g_list_append(glist,"free");
  gtk_combo_set_popdown_strings(GTK_COMBO(combo),glist);
  gtk_box_pack_start(GTK_BOX(box),combo,FALSE,FALSE,0); 
/*°Ñcombo¿Ø¼þ¼ÓÈë×é×°ºÐ*/
  gtk_widget_show(combo);
}
GtkWidget *create_view_and_model ()
        {  
                GtkTreeViewColumn *col;  
                GtkCellRenderer *renderer_text;//explain text
                GtkCellRenderer *renderer_icon;// explain picture 
                GtkCellRenderer *renderer_name;//explain name
                GtkWidget *view; 
                GtkTreeModel *model; //Õâ±ßÒª²»Òª¸Ä³ÉÈ«¾Ö±äÁ¿£¿ 
          view = gtk_tree_view_new();  
                col = gtk_tree_view_column_new();  
                gtk_tree_view_column_set_title(col, "YOUR GROUP");  
                gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);  
                renderer_text=gtk_cell_renderer_text_new();//explain text
                renderer_icon=gtk_cell_renderer_pixbuf_new();//explain picture
    renderer_name=gtk_cell_renderer_text_new();//explain name
    
    gtk_tree_view_column_pack_start(col,renderer_icon,FALSE);//add picture col
     gtk_tree_view_column_pack_start(col, renderer_name, TRUE); //add name col
     gtk_tree_view_column_pack_start(col, renderer_text, TRUE); //add text col 
   
                
gtk_tree_view_column_add_attribute(col,renderer_icon,"pixbuf",LIST_ICON);//add 
picture to col
     gtk_tree_view_column_add_attribute(col, renderer_name,"text",LIST_NAME 
);//add name  to col
     gtk_tree_view_column_add_attribute(col, renderer_text,"text", 
COLUMN);//add text  to col
   
    
                model = create_and_fill_model();  
                gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);  
                g_object_unref(model);   
                return view;
}
GtkTreeModel *create_and_fill_model ()
{  
        GdkPixbuf *pixbuf;
  const gchar *files[]={"./newface/1.bmp"};

  pixbuf = gdk_pixbuf_new_from_file(files[0],NULL);

        treestore = 
gtk_tree_store_new(NUM_COLS,GDK_TYPE_PIXBUF,G_TYPE_STRING,G_TYPE_STRING);  
        gtk_tree_store_append(treestore, &toplevel, NULL);  
        gtk_tree_store_set(treestore, &toplevel,COLUMN, "Myself",-1);  
        gtk_tree_store_append(treestore, &child, &toplevel);  
        gtk_tree_store_set(treestore, 
&child,LIST_ICON,pixbuf,LIST_NAME,"yourself",COLUMN, getip() ,-1);
        gtk_tree_store_append(treestore, &toplevel, NULL);  
        gtk_tree_store_set(treestore, &toplevel,COLUMN, "YourfFriends",-1);  
        return GTK_TREE_MODEL(treestore);
}
void  on_changed(GtkWidget *widget, gpointer statusbar) 
{  
        GtkTreeIter iter;  
        GtkTreeModel *model;  
        char *value;  
        if 
(gtk_tree_selection_get_selected(GTK_TREE_SELECTION(widget),&model,&iter)) 
                {    
                        gtk_tree_model_get(model, &iter, COLUMN, &value,  -1);  
  
                        gtk_statusbar_push(GTK_STATUSBAR(statusbar),        
                        
gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar),value), value);    
                        g_free(value);  
                }
}
void PackNewbatton0(GtkWidget *box,char*button_name)
{
            GtkWidget *button;
            button=gtk_button_new_with_label(button_name);
            gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0); 
/*°Ñ°´Å¥¼ÓÈë×é×°ºÐ*/
            gtk_widget_show(button); 
}
void PackNewbatton1(GtkWidget *box,char*button_name)
{
          
            button1=gtk_button_new_with_label(button_name);
            gtk_box_pack_start(GTK_BOX(box),button1,FALSE,FALSE,0); 
/*°Ñ°´Å¥¼ÓÈë×é×°ºÐ*/
            gtk_widget_show(button1); 
}
void view_onRowActivated (GtkTreeView *treeview,GtkTreePath 
*path,GtkTreeViewColumn *col,gpointer userdata)
{      
             GtkTreeIter iter;  
             GtkTreeModel *model;  
             char *value;//ip
             char *value_name; //name
       
       
       
      
       
             pthread_t c_thread[100];
             int j=0;
             int res;
             model = gtk_tree_view_get_model(treeview);    
             if (gtk_tree_model_get_iter(model, &iter, path))
        {
                   gtk_tree_model_get(model, &iter, COLUMN, &value,LIST_NAME, 
&value_name,  -1);
             if(Mysql_find_p(value)==0)
                {  
                         
                         strcpy(arg1.valueip,value);
                         g_print("chat2%s\n",arg1.valueip);
                 res=pthread_create(&(c_thread[j]),NULL,UIGetUsrInfo_auto,(void 
*)&arg1);
                 j++;
                 Mysql_newtable (value);
                 Mysql_insert_p(value);
               if(res<0)
                   {
                            printf("pthread create failed");
                          exit(1);
                                  }
                                  
                                  g_free(value);
                                  g_free(value_name);
                                  //pthread_join (c_thread[j], NULL);
                                 }
                          }
}
GtkWidget* PackNewentry_chat(GtkWidget *box)
{
           
           name_chat=gtk_entry_new();/*´´½¨Â¼Èë¹¹¼þ*/

     
gtk_box_pack_start(GTK_BOX(box),name_chat,FALSE,FALSE,5);/*°Ñ¼Èë¹¹¼þ¼ÓÈë×éºÏ¿ò*/

     gtk_widget_show(name_chat);/*ÏÔʾ¼Èë¹¹¼þ*/
     return name_chat;
}
const char* button_event_chat(GtkWidget *widget,gpointer *data)
{
           GdkPixbuf *pixbuf;
     const gchar *files[]={"./newface/2.bmp"};

     pixbuf = gdk_pixbuf_new_from_file(files[0],NULL);
           const char *uname;
           uname=(char *)malloc(sizeof(gchar));
     uname=gtk_entry_get_text(GTK_ENTRY(name_chat));/*»ñµÃ¼Èë¹¹¼þÕýÎÄ*/
     
           gtk_tree_store_append(treestore, &child, &toplevel);  
           gtk_tree_store_set(treestore, 
&child,LIST_ICON,pixbuf,LIST_NAME,"Yourfriends",COLUMN, uname ,-1);
}
void udp_server(void) 
{ 
        int sockfd; 
        struct sockaddr_in addr; 

        /* ·þÎñÆ÷¶Ë¿ªÊ¼½¨Á¢socketÃèÊö·û */ 
        sockfd=socket(AF_INET,SOCK_DGRAM,0); 
        if(sockfd<0) 
        { 
                fprintf(stderr,"Socket Error:%s\n",strerror(errno)); 
                exit(1); 
        } 

        /* ·þÎñÆ÷¶ËÌî³ä sockaddr½á¹¹ */ 
        bzero(&addr,sizeof(struct sockaddr_in)); 
        addr.sin_family=AF_INET; 
        addr.sin_addr.s_addr=htonl(INADDR_ANY); 
        addr.sin_port=htons(SERVER_PORT); 

        /* À¦°ósockfdÃèÊö·û */ 
        if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0) 
        { 
                fprintf(stderr,"Bind Error:%s\n",strerror(errno)); 
                exit(1); 
        } 

        udps_respon(sockfd); // ½øÐжÁд²Ù×÷
        close(sockfd); 
} 
void udps_respon(int sockfd) 
{ 
        struct sockaddr_in addr; 
        int addrlen,n; 
        pthread_t d_thread[100];
  int j=0;
        int res;
        while(1) 
        {       /* ´ÓÍøÂçÉ϶Á,²¢Ð´µ½ÍøÂçÉÏ */ 
                bzero(msg,sizeof(msg)); // ³õʼ»¯,ÇåÁã
                addrlen = sizeof(struct sockaddr); 
                n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,(struct 
sockaddr*)&addr,&addrlen); // ´Ó¿Í»§¶Ë½ÓÊÕÏûÏ¢
                
                /* ÏÔʾ·þÎñ¶ËÒѾ­ÊÕµ½ÁËÐÅÏ¢ */ 
          printf("Server have received %s\n",msg);
          char msg_type = msg[0];

         switch (msg_type)
         {
           case '1':
                 redraw();
                 char *a=(char*)malloc(sizeof(char)*17);
                 strcpy(a,getip());
                 g_print("%s",a);
                 a[0]='2';
                 sleep(2);
                 udp_client(a,(const char *)msg);
                 free(a);
                 break;
                 case '2':
                 msg[0]='1';
                 redraw();
                 break;
                 case '9':
                 printf("pareare recv");
                 clientrecvfile();
                 break;
           default:
           printf("receive c connection from %s\n",inet_ntoa(addr.sin_addr));
           char *ip_auto=(char*)malloc(sizeof(char)*17);
           strcpy(ip_auto,inet_ntoa(addr.sin_addr));
                 if(Mysql_find_p(inet_ntoa(addr.sin_addr))==0)
                         {
                                struct argument arg;
                            strcpy(arg.valueip,ip_auto);
                            g_print("%s",arg.valueip);
                            
res=pthread_create(&(d_thread[j]),NULL,UIGetUsrInfo_auto,(void*)&arg);
                            showmsg(msg,ip_auto);
                            Mysql_newtable (ip_auto);
          Mysql_insert_p(ip_auto);
                            if(res<0)
          {
                printf("pthread create failed");
                    exit(1);
                            }
                        }
                        else
                                {
                                          showmsg(msg,ip_auto);
                                }
                                //free(ip_auto);
                        break;
                     
                           //showmsg(msg,inet_ntoa(addr.sin_addr));       
          }
          msg[n]='\0'; // ÏÔʾÏûÏ¢
           
           
        } 
} 
void redraw()
{
           GdkPixbuf *pixbuf;
     const gchar *files[]={"./newface/2.bmp"};
     pixbuf = gdk_pixbuf_new_from_file(files[0],NULL);
           gtk_tree_store_append(treestore, &child, &toplevel);  
           gtk_tree_store_set(treestore, 
&child,LIST_ICON,pixbuf,LIST_NAME,"Yourfriends",COLUMN, msg,-1);
}
/*void redelete()
{
          msg[0]='1';
          int valid;
          valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(treestore), 
&toplevel);
   gtk_tree_store_append(treestore, &child, &toplevel);
    
   while(valid)
    {
        gchar *strr;
        
        gtk_tree_model_get(GTK_TREE_MODEL(treestore),&child,COLUMN,&strr,-1);
        if(strcmp(strr , msg) == 0) {
            gtk_tree_store_remove(GTK_TREE_STORE(treestore), &child);
            break;
        }
        valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(treestore), 
&child);//ÏÈÅжÏÊÇ·ñµ½½áβ
    }
}*/
/*void treeclose(GtkWidget *widget,gpointer *data)
{ 
    int res;
    pthread_t c_thread;
    res=pthread_create(&c_thread,NULL,udp_client_logout,NULL);
    if(res<0)
        {
                printf("pthread create failed");
                exit(1);
        }
    gtk_main_quit();
}*/
        
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to