[DEV] run with no error ==> have many small error that thing not work compleately

This commit is contained in:
Edouard DUPIN 2014-08-08 21:39:25 +02:00
parent e3305c3757
commit 4b8c98c110
9 changed files with 72 additions and 158 deletions

View File

@ -388,18 +388,15 @@ ewol::Context::~Context() {
// Remove current windows // Remove current windows
m_windowsCurrent.reset(); m_windowsCurrent.reset();
// clean all widget and sub widget with their resources: // clean all widget and sub widget with their resources:
do { m_objectManager.cleanInternalRemoved();
m_objectManager.removeAllRemovedObject();
} while (m_resourceManager.checkResourceToRemove() == true);
// call application to uninit // call application to uninit
m_application->unInit(*this); m_application->unInit(*this);
m_application.reset(); m_application.reset();
// clean all messages // clean all messages
m_msgSystem.clean(); m_msgSystem.clean();
// an other cycle of removing ... // internal clean elements
do { m_objectManager.cleanInternalRemoved();
m_objectManager.removeAllRemovedObject(); m_resourceManager.cleanInternalRemoved();
} while (m_resourceManager.checkResourceToRemove() == true);
EWOL_INFO("List of all widget of this context must be equal at 0 ==> otherwise some remove is missing"); EWOL_INFO("List of all widget of this context must be equal at 0 ==> otherwise some remove is missing");
m_objectManager.displayListObject(); m_objectManager.displayListObject();
@ -667,9 +664,8 @@ bool ewol::Context::OS_Draw(bool _displayEveryTime) {
m_resourceManager.updateContext(); m_resourceManager.updateContext();
// release open GL Context // release open GL Context
ewol::openGL::unLock(); ewol::openGL::unLock();
do { m_objectManager.cleanInternalRemoved();
m_objectManager.removeAllRemovedObject(); m_resourceManager.cleanInternalRemoved();
} while (m_resourceManager.checkResourceToRemove() == true);
// release the curent interface : // release the curent interface :
unLockContext(); unLockContext();
} }
@ -683,8 +679,7 @@ void ewol::Context::onObjectRemove(const std::shared_ptr<ewol::Object>& _object)
} }
// inform all manager that can not be directly linked with the object manager // inform all manager that can not be directly linked with the object manager
m_input.onObjectRemove(_object); m_input.onObjectRemove(_object);
m_widgetManager.onObjectRemove(_object); m_resourceManager.cleanInternalRemoved();
m_resourceManager.checkResourceToRemove();
} }
void ewol::Context::resetIOEvent() { void ewol::Context::resetIOEvent() {

View File

@ -37,7 +37,7 @@ void ewol::object::Manager::displayListObject() {
for (auto &it : m_eObjectList) { for (auto &it : m_eObjectList) {
std::shared_ptr<ewol::Object> element = it.lock(); std::shared_ptr<ewol::Object> element = it.lock();
if (element != nullptr) { if (element != nullptr) {
EWOL_INFO(" name='" << element->getName() << "' type=" << element->getObjectType()); EWOL_INFO(" [" << element->getId() << "] ref=" << element.use_count()-1 << " name='" << element->getName() << "' type=" << element->getObjectType());
} }
} }
} }
@ -68,65 +68,8 @@ int32_t ewol::object::Manager::getNumberObject() {
return m_eObjectList.size(); return m_eObjectList.size();
} }
void ewol::object::Manager::informOneObjectIsRemoved(const std::shared_ptr<ewol::Object>& _object) {
EWOL_TODO("ewol::object::Manager::informOneObjectIsRemoved()");
/*
for (auto &it : m_eObjectList) {
std::shared_ptr<ewol::Object> element = it.lock();
if ( element != nullptr
&& element != _object) {
EWOL_VERBOSE("[" << _object->getId() << "] onObjectRemove() : " << element->getId() << " type=" << element->getObjectType() << " name='" << element->getName() << "'");
element->onObjectRemove(_object);
}
}
// inform context that n object is removed ...
m_context.onObjectRemove(_object);
m_multiCast.onObjectRemove(_object);
EWOL_VERBOSE("m_removeEventList.size() = " << m_removeEventList.size());
for (auto &it : m_removeEventList) {
EWOL_VERBOSE("[" << _object->getId() << "] Inform Event Remove Object List : ...");
std::shared_ptr<ewol::Object> element = it.lock();
if (element != nullptr) {
element->onObjectRemove(_object);
}
}
*/
}
void ewol::object::Manager::remove(const std::shared_ptr<ewol::Object>& _object) {
EWOL_TODO("ewol::object::Manager::remove()");
/*
if (_object == nullptr) {
EWOL_ERROR("Try to Auto-Remove (nullptr) Object");
return;
}
int32_t count = 0;
auto it(m_eObjectListActive.begin());
while (it != m_eObjectListActive.end()) {
if (*it == _object) {
m_eObjectListActive.erase(it);
// remove Element
EWOL_DEBUG("Auto-Remove Object : [" << _object->getId() << "] type='" << _object->getObjectType() << "' name=" << _object->getName());
informOneObjectIsRemoved(_object);
ewol::getContext().forceRedrawAll();
EWOL_VERBOSE("Auto-Remove Object ... done (have " << _object->getRefCount() << " references)");
it = m_eObjectListActive.begin();
count++;
} else {
++it;
}
}
if (count == 0) {
EWOL_ERROR("Try to Auto-Remove Object that is not referenced ...");
} else if ( count>1
|| count<0) {
EWOL_ERROR("Remove more than one object in the system list ==> this is a real problem ...");
}
*/
}
// clean all Object that request an autoRemove ... // clean all Object that request an autoRemove ...
void ewol::object::Manager::removeAllRemovedObject() { void ewol::object::Manager::cleanInternalRemoved() {
size_t nbObject = m_eObjectList.size(); size_t nbObject = m_eObjectList.size();
EWOL_VERBOSE("Clean Object List (if needed) : " << m_eObjectList.size() << " elements"); EWOL_VERBOSE("Clean Object List (if needed) : " << m_eObjectList.size() << " elements");
auto it(m_eObjectList.begin()); auto it(m_eObjectList.begin());

View File

@ -43,17 +43,10 @@ namespace ewol {
* @param[in] _object Reference shared pointer on the object * @param[in] _object Reference shared pointer on the object
*/ */
void add(const std::shared_ptr<ewol::Object>& _object); void add(const std::shared_ptr<ewol::Object>& _object);
/**
* @brief Called when an object request to be removed
* @param[in] _object Reference shared pointer on the object
*/
void remove(const std::shared_ptr<ewol::Object>& _object);
public: public:
void removeAllRemovedObject(); void cleanInternalRemoved();
std::shared_ptr<ewol::Object> get(const std::string& _name); std::shared_ptr<ewol::Object> get(const std::string& _name);
private:
void informOneObjectIsRemoved(const std::shared_ptr<ewol::Object>& _object);
private: private:
ewol::object::MultiCast m_multiCast; //!< muticast manager ewol::object::MultiCast m_multiCast; //!< muticast manager
public: public:

View File

@ -34,7 +34,7 @@ void ewol::Object::autoDestroy() {
} }
void ewol::Object::requestDestroyFromChild(const std::shared_ptr<ewol::Object>& _child) { void ewol::Object::requestDestroyFromChild(const std::shared_ptr<ewol::Object>& _child) {
EWOL_WARNING("Call From Child with no effects ==> must implement : requestDestroyFromChild(...)"); EWOL_CRITICAL("Call From Child with no effects ==> must implement : requestDestroyFromChild(...)");
} }
void ewol::Object::setParent(const std::shared_ptr<ewol::Object>& _newParent) { void ewol::Object::setParent(const std::shared_ptr<ewol::Object>& _newParent) {
// TODO : Implement change of parent ... // TODO : Implement change of parent ...
@ -59,8 +59,6 @@ ewol::Object::Object() :
ewol::Object::~Object() { ewol::Object::~Object() {
EWOL_DEBUG("delete Object : [" << m_uniqueId << "] : " << getTypeDescription()); EWOL_DEBUG("delete Object : [" << m_uniqueId << "] : " << getTypeDescription());
//getObjectManager().remove(shared_from_this());
// TODO : getMultiCast().rm();
m_externEvent.clear(); m_externEvent.clear();
m_availlableEventId.clear(); m_availlableEventId.clear();
m_uniqueId = -1; m_uniqueId = -1;

View File

@ -154,15 +154,15 @@ void ewol::resource::Manager::contextHasBeenDestroyed() {
// internal generic keeper ... // internal generic keeper ...
std::shared_ptr<ewol::Resource> ewol::resource::Manager::localKeep(const std::string& _filename) { std::shared_ptr<ewol::Resource> ewol::resource::Manager::localKeep(const std::string& _filename) {
EWOL_VERBOSE("KEEP (DEFAULT) : file : \"" << _filename << "\""); EWOL_VERBOSE("KEEP (DEFAULT) : file : '" << _filename << "' in " << m_resourceList.size() << " resources");
for (auto &it : m_resourceList) { for (auto &it : m_resourceList) {
std::shared_ptr<ewol::Resource> tmpRessource = it.lock(); std::shared_ptr<ewol::Resource> tmpRessource = it.lock();
if ( tmpRessource != nullptr if (tmpRessource != nullptr) {
&& tmpRessource->getName() == _filename) { if (tmpRessource->getName() == _filename) {
return tmpRessource; return tmpRessource;
}
} }
} }
// we did not find it ...
return nullptr; return nullptr;
} }
@ -181,18 +181,13 @@ void ewol::resource::Manager::localAdd(const std::shared_ptr<ewol::Resource>& _o
} }
// in case of error ... // in case of error ...
bool ewol::resource::Manager::checkResourceToRemove() { void ewol::resource::Manager::cleanInternalRemoved() {
//EWOL_INFO("remove object in Manager"); //EWOL_INFO("remove object in Manager");
updateContext(); updateContext();
for (auto it(m_resourceList.begin()); it!=m_resourceList.end(); ++it) { for (auto it(m_resourceList.begin()); it!=m_resourceList.end(); ++it) {
if ((*it).lock() == nullptr) { if ((*it).expired() == true) {
m_resourceList.erase(it); m_resourceList.erase(it);
it = m_resourceList.begin(); it = m_resourceList.begin();
continue;
} }
m_resourceList.erase(it);
it = m_resourceList.begin();
return true;
} }
return false;
} }

View File

@ -63,7 +63,7 @@ namespace ewol {
// internal API to extent eResources in extern Soft // internal API to extent eResources in extern Soft
std::shared_ptr<ewol::Resource> localKeep(const std::string& _filename); std::shared_ptr<ewol::Resource> localKeep(const std::string& _filename);
void localAdd(const std::shared_ptr<ewol::Resource>& _object); void localAdd(const std::shared_ptr<ewol::Resource>& _object);
virtual bool checkResourceToRemove(); virtual void cleanInternalRemoved();
}; };
}; };
}; };

View File

@ -33,8 +33,6 @@
#define __class__ "ewol::widget::Manager" #define __class__ "ewol::widget::Manager"
ewol::widget::Manager::Manager() : ewol::widget::Manager::Manager() :
m_focusWidgetDefault(nullptr),
m_focusWidgetCurrent(nullptr),
m_havePeriodic(false), m_havePeriodic(false),
m_haveRedraw(true), m_haveRedraw(true),
m_applWakeUpTime(0), m_applWakeUpTime(0),
@ -85,23 +83,24 @@ void ewol::widget::Manager::focusKeep(const std::shared_ptr<ewol::Widget>& _newW
} }
EWOL_VERBOSE("focusKeep=" << _newWidget->getId() ); EWOL_VERBOSE("focusKeep=" << _newWidget->getId() );
//etk::log::displayBacktrace(); //etk::log::displayBacktrace();
if (_newWidget == m_focusWidgetCurrent) { auto focusWidgetCurrent = m_focusWidgetCurrent.lock();
if (_newWidget == focusWidgetCurrent) {
// nothing to do ... // nothing to do ...
return; return;
} }
if (m_focusWidgetCurrent != nullptr) { if (focusWidgetCurrent != nullptr) {
EWOL_DEBUG("Rm focus on WidgetID=" << m_focusWidgetCurrent->getId() ); EWOL_DEBUG("Rm focus on WidgetID=" << focusWidgetCurrent->getId() );
m_focusWidgetCurrent->rmFocus(); focusWidgetCurrent->rmFocus();
m_focusWidgetCurrent = nullptr; focusWidgetCurrent.reset();
} }
if (_newWidget->canHaveFocus() == false) { if (_newWidget->canHaveFocus() == false) {
EWOL_DEBUG("Widget can not have focus, id=" << _newWidget->getId() ); EWOL_DEBUG("Widget can not have focus, id=" << _newWidget->getId() );
return; return;
} }
m_focusWidgetCurrent = _newWidget; m_focusWidgetCurrent = _newWidget;
if (m_focusWidgetCurrent != nullptr) { if (_newWidget != nullptr) {
EWOL_DEBUG("Set focus on WidgetID=" << m_focusWidgetCurrent->getId() ); EWOL_DEBUG("Set focus on WidgetID=" << _newWidget->getId() );
m_focusWidgetCurrent->setFocus(); _newWidget->setFocus();
} }
} }
@ -111,47 +110,54 @@ void ewol::widget::Manager::focusSetDefault(const std::shared_ptr<ewol::Widget>&
EWOL_VERBOSE("Widget can not have focus, id=" << _newWidget->getId() ); EWOL_VERBOSE("Widget can not have focus, id=" << _newWidget->getId() );
return; return;
} }
if (m_focusWidgetDefault == m_focusWidgetCurrent) { std::shared_ptr<ewol::Widget> focusWidgetDefault = m_focusWidgetDefault.lock();
if (m_focusWidgetCurrent != nullptr) { std::shared_ptr<ewol::Widget> focusWidgetCurrent = m_focusWidgetCurrent.lock();
EWOL_DEBUG("Rm focus on WidgetID=" << m_focusWidgetCurrent->getId() ); if (focusWidgetDefault == focusWidgetCurrent) {
m_focusWidgetCurrent->rmFocus(); if (focusWidgetCurrent != nullptr) {
EWOL_DEBUG("Rm focus on WidgetID=" << focusWidgetCurrent->getId() );
focusWidgetCurrent->rmFocus();
} }
m_focusWidgetCurrent = _newWidget; m_focusWidgetCurrent = _newWidget;
if (m_focusWidgetCurrent != nullptr) { if (_newWidget != nullptr) {
EWOL_DEBUG("Set focus on WidgetID=" << m_focusWidgetCurrent->getId() ); EWOL_DEBUG("Set focus on WidgetID=" << _newWidget->getId() );
m_focusWidgetCurrent->setFocus(); _newWidget->setFocus();
} }
} }
m_focusWidgetDefault = _newWidget; m_focusWidgetDefault = _newWidget;
} }
void ewol::widget::Manager::focusRelease() { void ewol::widget::Manager::focusRelease() {
if (m_focusWidgetDefault == m_focusWidgetCurrent) { std::shared_ptr<ewol::Widget> focusWidgetDefault = m_focusWidgetDefault.lock();
std::shared_ptr<ewol::Widget> focusWidgetCurrent = m_focusWidgetCurrent.lock();
if (focusWidgetDefault == focusWidgetCurrent) {
// nothink to do ... // nothink to do ...
return; return;
} }
if (m_focusWidgetCurrent != nullptr) { if (focusWidgetCurrent != nullptr) {
EWOL_DEBUG("Rm focus on WidgetID=" << m_focusWidgetCurrent->getId() ); EWOL_DEBUG("Rm focus on WidgetID=" << focusWidgetCurrent->getId() );
m_focusWidgetCurrent->rmFocus(); focusWidgetCurrent->rmFocus();
} }
m_focusWidgetCurrent = m_focusWidgetDefault; m_focusWidgetCurrent = m_focusWidgetDefault;
if (nullptr != m_focusWidgetCurrent) { focusWidgetCurrent = m_focusWidgetCurrent.lock();
EWOL_DEBUG("Set focus on WidgetID=" << m_focusWidgetCurrent->getId() ); if (nullptr != focusWidgetCurrent) {
m_focusWidgetCurrent->setFocus(); EWOL_DEBUG("Set focus on WidgetID=" << focusWidgetCurrent->getId() );
focusWidgetCurrent->setFocus();
} }
} }
const std::shared_ptr<ewol::Widget>& ewol::widget::Manager::focusGet() { std::shared_ptr<ewol::Widget> ewol::widget::Manager::focusGet() {
return m_focusWidgetCurrent; return m_focusWidgetCurrent.lock();
} }
void ewol::widget::Manager::focusRemoveIfRemove(const std::shared_ptr<ewol::Widget>& _newWidget) { void ewol::widget::Manager::focusRemoveIfRemove(const std::shared_ptr<ewol::Widget>& _newWidget) {
if (m_focusWidgetCurrent == _newWidget) { std::shared_ptr<ewol::Widget> focusWidgetDefault = m_focusWidgetDefault.lock();
std::shared_ptr<ewol::Widget> focusWidgetCurrent = m_focusWidgetCurrent.lock();
if (focusWidgetCurrent == _newWidget) {
EWOL_WARNING("Release focus when remove widget"); EWOL_WARNING("Release focus when remove widget");
focusRelease(); focusRelease();
} }
if (m_focusWidgetDefault == _newWidget) { if (focusWidgetDefault == _newWidget) {
EWOL_WARNING("Release default focus when remove widget"); EWOL_WARNING("Release default focus when remove widget");
focusSetDefault(nullptr); focusSetDefault(nullptr);
} }
@ -163,14 +169,13 @@ void ewol::widget::Manager::periodicCallAdd(const std::shared_ptr<ewol::Widget>&
} }
m_havePeriodic = true; m_havePeriodic = true;
for (auto &it : m_listOfPeriodicWidget) { for (auto &it : m_listOfPeriodicWidget) {
if (it == _pWidget) { if (it.lock() == _pWidget) {
return; return;
} }
} }
for (auto &it : m_listOfPeriodicWidget) { for (auto &it : m_listOfPeriodicWidget) {
if (it == nullptr) { if (it.expired() == true) {
it = _pWidget; it = _pWidget;
return; return;
} }
} }
@ -179,16 +184,17 @@ void ewol::widget::Manager::periodicCallAdd(const std::shared_ptr<ewol::Widget>&
void ewol::widget::Manager::periodicCallRm(const std::shared_ptr<ewol::Widget>& _pWidget) { void ewol::widget::Manager::periodicCallRm(const std::shared_ptr<ewol::Widget>& _pWidget) {
for (auto &it : m_listOfPeriodicWidget) { for (auto &it : m_listOfPeriodicWidget) {
if (it == _pWidget) { if (it.lock() == _pWidget) {
it.reset(); it.reset();
} }
} }
periodicCallUpdateCount(); periodicCallUpdateCount();
} }
void ewol::widget::Manager::periodicCallUpdateCount() { void ewol::widget::Manager::periodicCallUpdateCount() {
int32_t nbElement = 0; int32_t nbElement = 0;
for (auto &it : m_listOfPeriodicWidget) { for (auto &it : m_listOfPeriodicWidget) {
if (it != nullptr) { if (it.expired() == false) {
nbElement++; nbElement++;
} }
} }
@ -216,15 +222,16 @@ void ewol::widget::Manager::periodicCall(int64_t _localTime) {
EWOL_VERBOSE("periodic : " << _localTime); EWOL_VERBOSE("periodic : " << _localTime);
for (int32_t iii=m_listOfPeriodicWidget.size()-1; iii >= 0 ; iii--) { for (int32_t iii=m_listOfPeriodicWidget.size()-1; iii >= 0 ; iii--) {
if (nullptr != m_listOfPeriodicWidget[iii]) { auto tmpWidget = m_listOfPeriodicWidget[iii].lock();
int64_t deltaTimeCallUser = m_listOfPeriodicWidget[iii]->systemGetCallDeltaTime(); if (nullptr != tmpWidget) {
int64_t deltaTimeCallUser = tmpWidget->systemGetCallDeltaTime();
if (deltaTimeCallUser <= 0) { if (deltaTimeCallUser <= 0) {
myTime.setDeltaCall(deltaTime); myTime.setDeltaCall(deltaTime);
EWOL_VERBOSE("[" << iii << "] periodic : " << myTime); EWOL_VERBOSE("[" << iii << "] periodic : " << myTime);
m_listOfPeriodicWidget[iii]->systemSetLastCallTime(_localTime); tmpWidget->systemSetLastCallTime(_localTime);
m_listOfPeriodicWidget[iii]->periodicCall(myTime); tmpWidget->periodicCall(myTime);
} else { } else {
int64_t lastCallTime = m_listOfPeriodicWidget[iii]->systemGetLastCallTime(); int64_t lastCallTime = tmpWidget->systemGetLastCallTime();
if (lastCallTime == 0) { if (lastCallTime == 0) {
lastCallTime = _localTime; lastCallTime = _localTime;
} }
@ -232,8 +239,8 @@ void ewol::widget::Manager::periodicCall(int64_t _localTime) {
if (deltaLocalTime >= lastCallTime) { if (deltaLocalTime >= lastCallTime) {
myTime.setDeltaCall(deltaLocalTime); myTime.setDeltaCall(deltaLocalTime);
EWOL_VERBOSE("[" << iii << "] periodic : " << myTime); EWOL_VERBOSE("[" << iii << "] periodic : " << myTime);
m_listOfPeriodicWidget[iii]->systemSetLastCallTime(_localTime); tmpWidget->systemSetLastCallTime(_localTime);
m_listOfPeriodicWidget[iii]->periodicCall(myTime); tmpWidget->periodicCall(myTime);
} }
} }
} }
@ -297,20 +304,3 @@ std::string ewol::widget::Manager::list() {
return tmpVal; return tmpVal;
} }
void ewol::widget::Manager::onObjectRemove(const std::shared_ptr<ewol::Object>& _object) {
if (m_focusWidgetDefault == _object) {
EWOL_VERBOSE("Remove object ==> rm default focus !!!");
m_focusWidgetDefault.reset();
}
if (m_focusWidgetCurrent == _object) {
EWOL_VERBOSE("Remove object ==> rm current focus !!!");
m_focusWidgetCurrent.reset();
}
for (auto &it : m_listOfPeriodicWidget) {
if (it == _object) {
EWOL_VERBOSE("Remove object ==> rm periodic call !!!");
it.reset();
}
}
periodicCallUpdateCount();
}

View File

@ -23,9 +23,9 @@ namespace ewol {
typedef std::shared_ptr<ewol::Widget> (*creator_tf)(); typedef std::shared_ptr<ewol::Widget> (*creator_tf)();
private: private:
// For the focus Management // For the focus Management
std::shared_ptr<ewol::Widget> m_focusWidgetDefault; std::weak_ptr<ewol::Widget> m_focusWidgetDefault;
std::shared_ptr<ewol::Widget> m_focusWidgetCurrent; std::weak_ptr<ewol::Widget> m_focusWidgetCurrent;
std::vector<std::shared_ptr<ewol::Widget>> m_listOfPeriodicWidget; std::vector<std::weak_ptr<ewol::Widget>> m_listOfPeriodicWidget;
bool m_havePeriodic; bool m_havePeriodic;
bool m_haveRedraw; bool m_haveRedraw;
etk::Hash<creator_tf> m_creatorList; etk::Hash<creator_tf> m_creatorList;
@ -38,7 +38,7 @@ namespace ewol {
void focusKeep(const std::shared_ptr<ewol::Widget>& _newWidget); // set the focus at the specific widget void focusKeep(const std::shared_ptr<ewol::Widget>& _newWidget); // set the focus at the specific widget
void focusSetDefault(const std::shared_ptr<ewol::Widget>& _newWidget); // select the default focus getter void focusSetDefault(const std::shared_ptr<ewol::Widget>& _newWidget); // select the default focus getter
void focusRelease(); // release focus from the current widget to the default void focusRelease(); // release focus from the current widget to the default
const std::shared_ptr<ewol::Widget>& focusGet(); std::shared_ptr<ewol::Widget> focusGet();
void focusRemoveIfRemove(const std::shared_ptr<ewol::Widget>& _newWidget); void focusRemoveIfRemove(const std::shared_ptr<ewol::Widget>& _newWidget);
void periodicCallAdd(const std::shared_ptr<ewol::Widget>& _pWidget); void periodicCallAdd(const std::shared_ptr<ewol::Widget>& _pWidget);
@ -55,7 +55,6 @@ namespace ewol {
std::shared_ptr<ewol::Widget> create(const std::string& _name); std::shared_ptr<ewol::Widget> create(const std::string& _name);
bool exist(const std::string& _name); bool exist(const std::string& _name);
std::string list(); std::string list();
virtual void onObjectRemove(const std::shared_ptr<ewol::Object>& _object);
private: private:
void periodicCallUpdateCount(); void periodicCallUpdateCount();
}; };

View File

@ -196,7 +196,6 @@ void ewol::widget::Windows::popUpWidgetPop() {
if (m_popUpWidgetList.size() == 0) { if (m_popUpWidgetList.size() == 0) {
return; return;
} }
m_popUpWidgetList.back()->removeParent();
m_popUpWidgetList.pop_back(); m_popUpWidgetList.pop_back();
} }
@ -271,6 +270,7 @@ void ewol::widget::Windows::requestDestroyFromChild(const std::shared_ptr<Object
(*it).reset(); (*it).reset();
m_popUpWidgetList.erase(it); m_popUpWidgetList.erase(it);
it = m_popUpWidgetList.begin(); it = m_popUpWidgetList.begin();
markToRedraw();
continue; continue;
} }
++it; ++it;
@ -281,5 +281,6 @@ void ewol::widget::Windows::requestDestroyFromChild(const std::shared_ptr<Object
} }
m_subWidget->removeParent(); m_subWidget->removeParent();
m_subWidget.reset(); m_subWidget.reset();
markToRedraw();
} }
} }