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);
 }