[Glade-devel] Cut/Paste + Undo/Redo bug

Joaquin Cuenca Abela e98cuenc@free.fr
Sat, 7 Jun 2003 11:42:20 +0200


Paolo wrote:
> 
> Hi Archit,
> 
> (I've cc'ed Joaquin since the attached patch is big and maybe 
> the mail will not reach the list)
> 
> Attached there is the current diff of my tree against cvs 
> where I think I've fixed this bug (along with some others and 
> along with adding some new ones ;) )
> 
> If you could verify/review the patch it would be great!
> 
> On Sun, 2003-06-01 at 03:07, Archit Baweja wrote:
> > Well I had been testing my undo/redo code for cut/paste a lot, as I 
> > wrote it.
> > I haven't fixed it yet, but just thought I'd mention it to 
> you guys. Try this 
> > out
> > 
> > Create window
> > Add a hbox
> > Add a button
> > Now cut and then paste 3 times the button
> > Now keep doing undo
> > When it is time to undo the first cut (thats the third time it is 
> > *supposed* to show up again), it crashes.
> > 
> 
> What I think is the problem is that every cut creates a new 
> placeholder, so when you undo the first cut what happens is 
> that it tries to paste on a placeholder which isn't there anymore.
> 
> The main fixes to this is in command.c where I ref the 
> placeholders and in glade_widget_replace_with_placeholder 
> where I pass the placeholder instead of always creating a new one. 
> 
> I'm sorry that I attached the whole diff containing other 
> changes but extracting only that one was a bit painful. The 
> description of the other changes follows below. It also 
> contains cleanups to project/placeholder/widget I already 
> submitted separately to the list.

I've committed the patch, but I've changed where the ref happens.

Now, we ref a widget & the placeholder when we create/destroy/cut/paste
it.  That's, at the very beginning of the operation (as we're
referencing the widgets on cmd->widget & cmd->placeholder).

When we destroy the operation, we unref them.

When we replace the widget with a new placeholder, then we ref the new
placeholder.

That's all.  This way we should be safe & not leak.  At least it's
working here[TM], and it looks more natural than the current "ops, we're
going to remove the widget from its parent, reference it now or it will
be destroyed" :-)

P.S.: Paolo, am I still missing some of your patches, or this big patch
had everything?

Cheers,