com gtk/php-gtk: Implement GdkAtom support.: TODO2 config.m4 ext/gtk+/gtk.overrides ext/gtk+/php_gtk+_types.c genera tor/arg_types.php main/php_gtk.h main/phpg_atom .c

[email protected] (David Soria Parra) Sat, 19 Nov 2005 21:00:57 +0000
Newsgroups php.gtk.cvs
Message-ID <[email protected]>
Commit:    893224246cd5c192f8af0ee9154bd12550f5d1ca
Author:    Andrei Zmievski <[email protected]>         Sat, 19 Nov 2005 21:00:57 +0000
Parents:   24dca3dda20099cb065965c73adb3148346629bf
Branches:  master

Link:       http://git.php.net/?p=gtk/php-gtk.git;a=commitdiff;h=893224246cd5c192f8af0ee9154bd12550f5d1ca

Log:
Implement GdkAtom support.

Changed paths:
  M  TODO2
  M  config.m4
  M  ext/gtk+/gtk.overrides
  M  ext/gtk+/php_gtk+_types.c
  M  generator/arg_types.php
  M  main/php_gtk.h
  A  main/phpg_atom.c
diff_893224246cd5c192f8af0ee9154bd12550f5d1ca.txt (text/plain, 9.5 KB)
893224246cd5c192f8af0ee9154bd12550f5d1ca
diff --git a/TODO2 b/TODO2
index 0eeb7ce..ee7411d 100644
--- a/TODO2
+++ b/TODO2
@@ -10,7 +10,6 @@ Base Functionality
 ~~~~~~~~~~~~~~~~~~
 * Some classes need to be coded in C entirely, see gtk-types.c
 * Interfaces
-* Atoms
 * Implement __gtype, __doc, and other special properties, if possible
 * Deal with clone() handler in Zend
 * Maybe use zend_call_function() instead of call_user_function_ex() to take
diff --git a/config.m4 b/config.m4
index 9674736..ba730f0 100644
--- a/config.m4
+++ b/config.m4
@@ -69,7 +69,7 @@ PHP_SUBST(PHP_GTK_EXTENSIONS)
 PHP_NEW_EXTENSION(php_gtk2, main/php_gtk.c main/phpg_support.c main/phpg_gtype.c \
                             main/phpg_exceptions.c main/php_gtk_util.c main/phpg_gvalue.c \
                             main/phpg_closure.c main/phpg_gboxed.c main/phpg_gpointer.c \
-                            main/phpg_gobject.c,
+                            main/phpg_atom.c main/phpg_gobject.c,
                             $ext_shared,, -I@ext_srcdir@/main)
 
 PHP_ADD_SOURCES_X(/main, php_gtk_ext.c,, shared_objects_php_gtk2)
diff --git a/ext/gtk+/gtk.overrides b/ext/gtk+/gtk.overrides
index bb37f45..867588e 100644
--- a/ext/gtk+/gtk.overrides
+++ b/ext/gtk+/gtk.overrides
@@ -4,6 +4,9 @@ headers
 #include "php_gtk_api.h"
 #include "ext/standard/file.h"
 
+#undef GDK_DISPLAY
+#define GDK_DISPLAY(object) (GDK_DISPLAY_OBJECT(object))
+
 /* TODO
  * implement gtk_adjustment_set_all
  */
diff --git a/ext/gtk+/php_gtk+_types.c b/ext/gtk+/php_gtk+_types.c
index 07ccab6..8110aab 100644
--- a/ext/gtk+/php_gtk+_types.c
+++ b/ext/gtk+/php_gtk+_types.c
@@ -42,7 +42,7 @@ PHP_GTK_API int phpg_rectangle_from_zval(zval *value, GdkRectangle *rectangle TS
 		return SUCCESS;
 	}
 
-	php_error(E_WARNING, "could not convert to type GdkRectangle");
+	php_error(E_WARNING, "unable to convert to type GdkRectangle");
 
 	return FAILURE;
 }
