diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp index 3d825064544f1a2d1366982b57d44666400010f3..863d1b59486f69eb156bcea22d8e251c6cbacd5b 100644 --- a/Common/GmshMessage.cpp +++ b/Common/GmshMessage.cpp @@ -264,7 +264,7 @@ void Msg::Fatal(const char *fmt, ...) #if defined(HAVE_FLTK) if(FlGui::available()){ - FlGui::instance()->check(); + if(FlGui::instance()->in_main_thread()) FlGui::instance()->check(); std::string tmp = std::string("@C1@.") + "Fatal : " + str; FlGui::instance()->addMessage(tmp.c_str()); if(_firstError.empty()) _firstError = str; @@ -310,9 +310,7 @@ void Msg::Error(const char *fmt, ...) #if defined(HAVE_FLTK) if(FlGui::available()){ -#ifndef HAVE_ONELAB2 - FlGui::instance()->check(); -#endif + if(FlGui::instance()->in_main_thread()) FlGui::instance()->check(); std::string tmp = std::string("@C1@.") + "Error : " + str; FlGui::instance()->addMessage(tmp.c_str()); if(_firstError.empty()) _firstError = str; @@ -350,7 +348,7 @@ void Msg::Warning(const char *fmt, ...) #if defined(HAVE_FLTK) if(FlGui::available()){ - FlGui::instance()->check(); + if(FlGui::instance()->in_main_thread()) FlGui::instance()->check(); std::string tmp = std::string("@C5@.") + "Warning : " + str; FlGui::instance()->addMessage(tmp.c_str()); if(_firstWarning.empty()) _firstWarning = str; @@ -390,7 +388,7 @@ void Msg::Info(const char *fmt, ...) #endif { if(FlGui::available()){ - FlGui::instance()->check(); + if(FlGui::instance()->in_main_thread()) FlGui::instance()->check(); std::string tmp = std::string("Info : ") + str; FlGui::instance()->addMessage(tmp.c_str()); } @@ -429,9 +427,7 @@ void Msg::Direct(const char *fmt, ...) #endif { if(FlGui::available()){ -#ifndef HAVE_ONELAB2 - FlGui::instance()->check(); -#endif + if(FlGui::instance()->in_main_thread()) FlGui::instance()->check(); std::string tmp = std::string("@C4@.") + str; FlGui::instance()->addMessage(tmp.c_str()); } @@ -470,9 +466,7 @@ void Msg::StatusBar(bool log, const char *fmt, ...) #endif { if(FlGui::available()){ -#ifndef HAVE_ONELAB2 - if(log) FlGui::instance()->check(); -#endif + if(log && FlGui::instance()->in_main_thread()) FlGui::instance()->check(); if(!log || _verbosity > 4) FlGui::instance()->setStatus(str); if(log){ @@ -554,7 +548,7 @@ void Msg::ProgressMeter(int n, int N, bool log, const char *fmt, ...) #if defined(HAVE_FLTK) if(FlGui::available() && _verbosity > 4){ - FlGui::instance()->check(); + if(FlGui::instance()->in_main_thread()) FlGui::instance()->check(); FlGui::instance()->setProgress(str, (n > N - 1) ? 0 : n, 0, N); } #endif diff --git a/Fltk/FlGui.cpp b/Fltk/FlGui.cpp index 8b8172faeb8ec4dbfb291bb5a7d16b4983657107..70272aa6ad88a300c9029159e94c4b5e86d8a92e 100644 --- a/Fltk/FlGui.cpp +++ b/Fltk/FlGui.cpp @@ -74,6 +74,9 @@ static int globalShortcut(int event) return FlGui::instance()->testGlobalShortcuts(event); } +int FlGui::lock(){_in_main_thread++; Fl::lock();} +void FlGui::unlock(){Fl::unlock(); _in_main_thread--;} + static void simple_right_box_draw(int x, int y, int w, int h, Fl_Color c) { fl_color(c); fl_rectf(x, y, w, h); @@ -384,6 +387,8 @@ FlGui::FlGui(int argc, char **argv) // init solver plugin stuff callForSolverPlugin(-1); + _in_main_thread = 0; + // draw for(unsigned int i = 0; i < graph.size(); i++) for(unsigned int j = 0; j < graph[i]->gl.size(); j++) diff --git a/Fltk/FlGui.h b/Fltk/FlGui.h index 71a14ad480d03750792174a634f185a5be6b2b2d..467e8e306a00417ff6062cdcce2fb5dc8e56b264 100644 --- a/Fltk/FlGui.h +++ b/Fltk/FlGui.h @@ -45,6 +45,7 @@ class FlGui{ private: static FlGui *_instance; static std::string _openedThroughMacFinder; + int _in_main_thread; std::string _lastStatus; public: std::vector<GVertex*> selectedVertices; @@ -83,6 +84,9 @@ class FlGui{ static void wait(); // wait (at most time seconds) for any events, then process them static void wait(double time); + int lock(); + void unlock(); + bool in_main_thread() {return _in_main_thread==0;} // is a file opened through the Mac Finder? static void setOpenedThroughMacFinder(const std::string &name) { diff --git a/contrib/onelab2/GmshLocalClient.cpp b/contrib/onelab2/GmshLocalClient.cpp index 6ff67095c4ec02a41d9cfede28675ea721c69ba6..e3e7c96af50f000c3f85469f5a8af8d9f78fce8a 100644 --- a/contrib/onelab2/GmshLocalClient.cpp +++ b/contrib/onelab2/GmshLocalClient.cpp @@ -1,6 +1,7 @@ #include "GmshLocalClient.h" #include "onelabUtils.h" #ifdef HAVE_FLTK +#include "FlGui.h" #include "GmshMessage.h" #include "onelab2Group.h" #include "OpenFile.h" @@ -10,33 +11,33 @@ void GmshLocalClient::setCallback(onelabGroup *cb) {_cb_obj = cb;} void GmshLocalClient::onNewParameter(onelab::parameter *p) { if(_cb_obj) { - Fl::lock(); + FlGui::instance()->lock(); _cb_obj->addParameter(*p); - Fl::unlock(); + FlGui::instance()->unlock(); Fl::awake((void *)NULL); } } void GmshLocalClient::onUpdateParameter(onelab::parameter *p) { if(_cb_obj) { - Fl::lock(); + FlGui::instance()->lock(); _cb_obj->updateParameter(*p); - Fl::unlock(); + FlGui::instance()->unlock(); Fl::awake((void *)NULL); } } void GmshLocalClient::onRemoveParameter(onelab::parameter *p) { if(_cb_obj) { - Fl::lock(); + FlGui::instance()->lock(); _cb_obj->removeParameter(*p); - Fl::unlock(); + FlGui::instance()->unlock(); Fl::awake((void *)NULL); } } void GmshLocalClient::onMessage(const std::string & name, const std::string &message, int level) { - Fl::lock(); + FlGui::instance()->lock(); switch(level) { case OnelabAttrMessage::Info: Msg::Direct("Info : %s - %s", name.c_str(), message.c_str()); @@ -48,7 +49,7 @@ void GmshLocalClient::onMessage(const std::string & name, const std::string &mes Msg::Error("%s - %s", name.c_str(), message.c_str()); break; } - Fl::unlock(); + FlGui::instance()->unlock(); Fl::awake((void *)NULL); } void GmshLocalClient::refresh() @@ -57,18 +58,18 @@ void GmshLocalClient::refresh() } void GmshLocalClient::mergeFile(const std::string &filename) { - Fl::lock(); + FlGui::instance()->lock(); MergePostProcessingFile(filename, CTX::instance()->solver.autoShowViews, CTX::instance()->solver.autoShowLastStep, true); - Fl::unlock(); + FlGui::instance()->unlock(); Fl::awake((void *)NULL); } #endif void GmshLocalClient::run(std::string action) { if(getName() == "Gmsh") { - Fl::lock(); + FlGui::instance()->lock(); onelabUtils::runGmshClient(action, 2); - Fl::unlock(); + FlGui::instance()->unlock(); Fl::awake((void *)NULL); } } diff --git a/contrib/onelab2/GmshNetworkClient.cpp b/contrib/onelab2/GmshNetworkClient.cpp index 2c368be8e7aa41d2d3cafbeb041249b6fbac3132..f0c2be12849f07a9a74e626cbcf029b286305ee2 100644 --- a/contrib/onelab2/GmshNetworkClient.cpp +++ b/contrib/onelab2/GmshNetworkClient.cpp @@ -2,6 +2,7 @@ #include "GmshNetworkClient.h" #ifdef HAVE_FLTK +#include "FlGui.h" #include "onelab2Group.h" #include "GmshMessage.h" @@ -9,33 +10,33 @@ void GmshNetworkClient::setCallback(onelabGroup *cb) {_cb_obj = cb;} void GmshNetworkClient::onNewParameter(onelab::parameter *p) { if(_cb_obj) { - Fl::lock(); + FlGui::instance()->lock(); _cb_obj->addParameter(*p); - Fl::unlock(); + FlGui::instance()->unlock(); Fl::awake((void *)NULL); } } void GmshNetworkClient::onUpdateParameter(onelab::parameter *p) { if(_cb_obj) { - Fl::lock(); + FlGui::instance()->lock(); _cb_obj->updateParameter(*p); - Fl::unlock(); + FlGui::instance()->unlock(); Fl::awake((void *)NULL); } } void GmshNetworkClient::onRemoveParameter(onelab::parameter *p) { if(_cb_obj) { - Fl::lock(); + FlGui::instance()->lock(); _cb_obj->removeParameter(*p); - Fl::unlock(); + FlGui::instance()->unlock(); Fl::awake((void *)NULL); } } void GmshNetworkClient::onMessage(const std::string & name, const std::string &message, int level) { - Fl::lock(); + FlGui::instance()->lock(); switch(level) { case OnelabAttrMessage::Info: Msg::Direct("Info : %s - %s", name.c_str(), message.c_str()); @@ -47,7 +48,7 @@ void GmshNetworkClient::onMessage(const std::string & name, const std::string &m Msg::Error("%s - %s", name.c_str(), message.c_str()); break; } - Fl::unlock(); + FlGui::instance()->unlock(); Fl::awake((void *)NULL); } #endif