Subject: [PHP-GTK-DEV] module defined callbacks in php-gtk - function pointer experts needed :)
Date: Mon, 30 Jun 2003 00:06:31 +0800
From: Alan Knowles <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED], Andrei Zmievski <[EMAIL PROTECTED]>, [EMAIL PROTECTED]
Andrei, attached is a patch for adding a callback registry to php-gtk, so that callbacks that use gpointers or other 'unhandled' types, can be mapped to module defined handlers.
In the example, the callback for GtkSheet::traverse is mapped to php_gtk_sheet_callback_traverse, rather than the default mashaller. using php_gtk_register_callback("GtkSheet::traverse",php_gtk_sheet_callback_traverse);
I've just modified the gtk_signal_connect_impl function to check the registry (and moved it to php_gtk_object.c)
It almost works, except I guess I got a pointer wrong somewhere in the process, cause it dont callback to the right place at present...
any ideas why? :) -- cc'd to php-dev if anyone wants to help out with my crappy C code :)
Regards Alan
-- Can you help out? Need Consulting Services or Know of a Job? http://www.akbkhome.com
Index: ext/extra/php_extra.c =================================================================== RCS file: /repository/php-gtk/ext/extra/php_extra.c,v retrieving revision 1.1 diff -u -r1.1 php_extra.c --- ext/extra/php_extra.c 28 Jun 2003 01:46:31 -0000 1.1 +++ ext/extra/php_extra.c 29 Jun 2003 15:53:43 -0000 @@ -28,11 +28,19 @@ PHP_GTK_GET_EXTENSION(extra) #endif + +gint php_gtk_sheet_callback_traverse(GtkWidget *widget, + gint row, gint col, gint *new_row, gint *new_col, + gpointer data) +{ + + printf("GOT php_gtk_sheet_callback_traverse"); +} PHP_GTK_XINIT_FUNCTION(extra) { php_extra_register_constants(module_number TSRMLS_CC); php_extra_register_classes(); - + php_gtk_register_callback("GtkSheet::traverse",php_gtk_sheet_callback_traverse); return SUCCESS; } Index: ext/gtk+/gtk.overrides =================================================================== RCS file: /repository/php-gtk/ext/gtk+/gtk.overrides,v retrieving revision 1.66 diff -u -r1.66 gtk.overrides --- ext/gtk+/gtk.overrides 6 Feb 2003 17:44:51 -0000 1.66 +++ ext/gtk+/gtk.overrides 29 Jun 2003 15:53:47 -0000 @@ -2305,25 +2305,25 @@ PHP_FUNCTION(gtk_signal_connect) { - gtk_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, 0); + php_gtk_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, 0); } %% override gtk_signal_connect_object PHP_FUNCTION(gtk_signal_connect_object) { - gtk_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0); + php_gtk_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0); } %% override gtk_signal_connect_after PHP_FUNCTION(gtk_signal_connect_after) { - gtk_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, 1); + php_gtk_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, 1); } %% override gtk_signal_connect_object_after PHP_FUNCTION(gtk_signal_connect_object_after) { - gtk_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 1); + php_gtk_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 1); } %% override gtk_signal_emit Index: main/php_gtk.c =================================================================== RCS file: /repository/php-gtk/main/php_gtk.c,v retrieving revision 1.28 diff -u -r1.28 php_gtk.c --- main/php_gtk.c 27 Nov 2002 20:13:34 -0000 1.28 +++ main/php_gtk.c 29 Jun 2003 15:53:48 -0000 @@ -109,6 +109,7 @@ zend_hash_init_ex(&php_gtk_prop_setters, 20, NULL, NULL, 1, 0); zend_hash_init_ex(&php_gtk_rsrc_hash, 50, NULL, NULL, 1, 0); zend_hash_init_ex(&php_gtk_type_hash, 50, NULL, NULL, 1, 0); + zend_hash_init_ex(&php_gtk_callback_hash, 50, NULL, NULL, 1, 0); zend_unset_timeout(TSRMLS_C); zend_set_timeout(0); Index: main/php_gtk.h =================================================================== RCS file: /repository/php-gtk/main/php_gtk.h,v retrieving revision 1.61 diff -u -r1.61 php_gtk.h --- main/php_gtk.h 27 Nov 2002 20:13:34 -0000 1.61 +++ main/php_gtk.h 29 Jun 2003 15:53:48 -0000 @@ -96,7 +96,7 @@ extern HashTable php_gtk_prop_getters; extern HashTable php_gtk_prop_setters; extern HashTable php_gtk_type_hash; - +extern HashTable php_gtk_callback_hash; /* Function declarations. */ int php_gtk_startup_all_extensions(int module_number); @@ -123,7 +123,7 @@ PHP_GTK_API void php_gtk_register_prop_getter(zend_class_entry *ce, prop_getter_t getter); PHP_GTK_API void php_gtk_register_prop_setter(zend_class_entry *ce, prop_setter_t setter); - +PHP_GTK_API void php_gtk_register_callback(char *class_and_method, void *call_function); PHP_GTK_API void php_gtk_object_init(GtkObject *obj, zval *wrapper); /* Utility functions. */ @@ -140,6 +140,9 @@ PHP_GTK_API zval *php_gtk_func_args_as_hash(int argc, int start, int length); PHP_GTK_API zval *php_gtk_build_value(char *format, ...); char *php_gtk_zval_type_name(zval *arg); + +PHP_GTK_API void php_gtk_signal_connect_impl(INTERNAL_FUNCTION_PARAMETERS, int pass_object, int after); + #define NOT_STATIC_METHOD() \ if (!this_ptr) { \ Index: main/php_gtk_object.c =================================================================== RCS file: /repository/php-gtk/main/php_gtk_object.c,v retrieving revision 1.55 diff -u -r1.55 php_gtk_object.c --- main/php_gtk_object.c 10 Dec 2002 04:39:15 -0000 1.55 +++ main/php_gtk_object.c 29 Jun 2003 15:53:49 -0000 @@ -31,12 +31,15 @@ HashTable php_gtk_rsrc_hash; HashTable php_gtk_type_hash; +HashTable php_gtk_callback_hash; + static const char *php_gtk_wrapper_key = "php_gtk::wrapper"; PHP_GTK_API void php_gtk_object_init(GtkObject *obj, zval *wrapper) { gtk_object_ref(obj); gtk_object_sink(obj); + php_gtk_set_object(wrapper, obj, le_gtk_object); }
@@ -1234,6 +1237,69 @@ zend_hash_index_update(&php_gtk_prop_setters, (long)ce, (void*)&setter, sizeof(prop_setter_t), NULL); } + +PHP_GTK_API void php_gtk_register_callback(char *class_and_method, void *call_function) +{ + printf("REGISTERING %s\n",class_and_method); + zend_hash_update(&php_gtk_callback_hash, class_and_method, strlen(class_and_method),(void*) call_function, + sizeof(void*), NULL); +} + + +PHP_GTK_API void php_gtk_signal_connect_impl(INTERNAL_FUNCTION_PARAMETERS, int pass_object, int after) +{ + char *name = NULL; + zval *callback = NULL; + zval *extra; + zval *data; + char *callback_filename; + uint callback_lineno; + char *lookup; + zend_class_entry *ce; + void *callback_cfunction; + + + NOT_STATIC_METHOD(); + + if (ZEND_NUM_ARGS() < 2) { + php_error(E_WARNING, "%s() requires at least 2 arguments, %d given", + get_active_function_name(TSRMLS_C), ZEND_NUM_ARGS()); + return; + } + + if (!php_gtk_parse_args(2, "sV", &name, &callback)) + return; + + callback_filename = zend_get_executed_filename(TSRMLS_C); + callback_lineno = zend_get_executed_lineno(TSRMLS_C); + extra = php_gtk_func_args_as_hash(ZEND_NUM_ARGS(), 2, ZEND_NUM_ARGS()); + data = php_gtk_build_value("(VNisi)", callback, extra, pass_object, callback_filename, callback_lineno); + ce = Z_OBJCE_P(this_ptr); + lookup = emalloc(ce->name_length + strlen(name) + 3); + strncpy(lookup, ce->name,ce->name_length); + strncpy(lookup + ce->name_length, "::", 2); + strncpy(lookup + ce->name_length + 2, name,strlen(name)); + lookup[ce->name_length + strlen(name) + 2] = '\0'; + printf("lookup ..%s..\n",lookup); + + /* now look at hashtable for the object.. */ + if (zend_hash_find(&php_gtk_callback_hash, lookup, ce->name_length + strlen(name) + 2, + (void **)&callback_cfunction) == SUCCESS) { + printf("FOUND A FUNCTION\n"); + + RETURN_LONG( gtk_signal_connect(PHP_GTK_GET(this_ptr), + name, + (GtkSignalFunc) &callback_cfunction, + data)); + + } + + + RETURN_LONG(gtk_signal_connect_full(PHP_GTK_GET(this_ptr), name, NULL, + (GtkCallbackMarshal)php_gtk_callback_marshal, + data, php_gtk_destroy_notify, FALSE, after)); +} + #endif /* HAVE_PHP_GTK */
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php