diff --git a/Fltk/onelabWindow.cpp b/Fltk/onelabWindow.cpp index 2c1213507a195731462a1df2028c39b4fba06e67..43d43654e407284d4efb9bc54ee00f96657a8416 100644 --- a/Fltk/onelabWindow.cpp +++ b/Fltk/onelabWindow.cpp @@ -492,11 +492,6 @@ void onelab_cb(Fl_Widget *w, void *data) if(!data) return; std::string action((const char*)data); - if(action == "stop"){ - FlGui::instance()->onelab->deactivate("kill"); - return; - } - if(action == "reset"){ // clear everything except model names std::vector<onelab::string> modelNames; @@ -593,9 +588,6 @@ void onelab_cb(Fl_Widget *w, void *data) if(ps.size()) what += " " + ps[0].getValue(); c->run(what); } - else if(action == "kill"){ - c->kill(); - } if(action == "compute") FlGui::instance()->onelab->checkForErrors(c->getName()); @@ -608,10 +600,35 @@ void onelab_cb(Fl_Widget *w, void *data) } while(!FlGui::instance()->onelab->stop() && action == "compute" && incrementLoop()); + FlGui::instance()->onelab->stop(false); FlGui::instance()->onelab->activate(); FlGui::instance()->onelab->show(); } +void onelab_stop_cb(Fl_Widget *w, void *data) +{ + if(!data) return; + std::string action((const char*)data); + + FlGui::instance()->onelab->stop(true); + + if(action == "stop"){ + FlGui::instance()->onelab->deactivate("kill"); + return; + } + + // Iterate over all other clients + for(onelab::server::citer it = onelab::server::instance()->firstClient(); + it != onelab::server::instance()->lastClient(); it++){ + onelab::client *c = it->second; + if(c->getName() == "Gmsh" || // local Gmsh client + c->getName() == "Listen" || // unknown client connecting through "-listen" + c->getName() == "GmshRemote") // distant post-processing Gmsh client + continue; + c->kill(); + } +} + static void onelab_check_button_cb(Fl_Widget *w, void *data) { if(!data) return; @@ -886,7 +903,6 @@ void onelabWindow::checkForErrors(const std::string &client) void onelabWindow::activate() { - _stop = false; _butt[0]->label("Compute"); _butt[0]->callback(onelab_cb, (void*)"compute"); _butt[1]->activate(); @@ -894,9 +910,8 @@ void onelabWindow::activate() void onelabWindow::deactivate(const std::string &how) { - _stop = (how == "stop") ? false : true; - _butt[0]->label((how == "stop") ? "Stop" : "Kill"); - _butt[0]->callback(onelab_cb, (how == "stop") ? (void*)"stop" : (void*)"kill"); + _butt[0]->label(how == "stop" ? "Stop" : "Kill"); + _butt[0]->callback(onelab_stop_cb, (how == "stop") ? (void*)"stop" : (void*)"kill"); _butt[1]->deactivate(); } diff --git a/Fltk/onelabWindow.h b/Fltk/onelabWindow.h index 8cf3abb36eeffc4101f669b6a06b75b638da4743..a4a266cac7dd43740417012bbcd26762dff50f5a 100644 --- a/Fltk/onelabWindow.h +++ b/Fltk/onelabWindow.h @@ -53,6 +53,7 @@ class onelabWindow{ void removeSolver(const std::string &name); void checkForErrors(const std::string &client); bool stop(){ return _stop; } + void stop(bool val){ _stop = val; } }; void onelab_cb(Fl_Widget *w, void *data);