On 09/01/13 09:31, Rouan van Dalen wrote:
> I have an Entry widget inside an EventBox (innerEventBox), and I have
> the innerEventBox inside another
> EventBox (outerEventBox).
>
> I need to traverse from the Entry widget to the outerEventBox so I can
> set the background color of the
> outerEventBox.
>
> I have the following code to do this:
>
>           get2ndAncestor :: Widget -> GType -> IO (Maybe Widget)
>           get2ndAncestor widget gtype =
>              do ancestor1 <- widgetGetAncestor widget gtype
>                 ancestor2 <- maybe (return Nothing) ((flip
> widgetGetAncestor) gtype) ancestor1
>                 return ancestor2
>
> When I use this code, it gets the 1st ancestor correctly, but the 2nd
> ancestor is the same as the 1st.
> The code above never returns the 2nd ancestor.
>
> The docs for widgetGetAncestor has a line that says:
>
> "Note that unlike widgetIsAncestor, widgetGetAncestor considers widget
> to be an ancestor of itself."
>
> I am not sure exactly what that line means, and if it is the cause of my
> problems.  If so, how do I get the
> ancestor of the ancestor of a widget?

It is the cause of your problems. You have this hierarchy of widgets:

   EventBox (a) -> EventBox (b) -> Entry (c)

'widgetGetAncestor b gTypeEventBox' returns Just b, because 
"widgetGetAncestor considers widget to be an ancestor of itself". It 
checks if b is an instance of gTypeEventBox, and since it is, returns 
it. When you call 'widgetGetAncestor c gTypeEventBox', it checks whether 
c is an EventBox, finds it is not, and recurses upwards.

If you know that the widget you want is exactly the grandparent of the 
widget you're starting from, you should be able to use widgetGetParent 
twice to get the EventBox you want.

It might be less fragile to keep hold of the EventBox you're looking for 
when you initially create your UI, so that you don't have to rely on the 
exact widget structure to find what you're looking for.

-- 
Will

------------------------------------------------------------------------------
Master Java SE, Java EE, Eclipse, Spring, Hibernate, JavaScript, jQuery
and much more. Keep your Java skills current with LearnJavaNow -
200+ hours of step-by-step video tutorials by Java experts.
SALE $49.99 this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122612 
_______________________________________________
Gtk2hs-devel mailing list
Gtk2hs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtk2hs-devel

Reply via email to