--- Begin Message ---
Hi,

    pachi (from #pygtk on GIMPNet) told me to shoot along an email over
here with some sample pygtk code for shaping windows (as there isn't
much out there about it). Attached is some code for shaping a window
into a rounded rectangle and (commented out) a circle, that I wrote. I
hope it helps you.

Natan Zohar
#!/usr/bin/env python
# A simple demonstration of using cairo to shape windows.
# Natan 'whatah' Zohar
import gtk
import math

class ShapedGUI:
    def __init__(self):
        self.window = gtk.Window()
        self.window.show() # We show here so the window gets a border on it by the WM
        x,y,w,h = self.window.get_allocation()
        self.window.set_size_request(w,h)
        self.window.connect('size-allocate', self.reshaperect)
#        self.window.connect('size-allocate', self.reshapecircle)
        self.window.show()

    # Shape the window into a rounded rectangle
    def reshaperect(self, obj, allocation):
        w,h = allocation.width, allocation.height
        bitmap = gtk.gdk.Pixmap(None, w, h, 1)
        
        # Clear the bitmap
        fg = gtk.gdk.Color(pixel=0)
        bg = gtk.gdk.Color(pixel=-1)
        fg_gc = bitmap.new_gc(foreground=fg, background=bg)
        bitmap.draw_rectangle(fg_gc, True, 0, 0, w, h)

        # Draw our shape into the pixmap using cairo
        # Let's try drawing a rectangle with rounded edges.
        padding=5 # Padding from the edges of the window
        rounded=30 # How round to make the edges
        cr = bitmap.cairo_create()
        cr.set_source_rgb(0,0,0)
        # Move to top corner
        cr.move_to(0+padding+rounded, 0+padding)
        
        # Top right corner and round the edge
        cr.line_to(w-padding-rounded, 0+padding)
        cr.arc(w-padding-rounded, 0+padding+rounded, rounded, math.pi/2, 0)

        # Bottom right corner and round the edge
        cr.line_to(w-padding, h-padding-rounded)
        cr.arc(w-padding-rounded, h-padding-rounded, rounded, 0, math.pi/2)
       
        # Bottom left corner and round the edge.
        cr.line_to(0+padding+rounded, h-padding)
        cr.arc(0+padding+rounded, h-padding-rounded, rounded, math.pi+math.pi/2, math.pi)

        # Top left corner and round the edge
        cr.line_to(0+padding, 0+padding+rounded)
        cr.arc(0+padding+rounded, 0+padding+rounded, rounded, math.pi/2, 0)
        
        # Fill in the shape.
        cr.fill()

        # Set the window shape
        self.window.shape_combine_mask(bitmap, 0, 0)
        self.window.show()


    # Reshape the window into a circle
    def reshapecircle(self, obj, allocation):
        w,h = allocation.width, allocation.height
        bitmap = gtk.gdk.Pixmap(None, w, h, 1)
        
        # Clear the bitmap 
        fg = gtk.gdk.Color(pixel=0)
        bg = gtk.gdk.Color(pixel=-1)
        fg_gc = bitmap.new_gc(foreground=fg, background=bg)
        bitmap.draw_rectangle(fg_gc, True, 0, 0, w, h)

        # Draw our shape into the bitmap using cairo      
        cr = bitmap.cairo_create()
        cr.set_source_rgb(0,0,0)
        cr.arc(w/2,h/2,min(h,w)/2,0,2*math.pi)
        cr.fill()

        # Set the window shape
        self.window.shape_combine_mask(bitmap, 0, 0)
        self.window.show()

shapedWin = ShapedGUI()
gtk.main()

--- End Message ---
_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to