diff --git a/readme.html b/readme.html index bde16bcf..33832689 100644 --- a/readme.html +++ b/readme.html @@ -280,6 +280,7 @@ version of GLFW.

  • Added windows simple multi-window test program
  • Added sharing simple OpenGL object sharing test program
  • Added dynamic simple dynamic linking test program
  • +
  • Added modes video mode enumeration and setting test program
  • Added a parameter to glfwOpenWindow for specifying a context the new window's context will share objects with
  • Added initial window title parameter to glfwOpenWindow
  • Added glfwSetGamma, glfwSetGammaRamp and glfwGetGammaRamp functions and GLFWgammaramp type for monitor gamma ramp control
  • diff --git a/src/cocoa_fullscreen.m b/src/cocoa_fullscreen.m index d3a715ba..147913fb 100644 --- a/src/cocoa_fullscreen.m +++ b/src/cocoa_fullscreen.m @@ -64,6 +64,7 @@ static GLboolean modeIsGood(CGDisplayModeRef mode) return GL_TRUE; } + //======================================================================== // Convert Core Graphics display mode to GLFW video mode //======================================================================== @@ -217,6 +218,7 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount) return stored; } + //======================================================================== // Get the desktop video mode //======================================================================== diff --git a/src/cocoa_init.m b/src/cocoa_init.m index 00898778..16bd98eb 100644 --- a/src/cocoa_init.m +++ b/src/cocoa_init.m @@ -33,6 +33,7 @@ //======================================================================== // Change to our application bundle's resources directory, if present //======================================================================== + static void changeToResourcesDirectory(void) { char resourcesPath[MAXPATHLEN]; @@ -112,6 +113,7 @@ int _glfwPlatformInit(void) return GL_TRUE; } + //======================================================================== // Close window, if open, and shut down GLFW //======================================================================== diff --git a/src/cocoa_joystick.m b/src/cocoa_joystick.m index a167692f..45b3be0f 100644 --- a/src/cocoa_joystick.m +++ b/src/cocoa_joystick.m @@ -579,4 +579,3 @@ int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons, return numbuttons; } - diff --git a/src/cocoa_opengl.m b/src/cocoa_opengl.m index bd3827fc..0ea39076 100644 --- a/src/cocoa_opengl.m +++ b/src/cocoa_opengl.m @@ -59,6 +59,7 @@ void _glfwPlatformSwapBuffers(void) [window->NSGL.context flushBuffer]; } + //======================================================================== // Set double buffering swap interval //======================================================================== @@ -71,6 +72,7 @@ void _glfwPlatformSwapInterval(int interval) [window->NSGL.context setValues:&sync forParameter:NSOpenGLCPSwapInterval]; } + //======================================================================== // Check if an OpenGL extension is available at runtime //======================================================================== @@ -81,6 +83,7 @@ int _glfwPlatformExtensionSupported(const char* extension) return GL_FALSE; } + //======================================================================== // Get the function pointer to an OpenGL function //======================================================================== @@ -99,6 +102,7 @@ void* _glfwPlatformGetProcAddress(const char* procname) return symbol; } + //======================================================================== // Copies the specified OpenGL state categories from src to dst //======================================================================== diff --git a/src/cocoa_time.c b/src/cocoa_time.c index 4facbffb..745b4239 100644 --- a/src/cocoa_time.c +++ b/src/cocoa_time.c @@ -74,6 +74,7 @@ double _glfwPlatformGetTime(void) _glfwLibrary.NS.timer.resolution; } + //======================================================================== // Set timer value in seconds //======================================================================== diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 9d5ee5ec..dd548361 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -112,6 +112,7 @@ @end + //======================================================================== // Delegate for application related notifications //======================================================================== @@ -133,142 +134,6 @@ @end -//======================================================================== -// Keyboard symbol translation table -//======================================================================== - -// TODO: Need to find mappings for F13-F15, volume down/up/mute, and eject. -static const unsigned int MAC_TO_GLFW_KEYCODE_MAPPING[128] = -{ - /* 00 */ GLFW_KEY_A, - /* 01 */ GLFW_KEY_S, - /* 02 */ GLFW_KEY_D, - /* 03 */ GLFW_KEY_F, - /* 04 */ GLFW_KEY_H, - /* 05 */ GLFW_KEY_G, - /* 06 */ GLFW_KEY_Z, - /* 07 */ GLFW_KEY_X, - /* 08 */ GLFW_KEY_C, - /* 09 */ GLFW_KEY_V, - /* 0a */ GLFW_KEY_GRAVE_ACCENT, - /* 0b */ GLFW_KEY_B, - /* 0c */ GLFW_KEY_Q, - /* 0d */ GLFW_KEY_W, - /* 0e */ GLFW_KEY_E, - /* 0f */ GLFW_KEY_R, - /* 10 */ GLFW_KEY_Y, - /* 11 */ GLFW_KEY_T, - /* 12 */ GLFW_KEY_1, - /* 13 */ GLFW_KEY_2, - /* 14 */ GLFW_KEY_3, - /* 15 */ GLFW_KEY_4, - /* 16 */ GLFW_KEY_6, - /* 17 */ GLFW_KEY_5, - /* 18 */ GLFW_KEY_EQUAL, - /* 19 */ GLFW_KEY_9, - /* 1a */ GLFW_KEY_7, - /* 1b */ GLFW_KEY_MINUS, - /* 1c */ GLFW_KEY_8, - /* 1d */ GLFW_KEY_0, - /* 1e */ GLFW_KEY_RIGHT_BRACKET, - /* 1f */ GLFW_KEY_O, - /* 20 */ GLFW_KEY_U, - /* 21 */ GLFW_KEY_LEFT_BRACKET, - /* 22 */ GLFW_KEY_I, - /* 23 */ GLFW_KEY_P, - /* 24 */ GLFW_KEY_ENTER, - /* 25 */ GLFW_KEY_L, - /* 26 */ GLFW_KEY_J, - /* 27 */ GLFW_KEY_APOSTROPHE, - /* 28 */ GLFW_KEY_K, - /* 29 */ GLFW_KEY_SEMICOLON, - /* 2a */ GLFW_KEY_BACKSLASH, - /* 2b */ GLFW_KEY_COMMA, - /* 2c */ GLFW_KEY_SLASH, - /* 2d */ GLFW_KEY_N, - /* 2e */ GLFW_KEY_M, - /* 2f */ GLFW_KEY_PERIOD, - /* 30 */ GLFW_KEY_TAB, - /* 31 */ GLFW_KEY_SPACE, - /* 32 */ GLFW_KEY_WORLD_1, - /* 33 */ GLFW_KEY_BACKSPACE, - /* 34 */ -1, - /* 35 */ GLFW_KEY_ESCAPE, - /* 36 */ GLFW_KEY_RIGHT_SUPER, - /* 37 */ GLFW_KEY_LEFT_SUPER, - /* 38 */ GLFW_KEY_LEFT_SHIFT, - /* 39 */ GLFW_KEY_CAPS_LOCK, - /* 3a */ GLFW_KEY_LEFT_ALT, - /* 3b */ GLFW_KEY_LEFT_CONTROL, - /* 3c */ GLFW_KEY_RIGHT_SHIFT, - /* 3d */ GLFW_KEY_RIGHT_ALT, - /* 3e */ GLFW_KEY_RIGHT_CONTROL, - /* 3f */ -1, /* Function */ - /* 40 */ GLFW_KEY_F17, - /* 41 */ GLFW_KEY_KP_DECIMAL, - /* 42 */ -1, - /* 43 */ GLFW_KEY_KP_MULTIPLY, - /* 44 */ -1, - /* 45 */ GLFW_KEY_KP_ADD, - /* 46 */ -1, - /* 47 */ GLFW_KEY_NUM_LOCK, /* Really KeypadClear... */ - /* 48 */ -1, /* VolumeUp */ - /* 49 */ -1, /* VolumeDown */ - /* 4a */ -1, /* Mute */ - /* 4b */ GLFW_KEY_KP_DIVIDE, - /* 4c */ GLFW_KEY_KP_ENTER, - /* 4d */ -1, - /* 4e */ GLFW_KEY_KP_SUBTRACT, - /* 4f */ GLFW_KEY_F18, - /* 50 */ GLFW_KEY_F19, - /* 51 */ GLFW_KEY_KP_EQUAL, - /* 52 */ GLFW_KEY_KP_0, - /* 53 */ GLFW_KEY_KP_1, - /* 54 */ GLFW_KEY_KP_2, - /* 55 */ GLFW_KEY_KP_3, - /* 56 */ GLFW_KEY_KP_4, - /* 57 */ GLFW_KEY_KP_5, - /* 58 */ GLFW_KEY_KP_6, - /* 59 */ GLFW_KEY_KP_7, - /* 5a */ GLFW_KEY_F20, - /* 5b */ GLFW_KEY_KP_8, - /* 5c */ GLFW_KEY_KP_9, - /* 5d */ -1, - /* 5e */ -1, - /* 5f */ -1, - /* 60 */ GLFW_KEY_F5, - /* 61 */ GLFW_KEY_F6, - /* 62 */ GLFW_KEY_F7, - /* 63 */ GLFW_KEY_F3, - /* 64 */ GLFW_KEY_F8, - /* 65 */ GLFW_KEY_F9, - /* 66 */ -1, - /* 67 */ GLFW_KEY_F11, - /* 68 */ -1, - /* 69 */ GLFW_KEY_F13, - /* 6a */ GLFW_KEY_F16, - /* 6b */ GLFW_KEY_F14, - /* 6c */ -1, - /* 6d */ GLFW_KEY_F10, - /* 6e */ -1, - /* 6f */ GLFW_KEY_F12, - /* 70 */ -1, - /* 71 */ GLFW_KEY_F15, - /* 72 */ GLFW_KEY_INSERT, /* Really Help... */ - /* 73 */ GLFW_KEY_HOME, - /* 74 */ GLFW_KEY_PAGE_UP, - /* 75 */ GLFW_KEY_DELETE, - /* 76 */ GLFW_KEY_F4, - /* 77 */ GLFW_KEY_END, - /* 78 */ GLFW_KEY_F2, - /* 79 */ GLFW_KEY_PAGE_DOWN, - /* 7a */ GLFW_KEY_F1, - /* 7b */ GLFW_KEY_LEFT, - /* 7c */ GLFW_KEY_RIGHT, - /* 7d */ GLFW_KEY_DOWN, - /* 7e */ GLFW_KEY_UP, - /* 7f */ -1, -}; //======================================================================== // Converts a Mac OS X keycode to a GLFW keycode @@ -276,15 +141,150 @@ static const unsigned int MAC_TO_GLFW_KEYCODE_MAPPING[128] = static int convertMacKeyCode(unsigned int macKeyCode) { + // Keyboard symbol translation table + // TODO: Need to find mappings for F13-F15, volume down/up/mute, and eject. + static const unsigned int table[128] = + { + /* 00 */ GLFW_KEY_A, + /* 01 */ GLFW_KEY_S, + /* 02 */ GLFW_KEY_D, + /* 03 */ GLFW_KEY_F, + /* 04 */ GLFW_KEY_H, + /* 05 */ GLFW_KEY_G, + /* 06 */ GLFW_KEY_Z, + /* 07 */ GLFW_KEY_X, + /* 08 */ GLFW_KEY_C, + /* 09 */ GLFW_KEY_V, + /* 0a */ GLFW_KEY_GRAVE_ACCENT, + /* 0b */ GLFW_KEY_B, + /* 0c */ GLFW_KEY_Q, + /* 0d */ GLFW_KEY_W, + /* 0e */ GLFW_KEY_E, + /* 0f */ GLFW_KEY_R, + /* 10 */ GLFW_KEY_Y, + /* 11 */ GLFW_KEY_T, + /* 12 */ GLFW_KEY_1, + /* 13 */ GLFW_KEY_2, + /* 14 */ GLFW_KEY_3, + /* 15 */ GLFW_KEY_4, + /* 16 */ GLFW_KEY_6, + /* 17 */ GLFW_KEY_5, + /* 18 */ GLFW_KEY_EQUAL, + /* 19 */ GLFW_KEY_9, + /* 1a */ GLFW_KEY_7, + /* 1b */ GLFW_KEY_MINUS, + /* 1c */ GLFW_KEY_8, + /* 1d */ GLFW_KEY_0, + /* 1e */ GLFW_KEY_RIGHT_BRACKET, + /* 1f */ GLFW_KEY_O, + /* 20 */ GLFW_KEY_U, + /* 21 */ GLFW_KEY_LEFT_BRACKET, + /* 22 */ GLFW_KEY_I, + /* 23 */ GLFW_KEY_P, + /* 24 */ GLFW_KEY_ENTER, + /* 25 */ GLFW_KEY_L, + /* 26 */ GLFW_KEY_J, + /* 27 */ GLFW_KEY_APOSTROPHE, + /* 28 */ GLFW_KEY_K, + /* 29 */ GLFW_KEY_SEMICOLON, + /* 2a */ GLFW_KEY_BACKSLASH, + /* 2b */ GLFW_KEY_COMMA, + /* 2c */ GLFW_KEY_SLASH, + /* 2d */ GLFW_KEY_N, + /* 2e */ GLFW_KEY_M, + /* 2f */ GLFW_KEY_PERIOD, + /* 30 */ GLFW_KEY_TAB, + /* 31 */ GLFW_KEY_SPACE, + /* 32 */ GLFW_KEY_WORLD_1, + /* 33 */ GLFW_KEY_BACKSPACE, + /* 34 */ -1, + /* 35 */ GLFW_KEY_ESCAPE, + /* 36 */ GLFW_KEY_RIGHT_SUPER, + /* 37 */ GLFW_KEY_LEFT_SUPER, + /* 38 */ GLFW_KEY_LEFT_SHIFT, + /* 39 */ GLFW_KEY_CAPS_LOCK, + /* 3a */ GLFW_KEY_LEFT_ALT, + /* 3b */ GLFW_KEY_LEFT_CONTROL, + /* 3c */ GLFW_KEY_RIGHT_SHIFT, + /* 3d */ GLFW_KEY_RIGHT_ALT, + /* 3e */ GLFW_KEY_RIGHT_CONTROL, + /* 3f */ -1, /* Function */ + /* 40 */ GLFW_KEY_F17, + /* 41 */ GLFW_KEY_KP_DECIMAL, + /* 42 */ -1, + /* 43 */ GLFW_KEY_KP_MULTIPLY, + /* 44 */ -1, + /* 45 */ GLFW_KEY_KP_ADD, + /* 46 */ -1, + /* 47 */ GLFW_KEY_NUM_LOCK, /* Really KeypadClear... */ + /* 48 */ -1, /* VolumeUp */ + /* 49 */ -1, /* VolumeDown */ + /* 4a */ -1, /* Mute */ + /* 4b */ GLFW_KEY_KP_DIVIDE, + /* 4c */ GLFW_KEY_KP_ENTER, + /* 4d */ -1, + /* 4e */ GLFW_KEY_KP_SUBTRACT, + /* 4f */ GLFW_KEY_F18, + /* 50 */ GLFW_KEY_F19, + /* 51 */ GLFW_KEY_KP_EQUAL, + /* 52 */ GLFW_KEY_KP_0, + /* 53 */ GLFW_KEY_KP_1, + /* 54 */ GLFW_KEY_KP_2, + /* 55 */ GLFW_KEY_KP_3, + /* 56 */ GLFW_KEY_KP_4, + /* 57 */ GLFW_KEY_KP_5, + /* 58 */ GLFW_KEY_KP_6, + /* 59 */ GLFW_KEY_KP_7, + /* 5a */ GLFW_KEY_F20, + /* 5b */ GLFW_KEY_KP_8, + /* 5c */ GLFW_KEY_KP_9, + /* 5d */ -1, + /* 5e */ -1, + /* 5f */ -1, + /* 60 */ GLFW_KEY_F5, + /* 61 */ GLFW_KEY_F6, + /* 62 */ GLFW_KEY_F7, + /* 63 */ GLFW_KEY_F3, + /* 64 */ GLFW_KEY_F8, + /* 65 */ GLFW_KEY_F9, + /* 66 */ -1, + /* 67 */ GLFW_KEY_F11, + /* 68 */ -1, + /* 69 */ GLFW_KEY_F13, + /* 6a */ GLFW_KEY_F16, + /* 6b */ GLFW_KEY_F14, + /* 6c */ -1, + /* 6d */ GLFW_KEY_F10, + /* 6e */ -1, + /* 6f */ GLFW_KEY_F12, + /* 70 */ -1, + /* 71 */ GLFW_KEY_F15, + /* 72 */ GLFW_KEY_INSERT, /* Really Help... */ + /* 73 */ GLFW_KEY_HOME, + /* 74 */ GLFW_KEY_PAGE_UP, + /* 75 */ GLFW_KEY_DELETE, + /* 76 */ GLFW_KEY_F4, + /* 77 */ GLFW_KEY_END, + /* 78 */ GLFW_KEY_F2, + /* 79 */ GLFW_KEY_PAGE_DOWN, + /* 7a */ GLFW_KEY_F1, + /* 7b */ GLFW_KEY_LEFT, + /* 7c */ GLFW_KEY_RIGHT, + /* 7d */ GLFW_KEY_DOWN, + /* 7e */ GLFW_KEY_UP, + /* 7f */ -1, + }; + if (macKeyCode >= 128) return -1; // This treats keycodes as *positional*; that is, we'll return 'a' // for the key left of 's', even on an AZERTY keyboard. The charInput // function should still get 'q' though. - return MAC_TO_GLFW_KEYCODE_MAPPING[macKeyCode]; + return table[macKeyCode]; } + //======================================================================== // Content view class for the GLFW window //======================================================================== @@ -388,11 +388,11 @@ static int convertMacKeyCode(unsigned int macKeyCode) { NSUInteger i, length; NSString* characters; - int code = convertMacKeyCode([event keyCode]); + int key = convertMacKeyCode([event keyCode]); - if (code != -1) + if (key != -1) { - _glfwInputKey(window, code, GLFW_PRESS); + _glfwInputKey(window, key, GLFW_PRESS); if ([event modifierFlags] & NSCommandKeyMask) { @@ -412,7 +412,7 @@ static int convertMacKeyCode(unsigned int macKeyCode) - (void)flagsChanged:(NSEvent *)event { - int mode; + int mode, key; unsigned int newModifierFlags = [event modifierFlags] | NSDeviceIndependentModifierFlagsMask; @@ -422,14 +422,17 @@ static int convertMacKeyCode(unsigned int macKeyCode) mode = GLFW_RELEASE; window->NS.modifierFlags = newModifierFlags; - _glfwInputKey(window, MAC_TO_GLFW_KEYCODE_MAPPING[[event keyCode]], mode); + + key = convertMacKeyCode([event keyCode]); + if (key != -1) + _glfwInputKey(window, key, mode); } - (void)keyUp:(NSEvent *)event { - int code = convertMacKeyCode([event keyCode]); - if (code != -1) - _glfwInputKey(window, code, GLFW_RELEASE); + int key = convertMacKeyCode([event keyCode]); + if (key != -1) + _glfwInputKey(window, key, GLFW_RELEASE); } - (void)scrollWheel:(NSEvent *)event @@ -446,6 +449,7 @@ static int convertMacKeyCode(unsigned int macKeyCode) @end + //======================================================================== // GLFW application class //======================================================================== @@ -516,6 +520,7 @@ static NSString* findAppName(void) return @"GLFW Application"; } + //======================================================================== // Set up the menu bar (manually) // This is nasty, nasty stuff -- calls to undocumented semi-private APIs that @@ -523,6 +528,7 @@ static NSString* findAppName(void) // localize(d|able), etc. Loading a nib would save us this horror, but that // doesn't seem like a good thing to require of GLFW's clients. //======================================================================== + static void createMenuBar(void) { NSString* appName = findAppName(); @@ -586,6 +592,7 @@ static void createMenuBar(void) //======================================================================== // Initialize the Cocoa Application Kit //======================================================================== + static GLboolean initializeAppKit(void) { if (NSApp) @@ -604,6 +611,7 @@ static GLboolean initializeAppKit(void) return GL_TRUE; } + //======================================================================== // Create the Cocoa window //======================================================================== @@ -647,6 +655,7 @@ static GLboolean createWindow(_GLFWwindow* window, return GL_TRUE; } + //======================================================================== // Create the OpenGL context //======================================================================== @@ -919,6 +928,7 @@ void _glfwPlatformCloseWindow(_GLFWwindow* window) // TODO: Probably more cleanup } + //======================================================================== // Set the window title //======================================================================== @@ -928,6 +938,7 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char *title) [window->NS.window setTitle:[NSString stringWithUTF8String:title]]; } + //======================================================================== // Set the window size //======================================================================== @@ -937,6 +948,7 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) [window->NS.window setContentSize:NSMakeSize(width, height)]; } + //======================================================================== // Set the window position //======================================================================== @@ -957,6 +969,7 @@ void _glfwPlatformSetWindowPos(_GLFWwindow* window, int x, int y) display:YES]; } + //======================================================================== // Iconify the window //======================================================================== @@ -966,6 +979,7 @@ void _glfwPlatformIconifyWindow(_GLFWwindow* window) [window->NS.window miniaturize:nil]; } + //======================================================================== // Restore (un-iconify) the window //======================================================================== @@ -975,6 +989,7 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window) [window->NS.window deminiaturize:nil]; } + //======================================================================== // Write back window parameters into GLFW window structure //======================================================================== @@ -1049,6 +1064,7 @@ void _glfwPlatformRefreshWindowParams(void) window->glDebug = GL_FALSE; } + //======================================================================== // Poll for new window and input events //======================================================================== @@ -1073,6 +1089,7 @@ void _glfwPlatformPollEvents(void) _glfwLibrary.NS.autoreleasePool = [[NSAutoreleasePool alloc] init]; } + //======================================================================== // Wait for new window and input events //======================================================================== @@ -1091,6 +1108,7 @@ void _glfwPlatformWaitEvents( void ) _glfwPlatformPollEvents(); } + //======================================================================== // Set physical mouse cursor position //======================================================================== @@ -1118,6 +1136,7 @@ void _glfwPlatformSetMouseCursorPos(_GLFWwindow* window, int x, int y) CGDisplayMoveCursorToPoint(CGMainDisplayID(), targetPoint); } + //======================================================================== // Set physical mouse cursor mode //======================================================================== diff --git a/src/input.c b/src/input.c index ec894a27..ded88712 100644 --- a/src/input.c +++ b/src/input.c @@ -167,7 +167,7 @@ void _glfwInputKey(_GLFWwindow* window, int key, int action) return; // Register key action - if(action == GLFW_RELEASE && window->stickyKeys) + if (action == GLFW_RELEASE && window->stickyKeys) window->key[key] = GLFW_STICK; else { diff --git a/src/x11_fullscreen.c b/src/x11_fullscreen.c index e71c2a2b..f7855c4b 100644 --- a/src/x11_fullscreen.c +++ b/src/x11_fullscreen.c @@ -372,6 +372,8 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount) } } + XFree(vislist); + rescount = 0; resarray = NULL; @@ -457,8 +459,6 @@ int _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount) } } - XFree(vislist); - free(resarray); free(rgbarray); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 663f9a11..7a166881 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -36,6 +36,9 @@ target_link_libraries(joysticks ${STATIC_DEPS}) add_executable(listmodes listmodes.c) target_link_libraries(listmodes ${STATIC_DEPS}) +add_executable(modes modes.c getopt.c) +target_link_libraries(modes ${STATIC_DEPS}) + add_executable(peter peter.c) target_link_libraries(peter ${STATIC_DEPS}) @@ -64,7 +67,7 @@ set_target_properties(windows PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Windows") set(WINDOWS_BINARIES accuracy sharing tearing title windows) set(CONSOLE_BINARIES defaults events fsaa fsfocus gamma glfwinfo iconify - joysticks listmodes peter reopen) + joysticks listmodes modes peter reopen) if (MSVC) # Tell MSVC to use main instead of WinMain for Windows subsystem executables diff --git a/tests/modes.c b/tests/modes.c new file mode 100644 index 00000000..de3aec8a --- /dev/null +++ b/tests/modes.c @@ -0,0 +1,225 @@ +//======================================================================== +// 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 "getopt.h" + +static GLFWwindow window = NULL; + +enum Mode +{ + NO_MODE, + LIST_MODE, + TEST_MODE +}; + +static void usage(void) +{ + printf("Usage: modes -l\n"); + printf(" modes -t\n"); + printf(" modes -h\n"); +} + +static void print_mode(GLFWvidmode* mode) +{ + printf("%i x %i x %i (%i %i %i)", + mode->width, mode->height, + mode->redBits + mode->greenBits + mode->blueBits, + mode->redBits, mode->greenBits, mode->blueBits); +} + +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 list_modes(GLFWvidmode* modes, int count) +{ + int i; + GLFWvidmode mode; + + glfwGetDesktopMode(&mode); + printf("Desktop mode: "); + print_mode(&mode); + putchar('\n'); + + for (i = 0; i < count; i++) + { + printf("%3i: ", i); + print_mode(modes + i); + putchar('\n'); + } +} + +static void test_modes(GLFWvidmode* modes, int count) +{ + int i, width, height; + + glfwSetWindowSizeCallback(window_size_callback); + glfwSetWindowCloseCallback(window_close_callback); + + for (i = 0; i < count; i++) + { + glfwOpenWindowHint(GLFW_RED_BITS, modes[i].redBits); + glfwOpenWindowHint(GLFW_GREEN_BITS, modes[i].greenBits); + glfwOpenWindowHint(GLFW_BLUE_BITS, modes[i].blueBits); + + printf("Opening "); + print_mode(modes + i); + printf(" window\n"); + + window = glfwOpenWindow(modes[i].width, modes[i].height, + GLFW_FULLSCREEN, "Video Mode Test", + NULL); + if (!window) + { + printf("Failed to enter mode %i: ", i); + print_mode(modes + i); + putchar('\n'); + 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) != modes[i].redBits || + glfwGetWindowParam(window, GLFW_GREEN_BITS) != modes[i].greenBits || + glfwGetWindowParam(window, GLFW_BLUE_BITS) != modes[i].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), + modes[i].redBits, + modes[i].greenBits, + modes[i].blueBits); + } + + glfwGetWindowSize(window, &width, &height); + + if (width != modes[i].width || height != height) + { + printf("*** Size mismatch: %ix%i instead of %ix%i\n", + width, height, + modes[i].width, modes[i].height); + } + + printf("Closing window\n"); + + glfwCloseWindow(window); + glfwPollEvents(); + window = NULL; + + sleep(5); + } +} + +int main(int argc, char** argv) +{ + int ch, found, count = 0, mode = NO_MODE; + GLFWvidmode* modes = NULL; + + while ((ch = getopt(argc, argv, "lth")) != -1) + { + switch (ch) + { + case 'h': + usage(); + exit(EXIT_SUCCESS); + case 'l': + mode = LIST_MODE; + break; + case 't': + mode = TEST_MODE; + break; + default: + usage(); + exit(EXIT_FAILURE); + } + } + + argc -= optind; + argv += optind; + + glfwSetErrorCallback(error_callback); + + if (!glfwInit()) + exit(EXIT_FAILURE); + + for (;;) + { + count += 256; + modes = realloc(modes, sizeof(GLFWvidmode) * count); + + found = glfwGetVideoModes(modes, count); + if (found < count) + break; + } + + if (mode == LIST_MODE) + list_modes(modes, found); + else if (mode == TEST_MODE) + test_modes(modes, found); + + free(modes); + modes = NULL; + + exit(EXIT_SUCCESS); +} +