diff --git a/generator/arg_types.php b/generator/arg_types.php
index 623577d..4ea8a8a 100644
--- a/generator/arg_types.php
+++ b/generator/arg_types.php
@@ -640,10 +640,45 @@ class Boxed_Arg extends Arg_Type {
 
 /* {{{ Atom_Arg */
 class Atom_Arg extends Int_Arg {
-    function write_return($type, &$var_list, $separate)
+    const atom_tpl = "
+    %(name) = phpg_gdkatom_from_zval(php_%(name) TSRMLS_CC);
+    if (%(name) == NULL) {
+        php_error(E_WARNING, \"%s::%s() expects %(name) argument to be a valid GdkAtom object\",
+                  get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C));
+        %(on_error);
+    }\n";
+
+    const atom_default_tpl = "
+    if (php_%(name)) {
+        %(name) = phpg_gdkatom_from_zval(php_%(name) TSRMLS_CC);
+        if (%(name) == NULL) {
+            php_error(E_WARNING, \"%s::%s() expects %(name) argument to be a valid GdkAtom object\",
+                      get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C));
+            %(on_error);
+        }
+    }\n";
+
+    function write_param($type, $name, $default, $null_ok, $info)
     {
-        return "    *return_value = *php_gdk_atom_new(%s);\n" .
-               "    return;";
+        if (isset($default)) {
+            $info->var_list->add('GdkAtom', $name . ' = ' . $default);
+            $info->var_list->add('zval', '*php_' . $name . ' = NULL');
+            $info->pre_code[] = aprintf(self::atom_default_tpl, array('name' => $name,
+                                                                      'on_error' => $info->error_action));
+        } else {
+            $info->var_list->add('GdkAtom', $name);
+            $info->var_list->add('zval', '*php_' . $name . ' = NULL');
+            $info->pre_code[] = aprintf(self::atom_tpl, array('name' => $name,
+                                                              'on_error' => $info->error_action));
+        }
+        $info->arg_list[] = $name;
+        $info->add_parse_list('O', array('&php_' . $name, 'gdkatom_ce'));
+    }
+
+    function write_return($type, $owns_return, $info)
+    {
+        $info->var_list->add('GdkAtom', 'php_retval');
+        $info->post_code[] = "\tRETVAL_STRING(gdk_atom_name(php_retval), 1);";
     }
 }
 /* }}} */
@@ -1007,9 +1042,8 @@ $matcher->register('GdkRectangle', new GdkRectangle_Arg);
  * GdkRectangle(Ptr) args and others
  */
 
-#$arg = new Atom_Arg();
-#$matcher->register('GdkAtom', $arg);
-#
+$matcher->register('GdkAtom', new Atom_Arg());
+
 #$arg = new Drawable_Arg();
 #$matcher->register('GdkDrawable*', $arg);
 #
diff --git a/main/php_gtk.h b/main/php_gtk.h
index 5cb0868..d0ab87b 100644
--- a/main/php_gtk.h
+++ b/main/php_gtk.h
@@ -124,6 +124,12 @@ typedef struct {
 	gpointer pointer;
 } phpg_gpointer_t;
 
