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: */
+