[Gtk-sharp-list] Problem with Semi-Transparent Window

Arno Nühm informatik4u at web.de
Fri May 4 08:46:07 EDT 2007


Hello,
i have a non-decorated (borderless) and dragable Gtk.Window with a semi-transparent PNG image in the background and a label above. The progrmm will be used as a desktop widget and should be transparent (by copying the desktop background).

That works so far, but i have the following problem:
When another window is above my programm and the window is moved or minimized, it draws some lines on my programm. Sometimes even the text of my label will be ereased.

Does somebody knows where's the problem here?

Here is a example code and a example semi-transparent PNG image:

http://img339.imageshack.us/img339/7640/backgroundtransgn8.png


using System;
using Gtk;
using Gdk;

public class TransparentWindow : Gtk.Window
{	
	double offsetX;
	double offsetY;
			
	public TransparentWindow (String title) : base (Gtk.WindowType.Toplevel)
	{
		this.Events |= Gdk.EventMask.ButtonPressMask;
		this.Events |= Gdk.EventMask.ButtonReleaseMask;
		this.Events |= Gdk.EventMask.ButtonMotionMask;
		this.DeleteEvent += new DeleteEventHandler (OnSkinWindowDelete);
		this.ButtonPressEvent += new ButtonPressEventHandler(OnButtonPressEvent);
		this.ButtonReleaseEvent += new ButtonReleaseEventHandler(OnButtonReleaseEvent);
		this.MotionNotifyEvent += new MotionNotifyEventHandler(OnButtonMotionEvent);
		
		this.Title = title;
		this.Stick();
		this.Decorated = false;
		
		// transparent Background image 
		Gdk.Pixbuf pixbufBg = new Pixbuf("backgroundtrans.png");
		Gtk.Image backgroundImage = new Gtk.Image(pixbufBg);
		
		// Label
		Gtk.Label label = new Gtk.Label();
		label.Text = "<span color=\"black\" weight=\"bold\">test test test test test test test test </span>";
		label.UseMarkup = true;
		
		// Container to add Widgets with fixed positions
		Gtk.Fixed fixedContainer = new Gtk.Fixed();
		fixedContainer.Add(backgroundImage);
		fixedContainer.Put(label, 6, 5);
		
		// add fixed Container to window
		this.Add(fixedContainer);
		
		this.ShowAll ();
	}
			
	// drag methods
	private void OnButtonPressEvent(object o, ButtonPressEventArgs a)
	{			
		this.offsetX = a.Event.X;
		this.offsetY = a.Event.Y;
	}
	
	private void OnButtonMotionEvent(object o, MotionNotifyEventArgs a)
	{
			
		int x = (int)(a.Event.XRoot - this.offsetX);
		int y = (int)(a.Event.YRoot - this.offsetY);
		this.Move(x,y);
		}
	
	private void OnButtonReleaseEvent(object o, ButtonReleaseEventArgs a)
	{			
		QueueDraw();
	}
		
	// transparency methods
	void MakeTransparent (Widget widget)
        {
            if (0 < (int) (widget.WidgetFlags & WidgetFlags.NoWindow)) {
                return;
            }

            widget.AppPaintable = true;
            widget.DoubleBuffered = false;
            widget.GdkWindow.SetBackPixmap (null, true);
            widget.ExposeEvent += OnChildExpose;
            widget.StyleSet += MakeTransparentAgain;

        }
        
         void MakeTransparentAgain (object obj, StyleSetArgs args)
        {
            (obj as Widget).GdkWindow.SetBackPixmap (null, true);
        }	
		        
        protected override void OnAdded (Widget widget)
        {
            widget.Realized += OnChildRealized;
            base.OnAdded (widget);
        }
		
		protected override void OnRealized ()
        {
            base.OnRealized ();
            MakeTransparent (this);
        }
        
		[GLib.ConnectBefore]
        void OnChildRealized (object obj, EventArgs args)
        {
            MakeTransparent (obj as Widget);
        }
        
        [GLib.ConnectBefore]
        void OnChildExpose (object obj, ExposeEventArgs args)
        {
            (obj as Widget).GdkWindow.ClearArea (args.Event.Area.X,
                                                 args.Event.Area.Y,
                                                 args.Event.Area.Width,
                                                 args.Event.Area.Height);
            args.RetVal = false;
        }
        
        // quit
        void OnSkinWindowDelete (object sender, DeleteEventArgs a)
	{
		Application.Quit ();
		a.RetVal = true;
	} 
		
	public static void Main (string[] args)
	{
		Application.Init ();
		TransparentWindow win = new TransparentWindow ("TestWindow");
		win.Show ();
		Application.Run ();
	}
}


Thanks in advance!

--
Christian
_______________________________________________________________
SMS schreiben mit WEB.DE FreeMail - einfach, schnell und
kostenguenstig. Jetzt gleich testen! http://f.web.de/?mc=021192



More information about the Gtk-sharp-list mailing list