//======================================================================== // Video mode test // Copyright (c) Camilla Berglund // // 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. // //======================================================================== // // This test enumerates or verifies video modes // //======================================================================== #include #include #include #include #include "getopt.h" static GLFWwindow window = NULL; enum Mode { LIST_MODE, TEST_MODE }; static void usage(void) { printf("Usage: modes [-t]\n"); printf(" modes -h\n"); } static const char* format_mode(GLFWvidmode* mode) { static char buffer[512]; snprintf(buffer, sizeof(buffer), "%i x %i x %i (%i %i %i)", mode->width, mode->height, mode->redBits + mode->greenBits + mode->blueBits, mode->redBits, mode->greenBits, mode->blueBits); buffer[sizeof(buffer) - 1] = '\0'; return buffer; } static void error_callback(int error, const char* description) { fprintf(stderr, "Error: %s\n", description); } static void window_size_callback(GLFWwindow window, int width, int height) { printf("Window resized to %ix%i\n", width, height); glViewport(0, 0, width, height); } static int window_close_callback(GLFWwindow dummy) { window = NULL; return GL_TRUE; } static void key_callback(GLFWwindow dummy, int key, int action) { if (key == GLFW_KEY_ESCAPE) { glfwCloseWindow(window); window = NULL; } } static GLFWvidmode* get_video_modes(GLFWmonitor monitor, size_t* found) { size_t count = 0; GLFWvidmode* modes = NULL; for (;;) { count += 256; modes = realloc(modes, sizeof(GLFWvidmode) * count); *found = glfwGetVideoModes(monitor, modes, count); if (*found < count) break; } return modes; } static void list_modes(GLFWmonitor monitor) { size_t count, i; GLFWvidmode desktop_mode; glfwGetDesktopMode(&desktop_mode); printf("Desktop mode: %s\n", format_mode(&desktop_mode)); GLFWvidmode* modes = get_video_modes(monitor, &count); printf("Monitor %s:\n", glfwGetMonitorString(monitor, GLFW_MONITOR_NAME)); for (i = 0; i < count; i++) { printf("%3u: %s", (unsigned int) i, format_mode(modes + i)); if (memcmp(&desktop_mode, modes + i, sizeof(GLFWvidmode)) == 0) printf(" (desktop mode)"); putchar('\n'); } free(modes); } static void test_modes(GLFWmonitor monitor) { int width, height; size_t i, count; GLFWvidmode* modes = get_video_modes(monitor, &count); glfwSetWindowSizeCallback(window_size_callback); glfwSetWindowCloseCallback(window_close_callback); glfwSetKeyCallback(key_callback); for (i = 0; i < count; i++) { GLFWvidmode* mode = modes + i; glfwOpenWindowHint(GLFW_RED_BITS, mode->redBits); glfwOpenWindowHint(GLFW_GREEN_BITS, mode->greenBits); glfwOpenWindowHint(GLFW_BLUE_BITS, mode->blueBits); printf("Testing mode %u on monitor %s: %s", (unsigned int) i, glfwGetMonitorString(monitor, GLFW_MONITOR_NAME), format_mode(mode)); window = glfwOpenWindow(mode->width, mode->height, GLFW_FULLSCREEN, "Video Mode Test", NULL); if (!window) { printf("Failed to enter mode %u: %s\n", (unsigned int) i, format_mode(mode)); continue; } glfwSetTime(0.0); glfwSwapInterval(1); while (glfwGetTime() < 5.0) { glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(); glfwPollEvents(); if (!window) { printf("User terminated program\n"); exit(EXIT_SUCCESS); } } if (glfwGetWindowParam(window, GLFW_RED_BITS) != mode->redBits || glfwGetWindowParam(window, GLFW_GREEN_BITS) != mode->greenBits || glfwGetWindowParam(window, GLFW_BLUE_BITS) != mode->blueBits) { printf("*** Color bit mismatch: (%i %i %i) instead of (%i %i %i)\n", glfwGetWindowParam(window, GLFW_RED_BITS), glfwGetWindowParam(window, GLFW_GREEN_BITS), glfwGetWindowParam(window, GLFW_BLUE_BITS), mode->redBits, mode->greenBits, mode->blueBits); } glfwGetWindowSize(window, &width, &height); if (width != mode->width || height != mode->height) { printf("*** Size mismatch: %ix%i instead of %ix%i\n", width, height, mode->width, mode->height); } printf("Closing window\n"); glfwCloseWindow(window); glfwPollEvents(); window = NULL; } free(modes); } int main(int argc, char** argv) { int ch, mode = LIST_MODE; GLFWmonitor monitor = NULL; while ((ch = getopt(argc, argv, "th")) != -1) { switch (ch) { case 'h': usage(); exit(EXIT_SUCCESS); case 't': mode = TEST_MODE; break; default: usage(); exit(EXIT_FAILURE); } } argc -= optind; argv += optind; glfwSetErrorCallback(error_callback); if (!glfwInit()) exit(EXIT_FAILURE); while ((monitor = glfwGetNextMonitor(monitor))) { if (mode == LIST_MODE) list_modes(monitor); else if (mode == TEST_MODE) test_modes(monitor); } exit(EXIT_SUCCESS); }