Index: trunk/SophyaPI/PIext/cxxexecutor.cc
===================================================================
--- trunk/SophyaPI/PIext/cxxexecutor.cc	(revision 2757)
+++ trunk/SophyaPI/PIext/cxxexecutor.cc	(revision 2762)
@@ -156,5 +156,5 @@
   }
   // Pour synchronisation d'execution simultanee
-  ZSync zs(mutx_cxxe, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+  ZSync zs(mutx_cxxe);  zs.NOp(); 
 
   rc = ExecuteCXX(toks); if(rc) return(1);
@@ -166,5 +166,5 @@
   }
   // Pour synchronisation d'execution simultanee
-  ZSync zs(mutx_cxxe, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+  ZSync zs(mutx_cxxe);  zs.NOp(); 
 
   rc = FillUserCode(tokens[0]); if(rc) return(1);
@@ -188,5 +188,5 @@
   }
   // Pour synchronisation d'execution simultanee
-  ZSync zs(mutx_cxxe, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+  ZSync zs(mutx_cxxe);  zs.NOp(); 
 
   rc = FillUserCode(toks,2);        if(rc) return(1);
@@ -200,5 +200,5 @@
   }
   // Pour synchronisation d'execution simultanee
-  ZSync zs(mutx_cxxe, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+  ZSync zs(mutx_cxxe);  zs.NOp(); 
 
   rc = FillUserCode(tokens[2]); if(rc) return(1);
@@ -210,5 +210,5 @@
 } else if(kw == "c++compile") {
   // Pour synchronisation d'execution simultanee
-  ZSync zs(mutx_cxxe, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+  ZSync zs(mutx_cxxe);  zs.NOp(); 
 
   if(tokens.size()>=1) rc = Compile(tokens[0]);
@@ -218,5 +218,5 @@
 } else if(kw == "c++link") {
   // Pour synchronisation d'execution simultanee
-  ZSync zs(mutx_cxxe, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+  ZSync zs(mutx_cxxe);  zs.NOp(); 
 
   if(tokens.size()>=2)      rc = Link(tokens[0],tokens[1]);
Index: trunk/SophyaPI/PIext/nobjmgr.cc
===================================================================
--- trunk/SophyaPI/PIext/nobjmgr.cc	(revision 2757)
+++ trunk/SophyaPI/PIext/nobjmgr.cc	(revision 2762)
@@ -499,9 +499,6 @@
 list<string>::iterator ii;
 for(ii=odel.begin(); ii != odel.end(); ii++)  DelObj_P(*ii,true);
-if (myImgApp) {
-  if ( !_fgimgapp )  myImgApp->LockMutex();
-  (myImgApp->ObjMgrW())->UpdateList(did);
-  if ( !_fgimgapp )  myImgApp->UnlockMutex(true);
-}
+
+UpdateObjMgrWindow_P(did);  // On met a jour la fenetre de gestion des objets 
 }
 
@@ -1388,5 +1385,5 @@
 else if (arr) wrsid = myImgApp->DispImage(arr, n1, dopt, false, 0, fglock);
 
-AddWRsId(nom, wrsid);
+AddWRsId_P(nom, wrsid);
 return;
 }
@@ -1429,5 +1426,5 @@
 wrsid = myImgApp->DispImage(arr, n1, dopt, fgimagnav, 0, fglock);
 
-AddWRsId(nom, wrsid);
+AddWRsId_P(nom, wrsid);
 return;
 }
@@ -1476,5 +1473,5 @@
 PISurfaceDrawer* sdr = new PISurfaceDrawer(arr, true, true, true);
 wrsid = myImgApp->Disp3DDrawer(sdr, n1, dopt, "", 0, fglock);
-AddWRsId(nom, wrsid);
+AddWRsId_P(nom, wrsid);
 return; 
 }
@@ -1533,5 +1530,5 @@
   }
 
-AddWRsId(nom, wrsid);
+AddWRsId_P(nom, wrsid);
 return;
 }
@@ -1597,5 +1594,5 @@
 }
 
-AddWRsId(nom, wrsid);
+AddWRsId_P(nom, wrsid);
 
 return;
