Am Fri, 17 Jul 2009 10:38:04 -0300 schrieb Gustavo Sverzut Barbieri:
> On Fri, Jul 17, 2009 at 6:13 AM, Andreas Volz<[email protected]>
> wrote:
> > Hello,
> >
> > while wrapping Elementary to C++ I have this problem:
> >
> > How could I find out in the parent container widget that a child
> > widget has been added or removed. I tried the "sub-object-add" and
> > "sub-object-del" callback, but it's not what I want as it calls this
> > signal more often than when I add/del an object to a container.
> > Maybe the member_add and member_del callbacks in ESMART are what I
> > need, but they're not used in Elementary. Any other ideas?
>
> member_add() should be called on children, at least that's what I
> remember... if not I guess is missing as one object should contain the
> children (given the container member).
>
> anyway, I wish I had time to merge guarana and elementary as guarana
> way of creating widgets makes things much easier for bindings and all.
Any ideas when you've time for it. Then I'll stop my work and continue
after this merge.
> > I tried to suicide my C++ object if the C object deletes itself and
> > throws the delete signal, but that's a very bad design. It's the job
> > of the container to destroy the widgets.
>
> this is the way to go. Each shell/wrapper object should listen to
> EVAS_CALLBACK_DEL and EVAS_CALLBACK_FREE (pre/post memory being
> deleted) and either delete itself or make it shallow (make the now
> dead wrapped pointer NULL).
I'll show you my current implementation and the problem I have with it. For
more
code look in SVN...
ElmWidget is the base class of all Elementary widgets and EvasSmart itself.
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "../include/elementaryxx/ElmWidget.h"
using namespace std;
namespace efl {
ElmWidget::ElmWidget ()
{
}
ElmWidget::~ElmWidget ()
{
}
void ElmWidget::elmInit ()
{
init (); // call init() from EvasObject
// this is EVAS_CALLBACK_FREE
signalHandleFree.connect (sigc::mem_fun (this,
&ElmWidget::freeSignalHandler));
}
void ElmWidget::freeSignalHandler ()
{
//cout << "freeSignalHandler()" << endl;
mFree = false; // mark the object to don't delete the C object. In this case
it's yet deleted.
delete (this);
// !!!ATTENTION!!!
// suicide for a C++ object is dangerous, but allowed
// the simple rule is that no member functions or member variables are
allowed to access
// FIXME: Here is a design problem as child destructors access mFree member
variable. Solution needed!
}
Then all ElmWidgets do it like this:
// private
ElmButton::ElmButton (EvasObject &parent)
{
o = elm_button_add (parent.obj ());
elmInit ();
}
ElmButton::~ElmButton ()
{
if (mFree)
{
evas_object_del (o);
}
}
ElmButton *ElmButton::factory (EvasObject &parent)
{
return new ElmButton (parent);
}
I use a factory design to be sure that Elementary widgets are only
constructed on the heap and could be deleted. The implementation works,
but I found a problem. After the delete(this) the destructor of ElmButton
is called and access mFree again, but it's not longer existing, as it's
as member deleted with the class itself.
I thought about several solutions:
1) Make a private destructor and tell the user to use a destroy() member
function.
Then the C++ destructor is empty and does nothing. This gives the library
control
when to delete only the wrapper and when to delete also the C object.
2) Implement a global map where all deleted wrappers are marked and look in the
destructor in this map if to delete the C object or not.
3) As two, but let a second thread do this. More like a garbage collector.
I think I'll check solution 1. Any comment about it. The C design here is
really hard
to wrap with a good C++ design.
regards
Andreas
} // end namespace efl
------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge
This is your chance to win up to $100,000 in prizes! For a limited time,
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel