Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto
Dir : e17/proto/etk-perl Modified Files: Etk.xs Makefile.PL Log Message: - add tree fiield get functions - more tree work - more tree test work - add tree compare cb C / XS code - reformat / rename data structs - some docs =================================================================== RCS file: /cvs/e/e17/proto/etk-perl/Etk.xs,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- Etk.xs 9 Jun 2006 08:02:03 -0000 1.8 +++ Etk.xs 10 Jun 2006 16:42:26 -0000 1.9 @@ -10,185 +10,298 @@ #include "const-c.inc" -typedef struct _Callback_Data Callback_Data; -struct _Callback_Data +typedef struct _Callback_Signal_Data Callback_Signal_Data; +typedef struct _Callback_Tree_Compare_Data Callback_Tree_Compare_Data; +typedef struct _Callback_Timer_Data Callback_Timer_Data; + +/* Carries info for normal signals */ +struct _Callback_Signal_Data +{ + char *signal_name; /* etk signal name */ + Etk_Object *object; /* object signal is connected to */ + SV *perl_callback; /* perl callback to be called */ + void *perl_data; /* perl data to pass to the perl callback */ +}; + +/* Carries info for tree (column) compare callback */ +struct _Callback_Tree_Compare_Data +{ + Etk_Object *object; /* the column */ + SV *perl_callback; /* perl function that does the comparison */ + SV *perl_data; /* data to be passed to the above function */ +}; + +/* Carries info when we have a timer callback */ +struct _Callback_Timer_Data { - char *signal_name; - Etk_Object *object; - SV * sv; - void (*cb)(void); - void *data; + SV *perl_callback; /* the perl callback to call per timer tick */ + SV *perl_data; /* data to pass to the perl callback */ }; static void callback_VOID__VOID(Etk_Object *object, void *data) { dSP; - Callback_Data *cbd = NULL; + Callback_Signal_Data *cbd = NULL; cbd = data; PUSHMARK(SP); - XPUSHs(sv_2mortal(newSVsv(cbd->data))); + XPUSHs(sv_2mortal(newSVsv(cbd->perl_data))); PUTBACK ; /* Call the Perl sub */ - call_sv(cbd->sv, G_DISCARD); + call_sv(cbd->perl_callback, G_DISCARD); } static void callback_VOID__INT(Etk_Object *object, int value, void *data) { dSP; - Callback_Data *cbd = NULL; + Callback_Signal_Data *cbd = NULL; cbd = data; PUSHMARK(SP) ; XPUSHs(sv_2mortal(newSViv(value))); - XPUSHs(sv_2mortal(newSVsv(cbd->data))); + XPUSHs(sv_2mortal(newSVsv(cbd->perl_data))); PUTBACK ; /* Call the Perl sub */ - call_sv(cbd->sv, G_DISCARD); + call_sv(cbd->perl_callback, G_DISCARD); } static void callback_VOID__DOUBLE(Etk_Object *object, double value, void *data) { dSP; - Callback_Data *cbd = NULL; + Callback_Signal_Data *cbd = NULL; cbd = data; PUSHMARK(SP) ; XPUSHs(sv_2mortal(newSVnv(value))); - XPUSHs(sv_2mortal(newSVsv(cbd->data))); + XPUSHs(sv_2mortal(newSVsv(cbd->perl_data))); PUTBACK ; /* Call the Perl sub */ - call_sv(cbd->sv, G_DISCARD); + call_sv(cbd->perl_callback, G_DISCARD); } static void callback_VOID__POINTER(Etk_Object *object, void *value, void *data) { dSP; - Callback_Data *cbd = NULL; + Callback_Signal_Data *cbd = NULL; cbd = data; PUSHMARK(SP) ; //XPUSHs(sv_2mortal(newSViv(value))); - XPUSHs(sv_2mortal(newSVsv(cbd->data))); + XPUSHs(sv_2mortal(newSVsv(cbd->perl_data))); PUTBACK ; /* Call the Perl sub */ - call_sv(cbd->sv, G_DISCARD); + call_sv(cbd->perl_callback, G_DISCARD); } static void callback_VOID__POINTER_POINTER(Etk_Object *object, void *val1, void *val2, void *data) { dSP; - Callback_Data *cbd = NULL; + Callback_Signal_Data *cbd = NULL; cbd = data; PUSHMARK(SP) ; //XPUSHs(sv_2mortal(newSViv(value))); - XPUSHs(sv_2mortal(newSVsv(cbd->data))); + XPUSHs(sv_2mortal(newSVsv(cbd->perl_data))); PUTBACK ; /* Call the Perl sub */ - call_sv(cbd->sv, G_DISCARD); + call_sv(cbd->perl_callback, G_DISCARD); } static void callback_VOID__INT_POINTER(Etk_Object *object, int val1, void *val2, void *data) { dSP; - Callback_Data *cbd = NULL; + Callback_Signal_Data *cbd = NULL; cbd = data; PUSHMARK(SP) ; XPUSHs(sv_2mortal(newSViv(val1))); - XPUSHs(sv_2mortal(newSVsv(cbd->data))); + XPUSHs(sv_2mortal(newSVsv(cbd->perl_data))); PUTBACK ; /* Call the Perl sub */ - call_sv(cbd->sv, G_DISCARD); + call_sv(cbd->perl_callback, G_DISCARD); } static void callback_BOOL__VOID(Etk_Object *object, void *data) { dSP; - Callback_Data *cbd = NULL; + Callback_Signal_Data *cbd = NULL; cbd = data; PUSHMARK(SP) ; - XPUSHs(sv_2mortal(newSVsv(cbd->data))); + XPUSHs(sv_2mortal(newSVsv(cbd->perl_data))); PUTBACK ; /* Call the Perl sub */ - call_sv(cbd->sv, G_DISCARD); + call_sv(cbd->perl_callback, G_DISCARD); } static void callback_BOOL__DOUBLE(Etk_Object *object, double value, void *data) { dSP; - Callback_Data *cbd = NULL; + Callback_Signal_Data *cbd = NULL; cbd = data; PUSHMARK(SP) ; XPUSHs(sv_2mortal(newSVnv(value))); - XPUSHs(sv_2mortal(newSVsv(cbd->data))); + XPUSHs(sv_2mortal(newSVsv(cbd->perl_data))); PUTBACK ; /* Call the Perl sub */ - call_sv(cbd->sv, G_DISCARD); + call_sv(cbd->perl_callback, G_DISCARD); } static void callback_BOOL__POINTER_POINTER(Etk_Object *object, void *val1, void *val2, void *data) { dSP; - Callback_Data *cbd = NULL; + Callback_Signal_Data *cbd = NULL; cbd = data; PUSHMARK(SP) ; //XPUSHs(sv_2mortal(newSViv(value))); - XPUSHs(sv_2mortal(newSVsv(cbd->data))); + XPUSHs(sv_2mortal(newSVsv(cbd->perl_data))); PUTBACK ; /* Call the Perl sub */ - call_sv(cbd->sv, G_DISCARD); + call_sv(cbd->perl_callback, G_DISCARD); } -/* - * TODO: return the return value from the perl callback - */ int callback_timer(void *data) { dSP; SV* cb; + Callback_Timer_Data *cbd; + int count; + int ret = 0; - cb = data; - + cbd = data; PUSHMARK(SP) ; + XPUSHs(sv_2mortal(newSVsv(cbd->perl_data))); PUTBACK ; - call_sv(cb, G_DISCARD); - return 1; + count = call_sv(cbd->perl_callback, G_SCALAR); + + SPAGAIN; + + /* if the return value is incorrect, return 0 to end timer */ + if(count != 1) + croak("Improper return value from timer callback!\n"); + + ret = POPi; + + PUTBACK; + + return ret; +} + +int +tree_compare_cb( Etk_Tree * tree, Etk_Tree_Row * row1, Etk_Tree_Row *row2, +Etk_Tree_Col * col, void * data ) +{ + dSP; + Callback_Tree_Compare_Data *cbd; + HV *row1_hv; + HV *row2_hv; + HV *col_hv; + HV *tree_hv; + SV *data_sv; + SV *row1_rv; + SV *row2_rv; + SV *col_rv; + SV *tree_rv; + int count; + int ret; + + ENTER ; + SAVETMPS; + + cbd = data; + + tree_hv = (HV*)sv_2mortal((SV*)newHV()); + row1_hv = (HV*)sv_2mortal((SV*)newHV()); + row2_hv = (HV*)sv_2mortal((SV*)newHV()); + col_hv = (HV*)sv_2mortal((SV*)newHV()); + + tree_rv = newRV(newSViv(0)); + sv_setref_iv(tree_rv, "Etk_WidgetPtr", (IV) tree); + tree_hv = newHV(); + hv_store(tree_hv, "WIDGET", strlen("WIDGET"), tree_rv, 0); + row1_rv = newRV(tree_hv); + sv_bless(tree_rv, gv_stashpv("Etk::Tree", FALSE)); + + row1_rv = newRV(newSViv(0)); + sv_setref_iv(row1_rv, "Etk_Tree_RowPtr", (IV) row1); + row1_hv = newHV(); + hv_store(row1_hv, "WIDGET", strlen("WIDGET"), row1_rv, 0); + row1_rv = newRV(row1_hv); + sv_bless(row1_rv, gv_stashpv("Etk::Tree::Row", FALSE)); + + row2_rv = newRV(newSViv(0)); + sv_setref_iv(row2_rv, "Etk_Tree_RowPtr", (IV) row2); + row2_hv = newHV(); + hv_store(row2_hv, "WIDGET", strlen("WIDGET"), row2_rv, 0); + row2_rv = newRV(row2_hv); + sv_bless(row2_rv, gv_stashpv("Etk::Tree::Row", FALSE)); + + col_rv = newRV(newSViv(0)); + sv_setref_iv(col_rv, "Etk_Tree_ColPtr", (IV) col); + col_hv = newHV(); + hv_store(col_hv, "WIDGET", strlen("WIDGET"), col_rv, 0); + col_rv = newRV(col_hv); + sv_bless(col_rv, gv_stashpv("Etk::Tree::Col", FALSE)); + + data_sv = newSVsv(cbd->perl_data); + + PUSHMARK(SP); + XPUSHs(sv_2mortal(tree_rv)); + XPUSHs(sv_2mortal(row1_rv)); + XPUSHs(sv_2mortal(row2_rv)); + XPUSHs(sv_2mortal(col_rv)); + XPUSHs(sv_2mortal(data_sv)); + PUTBACK; + + count = call_sv(cbd->perl_callback, G_SCALAR); + + SPAGAIN; + + /* if the return value is incorrect, return 0 to end timer */ + if(count != 1) + croak("Improper return value from timer callback!\n"); + + ret = POPi; + + PUTBACK; + FREETMPS ; + LEAVE ; + + return ret; } + MODULE = Etk PACKAGE = Etk INCLUDE: const-xs.inc @@ -2103,15 +2216,15 @@ SV * data CODE: - Callback_Data *cbd = NULL; + Callback_Signal_Data *cbd = NULL; Etk_Signal *sig = NULL; Etk_Marshaller marsh; - cbd = calloc(1, sizeof(Callback_Data)); + cbd = calloc(1, sizeof(Callback_Signal_Data)); cbd->signal_name = strdup(signal_name); cbd->object = object; - cbd->data = newSVsv(data); - cbd->sv = newSVsv(callback); + cbd->perl_data = newSVsv(data); + cbd->perl_callback = newSVsv(callback); sig = etk_signal_lookup(signal_name, ETK_OBJECT(object)->type); if(!sig) printf("CANT GET SIG!\n"); @@ -2688,6 +2801,20 @@ void etk_tree_col_sort_func_set(col, compare_cb, data) + Etk_Tree_Col * col + SV * compare_cb + SV * data + CODE: + Callback_Tree_Compare_Data *cbd; + + cbd = calloc(1, sizeof(Callback_Tree_Compare_Data)); + cbd->object = col; + cbd->perl_data = newSVsv(data); + cbd->perl_callback = newSVsv(compare_cb); + etk_tree_col_sort_func_set(col, tree_compare_cb, cbd); + +void +etk_tree_col_sort_func_set2(col, compare_cb, data) Etk_Tree_Col * col int ( * ) ( Etk_Tree * tree, Etk_Tree_Row * row1, Etk_Tree_Row *row2, Etk_Tree_Col * col, void * data ) compare_cb void * data @@ -2945,6 +3072,109 @@ char * t CODE: etk_tree_row_fields_set(row, col, fraction, t, NULL); + +int +etk_tree_row_field_int_get(row, col) + Etk_Tree_Row * row + Etk_Tree_Col * col + CODE: + int i; + etk_tree_row_fields_get(row, col, &i, NULL); + RETVAL = i; + OUTPUT: + RETVAL + +char * +etk_tree_row_field_text_get(row, col) + Etk_Tree_Row * row + Etk_Tree_Col * col + CODE: + char *t; + etk_tree_row_fields_get(row, col, &t, NULL); + RETVAL = t; + OUTPUT: + RETVAL + +double +etk_tree_row_field_double_get(row, col) + Etk_Tree_Row * row + Etk_Tree_Col * col + CODE: + double d; + etk_tree_row_fields_get(row, col, &d, NULL); + RETVAL = d; + OUTPUT: + RETVAL + +char * +etk_tree_row_field_image_file_get(row, col) + Etk_Tree_Row * row + Etk_Tree_Col * col + CODE: + char *image; + etk_tree_row_fields_get(row, col, &image, NULL); + +void +etk_tree_row_field_image_edje_get(row, col) + Etk_Tree_Row * row + Etk_Tree_Col * col + PPCODE: + char *edje; + char *group; + + etk_tree_row_fields_get(row, col, &edje, &group, NULL); + EXTEND(SP, 2); + PUSHs(sv_2mortal(newSVpvn(edje, strlen(edje)))); + PUSHs(sv_2mortal(newSVpvn(group, strlen(group)))); + +void +etk_tree_row_field_icon_file_text_get(row, col) + Etk_Tree_Row * row + Etk_Tree_Col * col + PPCODE: + char *icon; + char *t; + etk_tree_row_fields_set(row, col, &icon, &t, NULL); + EXTEND(SP, 2); + PUSHs(sv_2mortal(newSVpvn(icon, strlen(icon)))); + PUSHs(sv_2mortal(newSVpvn(t, strlen(t)))); + +void +etk_tree_row_field_icon_edje_text_get(row, col) + Etk_Tree_Row * row + Etk_Tree_Col * col + PPCODE: + char *icon; + char *group; + char *t; + etk_tree_row_fields_get(row, col, &icon, &group, &t, NULL); + EXTEND(SP, 3); + PUSHs(sv_2mortal(newSVpvn(icon, strlen(icon)))); + PUSHs(sv_2mortal(newSVpvn(group, strlen(group)))); + PUSHs(sv_2mortal(newSVpvn(t, strlen(t)))); + +int +etk_tree_row_field_checkbox_get(row, col) + Etk_Tree_Row * row + Etk_Tree_Col * col + CODE: + int checked; + etk_tree_row_fields_get(row, col, &checked, NULL); + RETVAL = checked; + OUTPUT: + RETVAL + +void +etk_tree_row_field_progress_bar_get(row, col) + Etk_Tree_Row * row + Etk_Tree_Col * col + CODE: + double fraction; + char *t; + etk_tree_row_fields_get(row, col, &fraction, &t, NULL); + EXTEND(SP, 2); + PUSHs(sv_2mortal(newSViv(fraction))); + PUSHs(sv_2mortal(newSVpvn(t, strlen(t)))); void etk_tree_row_fields_get(row, ...) =================================================================== RCS file: /cvs/e/e17/proto/etk-perl/Makefile.PL,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- Makefile.PL 10 Jun 2006 11:04:55 -0000 1.3 +++ Makefile.PL 10 Jun 2006 16:42:26 -0000 1.4 @@ -11,7 +11,7 @@ AUTHOR => 'Hisham Mardam Bey <[EMAIL PROTECTED]>') : ()), LIBS => [`etk-config --libs`], # e.g., '-lm' DEFINE => '', # e.g., '-DHAVE_SOMETHING' - INC => "-I. `etk-config --cflags`", # e.g., '-I. -I/usr/include/other' + INC => "-g -I. `etk-config --cflags`", # e.g., '-I. -I/usr/include/other' # Un-comment this if you add C files to link with later: # OBJECT => '$(O_FILES)', # link all the C files too ); _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs