Enlightenment CVS committal

Author  : leviathan
Project : e17
Module  : libs/etk-perl

Dir     : e17/libs/etk-perl/xs


Modified Files:
        EtkSignals.h Object.xs Signal.xs 


Log Message:
Fix for signals and callbacks:

Callback functions must return a value now ( 0 = false, any other value is true 
)

===================================================================
RCS file: /cvs/e/e17/libs/etk-perl/xs/EtkSignals.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- EtkSignals.h        3 Jul 2007 19:26:05 -0000       1.1
+++ EtkSignals.h        30 Sep 2007 11:25:44 -0000      1.2
@@ -23,6 +23,7 @@
 struct _Callback_Signal_Data
 {
    char       *signal_name;   /* etk signal name */
+   int        signal_code;   /* etk signal code */
    Etk_Object *object;        /* object signal is connected to */
    SV         *perl_object;   /* reference to the perl object */
    SV         *perl_callback; /* perl callback to be called */
===================================================================
RCS file: /cvs/e/e17/libs/etk-perl/xs/Object.xs,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- Object.xs   29 Sep 2007 20:09:49 -0000      1.2
+++ Object.xs   30 Sep 2007 11:25:44 -0000      1.3
@@ -32,11 +32,14 @@
    call_sv(ncb->perl_callback, G_DISCARD);
 }
 
-static void
+static Etk_Bool
 callback_VOID(Etk_Object *object, void *data)
 {
    dSP;
    Callback_Signal_Data *cbd = NULL;
+   int count;
+   Etk_Bool ret = ETK_TRUE;
+   SV * sv_ret;
 
    cbd = data;
    
@@ -45,14 +48,34 @@
    XPUSHs(sv_2mortal(newSVsv(cbd->perl_data)));
    PUTBACK ;
       
-   call_sv(cbd->perl_callback, G_DISCARD);
+   count = call_sv(cbd->perl_callback, G_SCALAR);
+
+   SPAGAIN;
+
+   if (count == 1) {
+       sv_ret = POPs;
+       if (SvIOK(sv_ret))
+               ret = SvIV(sv_ret);
+       /* Assume true by default */
+       if (ret != ETK_FALSE) ret = ETK_TRUE;
+   }
+
+   PUTBACK;
+   FREETMPS;
+   LEAVE;
+
+   return ret;
+   
 }
 
-static void
+static Etk_Bool
 callback_INT(Etk_Object *object, int value, void *data)
 {
    dSP;
    Callback_Signal_Data *cbd = NULL;
+   int count;
+   Etk_Bool ret = ETK_TRUE;
+   SV * sv_ret;
 
    cbd = data;
 
@@ -62,14 +85,35 @@
    XPUSHs(sv_2mortal(newSVsv(cbd->perl_data)));   
    PUTBACK ;
       
-   call_sv(cbd->perl_callback, G_DISCARD);
+   count = call_sv(cbd->perl_callback, G_SCALAR);
+
+   SPAGAIN;
+
+   if (count == 1) {
+       sv_ret = POPs;
+       if (SvIOK(sv_ret))
+               ret = SvIV(sv_ret);
+       
+       if (ret != ETK_FALSE) ret = ETK_TRUE;
+   }
+
+   PUTBACK;
+   FREETMPS;
+   LEAVE;
+
+   return ret;
+
+
 }
 
-static void
+static Etk_Bool
 callback_DOUBLE(Etk_Object *object, double value, void *data)
 {
    dSP;
    Callback_Signal_Data *cbd = NULL;
+   int count;
+   Etk_Bool ret = ETK_TRUE;
+   SV * sv_ret;
 
    cbd = data;
 
@@ -79,15 +123,35 @@
    XPUSHs(sv_2mortal(newSVsv(cbd->perl_data)));   
    PUTBACK ;
 
-   call_sv(cbd->perl_callback, G_DISCARD);
+   count = call_sv(cbd->perl_callback, G_SCALAR);
+
+   SPAGAIN;
+
+   if (count == 1) {
+       sv_ret = POPs;
+       if (SvIOK(sv_ret))
+               ret = SvIV(sv_ret);
+       
+       if (ret != ETK_FALSE) ret = ETK_TRUE;
+   }
+
+   PUTBACK;
+   FREETMPS;
+   LEAVE;
+
+   return ret;
+
 }
 
