yade-dev team mailing list archive
-
yade-dev team
-
Mailing list archive
-
Message #01615
[svn] r1922 - in trunk: core gui/py gui/qt3
Author: eudoxos
Date: 2009-08-05 12:09:52 +0200 (Wed, 05 Aug 2009)
New Revision: 1922
Modified:
trunk/core/FrontEnd.hpp
trunk/core/yade.cpp
trunk/gui/py/PythonUI.hpp
trunk/gui/qt3/QtGUI-python.cpp
trunk/gui/qt3/QtGUI.cpp
trunk/gui/qt3/QtGUI.hpp
trunk/gui/qt3/qt.py
Log:
1. Be more tolerant to specifying invalid GUI at the command line
2. Throw exception about unopenable $DISPLAY rather than letting QApplication abort()
Modified: trunk/core/FrontEnd.hpp
===================================================================
--- trunk/core/FrontEnd.hpp 2009-08-05 09:02:32 UTC (rev 1921)
+++ trunk/core/FrontEnd.hpp 2009-08-05 10:09:52 UTC (rev 1922)
@@ -20,10 +20,11 @@
virtual ~FrontEnd ();
virtual int run(int , char * []) { return -1;};
+ // called before actually invoking it
+ virtual bool available(){return false;}
REGISTER_CLASS_AND_BASE(FrontEnd,Factorable);
};
-
REGISTER_FACTORABLE(FrontEnd);
Modified: trunk/core/yade.cpp
===================================================================
--- trunk/core/yade.cpp 2009-08-05 09:02:32 UTC (rev 1921)
+++ trunk/core/yade.cpp 2009-08-05 10:09:52 UTC (rev 1922)
@@ -278,15 +278,23 @@
}
}
+ // handle this a little more inteligently, use FrontEnd::available to chec kif the GUI will really run (QtGUi without DISPLAY and similar)
if(gui.size()==0) gui=Omega::instance().preferences->defaultGUILibName;
#ifdef YADE_OPENGL
if(!explicitUI && gui=="PythonUI" && !getenv("TERM")){ LOG_WARN("No $TERM, using QtGUI instead of PythonUI"); gui="QtGUI"; }
#else
if(gui=="QtGUI"){LOG_WARN("openGL-less build, using PythonUI instead of QtGUI"); gui="PythonUI";}
#endif
+ if(string(getenv("DISPLAY")).empty()) unsetenv("DISPLAY"); // empty $DISPLAY is no display
if(gui=="QtGUI" && !getenv("DISPLAY")){ LOG_WARN("No $DISPLAY, using PythonUI instead of QtUI"); gui="PythonUI"; }
-
- shared_ptr<FrontEnd> frontEnd = dynamic_pointer_cast<FrontEnd>(ClassFactory::instance().createShared(gui));
+ shared_ptr<FrontEnd> frontEnd;
+ try{
+ frontEnd=dynamic_pointer_cast<FrontEnd>(ClassFactory::instance().createShared(gui));
+ if(!frontEnd){ LOG_FATAL("Selected class `"<<gui<<"' is not an UI."); exit(1);}
+ } catch (FactoryError& e){
+ LOG_FATAL("Unable to create UI `"<<gui<<"', got error: "<<e.what());
+ exit(1);
+ }
// for(int i=0;i<argc; i++)cerr<<"Argument "<<i<<": "<<argv[i]<<endl;
int ok = frontEnd->run(argc,argv);
Modified: trunk/gui/py/PythonUI.hpp
===================================================================
--- trunk/gui/py/PythonUI.hpp 2009-08-05 09:02:32 UTC (rev 1921)
+++ trunk/gui/py/PythonUI.hpp 2009-08-05 10:09:52 UTC (rev 1922)
@@ -22,7 +22,8 @@
static bool stopAfter;
static bool nonInteractive;
static vector<string> scriptArgs;
-
+
+ virtual bool available(){return true;}
REGISTER_CLASS_NAME(PythonUI);
REGISTER_BASE_CLASS_NAME(FrontEnd);
DECLARE_LOGGER;
Modified: trunk/gui/qt3/QtGUI-python.cpp
===================================================================
--- trunk/gui/qt3/QtGUI-python.cpp 2009-08-05 09:02:32 UTC (rev 1921)
+++ trunk/gui/qt3/QtGUI-python.cpp 2009-08-05 10:09:52 UTC (rev 1922)
@@ -20,7 +20,10 @@
void qtGuiActivate(){
if(qtGuiIsActive()) return;
QtGUI* gui=new QtGUI();
- gui->runNaked();
+ if(!gui->checkDisplay(/* quiet */ false) || !gui->runNaked()){
+ PyErr_SetString(PyExc_ImportError,"Qt3 GUI could not be activated.");
+ python::throw_error_already_set();
+ }
}
YadeQtMainWindow* ensuredMainWindow(){if(!qtGuiIsActive()){qtGuiActivate(); while(!YadeQtMainWindow::self) usleep(50000); } /* throw runtime_error("No instance of YadeQtMainWindow");*/ return YadeQtMainWindow::self; }
Modified: trunk/gui/qt3/QtGUI.cpp
===================================================================
--- trunk/gui/qt3/QtGUI.cpp 2009-08-05 09:02:32 UTC (rev 1921)
+++ trunk/gui/qt3/QtGUI.cpp 2009-08-05 10:09:52 UTC (rev 1922)
@@ -81,12 +81,17 @@
return res;
}
+bool QtGUI::checkDisplay(bool quiet){
+ bool ret=(XOpenDisplay(NULL)!=0);
+ if(!ret) LOG_ERROR("Unable to open display `"<<getenv("DISPLAY")<<"'.");
+ return ret;
+}
-void QtGUI::runNaked(){
+bool QtGUI::runNaked(){
if(!app){ // no app existing yet
if(getenv("DISPLAY")==0){
LOG_ERROR("$DISPLAY environment var not set, not starting qt3 gui.");
- return;
+ return false;
};
LOG_INFO("Creating QApplication");
XInitThreads();
@@ -99,4 +104,5 @@
} else { LOG_ERROR("Main window was there, but not QtGUI::app??"); }
boost::thread appThread(boost::bind(&QApplication::exec,app));
}
+ return true;
}
Modified: trunk/gui/qt3/QtGUI.hpp
===================================================================
--- trunk/gui/qt3/QtGUI.hpp 2009-08-05 09:02:32 UTC (rev 1921)
+++ trunk/gui/qt3/QtGUI.hpp 2009-08-05 10:09:52 UTC (rev 1922)
@@ -29,7 +29,11 @@
public :
QtGUI ();
- void runNaked();
+ // run the QtGUI without showing the main window (called from python when importing yade.qt; yade.qt.Controller() will then show just the Controller and so on)
+ bool runNaked();
+ // try to open the X display, return false if fails; optionally display error to the log.
+ bool checkDisplay(bool quiet=true);
+ virtual bool available(){return checkDisplay();}
virtual ~QtGUI ();
virtual int run(int argc, char *argv[]);
void help();
Modified: trunk/gui/qt3/qt.py
===================================================================
--- trunk/gui/qt3/qt.py 2009-08-05 09:02:32 UTC (rev 1921)
+++ trunk/gui/qt3/qt.py 2009-08-05 10:09:52 UTC (rev 1922)
@@ -2,8 +2,8 @@
from _qt import *
if not isActive():
+ # will raise ImportError if the GUI could not be activated for some reason
activate()
-# # raise ImportError("The Qt gui is not being used (run with -N QtGUI).")