//======================================================================== // Simple multi-window example // Copyright (c) Camilla Löwy // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== #define GLAD_GL_IMPLEMENTATION #include #define GLFW_INCLUDE_NONE #include #include #include void mouse_button_callback(GLFWwindow* window, int button, int action, int mods){ if(button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS){ glfwDragWindow(window); } } int main(int argc, char** argv) { int xpos, ypos, height; const char* description; GLFWwindow* windows[4]; if (!glfwInit()) { glfwGetError(&description); printf("Error: %s\n", description); exit(EXIT_FAILURE); } glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); glfwWindowHint(GLFW_DECORATED, GLFW_FALSE); glfwGetMonitorWorkarea(glfwGetPrimaryMonitor(), &xpos, &ypos, NULL, &height); for (int i = 0; i < 4; i++) { const int size = height / 5; const struct { float r, g, b; } colors[] = { { 0.95f, 0.32f, 0.11f }, { 0.50f, 0.80f, 0.16f }, { 0.f, 0.68f, 0.94f }, { 0.98f, 0.74f, 0.04f } }; if (i > 0) glfwWindowHint(GLFW_FOCUS_ON_SHOW, GLFW_FALSE); windows[i] = glfwCreateWindow(size, size, "Multi-Window Example", NULL, NULL); if (!windows[i]) { glfwGetError(&description); printf("Error: %s\n", description); glfwTerminate(); exit(EXIT_FAILURE); } glfwSetWindowPos(windows[i], xpos + size * (1 + (i & 1)), ypos + size * (1 + (i >> 1))); glfwSetInputMode(windows[i], GLFW_STICKY_KEYS, GLFW_TRUE); glfwSetMouseButtonCallback(windows[i], mouse_button_callback); glfwMakeContextCurrent(windows[i]); gladLoadGL(glfwGetProcAddress); glClearColor(colors[i].r, colors[i].g, colors[i].b, 1.f); } for (int i = 0; i < 4; i++) glfwShowWindow(windows[i]); for (;;) { for (int i = 0; i < 4; i++) { glfwMakeContextCurrent(windows[i]); glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(windows[i]); if (glfwWindowShouldClose(windows[i]) || glfwGetKey(windows[i], GLFW_KEY_ESCAPE)) { glfwTerminate(); exit(EXIT_SUCCESS); } } glfwWaitEvents(); } }