Re: GTK_VISIBLE flag




Owen Taylor <otaylor@redhat.com> writes:

> Lars Hamann <lars@gtk.org> writes:
> 
> > Hi Owen!
> > 
> > I've a little question about the GTK_VISIBLE flag and the gtk_widget_real_map
> > function.
> > 
> > Currently it's possible to call something like :
> > 
> > gtk_widget_hide (widget);
> > gtk_widget_realize (widget);
> > gtk_widget_map (widget);
> > 
> > This code will bring any widget onto the screen, but its GTK_VISIBLE flag
> > will be FALSE. I think gtk_widget_real_map should set GTK_VISIBLE. Or, if you
> > don't like that, it should at least abort the map operation.
> 
> I think a 
> 
>  g_return_if_fail (GTK_WIDGET_VISIBLE (widget));
> 
> would be the better solution. (Probably in gtk_widget_map()) Anything
> else would be confusing gtk_widget_map() with gtk_widget_show().
> gtk_widget_map() is a lowlevel call that you shouldn't make on
> a widget unless it's VISIBLE flag is true. I don't really want
> to allow "broken" code to work here, because GTK+ is going to
> have a harder time of it if things are done in strange, unforseen
> orders.

Speaking of strange, unforseen orders, it appears that in
may cases, adding an !VISIBLE widget to a mapped parent will
result in the widget being mapped, though the VISIBLE flag
is not set.

GTK+ is littered with code like: [ from gtk_bin_add() ]

  if (GTK_WIDGET_VISIBLE (child->parent))
    {
      if (GTK_WIDGET_REALIZED (child->parent) &&
	  !GTK_WIDGET_REALIZED (child))
	gtk_widget_realize (child);
      
      if (GTK_WIDGET_MAPPED (child->parent) &&
	  !GTK_WIDGET_MAPPED (child))
	gtk_widget_map (child);
    }
  
These all need to be fixed :-( - it should be 

      if (GTK_WIDGET_MAPPED (child->parent) &&
          GTK_WIDGET_VISIBLE (child) &&
	  !GTK_WIDGET_MAPPED (child))
	gtk_widget_map (child);

Regards,
                                        Owen



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]