com gtk/php-gtk: ext/libglade is now as complete as it's likely to get - please test: ext/libglade/libglade.overrides
[email protected] (David Soria Parra) Fri, 21 Oct 2005 13:24:43 +0000
| Newsgroups | php.gtk.cvs |
|---|---|
| Message-ID | <[email protected]> |
Commit: b5ec9bf034818016005162bb6ea156fc8f5cb281 Author: Steph Fox <[email protected]> Fri, 21 Oct 2005 13:24:43 +0000 Parents: 0ab931512beac8bda233f35fefe094787d1d7b40 Branches: master Link: http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=b5ec9bf034818016005162bb6ea156fc8f5cb281 Log: ext/libglade is now as complete as it's likely to get - please test Changed paths: M ext/libglade/libglade.overrides Diff: b5ec9bf034818016005162bb6ea156fc8f5cb281 diff --git a/ext/libglade/libglade.overrides b/ext/libglade/libglade.overrides index cc418cf..f9a13a9 100644 --- a/ext/libglade/libglade.overrides +++ b/ext/libglade/libglade.overrides @@ -3,15 +3,25 @@ headers #include <glade/glade.h> #include "php_gtk_api.h" + +%% {{{ ignores [confirmed] %% ignore-glob *_get_type %% ignore glade_xml_construct + glade_xml_signal_autoconnect_full glade_xml_signal_connect_data glade_xml_signal_connect_full - glade_xml_signal_autoconnect_full +%% }}} + +%% {{{ ignores [tbd] +%% +ignore + glade_set_custom_handler + glade_xml_new_from_buffer +%% }}} %% {{{ GladeXML %% @@ -64,14 +74,17 @@ PHP_METHOD %% 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) +static void glade_signal_marshal(const gchar *handler_name, GObject *object, + const gchar *signal_name, const gchar *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; + int handler_id, n_args = 0; GClosure *closure = NULL; zval *php_object = NULL, *php_connect_object = NULL; + zval *hash = NULL, ***args = NULL; TSRMLS_FETCH(); if (!zend_is_callable(cbd->callback, 0, &callback_name)) { @@ -81,17 +94,17 @@ static void glade_signal_marshal(char *handler_name, GObject *object, char *sign return; } - if (connect_object) { /* FIXME: this is never reached, needs investigating. 'after' works... */ - fprintf(stdout, "DEBUG: connect_object was called\n"); + if (connect_object) { 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; + args = php_gtk_hash_as_array_offset(cbd->user_args, 1, &n_args); + args[0] = &php_connect_object; + hash = php_gtk_array_as_hash(args, n_args, 0, n_args); + closure = phpg_closure_new(cbd->callback, hash, PHPG_CONNECT_OBJECT TSRMLS_CC); + efree(args); } else { - connect_type = PHPG_CONNECT_NORMAL; + closure = phpg_closure_new(cbd->callback, cbd->user_args, PHPG_CONNECT_NORMAL TSRMLS_CC); } - 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); @@ -122,4 +135,55 @@ PHP_METHOD(glade_xml_signal_connect) RETURN_NULL(); } +%% +override glade_xml_signal_autoconnect +static void glade_auto_signal_marshal(const gchar *handler_name, GObject *object, + const gchar *signal_name, const gchar *signal_data, + GObject *connect_object, gboolean after, + zval *data) +{ + zval *callback = NULL, *hash = NULL, ***args = NULL; + zval *php_object = NULL, *php_connect_object = NULL; + GClosure *closure = NULL; + int handler_id, n_args = 0; + TSRMLS_FETCH(); + + MAKE_STD_ZVAL(callback); + ZVAL_STRING(callback, (char *)handler_name, 1); + + if (!zend_is_callable(callback, 0, NULL)) { + php_error(E_WARNING, "%s() is unable to autoconnect callback for handler '%s'", + get_active_function_name(TSRMLS_C), handler_name); + return; + } + + if (connect_object) { + phpg_gobject_new(&php_connect_object, (GObject*)connect_object TSRMLS_CC); + args = php_gtk_hash_as_array_offset(data, 1, &n_args); + args[0] = &php_connect_object; + hash = php_gtk_array_as_hash(args, n_args, 0, n_args); + closure = phpg_closure_new(callback, hash, PHPG_CONNECT_OBJECT TSRMLS_CC); + efree(args); + } else { + closure = phpg_closure_new(callback, data, PHPG_CONNECT_NORMAL 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); +} + +PHP_METHOD(glade_xml_signal_autoconnect) +{ + zval *extra = NULL; + + NOT_STATIC_METHOD(); + + if (!php_gtk_parse_varargs(ZEND_NUM_ARGS(), 0, &extra, "")) + return; + + glade_xml_signal_autoconnect_full(GLADE_XML(PHPG_GOBJECT(this_ptr)), + (GladeXMLConnectFunc)glade_auto_signal_marshal, extra); +} + %% }}}