summaryrefslogtreecommitdiff
path: root/src/clean_gtk_support.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/clean_gtk_support.c')
-rw-r--r--src/clean_gtk_support.c64
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);
}