X-Git-Url: http://woldlab.caltech.edu/gitweb/?a=blobdiff_plain;f=qui%2Fmussagl.cpp;h=d0df4c6c05dfc5e56c0e9ed73e6f8ade53c71176;hb=02fc4144044a430f8bee6617c0c9871d4ebe5e4d;hp=dcf393b146178300d918aa6b6d912910ee8bf8d4;hpb=3b0f9f973ad3ff2d50df5b934cd40c7b85ca237d;p=mussa.git diff --git a/qui/mussagl.cpp b/qui/mussagl.cpp index dcf393b..d0df4c6 100644 --- a/qui/mussagl.cpp +++ b/qui/mussagl.cpp @@ -1,18 +1,42 @@ #include +using namespace boost::filesystem; + #ifdef USE_PYTHON -#include -namespace py = boost::python; +#include "py/python.hpp" +extern "C" void initmussa(); +//extern "C" void initmussaqui(); #endif -using namespace boost::filesystem; +#include "qui/MussaWindow.hpp" +#include "qui/threading/ThreadManager.hpp" +#include "qui/threading/InterpreterThread.hpp" +#include "alg/parse_options.hpp" +#include "mussa_exceptions.hpp" #include #include #include -#include "qui/MussaWindow.hpp" -#include "alg/parse_options.hpp" -#include "mussa_exceptions.hpp" +#if defined(Q_WS_MAC) +#include +#endif + +std::string get_doc_dir() +{ +#if defined(Q_WS_MAC) + CFURLRef pluginRef = CFBundleCopyBundleURL(CFBundleGetMainBundle()); + CFStringRef macPath = CFURLCopyFileSystemPath(pluginRef, + kCFURLPOSIXPathStyle); + const char *pathPtr = CFStringGetCStringPtr(macPath, + CFStringGetSystemEncoding()); + std::string doc_dir(pathPtr); + qDebug("Path = %s", pathPtr); + CFRelease(pluginRef); + CFRelease(macPath); +#else + return std::string("."); +#endif +} int main(int argc, char **argv) { @@ -21,45 +45,47 @@ int main(int argc, char **argv) // if we're under unix and don't have a display, see if we can still run #ifdef Q_WS_X11 opts.useGUI = getenv("DISPLAY") != 0; + if (opts.useGUI == false) { + std::clog << "DISPLAY not set, running in console mode only" << std::endl; + } #endif - + //opts.doc_dir = get_doc_dir(); QApplication app(argc, argv, opts.useGUI); - Q_INIT_RESOURCE(icons); initialize_mussa(opts, argc, argv); - if (opts.analysis == 0) { return 1; } - + try { #ifdef USE_PYTHON if (opts.runAsPythonInterpeter) { - Py_Initialize(); - py::object main_module((py::handle<>(py::borrowed(PyImport_AddModule("__main__"))))); - py::object main_namespace = main_module.attr("__dict__"); - - py::handle<> ignored((PyRun_String( - //"from IPython.Shell import IPShellEmbed\n" - //"shell = IPShellEmbed(['mussa'], '')\n", - //"import mussa\n" - "def square(x):\n" - " r = x * x\n" - " print 'the square is %d' % (r)\n" - " return r\n", - Py_file_input, - main_namespace.ptr(), - main_namespace.ptr()) - )); - py::object square = main_module.attr("square"); - int result = py::extract(square(3)); - std::cout << "C++ has " << result << std::endl; - PyRun_InteractiveLoop(stdin, "mussa"); + ThreadManager &thread = ThreadManagerFactory(); + // allow the user to keep the interpreter open even after + // closing all the windows + app.setQuitOnLastWindowClosed(false); + InterpreterThread *interp = thread.create_interpreter(); + if (!interp) { + std::cerr << "Unable to initialize interpeter thread" << std::endl; + return 1; + } + MussaPython *py = interp->get_py_ptr(); + if (!py) { + std::cerr << "Unable to initialize python interpreter" << std::endl; + return 1; + } + py->add_module("mussa", &initmussa); + //py->add_module("mussaqui", &initmussaqui); + // quit when the interpreter exits + QObject::connect(interp, SIGNAL(finished()), + &app, SLOT(quit())); + interp->start(); + app.exec(); } else #endif /* USE_PYTHON */ if (opts.useGUI) { - MussaWindow win(opts.analysis); - win.show(); + MussaWindow *win = new MussaWindow(opts.analysis); + win->show(); app.exec(); } return 0; @@ -68,11 +94,11 @@ int main(int argc, char **argv) } catch (boost::filesystem::filesystem_error e) { qFatal(e.what()); } -#ifdef USE_PYTHON - catch (py::error_already_set e) { +#ifdef USE_PYTHON + catch( boost::python::error_already_set ) { PyErr_Print(); } -#endif /* USE_PYTHON */ +#endif catch (std::runtime_error e) { qFatal(e.what()); } catch (...) {