diff --git a/src/ControlManager.cpp b/src/ControlManager.cpp index ca6abe3..f7dee83 100644 --- a/src/ControlManager.cpp +++ b/src/ControlManager.cpp @@ -1398,7 +1398,8 @@ void Control::keyboardCalback(GLFWwindow* w, int key, int, int action, int mods) { if (UserInterface::manager().keyboardAvailable()) { - if ( !mods ) { + // keys without modifiers in any windows + if (!mods) { int _key = layoutKey(key); Control::manager().input_access_.lock(); if (_key >= GLFW_KEY_A && _key <= GLFW_KEY_Z) { @@ -1411,14 +1412,31 @@ void Control::keyboardCalback(GLFWwindow* w, int key, int, int action, int mods) } Control::manager().input_access_.unlock(); } -#if defined(APPLE) - else if ( w != Rendering::manager().mainWindow().window() && - key == GLFW_KEY_F && action == GLFW_PRESS && mods == GLFW_MOD_SUPER ) -#else - else if ( key == GLFW_KEY_F && action == GLFW_PRESS && mods == GLFW_MOD_CONTROL ) -#endif + // keys with modifiers in non-main window + else if ( w != Rendering::manager().mainWindow().window() ) { - Rendering::manager().window(w)->toggleFullscreen(); +#if defined(APPLE) + if ( key == GLFW_KEY_F && action == GLFW_PRESS && mods == GLFW_MOD_SUPER ) +#else + if ( key == GLFW_KEY_F && action == GLFW_PRESS && mods == GLFW_MOD_CONTROL ) +#endif + { + // toggle fullscreen on CTRL+F + Rendering::manager().window(w)->toggleFullscreen(); + } +#if defined(APPLE) + else if ( key == GLFW_KEY_Q && action == GLFW_PRESS && mods == GLFW_MOD_SUPER ) +#else + else if ( key == GLFW_KEY_Q && action == GLFW_PRESS && mods == GLFW_MOD_CONTROL ) +#endif + { + // Quit on CTRL+Q (if no main window) + if (glfwGetWindowAttrib(Rendering::manager().mainWindow().window(), GLFW_VISIBLE) + == GL_FALSE) { + // close rendering manager = quit + Rendering::manager().close(); + } + } } } } diff --git a/src/RenderingManager.cpp b/src/RenderingManager.cpp index fd97f00..53498ea 100644 --- a/src/RenderingManager.cpp +++ b/src/RenderingManager.cpp @@ -201,13 +201,24 @@ static void OutputWindowEvent( GLFWwindow *w, int button, int action, int) static void WindowCloseCallback( GLFWwindow* w ) { + // close main window if (Rendering::manager().mainWindow().window() == w) { if (!UserInterface::manager().TryClose()) glfwSetWindowShouldClose(w, GLFW_FALSE); } - else if (!glfwWindowShouldClose(w)) { - Mixer::manager().setView(View::DISPLAYS); - Rendering::manager().mainWindow().show(); + // not main window + else { + // if headless (main window not visile) + if (glfwGetWindowAttrib(Rendering::manager().mainWindow().window(), GLFW_VISIBLE) + == GL_FALSE) { + // close rendering manager = quit + Rendering::manager().close(); + } + // attempt to close shows display view + else { + Mixer::manager().setView(View::DISPLAYS); + Rendering::manager().mainWindow().show(); + } } } @@ -397,7 +408,7 @@ bool Rendering::init() unsigned int err = 0; while((err = glGetError()) != GL_NO_ERROR){ - fprintf(stderr, "394 error %d \n", err ); + fprintf(stderr, "GLFW error %d \n", err ); } // @@ -444,14 +455,15 @@ RenderingWindow* Rendering::window(int index) } -void Rendering::show() +void Rendering::show(bool show_main_window) { // show output windows for (auto it = outputs_.begin(); it != outputs_.end(); ++it) it->show(); // show main window - main_.show(); + if (show_main_window || Settings::application.num_output_windows < 1 ) + main_.show(); // show menu on first show UserInterface::manager().showPannel(NAV_MENU); diff --git a/src/RenderingManager.h b/src/RenderingManager.h index 6ebd4b5..8832a68 100644 --- a/src/RenderingManager.h +++ b/src/RenderingManager.h @@ -116,7 +116,7 @@ public: // Initialization OpenGL and GLFW window creation bool init(); // show windows and reset views - void show(); + void show(bool show_main_window = true); // true if active rendering window bool isActive(); // draw one frame diff --git a/src/main.cpp b/src/main.cpp index 97904c7..bc4c847 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -68,6 +68,7 @@ int main(int argc, char *argv[]) int versionRequested = 0; int testRequested = 0; int cleanRequested = 0; + int headlessRequested = 0; int helpRequested = 0; int fontsizeRequested = 0; int ret = -1; @@ -79,6 +80,8 @@ int main(int argc, char *argv[]) testRequested = 1; } else if (strcmp(argv[i], "--clean") == 0 || strcmp(argv[i], "-C") == 0) { cleanRequested = 1; + } else if (strcmp(argv[i], "--headless") == 0 || strcmp(argv[i], "-L") == 0) { + headlessRequested = 1; } else if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-H") == 0) { helpRequested = 1; } else if (strcmp(argv[i], "--fontsize") == 0 || strcmp(argv[i], "-F") == 0) { @@ -132,12 +135,13 @@ int main(int argc, char *argv[]) } if (helpRequested) { - printf("Usage: %s [-H, --help] [-V, --version] [-F N, --fontsize N] [-T, --test] [-C, --clean] [filename]\n", + printf("Usage: %s [-H, --help] [-V, --version] [-F N, --fontsize N] [-L, --headless] [-T, --test] [-C, --clean] [filename]\n", argv[0]); printf("Options:\n"); printf(" --help : Display usage information\n"); printf(" --version : Display version information\n"); printf(" --fontsize N : Force rendering font size to specified value N\n"); + printf(" --headless : Run without GUI\n"); printf(" --test : Run rendering test\n"); printf(" --clean : Reset user settings\n"); ret = 0;ret = 0; @@ -211,7 +215,7 @@ int main(int argc, char *argv[]) // show all windows Rendering::manager().draw(); - Rendering::manager().show(); + Rendering::manager().show(!headlessRequested); // try to load file given in argument Mixer::manager().load(_openfile);