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

Reply via email to