com gtk/php-gtk: - Implement atom object comparison and string casting. - Override Gdk::atom_intern() to return objects : ext/gtk+/gdk.overrides main/phpg_atom.c
[email protected] (David Soria Parra) Sat, 19 Nov 2005 21:45:36 +0000
| Newsgroups | php.gtk.cvs |
|---|---|
| Message-ID | <[email protected]> |
Commit: b9c43be5952d75835d6014c3545463a23e305fbf Author: Andrei Zmievski <[email protected]> Sat, 19 Nov 2005 21:45:36 +0000 Parents: fd28b69eea616874ed17a1b40d84f4c0d42c9971 Branches: master Link: http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=b9c43be5952d75835d6014c3545463a23e305fbf Log: - Implement atom object comparison and string casting. - Override Gdk::atom_intern() to return objects Changed paths: M ext/gtk+/gdk.overrides M main/phpg_atom.c Diff: b9c43be5952d75835d6014c3545463a23e305fbf diff --git a/ext/gtk+/gdk.overrides b/ext/gtk+/gdk.overrides index 13351c7..4cadc77 100644 --- a/ext/gtk+/gdk.overrides +++ b/ext/gtk+/gdk.overrides @@ -998,3 +998,22 @@ PHPG_PROP_READER return SUCCESS; } +%% +override gdk_atom_intern +PHP_METHOD +{ + char *atom_name; + zend_bool free_atom_name, only_if_exists = FALSE; + GdkAtom php_atom; + + if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "u|b", &atom_name, &free_atom_name, &only_if_exists)) + return; + + php_atom = gdk_atom_intern(atom_name, (gboolean)only_if_exists); + if (free_atom_name) g_free(atom_name); + if (php_atom == GDK_NONE) { + RETURN_NULL(); + } + phpg_gdkatom_new(&return_value, php_atom TSRMLS_CC); +} + diff --git a/main/phpg_atom.c b/main/phpg_atom.c index 533130e..eeda46b 100644 --- a/main/phpg_atom.c +++ b/main/phpg_atom.c @@ -27,6 +27,8 @@ */ PHP_GTK_EXPORT_CE(gdkatom_ce) = NULL; +static zend_object_handlers phpg_gdkatom_handlers; + static function_entry gdkatom_methods[] = { PHP_ME_MAPPING(__construct, no_direct_constructor, NULL) { NULL, NULL, NULL } @@ -42,6 +44,47 @@ static void phpg_free_gdkatom_storage(phpg_gdkatom_t *object TSRMLS_DC) } /* }}} */ +/* {{{ static phpg_gdkatom_compare_objects() */ +static int phpg_gdkatom_compare_objects(zval *zobj1, zval *zobj2 TSRMLS_DC) +{ + phpg_gdkatom_t *pobj1, *pobj2; + + pobj1 = zend_object_store_get_object(zobj1 TSRMLS_CC); + pobj2 = zend_object_store_get_object(zobj2 TSRMLS_CC); + + return (pobj1->atom > pobj2->atom) ? 1 : (pobj1->atom < pobj2->atom ? -1 : 0); +} +/* }}} */ + +/* {{{ static phpg_gdkatom_cast_object() */ +static int phpg_gdkatom_cast_object(zval *readobj, zval *writeobj, int type, int should_free TSRMLS_DC) +{ + phpg_gdkatom_t *pobj; + zval free_obj; + + if (type == IS_STRING) { + pobj = zend_object_store_get_object(readobj TSRMLS_CC); + if (should_free) { + free_obj = *writeobj; + } + if (!pobj->name) { + pobj->name = estrdup(gdk_atom_name(pobj->atom)); + } + if (!pobj->name) { + /* TODO obtain representation from __toString() perhaps */ + } + ZVAL_STRING(writeobj, pobj->name, 1); + if (should_free) { + zval_dtor(&free_obj); + } + + return SUCCESS; + } + + return FAILURE; +} +/* }}} */ + /* {{{ PHP_GTK_API phpg_create_gdkatom() */ PHP_GTK_API zend_object_value phpg_create_gdkatom(zend_class_entry *ce TSRMLS_DC) { @@ -54,7 +97,7 @@ PHP_GTK_API zend_object_value phpg_create_gdkatom(zend_class_entry *ce TSRMLS_DC object->atom = GDK_NONE; object->name = NULL; - zov.handlers = &php_gtk_handlers; + zov.handlers = &phpg_gdkatom_handlers; zov.handle = zend_objects_store_put(object, (zend_objects_store_dtor_t) zend_objects_destroy_object, (zend_objects_free_object_storage_t) phpg_free_gdkatom_storage, NULL TSRMLS_CC); return zov; @@ -103,6 +146,10 @@ void phpg_gdkatom_register_self(TSRMLS_D) { if (gdkatom_ce) return; + phpg_gdkatom_handlers = php_gtk_handlers; + phpg_gdkatom_handlers.compare_objects = phpg_gdkatom_compare_objects; + phpg_gdkatom_handlers.cast_object = phpg_gdkatom_cast_object; + gdkatom_ce = phpg_register_class("GdkAtom", gdkatom_methods, NULL, 0, NULL, phpg_create_gdkatom, G_TYPE_POINTER TSRMLS_CC); phpg_register_int_constant(gdkatom_ce, "gtype", sizeof("gtype")-1, G_TYPE_POINTER); }