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