+typedef struct {
+	PHPG_OBJ_HEADER;
+	gchar *name;
+	GdkAtom atom;
+} phpg_gdkatom_t;
+
 typedef int (*boxed_from_zval_t)(const zval *value, GValue *gvalue TSRMLS_DC);
 typedef int (*boxed_to_zval_t)(const GValue *gvalue, zval **value TSRMLS_DC);
 typedef struct {
@@ -148,6 +154,9 @@ enum {
 
 #define PHPG_GBOXED(zobj) phpg_gboxed_get(zobj TSRMLS_CC)->boxed
 
+#define PHPG_GDKATOM(zobj) ((phpg_gdkatom_t*)PHPG_GET(zobj))->atom
+
+
 /*
  * Property read/write function types
  */
@@ -458,6 +467,11 @@ static inline phpg_gboxed_t* phpg_gboxed_get(zval *zobj TSRMLS_DC)
 void phpg_gpointer_register_self(TSRMLS_D);
 PHP_GTK_API void phpg_gpointer_new(zval **zobj, GType gtype, gpointer pointer TSRMLS_DC);
 
+/* GdkAtom */
+void phpg_gdkatom_register_self(TSRMLS_D);
+PHP_GTK_API void phpg_gdkatom_new(zval **zobj, GdkAtom atom TSRMLS_DC);
+PHP_GTK_API GdkAtom phpg_gdkatom_from_zval(zval *value TSRMLS_DC);
+
 /* Closures */
 PHP_GTK_API GClosure* phpg_closure_new(zval *callback, zval *user_args, int connect_type, zval *replace_object TSRMLS_DC);
 PHP_GTK_API void phpg_watch_closure(zval *obj, GClosure *closure TSRMLS_DC);
@@ -466,6 +480,7 @@ PHP_GTK_API extern PHP_GTK_EXPORT_CE(gtype_ce);
 PHP_GTK_API extern PHP_GTK_EXPORT_CE(gobject_ce);
 PHP_GTK_API extern PHP_GTK_EXPORT_CE(gboxed_ce);
 PHP_GTK_API extern PHP_GTK_EXPORT_CE(gpointer_ce);
+PHP_GTK_API extern PHP_GTK_EXPORT_CE(gdkatom_ce);
 
 #endif /* HAVE_PHP_GTK */
 
diff --git a/main/phpg_atom.c b/main/phpg_atom.c
new file mode 100644
index 0000000..533130e
--- /dev/null
+++ b/main/phpg_atom.c
@@ -0,0 +1,114 @@
+/*
+ * PHP-GTK - The PHP language bindings for GTK+
+ *
+ * Copyright (C) 2001-2004 Andrei Zmievski <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "php_gtk.h"
+
+#if HAVE_PHP_GTK
+
+/*
+ * GdkAtom API and helper functions
+ */
+PHP_GTK_EXPORT_CE(gdkatom_ce) = NULL;
+
+static function_entry gdkatom_methods[] = {
+    PHP_ME_MAPPING(__construct, no_direct_constructor, NULL)
+    { NULL, NULL, NULL }
+};
+
+/* {{{ static phpg_free_gdkatom_storage() */
+static void phpg_free_gdkatom_storage(phpg_gdkatom_t *object TSRMLS_DC)
+{
+	zend_hash_destroy(object->zobj.properties);
+	FREE_HASHTABLE(object->zobj.properties);
+	if (object->name) efree(object->name);
+	efree(object);
+}
+/* }}} */
+
+/* {{{ PHP_GTK_API phpg_create_gdkatom() */
+PHP_GTK_API zend_object_value phpg_create_gdkatom(zend_class_entry *ce TSRMLS_DC)
+{
+	zend_object_value zov;
+	phpg_gdkatom_t *object;
+
+	object = emalloc(sizeof(phpg_gdkatom_t));
+	phpg_init_object(object, ce);
+
+	object->atom = GDK_NONE;
+	object->name = NULL;
+
+	zov.handlers = &php_gtk_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;
+}
+/* }}} */
+
+/* {{{ PHP_GTK_API phpg_gdkatom_new() */
+PHP_GTK_API void phpg_gdkatom_new(zval **zobj, GdkAtom atom TSRMLS_DC)
+{
+    phpg_gdkatom_t *pobj = NULL;
+
+    assert(zobj != NULL);
+    if (*zobj == NULL) {
+        MAKE_STD_ZVAL(*zobj);
+    }
+
+    object_init_ex(*zobj, gdkatom_ce);
+
+    pobj = zend_object_store_get_object(*zobj TSRMLS_CC);
+    pobj->atom = atom;
+    pobj->name = NULL;
+}
+/* }}} */
+
+/* {{{ PHP_GTK_API phpg_gdkatom_from_zval() */
+PHP_GTK_API GdkAtom phpg_gdkatom_from_zval(zval *value TSRMLS_DC)
+{
+    if (value) {
+        if (Z_TYPE_P(value) == IS_STRING) {
+            return gdk_atom_intern(Z_STRVAL_P(value), FALSE);
+        } else if (Z_TYPE_P(value) == IS_OBJECT
+                   && instanceof_function(Z_OBJCE_P(value), gdkatom_ce TSRMLS_CC)) {
+            return PHPG_GDKATOM(value);
+        } else {
+            php_error(E_WARNING, "unable to convert to type GdkAtom");
+            return NULL;
+        }
+    } else {
+        return NULL;
+    }
+}
+/* }}} */
+
+/* {{{ phpg_gdkatom_register_self() */
+void phpg_gdkatom_register_self(TSRMLS_D)
+{
+	if (gdkatom_ce) return;
+
+	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);
+}
+/* }}} */
+
+#endif /* HAVE_PHP_GTK */
+
+/* vim: set fdm=marker et sts=4: */
+