@@ -1712,4 +1709,11 @@
 void NamedObjMgr::AddWRsId(string & nom, int wrsid)
 {
+ZSync zs(*myMutex); zs.NOp(); 
+AddWRsId_P(nom, wrsid);
+}
+
+/* --Methode-- */
+void NamedObjMgr::AddWRsId_P(string & nom, int wrsid)
+{
 if(wrsid != 0) {
   NObjList::iterator it = myObjs->find(nom);
@@ -1724,6 +1728,18 @@
 {
 if (!myImgApp)  return;
-//RZDEL ZSync zs(*myMutex); zs.NOp(); 
+ZSync zs(*myMutex); zs.NOp(); 
+UpdateObjMgrWindow_P(did);
+}
+
+/* --Methode-- */
+void NamedObjMgr::UpdateObjMgrWindow_P(int did)
+{
+if (!myImgApp)  return;
 if ( !_fgimgapp )  myImgApp->LockMutex();
+if ( !(myImgApp->ObjMgrW())->Visible() || 
+     ( (myImgApp->ObjMgrW())->GetCurDirId() != did) ) {
+  if ( !_fgimgapp )  myImgApp->UnlockMutex(true);
+  return;
+  }
 
 (myImgApp->ObjMgrW())->ClearObjList();
@@ -1738,6 +1754,6 @@
   (myImgApp->ObjMgrW())->AddObj(cn.c_str(), (*it).second.oid);
   }
-
 if ( !_fgimgapp )  myImgApp->UnlockMutex(true);
+return;
 }
 
Index: trunk/SophyaPI/PIext/nobjmgr.h
===================================================================
--- trunk/SophyaPI/PIext/nobjmgr.h	(revision 2757)
+++ trunk/SophyaPI/PIext/nobjmgr.h	(revision 2762)
@@ -101,4 +101,6 @@
   virtual void                  SetTmpDir(string const& tmpdir);
 
+// Ajoute un identificateur d'objet widget/drawer/fenetre pour l'objet nom
+// Ces identificateurs servent lors de la destruction de l'objet nom
   virtual void		AddWRsId(string & nom, int wrsid);
 // Pour utilisation par ObjMgrWind
@@ -111,4 +113,5 @@
 
 protected:
+  // Les methodes _P sont celles SANS ZSync() - pour un usage interne par NamedObjMgr
   virtual bool		CreateDir_P(string & dirname);
   virtual void		CleanDir_P(string & dirname);
@@ -121,4 +124,7 @@
   virtual void          SaveObj_P(string & nom, POutPersist& s, bool keeppath=false);
 
+  virtual void		AddWRsId_P(string & nom, int wrsid);
+  virtual void		UpdateObjMgrWindow_P(int did);
+
   bool _fgimgapp;  // true -> cree par PIStdImgApp / pour gestion de thread
 };
Index: trunk/SophyaPI/PIext/piaversion.h
===================================================================
--- trunk/SophyaPI/PIext/piaversion.h	(revision 2757)
+++ trunk/SophyaPI/PIext/piaversion.h	(revision 2762)
@@ -2,5 +2,5 @@
 #define PIAPPVERSION_H_SEEN
 
-#define PIAPP_VERSIONNUMBER  3.98
+#define PIAPP_VERSIONNUMBER  3.985
 
 #endif
Index: trunk/SophyaPI/PIext/pisiadw.cc
===================================================================
--- trunk/SophyaPI/PIext/pisiadw.cc	(revision 2757)
+++ trunk/SophyaPI/PIext/pisiadw.cc	(revision 2762)
@@ -76,5 +76,5 @@
 cdir = '/' + cdir;
 dirlist->SetValueStr(cdir);
-dap->ObjMgr()->UpdateObjMgrWindow(dirlist->GetValue()-30000);
+dap->ObjMgr()->UpdateObjMgrWindow( GetCurDirId() );
 PIWindow::Show();
 return;
