Re: Reparenting bug
- From: Owen Taylor <otaylor redhat com>
- To: Conrad Steenberg <conrad srl caltech edu>
- Cc: gtk-list redhat com
- Subject: Re: Reparenting bug
- Date: 23 Jul 1999 10:35:36 -0400
Conrad Steenberg <conrad@srl.caltech.edu> writes:
> On Thu, 22 Jul 1999, Havoc Pennington wrote:
>
> > Anyway, I think the problem is that GtkSpinButton has two subwindows that
> > are direct children of its parent's windows, so gtk_widget_reparent()'s
> > attempt to reparent widget->window and save an unrealize leaves the
> > subwindow containing the little arrows behind. Using
> > container_remove()/container_add() will be a nice workaround, but this is
> > really a Gtk bug, I think. At least, I"m guessing that that's the problem.
>
> Hmmm, container_remove doesn't by any chance destroy the widget as well?
> Doing a remove/add as suggested results in the remove succeeding, but the
> add failing complaining that the child widget is not a widget anymore.
The parent widget holds the reference count on the widget, so
you need to do:
gtk_object_ref (widget);
gtk_container_remove (old_parent, widget);
gtk_container_add (new_parent, widget);
gtk_object_unref (widget);
> Anyway, as far as the reparenting goes, doing a reparent once works (out
> of original window), reparent back fails (back to original), and reparent
> again (out out original) works again. So it is the 'moving back to
> original window' op that fails.
Reparenting is broken for a number of widgets; that needs
to be fixed at some point; that could be done a couple
of ways.
1) Add another widget flag which says: "This widget
cannot be reparented using XReparentWindow()"
2) Give up on reparenting - simply make gtk_widget_reparent
always do the above ref()/remove()/add()/unref() sequence.
This is going to be 99% as efficient as what
reparent does now ... the only thing that you
save currently is destroying and creating the
X windows.
3) Scan all child GdkWindows of the parent window
and try to figure out which ones belong to the
widget. This is, I suspect, not going to be
reliable, anyways.
If you want to add a bug report to the bug tracker about
this, it will help make sure that it doesn't forgotten
about. For now, just use container_remove()/add().
Regards,
Owen
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]