diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp index 8cf379d31025cb5855c82fb91d58a951db0ed798..5c33f993ecdbf80bb6a8fc5793778775bb8c9ad1 100644 --- a/Fltk/onelabWindow.cpp +++ b/Fltk/onelabWindow.cpp @@ -118,15 +118,11 @@ bool onelab::localNetworkClient::run() std::string action = (ps.empty() ? "" : ps[0].getValue()); get(ps, getName() + "/1ModelName"); std::string modelName = (ps.empty() ? "" : ps[0].getValue()); - get(ps, getName() + "/9InitializeCommand"); - std::string initializeCommand = (ps.empty() ? "" : ps[0].getValue()); get(ps, getName() + "/9CheckCommand"); std::string checkCommand = (ps.empty() ? "" : ps[0].getValue()); get(ps, getName() + "/9ComputeCommand"); std::string computeCommand = (ps.empty() ? "" : ps[0].getValue()); - if(action == "initialize") - command += " " + modelName + " " + initializeCommand; - else if(action == "check") + if(action == "check") command += " " + modelName + " " + checkCommand; else if(action == "compute") command += " " + modelName + " " + computeCommand; @@ -1021,15 +1017,31 @@ void onelabWindow::rebuildSolverList() void onelabWindow::addSolver(const std::string &name, const std::string &commandLine, int index) { - onelab::server::citer it = onelab::server::instance()->findClient(name); - if(it == onelab::server::instance()->lastClient()){ - onelab::localNetworkClient *c = new onelab::localNetworkClient(name, commandLine); - c->setIndex(index); - opt_solver_name(index, GMSH_SET, name); - if(commandLine.empty()) - onelab_choose_executable_cb(0, (void *)c); + if(onelab::server::instance()->findClient(name) != + onelab::server::instance()->lastClient()) return; // solver already exists + + // unregister the other non-local clients so we keep only the new one + std::vector<onelab::client*> networkClients; + for(onelab::server::citer it = onelab::server::instance()->firstClient(); + it != onelab::server::instance()->lastClient(); it++) + if(it->second->isNetworkClient()) + networkClients.push_back(it->second); + for(unsigned int i = 0; i < networkClients.size(); i++){ + onelab::server::instance()->unregisterClient(networkClients[i]); + delete networkClients[i]; } + + // create and register the new client + onelab::localNetworkClient *c = new onelab::localNetworkClient(name, commandLine); + c->setIndex(index); + opt_solver_name(index, GMSH_SET, name); + if(commandLine.empty()) + onelab_choose_executable_cb(0, (void *)c); + FlGui::instance()->onelab->rebuildSolverList(); + + // initialize the client + onelab_cb(0, (void*)"initialize"); } void onelabWindow::removeSolver(const std::string &name) @@ -1054,18 +1066,9 @@ void solver_cb(Fl_Widget *w, void *data) int num = (intptr_t)data; if(num >= 0){ - // unregister all non-local clients - for(onelab::server::citer it = onelab::server::instance()->firstClient(); - it != onelab::server::instance()->lastClient(); it++){ - onelab::client *c = it->second; - if(c->isNetworkClient()) - onelab::server::instance()->unregisterClient(c); - } - // register new client std::string name = opt_solver_name(num, GMSH_GET, ""); std::string exe = opt_solver_executable(num, GMSH_GET, ""); FlGui::instance()->onelab->addSolver(name, exe, num); - onelab_cb(0, (void*)"initialize"); } else FlGui::instance()->onelab->rebuildSolverList();