[PATCH] gtk::get_version()
| From: | Steph | Date: | Sun, 11 Sep 2005 11:36:02 +0000 |
| Subject: | [PATCH] gtk::get_version() | ||
| Groups: | php.gtk.dev | ||
| Request: | Send a blank email to php-gtk-dev+get-1623@lists.php.net to get a copy of this message | ||
Note: GtkMenu::popup()'s also attached to this patch, pending review.
I'm going on the assumption that gtk::get_version() was intended as a
userland function rather than an internal function. If not, this function
(or something very like it) needs shifting across to utils.
- Steph
Index: ext/gtk+/gtk.overrides =================================================================== RCS file: /repository/php-gtk/ext/gtk+/gtk.overrides,v retrieving revision 1.119 diff -u -r1.119 gtk.overrides --- ext/gtk+/gtk.overrides 9 Sep 2005 11:02:47 -0000 1.119 +++ ext/gtk+/gtk.overrides 11 Sep 2005 11:18:42 -0000 @@ -287,6 +287,26 @@ } %% +add Gtk get_version +PHP_METHOD +{ +guint major; +guint minor; +guint micro; +char version[256]; +char *gtk_version; + + major = GTK_MAJOR_VERSION; + minor = GTK_MINOR_VERSION; + micro = GTK_MICRO_VERSION; + + snprintf(version, sizeof(version), "GTK %d.%d.%d", major, minor, micro); + gtk_version = version; + + RETURN_STRING(gtk_version, 1); +} + +%% add-arginfo Gtk quit_add static ZEND_BEGIN_ARG_INFO(ARGINFO_NAME, 0) @@ -925,6 +945,88 @@ } %% }}} +%% {{{ GtkMenu +%% +override gtk_menu_popup +static void php_gtk_menu_position(GtkMenu *menu, int *x, int *y, int *push_in, gpointer data) +{ + phpg_cb_data_t *cbd = (phpg_cb_data_t *) data; + char *callback_name; + zval *retval = NULL; + zval ***args = NULL; + int n_args = 0; + TSRMLS_FETCH(); + + if (!zend_is_callable(cbd->callback, 0, &callback_name)) { + php_error(E_WARNING, "unable to call menu position callback '%s' specified in %s on line %d", callback_name, cbd->src_filename, cbd->src_lineno); + efree(callback_name); + return; + } + + if (cbd->user_args) { + args = php_gtk_hash_as_array(cbd->user_args); + n_args = zend_hash_num_elements(Z_ARRVAL_P(cbd->user_args)); + } + + call_user_function_ex(EG(function_table), NULL, cbd->callback, &retval, n_args, args, 0, NULL TSRMLS_CC); + + if (retval) { + if (Z_TYPE_P(retval) == IS_ARRAY && !php_gtk_parse_args_hash_quiet(retval, "ii|b", x, y, push_in)) { + php_error(E_WARNING, "unable to parse result of menu position callback"); + } + zval_ptr_dtor(&retval); + } + + if (args) { + efree(args); + } + + efree(callback_name); +} + +PHP_METHOD +{ + GtkWidget *pms = NULL, *pmi = NULL; + zval *php_pms = NULL, *php_pmi = NULL; + zval *callback = NULL, *user_args = NULL; + int button = 0, time = 0; + phpg_cb_data_t *data; + + NOT_STATIC_METHOD(); + + if (ZEND_NUM_ARGS() > 2) { + if (!php_gtk_parse_varargs(ZEND_NUM_ARGS(), 5, &user_args, "NNVii", &php_pms, gtkwidget_ce, &php_pmi, gtkwidget_ce, &callback, &button, &time)) { + fprintf(stderr, "- At least 5 arguments are required when a menu position callback is used.\n"); + return; + } + } else { + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "|NN", &php_pms, gtkwidget_ce, &php_pmi, gtkwidget_ce)) { + return; + } + } + + if (php_pms && Z_TYPE_P(php_pms) != IS_NULL) + pms = GTK_WIDGET(PHPG_GOBJECT(php_pms)); + if (php_pmi && Z_TYPE_P(php_pmi) != IS_NULL) + pmi = GTK_WIDGET(PHPG_GOBJECT(php_pmi)); + if (!time) + time = gtk_get_current_event_time(); + + if (callback && Z_TYPE_P(callback) != IS_NULL) { + + zval_add_ref(&callback); + data = phpg_cb_data_new(callback, user_args TSRMLS_CC); + + gtk_menu_popup(GTK_MENU(PHPG_GOBJECT(this_ptr)), pms, pmi, + (GtkMenuPositionFunc)php_gtk_menu_position, data, button, time); + + } else { + + gtk_menu_popup(GTK_MENU(PHPG_GOBJECT(this_ptr)), pms, pmi, NULL, NULL, button, time); + } +} +%% }}} + %% {{{ GtkMessageDialog %% add-arginfo GtkMessageDialog __construct
Index: ext/gtk+/gtk.overrides =================================================================== RCS file: /repository/php-gtk/ext/gtk+/gtk.overrides,v retrieving revision 1.119 diff -u -r1.119 gtk.overrides --- ext/gtk+/gtk.overrides 9 Sep 2005 11:02:47 -0000 1.119 +++ ext/gtk+/gtk.overrides 11 Sep 2005 11:18:42 -0000 @@ -287,6 +287,26 @@ } %% +add Gtk get_version +PHP_METHOD +{ +guint major; +guint minor; +guint micro; +char version[256]; +char *gtk_version; + + major = GTK_MAJOR_VERSION; + minor = GTK_MINOR_VERSION; + micro = GTK_MICRO_VERSION; + + snprintf(version, sizeof(version), "GTK %d.%d.%d", major, minor, micro); + gtk_version = version; + + RETURN_STRING(gtk_version, 1); +} + +%% add-arginfo Gtk quit_add static ZEND_BEGIN_ARG_INFO(ARGINFO_NAME, 0) @@ -925,6 +945,88 @@ } %% }}} +%% {{{ GtkMenu +%% +override gtk_menu_popup +static void php_gtk_menu_position(GtkMenu *menu, int *x, int *y, int *push_in, gpointer data) +{ + phpg_cb_data_t *cbd = (phpg_cb_data_t *) data; + char *callback_name; + zval *retval = NULL; + zval ***args = NULL; + int n_args = 0; + TSRMLS_FETCH(); + + if (!zend_is_callable(cbd->callback, 0, &callback_name)) { + php_error(E_WARNING, "unable to call menu position callback '%s' specified in %s on line %d", callback_name, cbd->src_filename, cbd->src_lineno); + efree(callback_name); + return; + } + + if (cbd->user_args) { + args = php_gtk_hash_as_array(cbd->user_args); + n_args = zend_hash_num_elements(Z_ARRVAL_P(cbd->user_args)); + } + + call_user_function_ex(EG(function_table), NULL, cbd->callback, &retval, n_args, args, 0, NULL TSRMLS_CC); + + if (retval) { + if (Z_TYPE_P(retval) == IS_ARRAY && !php_gtk_parse_args_hash_quiet(retval, "ii|b", x, y, push_in)) { + php_error(E_WARNING, "unable to parse result of menu position callback"); + } + zval_ptr_dtor(&retval); + } + + if (args) { + efree(args); + } + + efree(callback_name); +} + +PHP_METHOD +{ + GtkWidget *pms = NULL, *pmi = NULL; + zval *php_pms = NULL, *php_pmi = NULL; + zval *callback = NULL, *user_args = NULL; + int button = 0, time = 0; + phpg_cb_data_t *data; + + NOT_STATIC_METHOD(); + + if (ZEND_NUM_ARGS() > 2) { + if (!php_gtk_parse_varargs(ZEND_NUM_ARGS(), 5, &user_args, "NNVii", &php_pms, gtkwidget_ce, &php_pmi, gtkwidget_ce, &callback, &button, &time)) { + fprintf(stderr, "- At least 5 arguments are required when a menu position callback is used.\n"); + return; + } + } else { + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "|NN", &php_pms, gtkwidget_ce, &php_pmi, gtkwidget_ce)) { + return; + } + } + + if (php_pms && Z_TYPE_P(php_pms) != IS_NULL) + pms = GTK_WIDGET(PHPG_GOBJECT(php_pms)); + if (php_pmi && Z_TYPE_P(php_pmi) != IS_NULL) + pmi = GTK_WIDGET(PHPG_GOBJECT(php_pmi)); + if (!time) + time = gtk_get_current_event_time(); + + if (callback && Z_TYPE_P(callback) != IS_NULL) { + + zval_add_ref(&callback); + data = phpg_cb_data_new(callback, user_args TSRMLS_CC); + + gtk_menu_popup(GTK_MENU(PHPG_GOBJECT(this_ptr)), pms, pmi, + (GtkMenuPositionFunc)php_gtk_menu_position, data, button, time); + + } else { + + gtk_menu_popup(GTK_MENU(PHPG_GOBJECT(this_ptr)), pms, pmi, NULL, NULL, button, time); + } +} +%% }}} + %% {{{ GtkMessageDialog %% add-arginfo GtkMessageDialog __construct