rendered paste body#python version of mouse_events.c
#from http://webcvs.cairographics.org/cairo-demo/gtk/mouse_events.c?revision=1.2
import gtk
import cairo
DEFAULT_WIDTH= 400
DEFAULT_HEIGHT =200
#/* a structure keeping information about
# * the selection */
class SelectionInfo:
def __init__(self):
self.active = False # /* whether the selection is active or not */
self.x, self.y = 0, 0
self.w, self.h = 0, 0
def main():
selection = SelectionInfo()
window = gtk.Window()
window.connect("delete-event", gtk.main_quit)
canvas = gtk.DrawingArea()
canvas.set_size_request(DEFAULT_WIDTH, DEFAULT_HEIGHT)
canvas.connect("expose-event", paint, selection)
canvas.add_events(gtk.gdk.BUTTON1_MOTION_MASK
| gtk.gdk.BUTTON_PRESS_MASK
| gtk.gdk.BUTTON_RELEASE_MASK)
#canvas.add_events(gtk.gdk.BUTTON1_MOTION_MASK)
#canvas.add_events(gtk.gdk.BUTTON_PRESS_MASK)
#canvas.add_events(gtk.gdk.BUTTON_RELEASE_MASK)
canvas.connect("button_press_event", event_press, selection)
canvas.connect("button_release_event", event_release, selection)
canvas.connect("motion_notify_event", event_motion, selection)
window.add(canvas)
window.show_all()
gtk.main()
def paint_selection(cr, sel_info):
if sel_info.active:
return
cr.save()
cr.rectangle(sel_info.x, sel_info.y, sel_info.w, sel_info.h)
cr.set_source_rgba(0,0,1,0.2)
cr.fill_preserve()
cr.set_source_rgba(0,0,0,0.5)
cr.stroke()
cr.restore()
def paint(widget, event, sel_info):
width = widget.get_allocation().width
height = widget.get_allocation().height
cr = widget.window.cairo_create()
cr.set_source_rgb(1,1,1)
cr.paint()
cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
cr.save()
cr.set_font_size(20)
cr.move_to(40,60)
cr.set_source_rgb(0,0,0)
cr.show_text("Drag your mouse here")
cr.restore()
cr.set_source_rgb(1,0,0)
cr.set_font_size(15)
cr.move_to(50,100)
cr.show_text("(and see alpha blended selection")
cr.set_source_rgb(0,0,1)
cr.move_to(0,150)
for i in range(width/10):
cr.rel_line_to(5,10)
cr.rel_line_to(5,-10)
cr.stroke()
paint_selection(cr, sel_info)
#cr.destroy()
def event_press(widget, event, sel_info):
print "event_press"
sel_info.active = True
sel_info.x = event.x
sel_info.y = event.y
sel_info.w = 0
sel_info.h = 0
widget.queue_draw() # gtk_widget_queue_draw (widget);
def event_motion(widget, event, sel_info):
print "event_motion"
sel_info.w = event.x - sel_info.x
sel_info.h = event.y - sel_info.y
widget.queue_draw()
def event_release(widget, event, sel_info):
print "event_release"
sel_info.active = False
widget.queue_draw()
main()