Fw: [PHP-GTK-DEV] a few new bits and bobs
| From: | Steph Fox | Date: | Wed, 21 Jun 2006 05:15:16 +0000 |
| Subject: | Fw: [PHP-GTK-DEV] a few new bits and bobs | ||
| Groups: | php.gtk.dev | ||
| Request: | Send a blank email to php-gtk-dev+get-3128@lists.php.net to get a copy of this message | ||
I shouldn't look at diffs when I'm tired. There _are_ two classes that need a construct exception adding, and neither of them are GtkDialog :\ but they're both covered here.
----- Original Message ----- From: "Steph Fox" <steph@zend.com>
To: "Andrei" <andrei@gravitonic.com>
Cc: "PHP-GTK dev" <php-gtk-dev@lists.php.net>
Sent: Wednesday, June 21, 2006 7:09 AM
Subject: [PHP-GTK-DEV] a few new bits and bobs
gtkoverrides.txt: - constructors for GtkCList and GtkCTree (with/without titles) - implementation of GtkCTree::insert_node() (needs the pointer support to work) - adds construct exception to GtkDialog - actually I thought there was another one that needed this too, did someone else fix it already? gdkoverrides.txt: - GdkPixbuf::add_alpha() can now take zero params (default behaviour is to make white pixels transparent), 1 boolean (as default or simply provides a copy of the original pixbuf) or 3 integers (describing the colour you want to disappear, e.g. 255, 0, 0 == red). - implementations of Gdk::pixmap_colormap_create_from_xpm, Gdk::pixmap_colormap_create_from_xpm_d, Gdk::pixmap_create_from_xpm and Gdk::pixmap_create_from_xpm_d. All four are affected by changes in GTK+ source that make it impossible to pass a NULL value for the drawable, colormap (where appropriate) or color objects. Otherwise unchanged from PHP-GTK 1. typedefs.txt: - Tried to add in the fields that GtkCList and GtkCTree _should_ have but got an unresolved crash when trying to allow some properties (the clist in GtkCTree being primary there) and have no idea why. Not suggesting this goes into CVS even in its shortened form, just want to get some idea what's going down there... anyone? - Steph __________ NOD32 1.1380 (20060125) Information __________ This message was checked by NOD32 antivirus system. http://www.eset.com--------------------------------------------------------------------------------
-- PHP-GTK Development Mailing List (http://gtk.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php __________ NOD32 1.1380 (20060125) Information __________ This message was checked by NOD32 antivirus system. http://www.eset.com
Index: ext/gtk+/gdk.overrides =================================================================== RCS file: /repository/php-gtk/ext/gtk+/gdk.overrides,v retrieving revision 1.64 diff -u -r1.64 gdk.overrides --- ext/gtk+/gdk.overrides 17 Jun 2006 18:43:55 -0000 1.64 +++ ext/gtk+/gdk.overrides 21 Jun 2006 04:56:57 -0000 @@ -1907,6 +1907,47 @@ } %% +add-arginfo GdkPixbuf add_alpha +static +ZEND_BEGIN_ARG_INFO_EX(ARGINFO_NAME, 0, 0, 3) + ZEND_ARG_INFO(0, substitute_or_red) + ZEND_ARG_INFO(0, green) + ZEND_ARG_INFO(0, blue) +ZEND_END_ARG_INFO(); + +%% +override gdk_pixbuf_add_alpha +PHP_METHOD +{ + zend_bool substitute = TRUE; + int red, blue, green; + guchar r = 255, g = 255, b = 255; + GdkPixbuf* pixbuf; + + NOT_STATIC_METHOD(); + + if (ZEND_NUM_ARGS() > 1) { + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "iii", &red, &green, &blue)) { + return; + } else { + r = (guchar)red; + g = (guchar)green; + b = (guchar)blue; + } + } else { + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "|b", &substitute)) + return; + } + + pixbuf = gdk_pixbuf_add_alpha(GDK_PIXBUF(PHPG_GOBJECT(this_ptr)), (gboolean)substitute, r, g, b); + + if (pixbuf) { + phpg_gobject_new(&return_value, (GObject *)pixbuf TSRMLS_CC); + g_object_unref(pixbuf); + } +} + +%% override gdk_pixbuf_get_pixels PHP_METHOD { @@ -2311,6 +2352,193 @@ %% }}} +%% {{{ GdkPixmap + +%% +override gdk_pixmap_colormap_create_from_xpm +PHP_METHOD +{ + zval *php_drawable, *php_trans_color, *php_colormap; + zval *ret_pixmap = NULL, *ret_mask = NULL; + gchar *filename; + zend_bool free_filename = FALSE; + GdkDrawable *drawable = NULL; + GdkColormap *colormap = NULL; + GdkColor *trans_color = NULL; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask; + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "OOOu", &php_drawable, gdkdrawable_ce, + &php_colormap, gdkcolormap_ce, + &php_trans_color, gdkcolor_ce, + &filename, &free_filename)) { + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + drawable = GDK_DRAWABLE(PHPG_GOBJECT(php_drawable)); + colormap = GDK_COLORMAP(PHPG_GOBJECT(php_colormap)); + trans_color = (GdkColor *) PHPG_GBOXED(php_trans_color); + + pixmap = gdk_pixmap_colormap_create_from_xpm(drawable, colormap, &mask, trans_color, filename); + if (free_filename) g_free(filename); + + if (!pixmap) { + php_error(E_WARNING, "%s() cannot load pixmap", get_active_function_name(TSRMLS_C)); + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + phpg_gobject_new(&ret_pixmap, (GObject*)pixmap TSRMLS_CC); + gdk_pixmap_unref(pixmap); + + phpg_gobject_new(&ret_mask, (GObject *)mask TSRMLS_CC); + gdk_bitmap_unref(mask); + + php_gtk_build_value(&return_value, "(NN)", ret_pixmap, ret_mask); +} + +%% +override gdk_pixmap_colormap_create_from_xpm_d +PHP_METHOD +{ + zval *php_drawable, *php_colormap, + *php_trans_color, *php_data; + zval *ret_pixmap = NULL, *ret_mask = NULL; + zval **line; + GdkDrawable *drawable = NULL; + GdkColormap *colormap = NULL; + GdkColor *trans_color = NULL; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask; + char **data; + int len, i = 0; + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "OOOa", &php_drawable, gdkdrawable_ce, + &php_colormap, gdkcolormap_ce, + &php_trans_color, gdkcolor_ce, + &php_data)) { + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + drawable = GDK_DRAWABLE(PHPG_GOBJECT(php_drawable)); + colormap = GDK_COLORMAP(PHPG_GOBJECT(php_colormap)); + trans_color = (GdkColor *) PHPG_GBOXED(php_trans_color); + + len = zend_hash_num_elements(Z_ARRVAL_P(php_data)); + data = emalloc(len * sizeof(char *)); + for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(php_data)); + zend_hash_get_current_data(Z_ARRVAL_P(php_data), (void **)&line) == SUCCESS; + zend_hash_move_forward(Z_ARRVAL_P(php_data))) { + convert_to_string_ex(line); + data[i++] = Z_STRVAL_PP(line); + } + + pixmap = gdk_pixmap_colormap_create_from_xpm_d(drawable, colormap, &mask, trans_color, data); + efree(data); + + if (!pixmap) { + php_error(E_WARNING, "%s() cannot load pixmap", get_active_function_name(TSRMLS_C)); + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + phpg_gobject_new(&ret_pixmap, (GObject*)pixmap TSRMLS_CC); + gdk_pixmap_unref(pixmap); + + phpg_gobject_new(&ret_mask, (GObject *)mask TSRMLS_CC); + gdk_bitmap_unref(mask); + + php_gtk_build_value(&return_value, "(NN)", ret_pixmap, ret_mask); +} + +%% +override gdk_pixmap_create_from_xpm +PHP_METHOD +{ + zval *php_drawable, *php_trans_color; + zval *ret_pixmap = NULL, *ret_mask = NULL; + gchar *filename; + zend_bool free_filename = FALSE; + GdkDrawable *drawable = NULL; + GdkColor *trans_color = NULL; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask; + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "OOu", &php_drawable, gdkdrawable_ce, + &php_trans_color, gdkcolor_ce, + &filename, &free_filename)) { + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + drawable = GDK_DRAWABLE(PHPG_GOBJECT(php_drawable)); + trans_color = (GdkColor *) PHPG_GBOXED(php_trans_color); + + pixmap = gdk_pixmap_create_from_xpm(drawable, &mask, trans_color, filename); + if (free_filename) g_free(filename); + + if (!pixmap) { + php_error(E_WARNING, "%s() cannot load pixmap", get_active_function_name(TSRMLS_C)); + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + phpg_gobject_new(&ret_pixmap, (GObject*)pixmap TSRMLS_CC); + gdk_pixmap_unref(pixmap); + + phpg_gobject_new(&ret_mask, (GObject *)mask TSRMLS_CC); + gdk_bitmap_unref(mask); + + php_gtk_build_value(&return_value, "(NN)", ret_pixmap, ret_mask); +} + +%% +override gdk_pixmap_create_from_xpm_d +PHP_METHOD +{ + zval *php_drawable, *php_trans_color, *php_data; + zval *ret_pixmap = NULL, *ret_mask = NULL; + zval **line; + GdkDrawable *drawable = NULL; + GdkColor *trans_color = NULL; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask; + char **data; + int len, i = 0; + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "OOa", &php_drawable, gdkdrawable_ce, + &php_trans_color, gdkcolor_ce, + &php_data)) { + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + drawable = GDK_DRAWABLE(PHPG_GOBJECT(php_drawable)); + trans_color = (GdkColor *) PHPG_GBOXED(php_trans_color); + + len = zend_hash_num_elements(Z_ARRVAL_P(php_data)); + data = emalloc(len * sizeof(char *)); + for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(php_data)); + zend_hash_get_current_data(Z_ARRVAL_P(php_data), (void **)&line) == SUCCESS; + zend_hash_move_forward(Z_ARRVAL_P(php_data))) { + convert_to_string_ex(line); + data[i++] = Z_STRVAL_PP(line); + } + + pixmap = gdk_pixmap_create_from_xpm_d(drawable, &mask, trans_color, data); + efree(data); + + if (!pixmap) { + php_error(E_WARNING, "%s() cannot load pixmap", get_active_function_name(TSRMLS_C)); + PHPG_THROW_CONSTRUCT_EXCEPTION(GdkPixmap); + } + + phpg_gobject_new(&ret_pixmap, (GObject*)pixmap TSRMLS_CC); + gdk_pixmap_unref(pixmap); + + phpg_gobject_new(&ret_mask, (GObject *)mask TSRMLS_CC); + gdk_bitmap_unref(mask); + + php_gtk_build_value(&return_value, "(NN)", ret_pixmap, ret_mask); +} + +%% }}} + %% {{{ GdkRectangle %% Index: ext/gtk+/gtk-types.defs =================================================================== RCS file: /repository/php-gtk/ext/gtk+/gtk-types.defs,v retrieving revision 1.3 diff -u -r1.3 gtk-types.defs --- ext/gtk+/gtk-types.defs 4 Apr 2005 04:07:30 -0000 1.3 +++ ext/gtk+/gtk-types.defs 19 Jun 2006 17:59:26 -0000 @@ -2481,10 +2481,13 @@ (c-name "GtkCList") (gtype-id "GTK_TYPE_CLIST") (fields - '("GList*" "selection") '("gint" "focus_row") '("gint" "rows") - '("gint" "columns") + '("gint" "sort_column") + '("GtkSortType" "sort_type") + '("GList*" "selection") + '("GtkSelectionMode" "selection_mode") + '("GList*" "row_list") ) ) @@ -2530,7 +2533,11 @@ (c-name "GtkCTree") (gtype-id "GTK_TYPE_CTREE") (fields - '("GList*" "selection") + '("gint" "tree_indent") + '("gint" "tree_spacing") + '("gint" "tree_column") + '("GtkCTreeLineStyle" "line_style") + '("GtkCTreeExpanderStyle" "expander_style") ) ) Index: ext/gtk+/gtk.overrides =================================================================== RCS file: /repository/php-gtk/ext/gtk+/gtk.overrides,v retrieving revision 1.197 diff -u -r1.197 gtk.overrides --- ext/gtk+/gtk.overrides 17 Jun 2006 20:44:14 -0000 1.197 +++ ext/gtk+/gtk.overrides 20 Jun 2006 19:06:37 -0000 @@ -39,8 +39,10 @@ gtk_action_group_add_radio_actions_full gtk_button_new_with_label gtk_button_new_with_mnemonic + gtk_clist_new_with_titles gtk_color_button_new gtk_combo_box_new_with_model + gtk_ctree_new_with_titles gtk_dialog_new gtk_exit gtk_entry_new_with_max_length @@ -1317,6 +1319,62 @@ %% {{{ GtkCList %% +add-arginfo GtkCList __construct +static +ZEND_BEGIN_ARG_INFO_EX(ARGINFO_NAME, 0, 0, 0) + ZEND_ARG_INFO(0, columns) + ZEND_ARG_INFO(0, titles) +ZEND_END_ARG_INFO(); + +%% +override gtk_clist_new +PHP_METHOD +{ + GObject *wrapped_obj; + gint columns, i = 0; + gchar **titles; + zval *php_titles = NULL, **temp_title; + HashTable *target_hash; + + + NOT_STATIC_METHOD(); + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "i|a", &columns, &php_titles)) { + PHPG_THROW_CONSTRUCT_EXCEPTION(GtkCList); + } + + phpg_warn_deprecated("use GtkListStore/GtkTreeView" TSRMLS_CC); + + if (columns <= 0) { + PHPG_THROW_EXCEPTION(phpg_construct_exception, "GtkCList requires the number of columns to be > 0"); + } + + if (php_titles) { + if (zend_hash_num_elements(Z_ARRVAL_P(php_titles)) < columns) { + PHPG_THROW_EXCEPTION(phpg_construct_exception, "The size of the title array needs to match the number of columns"); + } + target_hash = HASH_OF(php_titles); + titles = emalloc(sizeof(gchar *) * columns); + zend_hash_internal_pointer_reset(target_hash); + while (zend_hash_get_current_data(target_hash, (void **)&temp_title) == SUCCESS) { + convert_to_string_ex(temp_title); + titles[i++] = estrndup(Z_STRVAL_PP(temp_title), Z_STRLEN_PP(temp_title)); + zend_hash_move_forward(target_hash); + } + wrapped_obj = (GObject *) gtk_clist_new_with_titles(columns, titles); + efree(titles); + } else { + wrapped_obj = (GObject *)gtk_clist_new(columns); + } + + if (!wrapped_obj) { + PHPG_THROW_CONSTRUCT_EXCEPTION(GtkCList); + } + + phpg_gobject_set_wrapper(this_ptr, wrapped_obj TSRMLS_CC); +} + +%% add-arginfo GtkCList get_selection_info static ZEND_BEGIN_ARG_INFO(ARGINFO_NAME, 0) @@ -1598,6 +1656,136 @@ %% }}} +%% {{{ GtkCTree + +%% +add-arginfo GtkCTree __construct +static +ZEND_BEGIN_ARG_INFO_EX(ARGINFO_NAME, 0, 0, 0) + ZEND_ARG_INFO(0, columns) + ZEND_ARG_INFO(0, tree_column) + ZEND_ARG_INFO(0, titles) +ZEND_END_ARG_INFO(); + +%% +override gtk_ctree_new +PHP_METHOD +{ + GObject *wrapped_obj; + gint columns, tree_column, i = 0; + gchar **titles; + zval *php_titles = NULL, **temp_title; + HashTable *target_hash; + + NOT_STATIC_METHOD(); + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "ii|a", &columns, &tree_column, &php_titles)) { + PHPG_THROW_CONSTRUCT_EXCEPTION(GtkCTree); + } + + phpg_warn_deprecated("use GtkTreeStore/GtkTreeView" TSRMLS_CC); + + if (columns <= 0) { + php_error(E_WARNING, "%s::%s() requires the number of columns to be > 0", + get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C)); + PHPG_THROW_CONSTRUCT_EXCEPTION(GtkCTree); + } + + if (php_titles) { + if (zend_hash_num_elements(Z_ARRVAL_P(php_titles)) < columns) { + php_error(E_WARNING, "%s::%s(): the size of the title array needs to match the number of columns", + get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C)); + PHPG_THROW_CONSTRUCT_EXCEPTION(GtkCTree); + } + target_hash = HASH_OF(php_titles); + titles = emalloc(sizeof(gchar *) * columns); + zend_hash_internal_pointer_reset(target_hash); + while (zend_hash_get_current_data(target_hash, (void **)&temp_title) == SUCCESS) { + convert_to_string_ex(temp_title); + titles[i++] = estrndup(Z_STRVAL_PP(temp_title), Z_STRLEN_PP(temp_title)); + zend_hash_move_forward(target_hash); + } + wrapped_obj = (GObject *) gtk_ctree_new_with_titles(columns, tree_column, titles); + efree(titles); + } else { + wrapped_obj = (GObject *)gtk_ctree_new(columns, tree_column); + } + + if (!wrapped_obj) { + PHPG_THROW_CONSTRUCT_EXCEPTION(GtkCTree); + } + + phpg_gobject_set_wrapper(this_ptr, wrapped_obj TSRMLS_CC); +} + +%% +override gtk_ctree_insert_node +PHP_METHOD +{ + zval *php_parent, *php_sibling, *php_text, **temp_text; + zval *php_pixmap_closed = NULL, *php_pixmap_opened = NULL, + *php_mask_closed = NULL, *php_mask_opened = NULL; + gint columns, spacing = 5, i = 0; + zend_bool is_leaf = 0, expanded = 0; + GtkCTreeNode *parent = NULL, *sibling = NULL, *php_retval; + GdkPixmap *pixmap_closed = NULL, *pixmap_opened = NULL; + GdkBitmap *mask_closed = NULL, *mask_opened = NULL; + GtkCTree *tree; + gchar **text = NULL; + HashTable *target_hash; + + NOT_STATIC_METHOD(); + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "NNa|iNNNNbb", &php_parent, gtkctreenode_ce, + &php_sibling, gtkctreenode_ce, + &php_text, &spacing, + &php_pixmap_closed, gdkpixmap_ce, + &php_mask_closed, gdkpixmap_ce, + &php_pixmap_opened, gdkpixmap_ce, + &php_mask_opened, gdkpixmap_ce, + &is_leaf, &expanded)) { + return; + } + + target_hash = HASH_OF(php_text); + tree = GTK_CTREE(PHPG_GOBJECT(this_ptr)); + columns = GTK_CLIST(tree)->columns; + if (zend_hash_num_elements(target_hash) != columns) { + php_error(E_WARNING, "%s(): the text array size (%d) does not match the number of columns in the ctree (%d)", get_active_function_name(TSRMLS_C), zend_hash_num_elements(target_hash), columns); + return; + } + + if (Z_TYPE_P(php_parent) != IS_NULL) + parent = GTK_CTREE_NODE(PHPG_GPOINTER(php_parent)); + if (Z_TYPE_P(php_sibling) != IS_NULL) + sibling = GTK_CTREE_NODE(PHPG_GPOINTER(php_sibling)); + if (php_pixmap_closed && Z_TYPE_P(php_pixmap_closed) != IS_NULL) + pixmap_closed = GDK_PIXMAP(PHPG_GOBJECT(php_pixmap_closed)); + if (php_mask_closed && Z_TYPE_P(php_mask_closed) != IS_NULL) + mask_closed = GDK_PIXMAP(PHPG_GOBJECT(php_mask_closed)); + if (php_pixmap_opened && Z_TYPE_P(php_pixmap_opened) != IS_NULL) + pixmap_opened = GDK_PIXMAP(PHPG_GOBJECT(php_pixmap_opened)); + if (php_mask_opened && Z_TYPE_P(php_mask_opened) != IS_NULL) + mask_opened = GDK_PIXMAP(PHPG_GOBJECT(php_mask_opened)); + + text = emalloc(sizeof(gchar *) * columns); + zend_hash_internal_pointer_reset(target_hash); + while (zend_hash_get_current_data(target_hash, (void **)&temp_text) == SUCCESS) { + convert_to_string_ex(temp_text); + text[i++] = estrndup(Z_STRVAL_PP(temp_text), Z_STRLEN_PP(temp_text)); + zend_hash_move_forward(target_hash); + } + + php_retval = gtk_ctree_insert_node(tree, parent, sibling, text, (guint8)spacing, + pixmap_closed, mask_closed, pixmap_opened, + mask_opened, is_leaf, expanded); + + efree(text); + phpg_gpointer_new(&return_value, GTK_TYPE_CTREE_NODE, php_retval TSRMLS_CC); +} + +%% }}} + %% {{{ GtkDialog %% @@ -1807,7 +1995,7 @@ GObject *wrapped_obj; if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "|ui", &text, &free_text, &max)) { - return; + PHPG_THROW_CONSTRUCT_EXCEPTION(GtkEntry); } wrapped_obj = (GObject *)g_object_new(phpg_gtype_from_zval(this_ptr), @@ -3030,7 +3218,7 @@ GObject *wrapped_obj = NULL; if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "i|O", &socket_id, &display)) - return; + PHPG_THROW_CONSTRUCT_EXCEPTION(GtkPlug); wrapped_obj = g_object_new(phpg_gtype_from_zval(this_ptr), NULL);