com gtk/php-gtk: First draft for $glade->signal_connect () Note: passed object (as in 'connect_ object' set via Glade) is not honoured.: ext/libglade/libglade.overrides
[email protected] (David Soria Parra) Thu, 20 Oct 2005 18:55:29 +0000
| Newsgroups | php.gtk.cvs |
|---|---|
| Message-ID | <[email protected]> |
Commit: 0c4e22f04ced6f6cba847b90f80b20de32d39c78 Author: Steph Fox <[email protected]> Thu, 20 Oct 2005 18:55:29 +0000 Parents: d1c87670ec9880f5530673009c0047154ebcca11 Branches: master Link: http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=0c4e22f04ced6f6cba847b90f80b20de32d39c78 Log: First draft for $glade->signal_connect() Note: passed object (as in 'connect_object' set via Glade) is not honoured. Changed paths: M ext/libglade/libglade.overrides Diff: 0c4e22f04ced6f6cba847b90f80b20de32d39c78 diff --git a/ext/libglade/libglade.overrides b/ext/libglade/libglade.overrides index b60e07e..cc418cf 100644 --- a/ext/libglade/libglade.overrides +++ b/ext/libglade/libglade.overrides @@ -62,4 +62,64 @@ PHP_METHOD g_list_free(list); } +%% +override glade_xml_signal_connect +static void glade_signal_marshal(char *handler_name, GObject *object, char *signal_name, + char *signal_data, GObject *connect_object, gboolean after, gpointer data) +{ + phpg_cb_data_t *cbd = (phpg_cb_data_t *)data; + char *callback_name; + int connect_type, handler_id; + GClosure *closure = NULL; + zval *php_object = NULL, *php_connect_object = NULL; + TSRMLS_FETCH(); + + if (!zend_is_callable(cbd->callback, 0, &callback_name)) { + php_error(E_WARNING, "unable to call GladeXML callback '%s' specified in %s on line %ld\n", + callback_name, cbd->src_filename, cbd->src_lineno); + efree(callback_name); + return; + } + + if (connect_object) { /* FIXME: this is never reached, needs investigating. 'after' works... */ + fprintf(stdout, "DEBUG: connect_object was called\n"); + phpg_gobject_new(&php_connect_object, (GObject*)connect_object TSRMLS_CC); + zend_hash_add(Z_ARRVAL_P(cbd->user_args), "object", strlen("object") + 1, &php_connect_object, sizeof(php_connect_object), NULL); + connect_type = PHPG_CONNECT_SIMPLE; + } else { + connect_type = PHPG_CONNECT_NORMAL; + } + + closure = phpg_closure_new(cbd->callback, cbd->user_args, connect_type TSRMLS_CC); + + phpg_gobject_new(&php_object, (GObject*)object TSRMLS_CC); + phpg_gobject_watch_closure(php_object, closure TSRMLS_CC); + handler_id = g_signal_connect_closure(object, signal_name, closure, after); + + efree(callback_name); +} + +PHP_METHOD(glade_xml_signal_connect) +{ + char *handlername = NULL; + zval *callback = NULL, *extra = NULL; + zend_bool free_handlername; + phpg_cb_data_t *data; + + NOT_STATIC_METHOD(); + + if (!php_gtk_parse_varargs(ZEND_NUM_ARGS(), 2, &extra, "uV", &handlername, &free_handlername, &callback)) + return; + + zval_add_ref(&callback); + data = phpg_cb_data_new(callback, extra TSRMLS_CC); + + glade_xml_signal_connect_full(GLADE_XML(PHPG_GOBJECT(this_ptr)), handlername, + (GladeXMLConnectFunc)glade_signal_marshal, data); + + if (free_handlername) g_free(handlername); + + RETURN_NULL(); +} + %% }}}