/** signames.c **/ #include typedef struct SigDescStruct { struct SigDescStruct *left; struct SigDescStruct *right; gchar *signal_name; gchar *type_name; gchar *parent_type_name; gchar *fn; } SigDesc; static SigDesc *sigdesc = NULL; static gchar last_name_printed[100] = ""; static void load_signals(); static void add_siglist(const gchar *signal_name, const gchar *type_name, const gchar *parent_type_name,const gchar *fn); static void add_sigdesc_to_tree(SigDesc *new, SigDesc *node); static void print_signals(SigDesc *sd,FILE *file); static gchar *inheritance(GtkType type); void signames(FILE *file) { load_signals(); print_signals(sigdesc,file); } static void widget_list() { gtk_button_new(); gtk_calendar_new(); } int main(int argc,char *argv[]) { gnome_init("signames","1.0",argc,argv); widget_list(); signames(stdout); exit(0); } static void load_signals() { gint i = 0; gint j; gchar *type_name; gchar *parent_type_name; gchar *return_type_name; gchar *param_name; gchar fn[256]; GtkSignalQuery *q; while((q = gtk_signal_query(++i)) != NULL) { type_name = gtk_type_name(q->object_type); return_type_name = gtk_type_name(q->return_val); parent_type_name = inheritance(q->object_type); sprintf(fn,"%s cb(GtkWidget *",return_type_name); for(j=0; jnparams; j++) { param_name = gtk_type_name(q->params[j]); strcat(fn,","); strcat(fn,param_name); } strcat(fn,",gpointer)"); add_siglist(q->signal_name,type_name, parent_type_name,fn); } } static void add_siglist(const gchar *signal_name, const gchar *type_name, const gchar *parent_type_name,const gchar *fn) { SigDesc *new_sigdesc; new_sigdesc = g_malloc(sizeof(SigDesc)); new_sigdesc->signal_name = g_malloc(strlen(signal_name)+1); strcpy(new_sigdesc->signal_name,signal_name); new_sigdesc->type_name = g_malloc(strlen(type_name)+1); strcpy(new_sigdesc->type_name,type_name); new_sigdesc->fn = g_malloc(strlen(fn)+1); strcpy(new_sigdesc->fn,fn); if(parent_type_name == NULL) { new_sigdesc->parent_type_name = NULL; } else { new_sigdesc->parent_type_name = g_malloc(strlen(parent_type_name)+1); strcpy(new_sigdesc->parent_type_name, parent_type_name); } new_sigdesc->left = NULL; new_sigdesc->right = NULL; if(sigdesc == NULL) { sigdesc = new_sigdesc; } else { add_sigdesc_to_tree(new_sigdesc,sigdesc); } } static void add_sigdesc_to_tree(SigDesc *new,SigDesc *node) { int cond; if((cond = strcmp(new->type_name, node->type_name)) < 0) { if(node->left == NULL) node->left = new; else add_sigdesc_to_tree(new,node->left); } else if(cond > 0) { if(node->right == NULL) node->right = new; else add_sigdesc_to_tree(new,node->right); } else if((cond = strcmp(new->signal_name, node->signal_name)) < 0) { if(node->left == NULL) node->left = new; else add_sigdesc_to_tree(new,node->left); } else if(cond > 0) { if(node->right == NULL) node->right = new; else add_sigdesc_to_tree(new,node->right); } } static void print_signals(SigDesc *sd,FILE *file) { int i; int j; gchar string[256]; if(sd != NULL) { print_signals(sd->left,file); if(strcmp(last_name_printed,sd->type_name)) { fprintf(file,"\n%s (->%s)\n", sd->type_name,sd->parent_type_name); strcpy(last_name_printed,sd->type_name); } sprintf(string," \"%s\" %s", sd->signal_name,sd->fn); if(strlen(string) > 63) { for(i=63; i>0; i--) { if(string[i] == ',') { for(j = strlen(string); j > i; j--) string[j+9] = string[j]; string[i+1] = '\n'; for(j=2; j<10; j++) string[j+i] = ' '; break; } } } fprintf(file,"%s\n",string); print_signals(sd->right,file); } } static gchar *inheritance(GtkType type) { GtkType parent_type; gchar *parent_type_name; static gchar string[256]; string[0] = '\0'; while(1) { parent_type = gtk_type_parent(type); parent_type_name = gtk_type_name(parent_type); if(parent_type_name == NULL) break; if(strlen(string) > 1) { strcat(string,"->"); strcat(string,parent_type_name); } else { strcpy(string,parent_type_name); } type = parent_type; } if(strlen(string) > 1) return(string); return("none"); }