com gtk/php-gtk: Module isn't registered, so this has no way to work at present. (config.m4 probably needs updating when it does work, there've been
some function changes since 2.4): ext/libglade/config.w32 ext/libglade/libglade.defs ext/libglade/libglade.overrides ext/libglade/php_libglade.c
ext/libglade/php_libglade .h ext/libglade/v1.libglade.overrides
| From: | David Soria Parra | Date: | Wed, 21 Sep 2005 15:15:29 +0000 |
| Subject: | com gtk/php-gtk: Module isn't registered, so this has no way to work at present. (config.m4 probably needs updating when it does work, there've been some function changes since 2.4): ext/libglade/config.w32 ext/libglade/libglade.defs ext/libglade/libglade.overrides ext/libglade/php_libglade.c ext/libglade/php_libglade .h ext/libglade/v1.libglade.overrides |
||
| Groups: | php.gtk.cvs | ||
| Request: | Send a blank email to php-gtk-cvs+get-4825@lists.php.net to get a copy of this message | ||
Commit: 4646cdba60f0665d574ad15a1ad2f668544f5a13
Author: Steph Fox <sfox@php.net> Wed, 21 Sep 2005 15:15:29 +0000
Parents: 82c7b862cbc62e27ac696c3dfc1634adb19eb9e0
Branches: master
Link: http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=4646cdba60f0665d574ad15a1ad2f668544f5a13
Log:
Module isn't registered, so this has no way to work at present.
(config.m4 probably needs updating when it does work, there've been some function changes since
2.4)
Changed paths:
A ext/libglade/config.w32
M ext/libglade/libglade.defs
M ext/libglade/libglade.overrides
M ext/libglade/php_libglade.c
M ext/libglade/php_libglade.h
A ext/libglade/v1.libglade.overrides
4646cdba60f0665d574ad15a1ad2f668544f5a13 diff --git a/ext/libglade/config.w32 b/ext/libglade/config.w32 new file mode 100644 index 0000000..fca0be4 --- /dev/null +++ b/ext/libglade/config.w32 @@ -0,0 +1,26 @@ + +ARG_WITH("libglade", "Glade support", "no"); + +if (PHP_GTK_LIBGLADE != "no") { + + if (CHECK_HEADER("glade\\glade.h") && CHECK_LIB("glade-2.0.lib", "libglade")) { + + ADD_FLAG("CFLAGS_LIBGLADE", "/I ext\\libglade /I ..\\ext\\libglade /D HAVE_LIBGLADE=1"); + EXTENSION("libglade", "php_libglade.c gen_libglade.c", true); // always shared + AC_DEFINE("HAVE_LIBGLADE", 1, "libglade enabled"); + + if (FSO.FileExists("win32\\temp.bat")) { + + var temp = FSO.OpenTextFile("win32\\temp.bat", 8); + + temp.WriteLine("php -q generator\\generator.php -l win32\\logs\\config_glade.log -o ext\\libglade\\libglade.overrides -p GladeXML ext\\libglade\\libglade.defs > ext\\libglade\\gen_libglade.c"); + + temp.WriteLine('grep -h "^PHP_GTK_EXPORT_CE" ext\\libglade\\gen_libglade.c | sed -e "s/^/PHP_GTK_API extern /" > ext\\libglade\\gen_libglade.h'); + } + + } else { + + WARNING("libglade not enabled; libraries and headers not found"); + } + +} diff --git a/ext/libglade/libglade.defs b/ext/libglade/libglade.defs index 6d270af..71677c6 100644 --- a/ext/libglade/libglade.defs +++ b/ext/libglade/libglade.defs @@ -1,138 +1,152 @@ ;; -*- scheme -*- ; object definitions ... -(object XML - (in-module Glade) - (parent Data (Gtk)) - (c-name GladeXML) -) - -;; Enumerations and flags ... - - -;; From /usr/include/glade/glade-xml.h -(function glade_xml_get_type - (c-name glade_xml_get_type) - (return-type GtkType) +(define-object XML + (in-module "Glade") + (parent "GtkObject") + (c-name "GladeXML") + (gtype-id "GLADE_TYPE_XML") ) -(function glade_xml_new - (c-name glade_xml_new) - (return-type GladeXML*) - (parameter (type-and-name const-char* fname)) - (parameter (type-and-name const-char* root) (null-ok) (default "NULL")) -) +;; Functions, constructors, and methods ... -(function glade_xml_new_with_domain - (c-name glade_xml_new_with_domain) - (is-constructor-of GladeXML) - (return-type GladeXML*) - (parameter (type-and-name const-char* fname)) - (parameter (type-and-name const-char* root) (null-ok) (default "NULL")) - (parameter (type-and-name const-char* domain) (null-ok) (default "NULL")) +(define-function glade_xml_get_type + (c-name "glade_xml_get_type") + (return-type "GType") ) -(function xml_new_from_memory - (c-name glade_xml_new_from_memory) +(define-function glade_xml_new + (is-constructor-of "GladeXML") + (c-name "glade_xml_new") + (caller-owns-return #t) (return-type GladeXML*) - (parameter (type-and-name char* buffer)) - (parameter (type-and-name int size)) - (parameter (type-and-name const-char* root) (null-ok)) - (parameter (type-and-name const-char* domain) (null-ok)) -) - -(method construct - (of-object XML (Glade)) - (c-name glade_xml_construct) - (return-type gboolean) - (parameter (type-and-name const-char* fname)) - (parameter (type-and-name const-char* root)) - (parameter (type-and-name const-char* domain)) -) - -(method signal_connect - (of-object XML (Glade)) - (c-name glade_xml_signal_connect) - (return-type none) - (parameter (type-and-name const-char* handlername)) - (parameter (type-and-name GtkSignalFunc func)) -) - -(method signal_connect_data - (of-object XML (Glade)) - (c-name glade_xml_signal_connect_data) - (return-type none) - (parameter (type-and-name const-char* handlername)) - (parameter (type-and-name GtkSignalFunc func)) - (parameter (type-and-name gpointer user_data)) -) - -(method signal_autoconnect - (of-object XML (Glade)) - (c-name glade_xml_signal_autoconnect) - (return-type none) -) - -(method signal_connect_full - (of-object XML (Glade)) - (c-name glade_xml_signal_connect_full) - (return-type none) - (parameter (type-and-name const-gchar* handler_name)) - (parameter (type-and-name GladeXMLConnectFunc func)) - (parameter (type-and-name gpointer user_data)) -) - -(method signal_autoconnect_full - (of-object XML (Glade)) - (c-name glade_xml_signal_autoconnect_full) - (return-type none) - (parameter (type-and-name GladeXMLConnectFunc func)) - (parameter (type-and-name gpointer user_data)) -) - -(method get_widget - (of-object XML (Glade)) - (c-name glade_xml_get_widget) - (return-type GtkWidget*) - (parameter (type-and-name const-char* name)) -) - -(method get_widget_prefix - (of-object XML (Glade)) - (c-name glade_xml_get_widget_prefix) - (return-type GList*) - (parameter (type-and-name const-char* name)) -) - -(method get_widget_by_long_name - (of-object XML (Glade)) - (c-name glade_xml_get_widget_by_long_name) - (return-type GtkWidget*) - (parameter (type-and-name const-char* longname)) -) - -(method relative_file - (of-object XML (Glade)) - (c-name glade_xml_relative_file) - (return-type gchar*) - (parameter (type-and-name const-gchar* filename)) -) - -(function get_widget_name - (c-name glade_get_widget_name) - (return-type const-gchar*) - (parameter (type-and-name GtkWidget* widget)) -) - -(function get_widget_long_name - (c-name glade_get_widget_long_name) - (return-type const-gchar*) - (parameter (type-and-name GtkWidget* widget)) + (parameters + '("const-char*" "fname") + '("const-char*" "root") + '("const-char*" "domain") + ) ) -(function get_widget_tree - (c-name glade_get_widget_tree) +(define-function glade_xml_new_from_buffer + (is-constructor-of "GladeXML") + (c-name "glade_xml_new_from_buffer") + (caller-owns-return #t) (return-type GladeXML*) - (parameter (type-and-name GtkWidget* widget)) + (parameters + '("const-char*" "buffer") + '("int" "size") + '("const-char*" "root") + '("const-char*" "domain") + ) +) + +(define-method construct + (of-object "GladeXML") + (c-name "glade_xml_construct") + (return-type "gboolean") + (parameters + '("const-char*" "fname") + '("const-char*" "root") + '("const-char*" "domain") + ) +) + +(define-method signal_connect + (of-object "GladeXML") + (c-name "glade_xml_signal_connect") + (return-type "none") + (parameters + '("const-char*" "handlername") + '("GCallback" "func") + ) +) + +(define-method signal_connect_data + (of-object "GladeXML") + (c-name "glade_xml_signal_connect_data") + (return-type "none") + (parameters + '("const-char*" "handlername") + '("GCallback" "func") + '("gpointer" "user_data") + ) +) + +(define-method signal_autoconnect + (of-object "GladeXML") + (c-name "glade_xml_signal_autoconnect") + (return-type "none") +) + +(define-method signal_connect_full + (of-object "GladeXML") + (c-name "glade_xml_signal_connect_full") + (return-type "none") + (parameters + '("const-gchar*" "handler_name") + '("GladeXMLConnectFunc" "func") + '("gpointer" "user_data") + ) +) + +(define-method signal_autoconnect_full + (of-object "GladeXML") + (c-name "glade_xml_signal_autoconnect_full") + (return-type "none") + (parameters + '("GladeXMLConnectFunc" "func") + '("gpointer" "user_data") + ) +) + +(define-method get_widget + (of-object "GladeXML") + (c-name "glade_xml_get_widget") + (return-type "GtkWidget*") + (parameters + '("const-char*" "name") + ) +) + +(define-method get_widget_prefix + (of-object "GladeXML") + (c-name "glade_xml_get_widget_prefix") + (return-type "GList*") + (parameters + '("const-char*" "name") + ) +) + +(define-method relative_file + (of-object "GladeXML") + (c-name "glade_xml_relative_file") + (return-type "gchar*") + (parameters + '("const-gchar*" "filename") + ) +) + +(define-function glade_get_widget_name + (c-name "glade_get_widget_name") + (return-type "const-char*") + (parameters + '("GtkWidget*" "widget") + ) +) + +(define-function get_widget_tree + (c-name "glade_get_widget_tree") + (return-type "GladeXML*") + (parameters + '("GtkWidget*" "widget") + ) +) + +(define-function set_custom_handler + (c-name "glade_set_custom_handler") + (return-type "none") + (parameters + '("GladeXMLCustomWidgetHandler" "handler") + '("gpointer" "user_data") + ) ) - diff --git a/ext/libglade/libglade.overrides b/ext/libglade/libglade.overrides index 398015f..43349f0 100644 --- a/ext/libglade/libglade.overrides +++ b/ext/libglade/libglade.overrides @@ -12,167 +12,4 @@ ignore glade_xml_signal_connect_full glade_xml_signal_connect_data glade_xml_signal_autoconnect_full -%% -override glade_xml_signal_connect -static void glade_connect_one(const gchar *handler_name, GtkObject *obj, const - gchar *signal_name, const gchar *signal_data, - GtkObject *connect_object, gboolean after, - zval *callback_data) -{ - zval **callback = NULL, **extra = NULL, **pass_object = NULL; - zval **callback_filename = NULL, **callback_lineno = NULL; - zval *object; - TSRMLS_FETCH(); - - zend_hash_index_find(Z_ARRVAL_P(callback_data), 0, (void **)&callback); - zend_hash_index_find(Z_ARRVAL_P(callback_data), 1, (void **)&extra); - zend_hash_index_find(Z_ARRVAL_P(callback_data), 2, (void **)&pass_object); - zend_hash_index_find(Z_ARRVAL_P(callback_data), 3, (void **)&callback_filename); - zend_hash_index_find(Z_ARRVAL_P(callback_data), 4, (void **)&callback_lineno); - - if (connect_object) { - zval *temp; - - Z_LVAL_PP(pass_object) = 0; - object = php_gtk_new(connect_object); - MAKE_STD_ZVAL(temp); - array_init(temp); - add_next_index_zval(temp, object); - php_array_merge(Z_ARRVAL_P(temp), Z_ARRVAL_PP(extra), 0 TSRMLS_CC); - REPLACE_ZVAL_VALUE(extra, temp, 0); - } - - gtk_signal_connect_full(obj, signal_name, NULL, - (GtkCallbackMarshal)php_gtk_callback_marshal, - callback_data, php_gtk_destroy_notify, FALSE, after); -} - -static void glade_signal_connect_impl(INTERNAL_FUNCTION_PARAMETERS, int pass_object) -{ - char *handler_name = NULL; - zval *callback = NULL; - zval *extra; - zval *data; - char *callback_filename; - uint callback_lineno; - - 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", &handler_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); - glade_xml_signal_connect_full(GLADE_XML(PHP_GTK_GET(this_ptr)), handler_name, - (GladeXMLConnectFunc)glade_connect_one, data); - RETURN_NULL(); -} - -PHP_FUNCTION(glade_xml_signal_connect) -{ - glade_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); -} -%% -override glade_xml_signal_connect_object signal_connect_object GladeXML -PHP_FUNCTION(glade_xml_signal_connect_object) -{ - glade_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); -} -%% -override glade_xml_signal_autoconnect - -typedef struct _php_gtk_autoconnect_data { - zend_bool pass_object; - zval *map; -} php_gtk_autoconnect_data; - -static void glade_connect_auto(const gchar *handler_name, GtkObject *obj, - const gchar *signal_name, const gchar *signal_data, - GtkObject *connect_object, gboolean after, - php_gtk_autoconnect_data *ac_data) -{ - zval **callback_data = NULL, *map = ac_data->map; - zval **callback_ptr = NULL, *extra = NULL, *params = NULL; - zval *callback, *data, *object = NULL; - int pass_object = ac_data->pass_object; - char *callback_filename; - uint callback_lineno; - TSRMLS_FETCH(); - - if (map && zend_hash_find(Z_ARRVAL_P(map), (char *)handler_name, strlen(handler_name) + 1, (void **)&callback_data) == SUCCESS) { - if (Z_TYPE_PP(callback_data) != IS_ARRAY || - zend_hash_index_find(Z_ARRVAL_PP(callback_data), 0, (void **)&callback_ptr) == FAILURE) { - php_error(E_WARNING, "%s() is supplied with invalid callback structure for handler '%s'", get_active_function_name(TSRMLS_C), handler_name); - return; - } - zval_add_ref(callback_ptr); - callback = *callback_ptr; - zend_hash_index_del(Z_ARRVAL_PP(callback_data), 0); - extra = *callback_data; - } else { - 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; - } - - MAKE_STD_ZVAL(params); - array_init(params); - - if (connect_object) { - pass_object = 0; - object = php_gtk_new(connect_object); - add_next_index_zval(params, object); - } - - if (extra) - php_array_merge(Z_ARRVAL_P(params), Z_ARRVAL_P(extra), 0 TSRMLS_CC); - callback_filename = zend_get_executed_filename(TSRMLS_C); - callback_lineno = zend_get_executed_lineno(TSRMLS_C); - data = php_gtk_build_value("(NNisi)", callback, params, pass_object, - callback_filename, callback_lineno); - gtk_signal_connect_full(obj, signal_name, NULL, - (GtkCallbackMarshal)php_gtk_callback_marshal, - data, php_gtk_destroy_notify, FALSE, after); -} - -static void glade_signal_autoconnect_impl(INTERNAL_FUNCTION_PARAMETERS, int pass_object) -{ - zval *map = NULL; - php_gtk_autoconnect_data *ac_data; - - NOT_STATIC_METHOD(); - - if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "|a", &map)) - return; - - ac_data = (php_gtk_autoconnect_data *)emalloc(sizeof(php_gtk_autoconnect_data)); - ac_data->map = map; - ac_data->pass_object = pass_object; - glade_xml_signal_autoconnect_full(GLADE_XML(PHP_GTK_GET(this_ptr)), - (GladeXMLConnectFunc)glade_connect_auto, ac_data); -} - -PHP_FUNCTION(glade_xml_signal_autoconnect) -{ - glade_signal_autoconnect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); -} -%% -override glade_xml_signal_autoconnect_object signal_autoconnect_object GladeXML -PHP_FUNCTION(glade_xml_signal_autoconnect_object) -{ - glade_signal_autoconnect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); -} diff --git a/ext/libglade/php_libglade.c b/ext/libglade/php_libglade.c index 3e7e735..f725768 100644 --- a/ext/libglade/php_libglade.c +++ b/ext/libglade/php_libglade.c @@ -24,15 +24,14 @@ #if HAVE_LIBGLADE -#ifdef PHP_GTK_COMPILE_DL_LIBGLADE -PHP_GTK_GET_EXTENSION(libglade) +#ifdef COMPILE_DL_LIBGLADE2 +PHP_GTK_GET_EXTENSION(libglade); #endif PHP_GTK_XINIT_FUNCTION(libglade) { - glade_init(); - php_libglade_register_constants(module_number TSRMLS_CC); - php_libglade_register_classes(); + phpg_libglade_register_classes(); + phpg_libglade_register_constants("GLADE_"); return SUCCESS; } @@ -40,7 +39,7 @@ PHP_GTK_XINIT_FUNCTION(libglade) php_gtk_ext_entry libglade_ext_entry = { "libglade", PHP_GTK_XINIT(libglade), - NULL, + NULL }; -#endif /* HAVE_LIBGLADE */ +#endif /* HAVE_LIBGLADE */ diff --git a/ext/libglade/php_libglade.h b/ext/libglade/php_libglade.h index 6fef2b7..418235f 100644 --- a/ext/libglade/php_libglade.h +++ b/ext/libglade/php_libglade.h @@ -28,20 +28,18 @@ #if HAVE_LIBGLADE #include <glade/glade.h> -#include "gen_ce_libglade.h" +#include "gen_libglade.h" extern php_gtk_ext_entry libglade_ext_entry; -#define libglade_ext_ptr &libglade_ext_entry +#define php_gtk_ext_libglade_ptr &libglade_ext_entry -void php_libglade_register_constants(int module_number TSRMLS_DC); -void php_libglade_register_classes(); +void phpg_libglade_register_constants(const char *strip_prefix); +void phpg_libglade_register_classes(void); #else -#define libglade_ext_ptr NULL +#define php_gtk_ext_libglade_ptr NULL -#endif /* HAVE_LIBGLADE */ +#endif /* HAVE_LIBGLADE */ -#define php_gtk_ext_libglade_ptr libglade_ext_ptr - -#endif /* PHP_LIBGLADE_H */ +#endif /* PHP_LIBGLADE_H */ diff --git a/ext/libglade/v1.libglade.overrides b/ext/libglade/v1.libglade.overrides new file mode 100644 index 0000000..398015f --- /dev/null +++ b/ext/libglade/v1.libglade.overrides @@ -0,0 +1,178 @@ +/* vim: set ft=cpp: */ +%% +headers +#include <glade/glade.h> +#include "ext/gtk+/php_gtk+.h" +%% +ignore-glob + *_get_type +%% +ignore + glade_xml_new + glade_xml_signal_connect_full + glade_xml_signal_connect_data + glade_xml_signal_autoconnect_full +%% +override glade_xml_signal_connect +static void glade_connect_one(const gchar *handler_name, GtkObject *obj, const + gchar *signal_name, const gchar *signal_data, + GtkObject *connect_object, gboolean after, + zval *callback_data) +{ + zval **callback = NULL, **extra = NULL, **pass_object = NULL; + zval **callback_filename = NULL, **callback_lineno = NULL; + zval *object; + TSRMLS_FETCH(); + + zend_hash_index_find(Z_ARRVAL_P(callback_data), 0, (void **)&callback); + zend_hash_index_find(Z_ARRVAL_P(callback_data), 1, (void **)&extra); + zend_hash_index_find(Z_ARRVAL_P(callback_data), 2, (void **)&pass_object); + zend_hash_index_find(Z_ARRVAL_P(callback_data), 3, (void **)&callback_filename); + zend_hash_index_find(Z_ARRVAL_P(callback_data), 4, (void **)&callback_lineno); + + if (connect_object) { + zval *temp; + + Z_LVAL_PP(pass_object) = 0; + object = php_gtk_new(connect_object); + MAKE_STD_ZVAL(temp); + array_init(temp); + add_next_index_zval(temp, object); + php_array_merge(Z_ARRVAL_P(temp), Z_ARRVAL_PP(extra), 0 TSRMLS_CC); + REPLACE_ZVAL_VALUE(extra, temp, 0); + } + + gtk_signal_connect_full(obj, signal_name, NULL, + (GtkCallbackMarshal)php_gtk_callback_marshal, + callback_data, php_gtk_destroy_notify, FALSE, after); +} + +static void glade_signal_connect_impl(INTERNAL_FUNCTION_PARAMETERS, int pass_object) +{ + char *handler_name = NULL; + zval *callback = NULL; + zval *extra; + zval *data; + char *callback_filename; + uint callback_lineno; + + 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", &handler_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); + glade_xml_signal_connect_full(GLADE_XML(PHP_GTK_GET(this_ptr)), handler_name, + (GladeXMLConnectFunc)glade_connect_one, data); + RETURN_NULL(); +} + +PHP_FUNCTION(glade_xml_signal_connect) +{ + glade_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); +} +%% +override glade_xml_signal_connect_object signal_connect_object GladeXML +PHP_FUNCTION(glade_xml_signal_connect_object) +{ + glade_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); +} +%% +override glade_xml_signal_autoconnect + +typedef struct _php_gtk_autoconnect_data { + zend_bool pass_object; + zval *map; +} php_gtk_autoconnect_data; + +static void glade_connect_auto(const gchar *handler_name, GtkObject *obj, + const gchar *signal_name, const gchar *signal_data, + GtkObject *connect_object, gboolean after, + php_gtk_autoconnect_data *ac_data) +{ + zval **callback_data = NULL, *map = ac_data->map; + zval **callback_ptr = NULL, *extra = NULL, *params = NULL; + zval *callback, *data, *object = NULL; + int pass_object = ac_data->pass_object; + char *callback_filename; + uint callback_lineno; + TSRMLS_FETCH(); + + if (map && zend_hash_find(Z_ARRVAL_P(map), (char *)handler_name, strlen(handler_name) + 1, (void **)&callback_data) == SUCCESS) { + if (Z_TYPE_PP(callback_data) != IS_ARRAY || + zend_hash_index_find(Z_ARRVAL_PP(callback_data), 0, (void **)&callback_ptr) == FAILURE) { + php_error(E_WARNING, "%s() is supplied with invalid callback structure for handler '%s'", get_active_function_name(TSRMLS_C), handler_name); + return; + } + zval_add_ref(callback_ptr); + callback = *callback_ptr; + zend_hash_index_del(Z_ARRVAL_PP(callback_data), 0); + extra = *callback_data; + } else { + 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; + } + + MAKE_STD_ZVAL(params); + array_init(params); + + if (connect_object) { + pass_object = 0; + object = php_gtk_new(connect_object); + add_next_index_zval(params, object); + } + + if (extra) + php_array_merge(Z_ARRVAL_P(params), Z_ARRVAL_P(extra), 0 TSRMLS_CC); + + callback_filename = zend_get_executed_filename(TSRMLS_C); + callback_lineno = zend_get_executed_lineno(TSRMLS_C); + data = php_gtk_build_value("(NNisi)", callback, params, pass_object, + callback_filename, callback_lineno); + gtk_signal_connect_full(obj, signal_name, NULL, + (GtkCallbackMarshal)php_gtk_callback_marshal, + data, php_gtk_destroy_notify, FALSE, after); +} + +static void glade_signal_autoconnect_impl(INTERNAL_FUNCTION_PARAMETERS, int pass_object) +{ + zval *map = NULL; + php_gtk_autoconnect_data *ac_data; + + NOT_STATIC_METHOD(); + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "|a", &map)) + return; + + ac_data = (php_gtk_autoconnect_data *)emalloc(sizeof(php_gtk_autoconnect_data)); + ac_data->map = map; + ac_data->pass_object = pass_object; + glade_xml_signal_autoconnect_full(GLADE_XML(PHP_GTK_GET(this_ptr)), + (GladeXMLConnectFunc)glade_connect_auto, ac_data); +} + +PHP_FUNCTION(glade_xml_signal_autoconnect) +{ + glade_signal_autoconnect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); +} +%% +override glade_xml_signal_autoconnect_object signal_autoconnect_object GladeXML +PHP_FUNCTION(glade_xml_signal_autoconnect_object) +{ + glade_signal_autoconnect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); +}
4646cdba60f0665d574ad15a1ad2f668544f5a13 diff --git a/ext/libglade/config.w32 b/ext/libglade/config.w32 new file mode 100644 index 0000000..fca0be4 --- /dev/null +++ b/ext/libglade/config.w32 @@ -0,0 +1,26 @@ + +ARG_WITH("libglade", "Glade support", "no"); + +if (PHP_GTK_LIBGLADE != "no") { + + if (CHECK_HEADER("glade\\glade.h") && CHECK_LIB("glade-2.0.lib", "libglade")) { + + ADD_FLAG("CFLAGS_LIBGLADE", "/I ext\\libglade /I ..\\ext\\libglade /D HAVE_LIBGLADE=1"); + EXTENSION("libglade", "php_libglade.c gen_libglade.c", true); // always shared + AC_DEFINE("HAVE_LIBGLADE", 1, "libglade enabled"); + + if (FSO.FileExists("win32\\temp.bat")) { + + var temp = FSO.OpenTextFile("win32\\temp.bat", 8); + + temp.WriteLine("php -q generator\\generator.php -l win32\\logs\\config_glade.log -o ext\\libglade\\libglade.overrides -p GladeXML ext\\libglade\\libglade.defs > ext\\libglade\\gen_libglade.c"); + + temp.WriteLine('grep -h "^PHP_GTK_EXPORT_CE" ext\\libglade\\gen_libglade.c | sed -e "s/^/PHP_GTK_API extern /" > ext\\libglade\\gen_libglade.h'); + } + + } else { + + WARNING("libglade not enabled; libraries and headers not found"); + } + +} diff --git a/ext/libglade/libglade.defs b/ext/libglade/libglade.defs index 6d270af..71677c6 100644 --- a/ext/libglade/libglade.defs +++ b/ext/libglade/libglade.defs @@ -1,138 +1,152 @@ ;; -*- scheme -*- ; object definitions ... -(object XML - (in-module Glade) - (parent Data (Gtk)) - (c-name GladeXML) -) - -;; Enumerations and flags ... - - -;; From /usr/include/glade/glade-xml.h -(function glade_xml_get_type - (c-name glade_xml_get_type) - (return-type GtkType) +(define-object XML + (in-module "Glade") + (parent "GtkObject") + (c-name "GladeXML") + (gtype-id "GLADE_TYPE_XML") ) -(function glade_xml_new - (c-name glade_xml_new) - (return-type GladeXML*) - (parameter (type-and-name const-char* fname)) - (parameter (type-and-name const-char* root) (null-ok) (default "NULL")) -) +;; Functions, constructors, and methods ... -(function glade_xml_new_with_domain - (c-name glade_xml_new_with_domain) - (is-constructor-of GladeXML) - (return-type GladeXML*) - (parameter (type-and-name const-char* fname)) - (parameter (type-and-name const-char* root) (null-ok) (default "NULL")) - (parameter (type-and-name const-char* domain) (null-ok) (default "NULL")) +(define-function glade_xml_get_type + (c-name "glade_xml_get_type") + (return-type "GType") ) -(function xml_new_from_memory - (c-name glade_xml_new_from_memory) +(define-function glade_xml_new + (is-constructor-of "GladeXML") + (c-name "glade_xml_new") + (caller-owns-return #t) (return-type GladeXML*) - (parameter (type-and-name char* buffer)) - (parameter (type-and-name int size)) - (parameter (type-and-name const-char* root) (null-ok)) - (parameter (type-and-name const-char* domain) (null-ok)) -) - -(method construct - (of-object XML (Glade)) - (c-name glade_xml_construct) - (return-type gboolean) - (parameter (type-and-name const-char* fname)) - (parameter (type-and-name const-char* root)) - (parameter (type-and-name const-char* domain)) -) - -(method signal_connect - (of-object XML (Glade)) - (c-name glade_xml_signal_connect) - (return-type none) - (parameter (type-and-name const-char* handlername)) - (parameter (type-and-name GtkSignalFunc func)) -) - -(method signal_connect_data - (of-object XML (Glade)) - (c-name glade_xml_signal_connect_data) - (return-type none) - (parameter (type-and-name const-char* handlername)) - (parameter (type-and-name GtkSignalFunc func)) - (parameter (type-and-name gpointer user_data)) -) - -(method signal_autoconnect - (of-object XML (Glade)) - (c-name glade_xml_signal_autoconnect) - (return-type none) -) - -(method signal_connect_full - (of-object XML (Glade)) - (c-name glade_xml_signal_connect_full) - (return-type none) - (parameter (type-and-name const-gchar* handler_name)) - (parameter (type-and-name GladeXMLConnectFunc func)) - (parameter (type-and-name gpointer user_data)) -) - -(method signal_autoconnect_full - (of-object XML (Glade)) - (c-name glade_xml_signal_autoconnect_full) - (return-type none) - (parameter (type-and-name GladeXMLConnectFunc func)) - (parameter (type-and-name gpointer user_data)) -) - -(method get_widget - (of-object XML (Glade)) - (c-name glade_xml_get_widget) - (return-type GtkWidget*) - (parameter (type-and-name const-char* name)) -) - -(method get_widget_prefix - (of-object XML (Glade)) - (c-name glade_xml_get_widget_prefix) - (return-type GList*) - (parameter (type-and-name const-char* name)) -) - -(method get_widget_by_long_name - (of-object XML (Glade)) - (c-name glade_xml_get_widget_by_long_name) - (return-type GtkWidget*) - (parameter (type-and-name const-char* longname)) -) - -(method relative_file - (of-object XML (Glade)) - (c-name glade_xml_relative_file) - (return-type gchar*) - (parameter (type-and-name const-gchar* filename)) -) - -(function get_widget_name - (c-name glade_get_widget_name) - (return-type const-gchar*) - (parameter (type-and-name GtkWidget* widget)) -) - -(function get_widget_long_name - (c-name glade_get_widget_long_name) - (return-type const-gchar*) - (parameter (type-and-name GtkWidget* widget)) + (parameters + '("const-char*" "fname") + '("const-char*" "root") + '("const-char*" "domain") + ) ) -(function get_widget_tree - (c-name glade_get_widget_tree) +(define-function glade_xml_new_from_buffer + (is-constructor-of "GladeXML") + (c-name "glade_xml_new_from_buffer") + (caller-owns-return #t) (return-type GladeXML*) - (parameter (type-and-name GtkWidget* widget)) + (parameters + '("const-char*" "buffer") + '("int" "size") + '("const-char*" "root") + '("const-char*" "domain") + ) +) + +(define-method construct + (of-object "GladeXML") + (c-name "glade_xml_construct") + (return-type "gboolean") + (parameters + '("const-char*" "fname") + '("const-char*" "root") + '("const-char*" "domain") + ) +) + +(define-method signal_connect + (of-object "GladeXML") + (c-name "glade_xml_signal_connect") + (return-type "none") + (parameters + '("const-char*" "handlername") + '("GCallback" "func") + ) +) + +(define-method signal_connect_data + (of-object "GladeXML") + (c-name "glade_xml_signal_connect_data") + (return-type "none") + (parameters + '("const-char*" "handlername") + '("GCallback" "func") + '("gpointer" "user_data") + ) +) + +(define-method signal_autoconnect + (of-object "GladeXML") + (c-name "glade_xml_signal_autoconnect") + (return-type "none") +) + +(define-method signal_connect_full + (of-object "GladeXML") + (c-name "glade_xml_signal_connect_full") + (return-type "none") + (parameters + '("const-gchar*" "handler_name") + '("GladeXMLConnectFunc" "func") + '("gpointer" "user_data") + ) +) + +(define-method signal_autoconnect_full + (of-object "GladeXML") + (c-name "glade_xml_signal_autoconnect_full") + (return-type "none") + (parameters + '("GladeXMLConnectFunc" "func") + '("gpointer" "user_data") + ) +) + +(define-method get_widget + (of-object "GladeXML") + (c-name "glade_xml_get_widget") + (return-type "GtkWidget*") + (parameters + '("const-char*" "name") + ) +) + +(define-method get_widget_prefix + (of-object "GladeXML") + (c-name "glade_xml_get_widget_prefix") + (return-type "GList*") + (parameters + '("const-char*" "name") + ) +) + +(define-method relative_file + (of-object "GladeXML") + (c-name "glade_xml_relative_file") + (return-type "gchar*") + (parameters + '("const-gchar*" "filename") + ) +) + +(define-function glade_get_widget_name + (c-name "glade_get_widget_name") + (return-type "const-char*") + (parameters + '("GtkWidget*" "widget") + ) +) + +(define-function get_widget_tree + (c-name "glade_get_widget_tree") + (return-type "GladeXML*") + (parameters + '("GtkWidget*" "widget") + ) +) + +(define-function set_custom_handler + (c-name "glade_set_custom_handler") + (return-type "none") + (parameters + '("GladeXMLCustomWidgetHandler" "handler") + '("gpointer" "user_data") + ) ) - diff --git a/ext/libglade/libglade.overrides b/ext/libglade/libglade.overrides index 398015f..43349f0 100644 --- a/ext/libglade/libglade.overrides +++ b/ext/libglade/libglade.overrides @@ -12,167 +12,4 @@ ignore glade_xml_signal_connect_full glade_xml_signal_connect_data glade_xml_signal_autoconnect_full -%% -override glade_xml_signal_connect -static void glade_connect_one(const gchar *handler_name, GtkObject *obj, const - gchar *signal_name, const gchar *signal_data, - GtkObject *connect_object, gboolean after, - zval *callback_data) -{ - zval **callback = NULL, **extra = NULL, **pass_object = NULL; - zval **callback_filename = NULL, **callback_lineno = NULL; - zval *object; - TSRMLS_FETCH(); - - zend_hash_index_find(Z_ARRVAL_P(callback_data), 0, (void **)&callback); - zend_hash_index_find(Z_ARRVAL_P(callback_data), 1, (void **)&extra); - zend_hash_index_find(Z_ARRVAL_P(callback_data), 2, (void **)&pass_object); - zend_hash_index_find(Z_ARRVAL_P(callback_data), 3, (void **)&callback_filename); - zend_hash_index_find(Z_ARRVAL_P(callback_data), 4, (void **)&callback_lineno); - - if (connect_object) { - zval *temp; - - Z_LVAL_PP(pass_object) = 0; - object = php_gtk_new(connect_object); - MAKE_STD_ZVAL(temp); - array_init(temp); - add_next_index_zval(temp, object); - php_array_merge(Z_ARRVAL_P(temp), Z_ARRVAL_PP(extra), 0 TSRMLS_CC); - REPLACE_ZVAL_VALUE(extra, temp, 0); - } - - gtk_signal_connect_full(obj, signal_name, NULL, - (GtkCallbackMarshal)php_gtk_callback_marshal, - callback_data, php_gtk_destroy_notify, FALSE, after); -} - -static void glade_signal_connect_impl(INTERNAL_FUNCTION_PARAMETERS, int pass_object) -{ - char *handler_name = NULL; - zval *callback = NULL; - zval *extra; - zval *data; - char *callback_filename; - uint callback_lineno; - - 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", &handler_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); - glade_xml_signal_connect_full(GLADE_XML(PHP_GTK_GET(this_ptr)), handler_name, - (GladeXMLConnectFunc)glade_connect_one, data); - RETURN_NULL(); -} - -PHP_FUNCTION(glade_xml_signal_connect) -{ - glade_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); -} -%% -override glade_xml_signal_connect_object signal_connect_object GladeXML -PHP_FUNCTION(glade_xml_signal_connect_object) -{ - glade_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); -} -%% -override glade_xml_signal_autoconnect - -typedef struct _php_gtk_autoconnect_data { - zend_bool pass_object; - zval *map; -} php_gtk_autoconnect_data; - -static void glade_connect_auto(const gchar *handler_name, GtkObject *obj, - const gchar *signal_name, const gchar *signal_data, - GtkObject *connect_object, gboolean after, - php_gtk_autoconnect_data *ac_data) -{ - zval **callback_data = NULL, *map = ac_data->map; - zval **callback_ptr = NULL, *extra = NULL, *params = NULL; - zval *callback, *data, *object = NULL; - int pass_object = ac_data->pass_object; - char *callback_filename; - uint callback_lineno; - TSRMLS_FETCH(); - - if (map && zend_hash_find(Z_ARRVAL_P(map), (char *)handler_name, strlen(handler_name) + 1, (void **)&callback_data) == SUCCESS) { - if (Z_TYPE_PP(callback_data) != IS_ARRAY || - zend_hash_index_find(Z_ARRVAL_PP(callback_data), 0, (void **)&callback_ptr) == FAILURE) { - php_error(E_WARNING, "%s() is supplied with invalid callback structure for handler '%s'", get_active_function_name(TSRMLS_C), handler_name); - return; - } - zval_add_ref(callback_ptr); - callback = *callback_ptr; - zend_hash_index_del(Z_ARRVAL_PP(callback_data), 0); - extra = *callback_data; - } else { - 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; - } - - MAKE_STD_ZVAL(params); - array_init(params); - - if (connect_object) { - pass_object = 0; - object = php_gtk_new(connect_object); - add_next_index_zval(params, object); - } - - if (extra) - php_array_merge(Z_ARRVAL_P(params), Z_ARRVAL_P(extra), 0 TSRMLS_CC); - callback_filename = zend_get_executed_filename(TSRMLS_C); - callback_lineno = zend_get_executed_lineno(TSRMLS_C); - data = php_gtk_build_value("(NNisi)", callback, params, pass_object, - callback_filename, callback_lineno); - gtk_signal_connect_full(obj, signal_name, NULL, - (GtkCallbackMarshal)php_gtk_callback_marshal, - data, php_gtk_destroy_notify, FALSE, after); -} - -static void glade_signal_autoconnect_impl(INTERNAL_FUNCTION_PARAMETERS, int pass_object) -{ - zval *map = NULL; - php_gtk_autoconnect_data *ac_data; - - NOT_STATIC_METHOD(); - - if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "|a", &map)) - return; - - ac_data = (php_gtk_autoconnect_data *)emalloc(sizeof(php_gtk_autoconnect_data)); - ac_data->map = map; - ac_data->pass_object = pass_object; - glade_xml_signal_autoconnect_full(GLADE_XML(PHP_GTK_GET(this_ptr)), - (GladeXMLConnectFunc)glade_connect_auto, ac_data); -} - -PHP_FUNCTION(glade_xml_signal_autoconnect) -{ - glade_signal_autoconnect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); -} -%% -override glade_xml_signal_autoconnect_object signal_autoconnect_object GladeXML -PHP_FUNCTION(glade_xml_signal_autoconnect_object) -{ - glade_signal_autoconnect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); -} diff --git a/ext/libglade/php_libglade.c b/ext/libglade/php_libglade.c index 3e7e735..f725768 100644 --- a/ext/libglade/php_libglade.c +++ b/ext/libglade/php_libglade.c @@ -24,15 +24,14 @@ #if HAVE_LIBGLADE -#ifdef PHP_GTK_COMPILE_DL_LIBGLADE -PHP_GTK_GET_EXTENSION(libglade) +#ifdef COMPILE_DL_LIBGLADE2 +PHP_GTK_GET_EXTENSION(libglade); #endif PHP_GTK_XINIT_FUNCTION(libglade) { - glade_init(); - php_libglade_register_constants(module_number TSRMLS_CC); - php_libglade_register_classes(); + phpg_libglade_register_classes(); + phpg_libglade_register_constants("GLADE_"); return SUCCESS; } @@ -40,7 +39,7 @@ PHP_GTK_XINIT_FUNCTION(libglade) php_gtk_ext_entry libglade_ext_entry = { "libglade", PHP_GTK_XINIT(libglade), - NULL, + NULL }; -#endif /* HAVE_LIBGLADE */ +#endif /* HAVE_LIBGLADE */ diff --git a/ext/libglade/php_libglade.h b/ext/libglade/php_libglade.h index 6fef2b7..418235f 100644 --- a/ext/libglade/php_libglade.h +++ b/ext/libglade/php_libglade.h @@ -28,20 +28,18 @@ #if HAVE_LIBGLADE #include <glade/glade.h> -#include "gen_ce_libglade.h" +#include "gen_libglade.h" extern php_gtk_ext_entry libglade_ext_entry; -#define libglade_ext_ptr &libglade_ext_entry +#define php_gtk_ext_libglade_ptr &libglade_ext_entry -void php_libglade_register_constants(int module_number TSRMLS_DC); -void php_libglade_register_classes(); +void phpg_libglade_register_constants(const char *strip_prefix); +void phpg_libglade_register_classes(void); #else -#define libglade_ext_ptr NULL +#define php_gtk_ext_libglade_ptr NULL -#endif /* HAVE_LIBGLADE */ +#endif /* HAVE_LIBGLADE */ -#define php_gtk_ext_libglade_ptr libglade_ext_ptr - -#endif /* PHP_LIBGLADE_H */ +#endif /* PHP_LIBGLADE_H */ diff --git a/ext/libglade/v1.libglade.overrides b/ext/libglade/v1.libglade.overrides new file mode 100644 index 0000000..398015f --- /dev/null +++ b/ext/libglade/v1.libglade.overrides @@ -0,0 +1,178 @@ +/* vim: set ft=cpp: */ +%% +headers +#include <glade/glade.h> +#include "ext/gtk+/php_gtk+.h" +%% +ignore-glob + *_get_type +%% +ignore + glade_xml_new + glade_xml_signal_connect_full + glade_xml_signal_connect_data + glade_xml_signal_autoconnect_full +%% +override glade_xml_signal_connect +static void glade_connect_one(const gchar *handler_name, GtkObject *obj, const + gchar *signal_name, const gchar *signal_data, + GtkObject *connect_object, gboolean after, + zval *callback_data) +{ + zval **callback = NULL, **extra = NULL, **pass_object = NULL; + zval **callback_filename = NULL, **callback_lineno = NULL; + zval *object; + TSRMLS_FETCH(); + + zend_hash_index_find(Z_ARRVAL_P(callback_data), 0, (void **)&callback); + zend_hash_index_find(Z_ARRVAL_P(callback_data), 1, (void **)&extra); + zend_hash_index_find(Z_ARRVAL_P(callback_data), 2, (void **)&pass_object); + zend_hash_index_find(Z_ARRVAL_P(callback_data), 3, (void **)&callback_filename); + zend_hash_index_find(Z_ARRVAL_P(callback_data), 4, (void **)&callback_lineno); + + if (connect_object) { + zval *temp; + + Z_LVAL_PP(pass_object) = 0; + object = php_gtk_new(connect_object); + MAKE_STD_ZVAL(temp); + array_init(temp); + add_next_index_zval(temp, object); + php_array_merge(Z_ARRVAL_P(temp), Z_ARRVAL_PP(extra), 0 TSRMLS_CC); + REPLACE_ZVAL_VALUE(extra, temp, 0); + } + + gtk_signal_connect_full(obj, signal_name, NULL, + (GtkCallbackMarshal)php_gtk_callback_marshal, + callback_data, php_gtk_destroy_notify, FALSE, after); +} + +static void glade_signal_connect_impl(INTERNAL_FUNCTION_PARAMETERS, int pass_object) +{ + char *handler_name = NULL; + zval *callback = NULL; + zval *extra; + zval *data; + char *callback_filename; + uint callback_lineno; + + 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", &handler_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); + glade_xml_signal_connect_full(GLADE_XML(PHP_GTK_GET(this_ptr)), handler_name, + (GladeXMLConnectFunc)glade_connect_one, data); + RETURN_NULL(); +} + +PHP_FUNCTION(glade_xml_signal_connect) +{ + glade_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); +} +%% +override glade_xml_signal_connect_object signal_connect_object GladeXML +PHP_FUNCTION(glade_xml_signal_connect_object) +{ + glade_signal_connect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); +} +%% +override glade_xml_signal_autoconnect + +typedef struct _php_gtk_autoconnect_data { + zend_bool pass_object; + zval *map; +} php_gtk_autoconnect_data; + +static void glade_connect_auto(const gchar *handler_name, GtkObject *obj, + const gchar *signal_name, const gchar *signal_data, + GtkObject *connect_object, gboolean after, + php_gtk_autoconnect_data *ac_data) +{ + zval **callback_data = NULL, *map = ac_data->map; + zval **callback_ptr = NULL, *extra = NULL, *params = NULL; + zval *callback, *data, *object = NULL; + int pass_object = ac_data->pass_object; + char *callback_filename; + uint callback_lineno; + TSRMLS_FETCH(); + + if (map && zend_hash_find(Z_ARRVAL_P(map), (char *)handler_name, strlen(handler_name) + 1, (void **)&callback_data) == SUCCESS) { + if (Z_TYPE_PP(callback_data) != IS_ARRAY || + zend_hash_index_find(Z_ARRVAL_PP(callback_data), 0, (void **)&callback_ptr) == FAILURE) { + php_error(E_WARNING, "%s() is supplied with invalid callback structure for handler '%s'", get_active_function_name(TSRMLS_C), handler_name); + return; + } + zval_add_ref(callback_ptr); + callback = *callback_ptr; + zend_hash_index_del(Z_ARRVAL_PP(callback_data), 0); + extra = *callback_data; + } else { + 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; + } + + MAKE_STD_ZVAL(params); + array_init(params); + + if (connect_object) { + pass_object = 0; + object = php_gtk_new(connect_object); + add_next_index_zval(params, object); + } + + if (extra) + php_array_merge(Z_ARRVAL_P(params), Z_ARRVAL_P(extra), 0 TSRMLS_CC); + + callback_filename = zend_get_executed_filename(TSRMLS_C); + callback_lineno = zend_get_executed_lineno(TSRMLS_C); + data = php_gtk_build_value("(NNisi)", callback, params, pass_object, + callback_filename, callback_lineno); + gtk_signal_connect_full(obj, signal_name, NULL, + (GtkCallbackMarshal)php_gtk_callback_marshal, + data, php_gtk_destroy_notify, FALSE, after); +} + +static void glade_signal_autoconnect_impl(INTERNAL_FUNCTION_PARAMETERS, int pass_object) +{ + zval *map = NULL; + php_gtk_autoconnect_data *ac_data; + + NOT_STATIC_METHOD(); + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "|a", &map)) + return; + + ac_data = (php_gtk_autoconnect_data *)emalloc(sizeof(php_gtk_autoconnect_data)); + ac_data->map = map; + ac_data->pass_object = pass_object; + glade_xml_signal_autoconnect_full(GLADE_XML(PHP_GTK_GET(this_ptr)), + (GladeXMLConnectFunc)glade_connect_auto, ac_data); +} + +PHP_FUNCTION(glade_xml_signal_autoconnect) +{ + glade_signal_autoconnect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); +} +%% +override glade_xml_signal_autoconnect_object signal_autoconnect_object GladeXML +PHP_FUNCTION(glade_xml_signal_autoconnect_object) +{ + glade_signal_autoconnect_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); +}