I have changed it to be a simple window with a HScale slider in the
middle to dictate how round the edges are, so that it might actually be
a demonstratable application, as per pachi's request. Additionally, the
window when resized will scale and maintain the rounding of the corner.
Natan
>On Sun, 04 Jun 2006 15:29:12 +0100
>"Gustavo J. A. M. Carneiro" <[EMAIL PROTECTED]> wrote:
> I have modified it slightly in order to expunge the last traces of
> gdk.GC and gdk.draw_* APIs, which are now deprecated.
>
> Cheers.
>
> Sáb, 2006-06-03 às 20:13 -0300, Johan Dahlin escreveu:
> > anexo mensagem de e-mail (Using cairo to shape windows)
> > > ------ Mensagem Reencaminhada ------
> > > De: Natan Zohar <[EMAIL PROTECTED]>
> > > Para: [EMAIL PROTECTED]
> > > Assunto: Using cairo to shape windows
> > > Data: Sat, 03 Jun 2006 16:31:50 -0400
> > > Aplicação de Email: Sylpheed-Claws 2.2.0 (GTK+ 2.8.17;
> > > i686-pc-linux-gnu)
> > >
> > > 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
> > _______________________________________________
> > pygtk mailing list [email protected]
> > http://www.daa.com.au/mailman/listinfo/pygtk
> > Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/
> --
> Gustavo J. A. M. Carneiro
> <[EMAIL PROTECTED]> <[EMAIL PROTECTED]>
> The universe is always one step beyond logic
#!/usr/bin/env python
# A simple demonstration of using cairo to shape windows.
# Natan 'whatah' Zohar
import gtk
import math
import cairo
class ShapedGUI:
def __init__(self):
self.window = gtk.Window()
self.window.set_default_size(200,200)
self.window.set_border_width(10)
self.rounded = 0
self.padding = 5
self.scale = gtk.HScale()
self.scale.set_range(0, 100)
self.window.add(self.scale)
self.window.connect('size-allocate', self.size_allocate_cb)
self.scale.connect('adjust-bounds', self.slider_moved_cb)
self.window.show_all()
# Find how round the edges should be based on slider value (maximum rounding is = min(width,height)/2)
def find_edge_rounding(self):
val = self.scale.get_value()
val = min(100, val)
val = max(self.padding, val)
self.rounded = (val / 100.0) * min(self.width, self.height) / 2 - self.padding
# Slide callback
def slider_moved_cb(self, obj, data):
self.window.set_default_size(self.width, self.height)
# size allocation callback.
# Shape the window into a rounded rectangle
def size_allocate_cb(self, obj, allocation):
w,h = allocation.width, allocation.height
self.width, self.height = h,w
self.find_edge_rounding()
bitmap = gtk.gdk.Pixmap(None, w, h, 1)
cr = bitmap.cairo_create()
# Clear the bitmap
# Clear the bitmap
cr.set_source_rgb(0,0,0)
cr.set_operator(cairo.OPERATOR_DEST_OUT)
cr.paint()
cr.set_operator(cairo.OPERATOR_OVER)
# Draw our shape into the pixmap using cairo
# Let's try drawing a rectangle with rounded edges.
padding=self.padding # Padding from the edges of the window
rounded=self.rounded # How round to make the edges
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()
shapedWin = ShapedGUI()
shapedWin.window.connect("destroy", lambda w: gtk.main_quit())
gtk.main()
_______________________________________________
pygtk mailing list [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/