message: Added optional CTRL-Q Quit mode.
  To make it more difficult to accidentally quit the application, setting
  env OSPSTUDIO_SHOW_MODE=1 make CTRL-Q the quit key.
  AKA - Jim mode
diff: #include "sg/visitors/PrintNodes.h"
  // ospcommon
  #include "ospcommon/os/FileName.h"
  -#include "ospcommon/utility/getEnvVar.h"
  #include "ospcommon/utility/SaveImage.h"
  +#include "ospcommon/utility/getEnvVar.h"
  // tiny_file_dialogs
  -#include "tinyfiledialogs.h"
  #include "sg/scene/volume/Structured.h"
  +#include "tinyfiledialogs.h"
  // GUI mode entry point
  void start_GUI_mode(int argc, const char *argv[])
  @@ -206,15 +206,22 @@ MainWindow::MainWindow(const vec2i &windowSize, bool denoiser)
  });
  glfwSetKeyCallback(
  - glfwWindow, [](GLFWwindow *, int key, int, int action, int) {
  + glfwWindow, [](GLFWwindow *, int key, int, int action, int mod) {
  if (action == GLFW_PRESS) {
  switch (key) {
  case GLFW_KEY_G:
  activeWindow->showUi = !(activeWindow->showUi);
  break;
  - case GLFW_KEY_Q:
  + case GLFW_KEY_Q: {
  + auto showMode =
  + ospcommon::utility::getEnvVar<int>("OSPSTUDIO_SHOW_MODE");
  + // XXX Invoke the "Jim-Q" key, make it more difficult to exit
  + // by mistake.
  + if (showMode && mod != GLFW_MOD_CONTROL)
  + std::cout << "Use ctrl-Q to exit\n";
  + else
  g_quitNextFrame = true;
  - break;
  + } break;
  case GLFW_KEY_P:
  activeWindow->frame->traverse<sg::PrintNodes>();
  break;
  @@ -756,7 +763,7 @@ void MainWindow::importFiles()
  auto world = sg::createNode("world", "world");
  for (auto file : filesToImport) {
  -// try {
  + try {
  ospcommon::FileName fileName(file);
  std::string nodeName = fileName.base() + "_importer";
  @@ -768,10 +775,6 @@ void MainWindow::importFiles()
  imp["file"] = std::string(file);
  imp.importScene(baseMaterialRegistry);
  -#if 0 // BMCDEBUG, just for testing
  - imp.traverse<sg::PrintNodes>();
  -#endif
  -
  if (baseMaterialRegistry->matImportsList.size() != 0) {
  for (auto &newMat : baseMaterialRegistry->matImportsList)
  g_matTypes.insert(g_matTypes.begin(), newMat);
  @@ -785,9 +788,9 @@ void MainWindow::importFiles()
  refreshRenderer();
  }
  }
  -// } catch (...) {
  -// std::cerr << "Failed to open file '" << file << "'!\n";
  -// }
  + } catch (...) {
  + std::cerr << "Failed to open file '" << file << "'!\n";
  + }
  }
  world->createChild("light", lightTypeStr);
  @@ -814,10 +817,6 @@ bool MainWindow::importGeometry(std::shared_ptr<sg::Node> &world)
  imp["file"] = std::string(file);
  imp.importScene(baseMaterialRegistry);
  -#if 0 // BMCDEBUG, just for testing
  - imp.traverse<sg::PrintNodes>();
  -#endif
  -
  if (baseMaterialRegistry->matImportsList.size() != 0) {
  for (auto &newMat : baseMaterialRegistry->matImportsList)
  g_matTypes.insert(g_matTypes.begin(), newMat);
  