diff options
Diffstat (limited to 'src/clean_gtk_support.c')
-rw-r--r-- | src/clean_gtk_support.c | 64 |
1 files changed, 27 insertions, 37 deletions
diff --git a/src/clean_gtk_support.c b/src/clean_gtk_support.c index c725dfd..f1672ed 100644 --- a/src/clean_gtk_support.c +++ b/src/clean_gtk_support.c @@ -2,52 +2,42 @@ typedef long CleanInt; -void *safe_malloc(size_t n) { +extern CleanInt handleSignal (CleanInt,CleanInt*); + +static 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; +static void clean_g_signal_handler_void (GtkWidget *target,gpointer data) { + CleanInt args[2]; + args[0]=0; + handleSignal ((CleanInt)data,&args[2]); } -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 CleanInt clean_g_signal_handler_int_int_pointer_pointer_bool + (GtkWidget *target,gint i1,gint i2,gpointer p1,gpointer p2,gpointer data) { + CleanInt args[6]; + args[0]=4; + args[2]=i1; + args[3]=i2; + args[4]=(CleanInt)p1; + args[5]=(CleanInt)p2; + return handleSignal ((CleanInt)data,&args[2]); } -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 (int type,GtkWidget *widget,char *signal,CleanInt id) { + void *callback=NULL; + + switch (type) { + case 1: callback=&clean_g_signal_handler_void; break; + case 2: callback=&clean_g_signal_handler_int_int_pointer_pointer_bool; break; + default: + fprintf (stderr,"clean_g_signal_connect: illegal type %d\n",type); + return; + } -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); + g_signal_connect (widget,signal,G_CALLBACK (callback),(gpointer)id); } |