-static void
+static Etk_Bool
 callback_POINTER(Etk_Object *object, void *value, void *data)
 {
    dSP;
    Callback_Signal_Data *cbd = NULL;
+   int count;
+   Etk_Bool ret = ETK_TRUE;
    SV *event_rv;
+   SV * sv_ret;
    cbd = data;   
 
    event_rv = GetSignalEvent_POINTER(object, value, cbd);
@@ -98,14 +162,35 @@
    XPUSHs(sv_2mortal(newSVsv(cbd->perl_data)));   
    PUTBACK ;
       
-   call_sv(cbd->perl_callback, G_DISCARD);
+   count = call_sv(cbd->perl_callback, G_SCALAR);
+
+   SPAGAIN;
+
+   if (count == 1) {
+       sv_ret = POPs;
+       if (SvIOK(sv_ret))
+               ret = SvIV(sv_ret);
+       
+       if (ret != ETK_FALSE) ret = ETK_TRUE;
+   }
+
+   PUTBACK;
+   FREETMPS;
+   LEAVE;
+
+   return ret;
+
 }
 
-static void
+static Etk_Bool
 callback_POINTER_POINTER(Etk_Object *object, void *val1, void *val2, void 
*data)
 {
    dSP;
    Callback_Signal_Data *cbd = NULL;
+   int count;
+   Etk_Bool ret = ETK_TRUE;
+   SV * sv_ret;
+
    cbd = data;   
 
    SV * obj1_rv, *event_rv;
@@ -120,14 +205,35 @@
    XPUSHs(sv_2mortal(newSVsv(cbd->perl_data)));   
    PUTBACK ;
       
-   call_sv(cbd->perl_callback, G_DISCARD);
+ 
+   count = call_sv(cbd->perl_callback, G_SCALAR);
+
+   SPAGAIN;
+
+   if (count == 1) {
+       sv_ret = POPs;
+       if (SvIOK(sv_ret))
+               ret = SvIV(sv_ret);
+       
+       if (ret != ETK_FALSE) ret = ETK_TRUE;
+   }
+
+   PUTBACK;
+   FREETMPS;
+   LEAVE;
+
+   return ret;
+
 }
 
-static void
+static Etk_Bool
 callback_INT_INT(Etk_Object *object, int val1, int val2, void *data)
 {
    dSP;
    Callback_Signal_Data *cbd = NULL;
+   int count;
+   Etk_Bool ret = ETK_TRUE;
+   SV * sv_ret;
 
    cbd = data;
 
@@ -138,15 +244,36 @@
    XPUSHs(sv_2mortal(newSVsv(cbd->perl_data)));   
    PUTBACK ;
       
-   call_sv(cbd->perl_callback, G_DISCARD);
+   count = call_sv(cbd->perl_callback, G_SCALAR);
+
+   SPAGAIN;
+
+   if (count == 1) {
+       sv_ret = POPs;
+       if (SvIOK(sv_ret))
+               ret = SvIV(sv_ret);
+       
+       if (ret != ETK_FALSE) ret = ETK_TRUE;
+   }
+
+   PUTBACK;
+   FREETMPS;
+   LEAVE;
+
+   return ret;
+
+
 }
 
 
-static void
+static Etk_Bool
 callback_OBJECT(Etk_Object *object, Etk_Object *obj2, void *data)
 {
    dSP;
    Callback_Signal_Data *cbd = NULL;
+   int count;
+   Etk_Bool ret = ETK_TRUE;
+   SV * sv_ret;
 
    cbd = data;
 
@@ -156,56 +283,93 @@
    XPUSHs(sv_2mortal(newSVsv(cbd->perl_data)));   
    PUTBACK ;
       
-   call_sv(cbd->perl_callback, G_DISCARD);
+   count = call_sv(cbd->perl_callback, G_SCALAR);
+
+   SPAGAIN;
+
+   if (count == 1) {
+       sv_ret = POPs;
+       if (SvIOK(sv_ret))
+               ret = SvIV(sv_ret);
+       
+       if (ret != ETK_FALSE) ret = ETK_TRUE;
+   }
+
+   PUTBACK;
+   FREETMPS;
+   LEAVE;
+
+   return ret;
+
+
 }
 
 
