com gtk/php-gtk: Implement GdkGC::set_dashes() and ::set_values().: ext/gtk+/gdk.overrides ext/gtk+/php_gtk+_types.c main/php_gtk.h

[email protected] (David Soria Parra) Thu, 09 Mar 2006 07:57:36 +0000
Newsgroups php.gtk.cvs
Message-ID <[email protected]>
Commit:    ee088d85b464ff80dbc1cf933bb012a130854d3a
Author:    Andrei Zmievski <[email protected]>         Thu, 9 Mar 2006 07:57:36 +0000
Parents:   8e3b16f63021c5249939d80f7622b3f50860894c
Branches:  master

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

Log:
Implement GdkGC::set_dashes() and ::set_values().

# Untested

Changed paths:
  M  ext/gtk+/gdk.overrides
  M  ext/gtk+/php_gtk+_types.c
  M  main/php_gtk.h
diff_ee088d85b464ff80dbc1cf933bb012a130854d3a.txt (text/plain, 11.8 KB)
ee088d85b464ff80dbc1cf933bb012a130854d3a
diff --git a/ext/gtk+/gdk.overrides b/ext/gtk+/gdk.overrides
index 2882ea0..0bb3a49 100644
--- a/ext/gtk+/gdk.overrides
+++ b/ext/gtk+/gdk.overrides
@@ -47,7 +47,6 @@ ignore
 
 /* }}} */
 
-
 %% {{{ Gdk
 
 %%
@@ -91,7 +90,6 @@ PHP_METHOD
 
 %% }}}
 
-
 %% {{{ GdkColor
 
 %%
@@ -323,7 +321,6 @@ PHP_METHOD
 
 %% }}}
 
-
 %% {{{ GdkDisplay
 
 %%
@@ -373,10 +370,21 @@ PHP_METHOD
 
 %% }}}
 
