To catch mouse release, you must enable gtk.gdk.BUTTON_RELEASE_MASK but also gtk.gdk.BUTTON_PRESS_MASK !
So
mywidget.add_events(gtk.gdk.BUTTON_RELEASE_MASK) mywidget.connect("button_release_event", self.smart_function)
won't do, while
mywidget.add_events(gtk.gdk.BUTTON_RELEASE_MASK | gtk.gdk.BUTTON_PRESS_MASK) mywidget.connect("button_release_event", self.smart_function)
will.
Notice that - this may seem hackish but is very smart - release events are targeted to the widget over which the button was pressed, not to the one over which it was released (the only case where you need to know that a button pressed on some other widget was released on yours is drag and drop, which has its own methods).
According to the laconic official documentation and on the tutorial, the goal of gtk.gdk.POINTER_MOTION_HINT_MASK is to send you a motion event and then not send another until you call mywidget.get_pointer(), so that events don't keep queuing waiting for you to handle them.
However, this is plainly false in pygtk 2.13.0, where instead:
There are 3 possible explanations:
I see 2 or 3 as more probable, because the widget provided in this article currently doesn't work (tested on Ubuntu Intrepid, Ubuntu Hardy, OpenSolaris 08-11).
Moreover, since C gtk+ documentation tells the same thing (with some more particulars), I definitely see 3 as most probable.
The 'hadjustment' property of a gtk.TreeView is a gtk.Adjustment which shifts the whole treeview left. Can't find a reason for it.
The 'expander-size' style property just changes the height of rows: try for example
gtk.rc_parse_string(""" style "expander-big" { GtkTreeView::expander-size = 30 } class "GtkTreeView" style "expander-big" """)