@@ -159,5 +159,5 @@
 {
 if (!Visible()) return;
-if (did != (dirlist->GetValue()-30000) )  return;
+if (did != GetCurDirId() )  return;
 dap->ObjMgr()->UpdateObjMgrWindow(did);
 return;
Index: trunk/SophyaPI/PIext/pisiadw.h
===================================================================
--- trunk/SophyaPI/PIext/pisiadw.h	(revision 2757)
+++ trunk/SophyaPI/PIext/pisiadw.h	(revision 2762)
@@ -38,4 +38,5 @@
   inline  void	AddObj(const char * objn, int oid) 
 		    { mNitem++;  objlist->AppendItem(objn, oid); }
+  inline  int   GetCurDirId() { return (dirlist->GetValue()-30000); }
 
   virtual void  UpdateList(int did);
Index: trunk/SophyaPI/PIext/pistdimgapp.cc
===================================================================
--- trunk/SophyaPI/PIext/pistdimgapp.cc	(revision 2757)
+++ trunk/SophyaPI/PIext/pistdimgapp.cc	(revision 2762)
@@ -763,4 +763,5 @@
   piin->ImageWdg()->ShowCursor(true);
   pii = piin->ImageWdg();
+  piin->SetUserData(NULL, oid);
   pii->SetUserData(NULL, oid);
   //  XSync(PIXDisplay(), False);  
@@ -805,5 +806,6 @@
 mLastWdg = pii;
 mBWId++;
-mBWList[mBWId] = pii;
+if (fgimagnav) mBWList[mBWId] = piin;
+else mBWList[mBWId] = pii;
 // pii->Refresh();
   pii->Apply(true);
@@ -1505,5 +1507,10 @@
 for(it = mBWList.begin(); it != mBWList.end(); it++) 
   if ((*it).second == w)  { mBWList.erase(it);  break; }
-PIBaseWdg* bw = dynamic_cast<PIBaseWdg *>(w);
+PIBaseWdg* bw = NULL;
+if (w->kind() == PIImageNavigator::ClassId) {
+  PIImageNavigator* piin = dynamic_cast<PIImageNavigator *>(w);
+  if (piin) bw = piin->ImageWdg();
+}				 
+else bw = dynamic_cast<PIBaseWdg *>(w);
 if (bw != NULL) {
   PIDrawer* drw;
@@ -1517,8 +1524,5 @@
 }
 
-// Reza Fev 2005 - On met systematiquement mCurWdg et mLastWdg a NULL
-// Il peuvent en effet etre un des fils du widget qui est supprime
-// if (w == mCurWdg) {  
-if (true) {    // Reza Fev 2005 - mCurWdg = NULL systematique
+if ( (w == mCurWdg) || (bw == mCurWdg) ) {  
   mCurWdg = NULL;
   if (mFgCWImg) {
@@ -1529,22 +1533,16 @@
   }
 
-// if (w == mLastWdg)  mLastWdg = NULL;
-mLastWdg = NULL; // Reza Fev 2005 - mLastWdg = NULL systematique
+if ( (w == mLastWdg) || (bw == mLastWdg) ) mLastWdg = NULL;
 
 PIWdg* pw=NULL;
 pw = (PIWdg*)(w->Parent());
 //DBG printf("DeleteWidget(%lx)-DBG kind = %d - %d %d \n", (long)w, w->kind(), (int)dw, (int)dwin); 
-if (dw) { 
-  if (pw && (pw->kind() == PIImageNavigator::ClassId) )  { 
-    delete pw;
-    pw = NULL;
-  }
-  else delete w;
-}
-if (dwin && pw && (pw->kind() == PIWindow::ClassId )) {
- PIWindow* pww = dynamic_cast<PIWindow *>(pw);
- if (pww && (pww != (PIWindow*)mGrW) && (pww != (PIWindow*)mStW) && (pww->NbChilds()==0)) 
+if (dw)  delete w;
+
+if (dwin && pw) { 
+  PIWindow* pww = dynamic_cast<PIWindow *>(pw);
+  if (pww && (pww != (PIWindow*)mGrW) && (pww != (PIWindow*)mStW) && (pww->NbChilds()==0)) 
     DeleteWindow((PIWindow*)pw);
- } 
+  } 
 return;
 }
@@ -1911,5 +1909,5 @@
     if (mCurWdg) {
       int oid = mCurWdg->UserFlag();
-      DeleteWidget(mCurWdg);
+      //RZDEL-Mai2005      DeleteWidget(mCurWdg);
       mObjMgr->DelObj_Id(oid);
       }
Index: trunk/SophyaPI/PIext/servnobjm.cc
===================================================================
--- trunk/SophyaPI/PIext/servnobjm.cc	(revision 2757)
+++ trunk/SophyaPI/PIext/servnobjm.cc	(revision 2762)
@@ -108,5 +108,5 @@
 
 // Pour synchronisation d'execution simultanee
-ZSync zs(mutx_dynlink, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+ZSync zs(mutx_dynlink);  zs.NOp(); 
 
 cmd = "rm -f " + fname;
@@ -145,5 +145,5 @@
 if (!mImgapp)  return; 
 // Pour synchronisation d'execution simultanee
-ZSync zs(mutx_dynlink, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+ZSync zs(mutx_dynlink);  zs.NOp(); 
 
 cmd = "rm " + fname;
@@ -176,5 +176,5 @@
 {
 // Pour synchronisation d'execution simultanee
-ZSync zs(mutx_dynlink, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+ZSync zs(mutx_dynlink);  zs.NOp(); 
 DlFunctionOfX f = (DlFunctionOfX) LinkFunctionFromFile(fname, func);
 if (!f) return; 
@@ -189,5 +189,5 @@
 {
 // Pour synchronisation d'execution simultanee
-ZSync zs(mutx_dynlink, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+ZSync zs(mutx_dynlink);  zs.NOp(); 
 DlFunctionOfXY f = (DlFunctionOfXY) LinkFunctionFromFile(fname, func);
 if (!f)  return;
@@ -894,5 +894,5 @@
 
 // Pour synchronisation d'execution simultanee
-ZSync zs(mutx_dynlink, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+ZSync zs(mutx_dynlink);  zs.NOp(); 
 
 NTLoopExprFunc f = (NTLoopExprFunc)LinkFunctionFromFile(fname, funcname);
@@ -1191,5 +1191,5 @@
 
 // Pour synchronisation d'execution simultanee
-ZSync zs(mutx_dynlink, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+ZSync zs(mutx_dynlink);  zs.NOp(); 
 
 PlotExprFunc f = LinkExprFunc(vardec, expx, expy, expz, expt, expcut);