-
 %% {{{ GdkDrawable
 
 %%
+override-prop GdkDrawable xid
+PHPG_PROP_READER
+{
+#if defined(GDK_WINDOWING_X11)
+	RETVAL_LONG(GDK_DRAWABLE_XID(((GdkDrawable *)((phpg_gobject_t *)object)->obj)));
+#else
+    RETVAL_LONG((long) GDK_WINDOW_HWND((GdkDrawable *)((phpg_gobject_t *)object)->obj));
+#endif
+    return SUCCESS;
+}
+
+%%
 override gdk_drawable_get_size
 PHP_METHOD
 {
@@ -393,7 +401,6 @@ PHP_METHOD
 
 %% }}}
 
-
 %% {{{ GdkEvent
 
 %% {{{ read_property handler
@@ -1012,6 +1019,217 @@ PHP_METHOD
 
 %% }}}
 
+%% {{{ GdkGC
+
+%%
+override gdk_gc_set_dashes
+PHP_METHOD
+{
+    int dash_offset, n, i;
+    zval *dash_array, **item;
+    guchar *dash_list;
+
+    NOT_STATIC_METHOD();
+
+    if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "ia", &dash_offset, &dash_array)) {
+        return;
+    }
+
+    n = zend_hash_num_elements(Z_ARRVAL_P(dash_array));
+    dash_list = emalloc(n * sizeof(char));
+    for (i = 0, zend_hash_internal_pointer_reset(Z_ARRVAL_P(dash_array));
+         zend_hash_get_current_data(Z_ARRVAL_P(dash_array), (void **) &item) == SUCCESS;
+         zend_hash_move_forward(Z_ARRVAL_P(dash_array)), i++) {
+
+        if (Z_TYPE_PP(item) != IS_LONG) {
+            php_error(E_WARNING, "%s::%s(): dash list elements have to be integers",
+                      get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C));
+            efree(dash_list);
+            return;
+        }
+        dash_list[i] = (guchar)clamp_int(Z_LVAL_PP(item), 0, 255);
+        if (dash_list[i] == 0) {
+            php_error(E_WARNING, "%s::%s(): dash list element cannot be 0",
+                      get_active_class_name(NULL TSRMLS_CC), get_active_function_name(TSRMLS_C));
+            efree(dash_list);
+            return;
+        }
+    }
+
+    gdk_gc_set_dashes(GDK_GC(PHPG_GOBJECT(this_ptr)), dash_offset, dash_list, n);
+    efree(dash_list);
+}
+
+%%
+override gdk_gc_set_values
+PHP_METHOD
+{
+    zval *php_values, **value;
+	char *key;
+	uint key_len;
+	ulong num_key;
+	HashTable *hash;
+	GdkGCValues values;
+	GdkGCValuesMask mask = 0;
+
+    NOT_STATIC_METHOD();
+
+	if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "a", &php_values)) {
+		return;
+    }
+
+    hash = HASH_OF(php_values);
+    zend_hash_internal_pointer_reset(hash);
+    while (zend_hash_get_current_data(hash, (void**)&value) == SUCCESS) {
+        if (zend_hash_get_current_key_ex(hash, &key, &key_len, &num_key, 0, NULL) == HASH_KEY_IS_STRING) {
+            if (!strcmp(key, "foreground")) {
+                GdkColor *c;
+
+                if (!phpg_object_isa(*value, gdkcolor_ce)) {
+                    php_error(E_WARNING, "foreground value has to be a GdkColor");
+                    return;
+                }
+                c = (GdkColor *) PHPG_GBOXED(*value);
+                mask |= GDK_GC_FOREGROUND;
+                values.foreground.red 	= c->red;
+                values.foreground.green = c->green;
+                values.foreground.blue 	= c->blue;
+                values.foreground.pixel = c->pixel;
+            } else if (!strcmp(key, "background")) {
+                GdkColor *c;
+
+                if (!phpg_object_isa(*value, gdkcolor_ce)) {
+                    php_error(E_WARNING, "background value has to be a GdkColor");
+                    return;
+                }
+                c = (GdkColor *) PHPG_GBOXED(*value);
+                mask |= GDK_GC_BACKGROUND;
+                values.background.red 	= c->red;
+                values.background.green = c->green;
+                values.background.blue 	= c->blue;
+                values.background.pixel = c->pixel;
+            } else if (!strcmp(key, "font")) {
+                if (!phpg_object_isa(*value, gdkfont_ce)) {
+                    php_error(E_WARNING, "font value has to be a GdkFont");
+                    return;
+                }
+                mask |= GDK_GC_FONT;
+                values.font = (GdkFont *) PHPG_GBOXED(*value);
+            } else if (!strcmp(key, "function")) {
+                if (Z_TYPE_PP(value) != IS_LONG) {
+                    php_error(E_WARNING, "function value has to be an integer");
+                    return;
+                }
+                mask |= GDK_GC_FUNCTION;
+                values.function = Z_LVAL_PP(value);
+            } else if (!strcmp(key, "fill")) {
+                if (Z_TYPE_PP(value) != IS_LONG) {
+                    php_error(E_WARNING, "fill value has to be an integer");
+                    return;
+                }
+                mask |= GDK_GC_FILL;
+                values.fill = Z_LVAL_PP(value);
+            } else if (!strcmp(key, "tile")) {
+                if (!phpg_object_isa(*value, gdkpixmap_ce)) {
+                    php_error(E_WARNING, "tile value has to be a GdkPixmap");
+                    return;
+                }
+                mask |= GDK_GC_TILE;
+                values.tile = GDK_PIXMAP(PHPG_GOBJECT(*value));
+            } else if (!strcmp(key, "stipple")) {
+                if (!phpg_object_isa(*value, gdkpixmap_ce)) {
+                    php_error(E_WARNING, "stipple value has to be a GdkPixmap");
+                    return;
+                }
+                mask |= GDK_GC_STIPPLE;
+                values.stipple = GDK_PIXMAP(PHPG_GOBJECT(*value));
+            } else if (!strcmp(key, "clip_mask")) {
+                if (!phpg_object_isa(*value, gdkpixmap_ce)) {
+                    php_error(E_WARNING, "clip_mask value has to be a GdkPixmap");
+                    return;
+                }
+                mask |= GDK_GC_CLIP_MASK;
+                values.clip_mask = GDK_PIXMAP(PHPG_GOBJECT(*value));
+            } else if (!strcmp(key, "subwindow_mode")) {
+                if (Z_TYPE_PP(value) != IS_LONG) {
+                    php_error(E_WARNING, "subwindow_mode value has to be an integer");
+                    return;
+                }
+                mask |= GDK_GC_SUBWINDOW;
+                values.subwindow_mode = Z_LVAL_PP(value);
+            } else if (!strcmp(key, "ts_x_origin")) {
+                if (Z_TYPE_PP(value) != IS_LONG) {
+                    php_error(E_WARNING, "ts_x_origin value has to be an integer");
+                    return;
+                }
+                mask |= GDK_GC_TS_X_ORIGIN;
+                values.ts_x_origin = Z_LVAL_PP(value);
+            } else if (!strcmp(key, "ts_y_origin")) {
+                if (Z_TYPE_PP(value) != IS_LONG) {
+                    php_error(E_WARNING, "ts_y_origin value has to be an integer");
+                    return;
+                }
+                mask |= GDK_GC_TS_Y_ORIGIN;
+                values.ts_y_origin = Z_LVAL_PP(value);
+            } else if (!strcmp(key, "clip_x_origin")) {
+                if (Z_TYPE_PP(value) != IS_LONG) {
+                    php_error(E_WARNING, "clip_x_origin value has to be an integer");
+                    return;
+                }
+                mask |= GDK_GC_CLIP_X_ORIGIN;
+                values.clip_x_origin = Z_LVAL_PP(value);
+            } else if (!strcmp(key, "clip_y_origin")) {
+                if (Z_TYPE_PP(value) != IS_LONG) {
+                    php_error(E_WARNING, "clip_y_origin value has to be an integer");
+                    return;
+                }
+                mask |= GDK_GC_CLIP_Y_ORIGIN;
+                values.clip_y_origin = Z_LVAL_PP(value);
+            } else if (!strcmp(key, "graphics_exposures")) {
+                if (Z_TYPE_PP(value) != IS_LONG) {
+                    php_error(E_WARNING, "graphics_exposures value has to be an integer");
+                    return;
+                }
+                mask |= GDK_GC_EXPOSURES;
+                values.graphics_exposures = Z_LVAL_PP(value);
+            } else if (!strcmp(key, "line_width")) {
+                if (Z_TYPE_PP(value) != IS_LONG) {
+                    php_error(E_WARNING, "line_width value has to be an integer");
+                    return;
+                }
+                mask |= GDK_GC_LINE_WIDTH;
+                values.line_width = Z_LVAL_PP(value);
+            } else if (!strcmp(key, "line_style")) {
+                if (Z_TYPE_PP(value) != IS_LONG) {
+                    php_error(E_WARNING, "line_style value has to be an integer");
+                    return;
+                }
+                mask |= GDK_GC_LINE_STYLE;
+                values.line_style = Z_LVAL_PP(value);
+            } else if (!strcmp(key, "cap_style")) {
+                if (Z_TYPE_PP(value) != IS_LONG) {
+                    php_error(E_WARNING, "cap_style value has to be an integer");
+                    return;
+                }
+                mask |= GDK_GC_CAP_STYLE;
+                values.cap_style = Z_LVAL_PP(value);
+            } else if (!strcmp(key, "join_style")) {
+                if (Z_TYPE_PP(value) != IS_LONG) {
+                    php_error(E_WARNING, "join_style value has to be an integer");
+                    return;
+                }
+                mask |= GDK_GC_JOIN_STYLE;
+                values.join_style = Z_LVAL_PP(value);
+            }
+        }
+        zend_hash_move_forward(hash);
+    }
+
+    gdk_gc_set_values(GDK_GC(PHPG_GOBJECT(this_ptr)), &values, mask);
+    RETURN_TRUE;
+}
+
+%% }}}
 
 %% {{{ GdkPixbuf
 
@@ -1191,7 +1409,6 @@ PHP_METHOD
 
 %% }}}
 
