(Repost from the ruby-gnome2 developers list, where there seems
to be no-one home)

Folk,

I've subclassed the CellRendererPixbuf to make a renderer that
has a "state" property that displays an appropriate icon for each
state, and I want to add mouse button event handlers to it.

Problem is, there doesn't seem to be any way to get the TreeView
object which is the necessary Widget. In the C API, the _GtkTreeView
object (in gtktreeview.h), there's a "parent" member, but no supported
way of accessing it. What am I missing? Is there some standard Gtk
method or property for getting the parent of a Gtk::Object? If not,
why not?

The code, such as it is, is below. The images for <state> are
simply loaded from <state.png>.

Clifford Heath.

module Gtk
    class CellRendererIconSet < CellRendererPixbuf
        type_register
        install_property(GLib::Param::String.new(
                        "state",
                        "state",
                        "The state of an IconSet",
                        "",
                        GLib::Param::READABLE|GLib::Param::WRITABLE))

        def initialize(*args)
            super()
            @state = nil
            @states = {}
            if (args.size > 0)
                states = args[0]
                if (states.is_a? Hash)
                    @states = states
                elsif (states.is_a? Array)
                    states.each{|s| @states[s] = nil }
                end
                # More handling needed here...
            end
            # and here...
        end

        attr_reader :state

        def state=(s)
            throw "CellRendererIconSet: no such state #{s.inspect} in
#{@states}" if !@states.include?(s)
            @state = s
            self.pixbuf=(icon)
        end

        def icon(s = nil)
            s ||= @state
            puts "loading icon for #{s}" if (!@states[s])
		# Needs a directory path from which to load here:
            @states[s] ||= Gdk::Pixbuf.new(s.to_s.downcase+".png")
        end
    end
end

I want to move something like the following code into the class:


        treeview.add_events(Gdk::Event::BUTTON_PRESS_MASK)
        treeview.signal_connect("button_press_event") { |w, e|
            path, column, cell_x, cell_y = treeview.get_path_at_pos(e.x,
e.y)

            puts "button #{e.button} at (#{e.x}, #{e.y}) row #{path},
column #{column}, at (#{cell_x}, #{cell_y})"

            next if column != self
		on_click(path, e.button, e.state)
        }

... so I can then write (or similar with signals):

	def on_click(path, button, state)
	      next if e.button != 3

            # Get current state and calculate next state:
            storeRow = store[path]
            state = storeRow[Column::IconState]
            newstate = States[(States.index(state)+1) % States.size]
            storeRow[Column::IconState] = newstate
		true
      end