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
