The following testcase crashes 7.7 HEAD:
-----------
void handle_expose(GTK2.Widget widget, array events, int dummy)
{
int width = widget->allocation()->width;
int height = widget->allocation()->height;
Image.Image image = Image.Image(width,height,0,255,0);
GTK2.GdkPixmap pixmap = GTK2.GdkPixmap(image);
widget->draw_pixmap(GTK2.GdkGC(widget), pixmap, 0, 0,
0, 0, width, height);
}
int main(int argc, array(string) argv)
{
GTK2.Widget drawing_area;
GTK2.setup_gtk();
GTK2.Widget window = GTK2.Window(GTK2.GTK_WINDOW_TOPLEVEL);
window->set_default_size(300, 300);
window->signal_connect("destroy", GTK2.main_quit);
drawing_area = GTK2.DrawingArea();
window->add(drawing_area);
drawing_area->signal_connect("expose-event", handle_expose);
window->show_all();
GTK2.main();
}
-----------
The error lies in 7.7/src/post_modules/GTK2/source/common_draw.inc and
the following patch fixes the problem for draw_pixmap():
===================================================================
RCS file: /cvs/Pike/7.7/src/post_modules/GTK2/source/common_draw.inc,v
retrieving revision 1.6
diff -u -r1.6 common_draw.inc
--- common_draw.inc 27 Feb 2006 12:23:15 -0000 1.6
+++ common_draw.inc 15 Mar 2006 08:46:02 -0000
@@ -144,7 +144,7 @@
get_all_args("draw_pixmap",args,"%o%o%+%+%+%+%i%i",
&g,&p,&xs,&ys,&xd,&yd,&w,&h);
if (w>0 && h>0)
- gdk_draw_pixmap(TWIN,GC(g),GDK_DRAWABLE(p),xs,ys,xd,yd,w,h);
+ gdk_draw_pixmap(TWIN,GC(g),GDK_DRAWABLE(get_gdkobject(p, pixmap)),xs,ys,xd,yd,w,h);
RETURN_THIS();
}
Some of the other draw_* in common_draw.inc do the same kind of
strange casts from pike-objects to gtk-objects, so they should
probably be looked at too.