-static Etk_Signal_Callback *
-__etk_signal_connect_full(char *signal_name, SV *object, SV *callback, SV 
*data, Etk_Bool swapped, Etk_Bool after)
+const Etk_Signal_Callback *
+__etk_signal_connect_full(SV *signal, SV *object, SV *callback, SV *data, 
Etk_Bool swapped, Etk_Bool after)
 {
        dSP;
 
        Callback_Signal_Data *cbd = NULL;
+       Etk_Object * obj;
+       const Etk_Signal_Callback * ret = NULL;
+       int signal_code;
+       char * signal_name = NULL;
+       Etk_Type *type = NULL;
        Etk_Signal *sig = NULL;
        Etk_Marshaller marsh;
-       Etk_Object * obj;
 
        ENTER;
        SAVETMPS;
 
        obj = (Etk_Object *)SvObj(object, "Etk::Object");
+       type = etk_object_object_type_get(obj);
 
        cbd = calloc(1, sizeof(Callback_Signal_Data));
-       cbd->signal_name = strdup(signal_name);
        cbd->object = obj;
        cbd->perl_object = newSVsv(object);
        cbd->perl_data = newSVsv(data);
        cbd->perl_callback = newSVsv(callback); 
-       
-       sig = etk_signal_lookup(signal_name, obj->type);
-       if(!sig) printf("CANT GET SIG!\n");
-       marsh = etk_signal_marshaller_get(sig);
 
-       if(marsh == etk_marshaller_VOID)
-         etk_signal_connect_full_by_name(signal_name, obj, 
ETK_CALLBACK(callback_VOID), cbd, swapped, after);
-       else if(marsh == etk_marshaller_INT)
-         etk_signal_connect_full_by_name(signal_name, obj, 
ETK_CALLBACK(callback_INT), cbd, swapped, after);
-       else if(marsh == etk_marshaller_DOUBLE)
-         etk_signal_connect_full_by_name(signal_name, obj, 
ETK_CALLBACK(callback_DOUBLE), cbd, swapped, after);
-       else if(marsh == etk_marshaller_POINTER)
-         etk_signal_connect_full_by_name(signal_name, obj, 
ETK_CALLBACK(callback_POINTER), cbd, swapped, after);
-       else if(marsh == etk_marshaller_INT_INT)
-         etk_signal_connect_full_by_name(signal_name, obj, 
ETK_CALLBACK(callback_INT_INT), cbd, swapped, after);
-       else if(marsh == etk_marshaller_OBJECT)
-         etk_signal_connect_full_by_name(signal_name, obj, 
ETK_CALLBACK(callback_OBJECT), cbd, swapped, after);
-       else if(marsh == etk_marshaller_POINTER_POINTER)
-         etk_signal_connect_full_by_name(signal_name, obj, 
ETK_CALLBACK(callback_POINTER_POINTER), cbd, swapped, after);
-       else
-       etk_signal_connect_full_by_name(signal_name, obj, 
ETK_CALLBACK(callback_VOID), cbd, swapped, after);
+#define S(A) \
+       if ( signal_name == NULL ) \
+               ret = 
etk_signal_connect_full_by_code(signal_code,obj,ETK_CALLBACK(A),cbd,swapped,after);
 \
+       else \
+               ret = 
etk_signal_connect_full_by_name(signal_name,obj,ETK_CALLBACK(A),cbd,swapped,after);
 
+
+
+       if (SvPOK(signal)) {
+               signal_name = SvPV_nolen(signal);
+               cbd->signal_name = strdup(signal_name);
+               sig = etk_type_signal_get_by_name(type, signal_name);
+       } else {
+               signal_code = SvIV(signal);
+               cbd->signal_code = signal_code;
+               sig = etk_type_signal_get(type, signal_code);
+       }
+
+       marsh = etk_signal_marshaller_get(sig);
+       if (marsh == etk_marshaller_VOID) {
+               S(callback_VOID);
+       } else if (marsh == etk_marshaller_INT) {
+               S(callback_INT);
+       } else if (marsh == etk_marshaller_DOUBLE) {
+               S(callback_DOUBLE);
+       } else if (marsh == etk_marshaller_POINTER) {
+               S(callback_POINTER);
+       } else if (marsh == etk_marshaller_POINTER_POINTER) {
+               S(callback_POINTER_POINTER);
+       } else if (marsh == etk_marshaller_OBJECT) {
+               S(callback_OBJECT);
+       } else {
+               S(callback_VOID);
+       }
 
        PUTBACK;
        FREETMPS;
        LEAVE;
+
+       return ret;
 }
 
 
