#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()