Defeated
| From: | Steph | Date: | Mon, 17 Oct 2005 15:24:06 +0000 |
| Subject: | Defeated | ||
| Groups: | php.gtk.dev | ||
| Request: | Send a blank email to php-gtk-dev+get-1849@lists.php.net to get a copy of this message | ||
I just spent some hours trying to get glade_xml_signal_connect() working. I
knew it'd be a bit of a challenge, but it's more of an Everest than the
anticipated large Alp.
Quite possibly I'm attacking it from the wrong direction anyway. I'd have
_liked_ to use phpg_signal_connect_impl(), but a) it isn't exporting nicely
when I force it (possibly that's a win32 thing?), and b) it's effectively
private to /main at present (deliberately so?).
I ended up with g_signal_connect() and friends - convenience functions in
glib - but somehow the data isn't even getting far enough to prove me wrong
over that. It never reaches the marshal function (GladeXMLConnectFunc), and
I've been looking at it for so long now I'm absolutely out of ideas as to
why.
glade_xml_signal_connect() is the difficult one of the generic GladeXML
signal methods, the others will fall into place almost as soon as this one's
working.
Any heroes out there?
- Steph
ps my effort's attached as a unified diff
Index: ext/libglade/libglade.overrides =================================================================== RCS file: /repository/php-gtk/ext/libglade/libglade.overrides,v retrieving revision 1.18 diff -u -r1.18 libglade.overrides --- ext/libglade/libglade.overrides 17 Oct 2005 05:13:31 -0000 1.18 +++ ext/libglade/libglade.overrides 17 Oct 2005 15:01:47 -0000 @@ -62,4 +62,63 @@ g_list_free(list); } +%% +override glade_xml_signal_connect +static void glade_signal_marshal(const gchar *handler_name, GObject *obj, 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; + TSRMLS_FETCH(); + + fprintf(stdout, "DEBUG: reached the marshal function"); // I never get this far - why? + + 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", + callback_name, cbd->src_filename, cbd->src_lineno); + efree(callback_name); + return; + } + + /* If we ever reach here, this is where cbd->user_args should be checked... */ + + if (connect_object) { + g_signal_connect_object(G_OBJECT(obj), signal_name, G_CALLBACK(cbd->callback), + connect_object, (after ? G_CONNECT_AFTER : 0) | G_CONNECT_SWAPPED); + } else { + if (after) + g_signal_connect_after(G_OBJECT(obj), signal_name, G_CALLBACK(cbd->callback), + cbd->user_args); + else + g_signal_connect(G_OBJECT(obj), signal_name, G_CALLBACK(cbd->callback), + cbd->user_args); + } + + efree(callback_name); +} + +PHP_METHOD(glade_xml_signal_connect) +{ + char *signal = NULL; + zval *callback = NULL, *extra = NULL; + zend_bool free_signal; + phpg_cb_data_t *data; + + NOT_STATIC_METHOD(); + + if (!php_gtk_parse_varargs(ZEND_NUM_ARGS(), 2, &extra, "uV", &signal, &free_signal, &callback)) + return; + + zval_add_ref(&callback); + data = phpg_cb_data_new(callback, extra TSRMLS_CC); + + fprintf(stdout, "signal name is %s on line 175", signal); + + glade_xml_signal_connect_full(GLADE_XML(PHPG_GOBJECT(this_ptr)), signal, + (GladeXMLConnectFunc)glade_signal_marshal, data); + + if (free_signal) g_free(signal); + + RETURN_NULL(); +} + %% }}}
Index: ext/libglade/libglade.overrides =================================================================== RCS file: /repository/php-gtk/ext/libglade/libglade.overrides,v retrieving revision 1.18 diff -u -r1.18 libglade.overrides --- ext/libglade/libglade.overrides 17 Oct 2005 05:13:31 -0000 1.18 +++ ext/libglade/libglade.overrides 17 Oct 2005 15:01:47 -0000 @@ -62,4 +62,63 @@ g_list_free(list); } +%% +override glade_xml_signal_connect +static void glade_signal_marshal(const gchar *handler_name, GObject *obj, 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; + TSRMLS_FETCH(); + + fprintf(stdout, "DEBUG: reached the marshal function"); // I never get this far - why? + + 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", + callback_name, cbd->src_filename, cbd->src_lineno); + efree(callback_name); + return; + } + + /* If we ever reach here, this is where cbd->user_args should be checked... */ + + if (connect_object) { + g_signal_connect_object(G_OBJECT(obj), signal_name, G_CALLBACK(cbd->callback), + connect_object, (after ? G_CONNECT_AFTER : 0) | G_CONNECT_SWAPPED); + } else { + if (after) + g_signal_connect_after(G_OBJECT(obj), signal_name, G_CALLBACK(cbd->callback), + cbd->user_args); + else + g_signal_connect(G_OBJECT(obj), signal_name, G_CALLBACK(cbd->callback), + cbd->user_args); + } + + efree(callback_name); +} + +PHP_METHOD(glade_xml_signal_connect) +{ + char *signal = NULL; + zval *callback = NULL, *extra = NULL; + zend_bool free_signal; + phpg_cb_data_t *data; + + NOT_STATIC_METHOD(); + + if (!php_gtk_parse_varargs(ZEND_NUM_ARGS(), 2, &extra, "uV", &signal, &free_signal, &callback)) + return; + + zval_add_ref(&callback); + data = phpg_cb_data_new(callback, extra TSRMLS_CC); + + fprintf(stdout, "signal name is %s on line 175", signal); + + glade_xml_signal_connect_full(GLADE_XML(PHPG_GOBJECT(this_ptr)), signal, + (GladeXMLConnectFunc)glade_signal_marshal, data); + + if (free_signal) g_free(signal); + + RETURN_NULL(); +} + %% }}}