@@ -269,39 +433,41 @@
        Notify=1
 
 
-Etk_Signal_Callback *
-signal_connect(object, signal_name, callback, data=NULL)
+const Etk_Signal_Callback *
+signal_connect(object, signal, callback, data=NULL)
        SV *            object
-       char *          signal_name
+       SV *            signal
        SV *            callback
        SV *            data
       ALIAS:
        SignalConnect=1
        
        CODE:   
-       RETVAL = __etk_signal_connect_full(signal_name, newSVsv(object), 
newSVsv(callback), newSVsv(data), 
-                       ETK_FALSE, ETK_FALSE);
+       RETVAL = __etk_signal_connect_full(signal, newSVsv(object),
+               newSVsv(callback), newSVsv(data), 
+               ETK_FALSE, ETK_FALSE);
        OUTPUT:
        RETVAL
 
-Etk_Signal_Callback *
-signal_connect_after(object, signal_name, callback, data=NULL)
+const Etk_Signal_Callback *
+signal_connect_after(object, signal, callback, data=NULL)
        SV *            object
-       char *          signal_name
+       SV *            signal
        SV *            callback
        SV *            data
       ALIAS:
        SignalConnectAfter=1
        
        CODE:   
-       RETVAL = __etk_signal_connect_full(signal_name, object, callback, data, 
ETK_FALSE, ETK_TRUE);
+       RETVAL = __etk_signal_connect_full(signal, newSVsv(object), 
newSVsv(callback), 
+               newSVsv(data), ETK_FALSE, ETK_TRUE);
        OUTPUT:
        RETVAL
 
-Etk_Signal_Callback * 
-signal_connect_full(object, signal_name, callback, data, swapped, after)
+const Etk_Signal_Callback * 
+signal_connect_full(object, signal, callback, data, swapped, after)
        SV *            object
-       char *          signal_name
+       SV *            signal
        SV *            callback
        SV *            data
        Etk_Bool        swapped
@@ -309,22 +475,24 @@
       ALIAS:
        SignalConnectFull=1
        CODE:
-       RETVAL = __etk_signal_connect_full(signal_name, object, callback, data, 
swapped, after);
+       RETVAL = __etk_signal_connect_full(signal, newSVsv(object), 
newSVsv(callback),
+               newSVsv(data), swapped, after);
        OUTPUT:
        RETVAL
 
        
-Etk_Signal_Callback *
-signal_connect_swapped(object, signal_name, callback, data=NULL)
+const Etk_Signal_Callback *
+signal_connect_swapped(object, signal, callback, data=NULL)
        SV *            object
-       char *          signal_name
+       SV *            signal
        SV *            callback
        SV *            data
       ALIAS:
        SignalConnectSwapped=1
        
        CODE:   
-       RETVAL = __etk_signal_connect_full(signal_name, object, callback, data, 
ETK_TRUE, ETK_FALSE);
+       RETVAL = __etk_signal_connect_full(signal, newSVsv(object), 
newSVsv(callback),
+               newSVsv(data), ETK_TRUE, ETK_FALSE);
        OUTPUT:
        RETVAL
 
===================================================================
RCS file: /cvs/e/e17/libs/etk-perl/xs/Signal.xs,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- Signal.xs   3 Jul 2007 19:26:05 -0000       1.1
+++ Signal.xs   30 Sep 2007 11:25:44 -0000      1.2
@@ -23,9 +23,11 @@
       ALIAS:
        Shutdown=1
 
-void
-etk_signal_stop()
-      ALIAS:
-       Stop=1
+
+const char *
+etk_signal_name_get(signal)
+       Etk_Signal * signal
+       ALIAS:
+       NameGet=1
 
 



-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to