mirror of
https://github.com/php/php-gtk-src.git
synced 2026-04-28 11:33:20 +02:00
* Deal with non-pseudocolor colormaps properly.
* Implemented GdkFont functions. * Added support for 's#' parse arg spec.
This commit is contained in:
@@ -7,7 +7,6 @@
|
||||
* Modify generic get/set property handlers to percolate up the inheritance chain
|
||||
looking for attributes.
|
||||
* Implemented optional zval separation when parsing arguments.
|
||||
* Implement s# parse arg support.
|
||||
* Think about separating static class methods, Gtk::widget_push_colormap ->
|
||||
GtkWidget::push_colormap.
|
||||
|
||||
|
||||
+35
-3
@@ -508,11 +508,11 @@ static void gdk_colormap_get_property(zval *result, zval *object, zend_llist_ele
|
||||
zend_overloaded_element *property = (zend_overloaded_element *)(*element)->data;
|
||||
zend_llist_element *next;
|
||||
char *prop_name = Z_STRVAL(property->element);
|
||||
int prop_index;
|
||||
int prop_index, i;
|
||||
|
||||
ZVAL_NULL(result);
|
||||
|
||||
if (!strcmp(prop_name, "colors")) {
|
||||
if (!strcmp(prop_name, "colors") && cmap->colors) {
|
||||
next = (*element)->next;
|
||||
if (next) {
|
||||
property = (zend_overloaded_element *)next->data;
|
||||
@@ -526,6 +526,10 @@ static void gdk_colormap_get_property(zval *result, zval *object, zend_llist_ele
|
||||
*result = *php_gdk_color_new(&cmap->colors[prop_index]);
|
||||
}
|
||||
} else {
|
||||
array_init(result);
|
||||
|
||||
for (i = 0; i < cmap->size; i++)
|
||||
add_next_index_zval(result, php_gdk_color_new(&cmap->colors[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -670,19 +674,47 @@ static void gdk_visual_get_property(zval *result, zval *object, zend_llist_eleme
|
||||
/* GdkFont */
|
||||
PHP_FUNCTION(gdk_font_width)
|
||||
{
|
||||
|
||||
char *text;
|
||||
int length;
|
||||
|
||||
if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "s#", &text, &length))
|
||||
return;
|
||||
|
||||
RETURN_LONG(gdk_text_width(PHP_GDK_FONT_GET(this_ptr), text, length));
|
||||
}
|
||||
|
||||
PHP_FUNCTION(gdk_font_height)
|
||||
{
|
||||
char *text;
|
||||
int length;
|
||||
|
||||
if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "s#", &text, &length))
|
||||
return;
|
||||
|
||||
RETURN_LONG(gdk_text_height(PHP_GDK_FONT_GET(this_ptr), text, length));
|
||||
}
|
||||
|
||||
PHP_FUNCTION(gdk_font_measure)
|
||||
{
|
||||
char *text;
|
||||
int length;
|
||||
|
||||
if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "s#", &text, &length))
|
||||
return;
|
||||
|
||||
RETURN_LONG(gdk_text_measure(PHP_GDK_FONT_GET(this_ptr), text, length));
|
||||
}
|
||||
|
||||
PHP_FUNCTION(gdk_font_extents)
|
||||
{
|
||||
char *text;
|
||||
int length, lbearing, rbearing, width, ascent, descent;
|
||||
|
||||
if (!php_gtk_parse_args(ZEND_NUM_ARGS(), "s#", &text, &length))
|
||||
return;
|
||||
|
||||
gdk_text_extents(PHP_GDK_FONT_GET(this_ptr), text, length, &lbearing, &rbearing, &width, &ascent, &descent);
|
||||
*return_value = *php_gtk_build_value("(iiiii)", lbearing, rbearing, width, ascent, descent);
|
||||
}
|
||||
|
||||
static function_entry php_gdk_font_functions[] = {
|
||||
|
||||
+21
-5
@@ -24,9 +24,12 @@
|
||||
|
||||
#if HAVE_PHP_GTK
|
||||
|
||||
static char *parse_arg_impl(zval **arg, va_list *va, int spec, char *buf)
|
||||
static char *parse_arg_impl(zval **arg, va_list *va, char **spec, char *buf)
|
||||
{
|
||||
switch (spec) {
|
||||
char *spec_walk = *spec;
|
||||
char c = *spec_walk++;
|
||||
|
||||
switch (c) {
|
||||
case 'h':
|
||||
{
|
||||
short *p = va_arg(*va, short *);
|
||||
@@ -66,6 +69,10 @@ static char *parse_arg_impl(zval **arg, va_list *va, int spec, char *buf)
|
||||
*p = Z_STRVAL_PP(arg);
|
||||
if ((int)strlen(*p) != Z_STRLEN_PP(arg))
|
||||
return "string without null bytes";
|
||||
if (*spec_walk == '#') {
|
||||
int *p = va_arg(*va, int *);
|
||||
*p = Z_STRLEN_PP(arg);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -138,12 +145,17 @@ static char *parse_arg_impl(zval **arg, va_list *va, int spec, char *buf)
|
||||
*p = *arg;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return "<unknown>";
|
||||
}
|
||||
|
||||
*spec = spec_walk;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int parse_arg(int arg_num, zval **arg, va_list *va, int spec, int quiet)
|
||||
static int parse_arg(int arg_num, zval **arg, va_list *va, char **spec, int quiet)
|
||||
{
|
||||
char *expected_type;
|
||||
char *actual_type;
|
||||
@@ -230,6 +242,10 @@ static int parse_va_args(int argc, zval ***args, char *format, va_list *va, int
|
||||
max_argc++;
|
||||
break;
|
||||
|
||||
case '#':
|
||||
/* Pass */
|
||||
break;
|
||||
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
break;
|
||||
@@ -252,10 +268,10 @@ static int parse_va_args(int argc, zval ***args, char *format, va_list *va, int
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < argc; i++, format++) {
|
||||
for (i = 0; i < argc; i++) {
|
||||
if (*format == '|')
|
||||
format++;
|
||||
if (!parse_arg(i+1, args[i], va, *format, quiet))
|
||||
if (!parse_arg(i+1, args[i], va, &format, quiet))
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user