#include typedef long CleanInt; void *safe_malloc(size_t n) { void *ptr=malloc (n); if (ptr==NULL) perror ("malloc"); return ptr; } struct clean_g_signal { GtkWidget *target; CleanInt id; struct clean_g_signal *next; }; static struct clean_g_signal *signal_queue=NULL; static struct clean_g_signal *last_signal=NULL; static struct clean_g_signal *clean_g_signal_push (void) { struct clean_g_signal *signal=safe_malloc (sizeof(struct clean_g_signal)); if (last_signal!=NULL) last_signal->next=signal; else if (signal_queue==NULL) signal_queue=signal; last_signal=signal; return signal; } struct clean_g_signal *clean_g_signal_pop (void) { struct clean_g_signal *signal=signal_queue; if (signal_queue==NULL) last_signal=NULL; signal_queue=NULL; return signal; } static void clean_g_signal_handler_void (GtkWidget *target,gpointer data) { struct clean_g_signal *signal=clean_g_signal_push(); signal->target=target; signal->id=(CleanInt)data; } void clean_g_signal_connect_void (GtkWidget *widget,char *signal,CleanInt id) { g_signal_connect (widget,signal,G_CALLBACK (clean_g_signal_handler_void),(gpointer)id); }