-
 %% {{{ GdkScreen
 
 %%
@@ -1242,7 +1459,6 @@ PHP_METHOD
 
 %% }}}
 
-
 %% {{{ GdkWindow
 
 %%
@@ -1429,18 +1645,6 @@ PHP_METHOD
 }
 
 %%
-override-prop GdkDrawable xid
-PHPG_PROP_READER
-{
-#if defined(GDK_WINDOWING_X11)
-	RETVAL_LONG(GDK_DRAWABLE_XID(((GdkDrawable *)((phpg_gobject_t *)object)->obj)));
-#else
-    RETVAL_LONG((long) GDK_WINDOW_HWND((GdkDrawable *)((phpg_gobject_t *)object)->obj));
-#endif
-    return SUCCESS;
-}
-
-%%
 override gdk_atom_intern
 PHP_METHOD
 {
diff --git a/ext/gtk+/php_gtk+_types.c b/ext/gtk+/php_gtk+_types.c
index aef0336..d5cb7af 100644
--- a/ext/gtk+/php_gtk+_types.c
+++ b/ext/gtk+/php_gtk+_types.c
@@ -251,7 +251,7 @@ static void style_helper_write_dimension(zval *object, zval *offset, zval *value
         case STYLE_GC_ARRAY:
         {
             GdkGC **array = (GdkGC **) sh->array;
-            if (!phpg_object_check(value, gdkgc_ce TSRMLS_CC)) {
+            if (!phpg_object_isa(value, gdkgc_ce TSRMLS_CC)) {
                 php_error(E_WARNING, "Can only assign a GdkGC object");
                 return;
             }
@@ -265,7 +265,7 @@ static void style_helper_write_dimension(zval *object, zval *offset, zval *value
         case STYLE_PIXMAP_ARRAY:
         {
             GdkPixmap **array = (GdkPixmap **) sh->array;
-            if (Z_TYPE_P(value) != IS_NULL && !phpg_object_check(value, gdkpixmap_ce TSRMLS_CC)) {
+            if (Z_TYPE_P(value) != IS_NULL && !phpg_object_isa(value, gdkpixmap_ce TSRMLS_CC)) {
                 php_error(E_WARNING, "Can only assign a GdkPixmap object or null");
                 return;
             }
diff --git a/main/php_gtk.h b/main/php_gtk.h
index 63d04bd..55a386f 100644
--- a/main/php_gtk.h
+++ b/main/php_gtk.h
@@ -303,7 +303,7 @@ PHP_GTK_API void phpg_warn_deprecated(char *msg TSRMLS_DC);
 PHP_GTK_API  void php_gtk_signal_connect_impl(INTERNAL_FUNCTION_PARAMETERS, int pass_object, int after);
 PHP_GTK_API zval* php_gtk_simple_signal_callback(GtkObject *o, gpointer data, zval *gtk_args );
 
-static inline zend_bool phpg_object_check(zval *zobj, zend_class_entry *ce TSRMLS_DC)
+static inline zend_bool phpg_object_isa(zval *zobj, zend_class_entry *ce TSRMLS_DC)
 {
     phpg_return_val_if_fail(zobj != NULL, FALSE);
     phpg_return_val_if_fail(ce != NULL, FALSE);