[Gtk-sharp-list] Mono-cairo and Gtk# question regarding expose event

Martin Schanzenbach mschanzenbach at gmail.com
Wed Sep 5 13:45:59 EDT 2007


A few days ago I decided to learn mono and gtk#. I wanted to write a
simple widget that looks like libnotify widgets just bigger. But when
I tried to add widgets like a button to the window I couldn't see
anything but the white background and the colored stripe I have drawn
on the window using the expose event.
I'm going to cut things short and show you the code:

using System;
using Gtk;
using Cairo;

public class MainWindow : Gtk.Window
	public MainWindow (): base (Gtk.WindowType.Popup)
                this.SetSizeRequest(400, 400);
		this.AppPaintable = true;
                Gtk.Button b = new Gtk.Button("test");
                this.ExposeEvent += Expose;

        public void Expose(object o, Gtk.ExposeEventArgs args)
                Cairo.Context cr = Gdk.CairoHelper.Create(this.GdkWindow);
		cr.Operator = Cairo.Operator.Source;
		Cairo.Surface surface =
cr.Target.CreateSimilar(Cairo.Content.ColorAlpha, 400, 400);
		Cairo.Context crs = new Cairo.Context(surface);

		Gtk.Style stl = this.Style;
		Gdk.Color background = stl.Base(Gtk.StateType.Normal);
		crs.Color = new Cairo.Color( background.Red / 65535.0,
background.Green / 65535.0, background.Blue / 65535.0);
		crs.Rectangle( 0, 0, 400, 400);
		crs.Color = new Cairo.Color(0.0,0.0,0.0);
		crs.LineWidth = 1.0;
		//draw stripe
		double strx = 1.5;
		double stry = 1.5;
		crs.Color = new Cairo.Color(0.3,0.3,0.3);
		crs.Rectangle(strx,stry,40, 397);

class MainClass
	public static void Main (string[] args)
		Application.Init ();
		MainWindow win = new MainWindow ();
		Application.Run ();

That's the important stuff. Now I checked the theme.c from
notification-daemon (galago project) and the c code looks roughly the
same with the exception that the widgets obviosly DON'T get painted
over when the expose event is triggered. As you can see I used the
paint method PaintWithAlpha so that it is possible to actually see the
widgets below.
My question finally is: Why does mono behave differently here than the
c code? After all notification-daemon also repaints at every expose
event but no widget is ever hidden.
Any help would be greatly appreciated.

Martin Schanzenbach

More information about the Gtk-sharp-list mailing list