Hi,

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.Show();
                this.AppPaintable = true;
                Gtk.Button b = new Gtk.Button("test");
                b.SetSizeRequest(20,20);
                this.Add(b);
                this.ExposeEvent += Expose;
                this.ShowAll();
        }

        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);

                //FillBackground
                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.Fill();
                
                crs.Color = new Cairo.Color(0.0,0.0,0.0);
                crs.LineWidth = 1.0;
                crs.Rectangle(0.5,0.5,400-0.5,400-0.5);
                crs.Stroke();
                
                //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);
                crs.Fill();
                
                cr.SetSourceSurface(surface,0,0);
                cr.PaintWithAlpha(0.8);
        }
}

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
_______________________________________________
Gtk-sharp-list maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/gtk-sharp-list

Reply via email to