From 3b6a396b2f87ad40df39c22eed5175df80d843f3 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Tue, 22 Oct 2019 21:55:08 +0200 Subject: Restructure signal handling: callbacks cannot be delayed because they may have pointer arguments referring to the stack; also, some callbacks expect a return value --- src/clean_gtk_support.c | 64 +++++++++++++++++++++---------------------------- 1 file changed, 27 insertions(+), 37 deletions(-) (limited to 'src/clean_gtk_support.c') 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); } -- cgit v1.2.3