Re: Defeated
| From: | Tom Rogers | Date: | Thu, 20 Oct 2005 08:29:30 +0000 |
| Subject: | Re: Defeated | ||
| References: | 1 | Groups: | php.gtk.dev |
| Request: | Send a blank email to php-gtk-dev+get-1864@lists.php.net to get a copy of this message | ||
Hi Steph,
Tuesday, October 18, 2005, 1:24:06 AM, you wrote:
S> I just spent some hours trying to get
S> glade_xml_signal_connect() working. I
S> knew it'd be a bit of a challenge, but it's more of an Everest than the
S> anticipated large Alp.
S> Quite possibly I'm attacking it from the wrong direction anyway. I'd have
S> _liked_ to use phpg_signal_connect_impl(), but a) it isn't exporting nicely
S> when I force it (possibly that's a win32 thing?), and b) it's effectively
S> private to /main at present (deliberately so?).
S> I ended up with g_signal_connect() and friends - convenience functions in
S> glib - but somehow the data isn't even getting far enough to prove me wrong
S> over that. It never reaches the marshal function (GladeXMLConnectFunc), and
S> I've been looking at it for so long now I'm absolutely out of ideas as to
S> why.
S> glade_xml_signal_connect() is the difficult one of the generic GladeXML
S> signal methods, the others will fall into place almost as soon as this one's
S> working.
S> Any heroes out there?
S> - Steph
S> ps my effort's attached as a unified diff
This works for me as a basic test and will need more work :)
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;
guint signal_id, handler_id;
GQuark detail = 0;
GClosure *closure = NULL;
TSRMLS_FETCH();
fprintf(stdout, "DEBUG: reached the marshal function %s :
%s\n",handler_name,signal_name); // 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 (!g_signal_parse_name(signal_name, G_OBJECT_TYPE(obj), &signal_id, &detail, TRUE)) {
php_error(E_WARNING, "%s(): unknown signal name '%s'",
get_active_function_name(TSRMLS_C), signal_name);
return;
}
closure = phpg_closure_new(cbd->callback, cbd->user_args, PHPG_CONNECT_NORMAL TSRMLS_CC);
handler_id = g_signal_connect_closure_by_id(obj, signal_id, detail, closure, after);
efree(callback_name);
}
static PHP_METHOD(GladeXML, 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\n", 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();
}
The function name in the xml file was
<child>
<widget class="GtkImageMenuItem" id="open1">
<property name="visible">True</property>
<property name="label">gtk-open</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_open1_activate"
last_modification_time="Tue, 18 Oct 2005 00:12:42 GMT"/>
</widget>
</child>
so my php function call was:
$glade->signal_connect('on_open1_activate','on_open1_activate');
my call back function I also called 'on_open1_activate'
Hope this helps a bit
--
regards,
Tom