From 596132c3a1becceb0ba6d10991d52a85ba8f201c Mon Sep 17 00:00:00 2001 From: Riku Salminen Date: Tue, 21 Aug 2012 21:01:57 +0300 Subject: [PATCH 01/35] Add glfwShowWindow, glfwHideWindow Add glfwShowWindow and glfwHideWindow functions to allow explicit control over show/hide window. Remove platform specific show window code from _glfwPlatformCreateWindow but call glfwShowWindow from glfwCreateWindow to avoid breaking things (for now). --- include/GL/glfw3.h | 2 + src/cocoa_window.m | 20 +++++++- src/internal.h | 2 + src/win32_window.c | 114 +++++++++------------------------------------ src/window.c | 34 ++++++++++++++ src/x11_window.c | 26 +++++++++-- 6 files changed, 101 insertions(+), 97 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 050f0c30..79b6033a 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -540,6 +540,8 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow, int* xpos, int* ypos); GLFWAPI void glfwSetWindowPos(GLFWwindow, int xpos, int ypos); GLFWAPI void glfwIconifyWindow(GLFWwindow window); GLFWAPI void glfwRestoreWindow(GLFWwindow window); +GLFWAPI void glfwShowWindow(GLFWwindow window); +GLFWAPI void glfwHideWindow(GLFWwindow window); GLFWAPI int glfwGetWindowParam(GLFWwindow window, int param); GLFWAPI void glfwSetWindowUserPointer(GLFWwindow window, void* pointer); GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow window); diff --git a/src/cocoa_window.m b/src/cocoa_window.m index d7764f92..db6d07b8 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -906,7 +906,6 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window, if (!createContext(window, wndconfig, fbconfig)) return GL_FALSE; - [window->NS.object makeKeyAndOrderFront:nil]; [window->NSGL.context setView:[window->NS.object contentView]]; if (wndconfig->mode == GLFW_FULLSCREEN) @@ -1030,6 +1029,25 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window) } +//======================================================================== +// Show window +//======================================================================== + +void _glfwPlatformShowWindow(_GLFWwindow* window) +{ + [window->NS.object makeKeyAndOrderFront:nil]; +} + + +//======================================================================== +// Hide window +//======================================================================== + +void _glfwPlatformHideWindow(_GLFWwindow* window) +{ + [window->NS.object orderOut:nil]; +} + //======================================================================== // Write back window parameters into GLFW window structure //======================================================================== diff --git a/src/internal.h b/src/internal.h index 89ac48b2..1bad7483 100644 --- a/src/internal.h +++ b/src/internal.h @@ -302,6 +302,8 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height); void _glfwPlatformSetWindowPos(_GLFWwindow* window, int x, int y); void _glfwPlatformIconifyWindow(_GLFWwindow* window); void _glfwPlatformRestoreWindow(_GLFWwindow* window); +void _glfwPlatformShowWindow(_GLFWwindow* window); +void _glfwPlatformHideWindow(_GLFWwindow* window); // Event management void _glfwPlatformPollEvents(void); diff --git a/src/win32_window.c b/src/win32_window.c index 77b99026..ff6941ab 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -34,95 +34,6 @@ #include #include - -//======================================================================== -// Enable/disable minimize/restore animations -//======================================================================== - -static int setMinMaxAnimations(int enable) -{ - ANIMATIONINFO AI; - int old_enable; - - // Get old animation setting - AI.cbSize = sizeof(ANIMATIONINFO); - SystemParametersInfo(SPI_GETANIMATION, AI.cbSize, &AI, 0); - old_enable = AI.iMinAnimate; - - // If requested, change setting - if (old_enable != enable) - { - AI.iMinAnimate = enable; - SystemParametersInfo(SPI_SETANIMATION, AI.cbSize, &AI, - SPIF_SENDCHANGE); - } - - return old_enable; -} - - -//======================================================================== -// Focus the window and bring it to the top of the stack -// Due to some nastiness with how XP handles SetForegroundWindow we have -// to go through some really bizarre measures to achieve this -//======================================================================== - -static void setForegroundWindow(HWND hWnd) -{ - int try_count = 0; - int old_animate; - - // Try the standard approach first... - BringWindowToTop(hWnd); - SetForegroundWindow(hWnd); - - // If it worked, return now - if (hWnd == GetForegroundWindow()) - { - // Try to modify the system settings (since this is the foreground - // process, we are allowed to do this) - SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID) 0, - SPIF_SENDCHANGE); - return; - } - - // For other Windows versions than 95 & NT4.0, the standard approach - // may not work, so if we failed we have to "trick" Windows into - // making our window the foureground window: Iconify and restore - // again. It is ugly, but it seems to work (we turn off those annoying - // zoom animations to make it look a bit better at least). - - // Turn off minimize/restore animations - old_animate = setMinMaxAnimations(0); - - // We try this a few times, just to be on the safe side of things... - do - { - // Iconify & restore - ShowWindow(hWnd, SW_HIDE); - ShowWindow(hWnd, SW_SHOWMINIMIZED); - ShowWindow(hWnd, SW_SHOWNORMAL); - - // Try to get focus - BringWindowToTop(hWnd); - SetForegroundWindow(hWnd); - - // We do not want to keep going on forever, so we keep track of - // how many times we tried - try_count++; - } - while (hWnd != GetForegroundWindow() && try_count <= 3); - - // Restore the system minimize/restore animation setting - setMinMaxAnimations(old_animate); - - // Try to modify the system settings (since this is now hopefully the - // foreground process, we are probably allowed to do this) - SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID) 0, - SPIF_SENDCHANGE); -} - - //======================================================================== // Hide mouse cursor //======================================================================== @@ -1071,9 +982,6 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window, SWP_NOMOVE | SWP_NOSIZE); } - setForegroundWindow(window->Win32.handle); - SetFocus(window->Win32.handle); - return GL_TRUE; } @@ -1193,6 +1101,28 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window) } +//======================================================================== +// Show or hide window +//======================================================================== + +void _glfwPlatformShowWindow(_GLFWwindow* window) +{ + ShowWindow(window->Win32.handle, SW_SHOWNORMAL); + BringWindowToTop(window->Win32.handle); + SetForegroundWindow(window->Win32.handle); + SetFocus(window->Win32.handle); +} + + +//======================================================================== +// Show or hide window +//======================================================================== + +void _glfwPlatformHideWindow(_GLFWwindow* window) +{ + ShowWindow(window->Win32.handle, SW_HIDE); +} + //======================================================================== // Write back window parameters into GLFW window structure //======================================================================== diff --git a/src/window.c b/src/window.c index 4e95129a..efaa1572 100644 --- a/src/window.c +++ b/src/window.c @@ -318,6 +318,8 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, return GL_FALSE; } + glfwShowWindow(window, 1); // TODO: consider if this is necessary! + // Cache the actual (as opposed to requested) window parameters _glfwPlatformRefreshWindowParams(window); @@ -623,6 +625,38 @@ GLFWAPI void glfwIconifyWindow(GLFWwindow handle) } +//======================================================================== +// Window show +//======================================================================== + +GLFWAPI void glfwShowWindow(GLFWwindow window) +{ + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return; + } + + _glfwPlatformShowWindow((_GLFWwindow*)window); +} + + +//======================================================================== +// Window hide +//======================================================================== + +GLFWAPI void glfwHideWindow(GLFWwindow window) +{ + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return; + } + + _glfwPlatformHideWindow((_GLFWwindow*)window); +} + + //======================================================================== // Window un-iconification //======================================================================== diff --git a/src/x11_window.c b/src/x11_window.c index 442e76c0..90938ccb 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -230,10 +230,6 @@ static GLboolean createWindow(_GLFWwindow* window, _glfwPlatformSetWindowTitle(window, wndconfig->title); - // Make sure the window is mapped before proceeding - XMapWindow(_glfwLibrary.X11.display, window->X11.handle); - XFlush(_glfwLibrary.X11.display); - return GL_TRUE; } @@ -1099,6 +1095,28 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window) } +//======================================================================== +// Show window +//======================================================================== + +void _glfwPlatformShowWindow(_GLFWwindow* window) +{ + XMapRaised(_glfwLibrary.X11.display, window->X11.handle); + XFlush(_glfwLibrary.X11.display); +} + + +//======================================================================== +// Hide window +//======================================================================== + +void _glfwPlatformHideWindow(_GLFWwindow* window) +{ + XUnmapWindow(_glfwLibrary.X11.display, window->X11.handle); + XFlush(_glfwLibrary.X11.display); +} + + //======================================================================== // Read back framebuffer parameters from the context //======================================================================== From a2ca095b869c0c8255cf678e354f44a4aac87120 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 21 Aug 2012 20:28:36 +0200 Subject: [PATCH 02/35] Renamed GLFW_WINDOW_RESIZABLE to GLFW_RESIZABLE. This matches GLFW_ACTIVE and GLFW_ICONIFIED. --- examples/heightmap.c | 2 +- include/GL/glfw3.h | 14 +++++++------- readme.html | 2 +- src/window.c | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/heightmap.c b/examples/heightmap.c index fce8b8de..5139a493 100644 --- a/examples/heightmap.c +++ b/examples/heightmap.c @@ -581,7 +581,7 @@ int main(int argc, char** argv) exit(EXIT_FAILURE); } - glfwWindowHint(GLFW_WINDOW_RESIZABLE, GL_FALSE); + glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); glfwWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); glfwWindowHint(GLFW_OPENGL_VERSION_MINOR, 2); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 79b6033a..5472f8b1 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -405,18 +405,18 @@ extern "C" { #define GLFW_ACCUM_ALPHA_BITS 0x0002100A #define GLFW_AUX_BUFFERS 0x0002100B #define GLFW_STEREO 0x0002100C -#define GLFW_WINDOW_RESIZABLE 0x0002100D #define GLFW_FSAA_SAMPLES 0x0002100E /* The following constants are used with both glfwGetWindowParam * and glfwWindowHint */ -#define GLFW_OPENGL_VERSION_MAJOR 0x0002100F -#define GLFW_OPENGL_VERSION_MINOR 0x00021010 -#define GLFW_OPENGL_FORWARD_COMPAT 0x00021011 -#define GLFW_OPENGL_DEBUG_CONTEXT 0x00021012 -#define GLFW_OPENGL_PROFILE 0x00021013 -#define GLFW_OPENGL_ROBUSTNESS 0x00021014 +#define GLFW_OPENGL_VERSION_MAJOR 0x00022000 +#define GLFW_OPENGL_VERSION_MINOR 0x00022001 +#define GLFW_OPENGL_FORWARD_COMPAT 0x00022002 +#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022003 +#define GLFW_OPENGL_PROFILE 0x00022004 +#define GLFW_OPENGL_ROBUSTNESS 0x00022005 +#define GLFW_RESIZABLE 0x00022006 /* GLFW_OPENGL_ROBUSTNESS mode tokens */ #define GLFW_OPENGL_NO_ROBUSTNESS 0x00000000 diff --git a/readme.html b/readme.html index 39d0739b..580e21cd 100644 --- a/readme.html +++ b/readme.html @@ -296,7 +296,7 @@ version of GLFW.

  • Renamed glfw.h to glfw3.h to avoid conflicts with 2.x series
  • Renamed glfwOpenWindowHint to glfwWindowHint
  • Renamed GLFW_WINDOW token to GLFW_WINDOWED
  • -
  • Renamed GLFW_WINDOW_NO_RESIZE to GLFW_WINDOW_RESIZABLE
  • +
  • Renamed GLFW_WINDOW_NO_RESIZE to GLFW_RESIZABLE
  • Renamed GLFW_BUILD_DLL to _GLFW_BUILD_DLL
  • Renamed version test to glfwinfo
  • Renamed GLFW_NO_GLU to GLFW_INCLUDE_GLU and made it disabled by default
  • diff --git a/src/window.c b/src/window.c index efaa1572..81b0492c 100644 --- a/src/window.c +++ b/src/window.c @@ -410,7 +410,7 @@ GLFWAPI void glfwWindowHint(int target, int hint) case GLFW_STEREO: _glfwLibrary.hints.stereo = hint; break; - case GLFW_WINDOW_RESIZABLE: + case GLFW_RESIZABLE: _glfwLibrary.hints.resizable = hint; break; case GLFW_FSAA_SAMPLES: @@ -705,7 +705,7 @@ GLFWAPI int glfwGetWindowParam(GLFWwindow handle, int param) return window->closeRequested; case GLFW_REFRESH_RATE: return window->refreshRate; - case GLFW_WINDOW_RESIZABLE: + case GLFW_RESIZABLE: return window->resizable; case GLFW_OPENGL_VERSION_MAJOR: return window->glMajor; From 3d2722dc4c638e7c3af9fea0c58a208cee1a3944 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 21 Aug 2012 20:32:44 +0200 Subject: [PATCH 03/35] Fixed broken call to glfwShowWindow. --- src/window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/window.c b/src/window.c index 81b0492c..4f8a96e6 100644 --- a/src/window.c +++ b/src/window.c @@ -318,7 +318,7 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, return GL_FALSE; } - glfwShowWindow(window, 1); // TODO: consider if this is necessary! + glfwShowWindow(window); // Cache the actual (as opposed to requested) window parameters _glfwPlatformRefreshWindowParams(window); From 8bb5c59d2d01ccc6e1247b5680e7d962fb81de80 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 21 Aug 2012 21:18:09 +0200 Subject: [PATCH 04/35] Added GLFW_VISIBLE window hint and parameter. --- include/GL/glfw3.h | 1 + readme.html | 1 + src/cocoa_window.m | 16 ++++++++++++++++ src/internal.h | 4 ++++ src/win32_window.c | 6 ++++++ src/window.c | 22 +++++++++++++++++++--- src/x11_window.c | 2 ++ 7 files changed, 49 insertions(+), 3 deletions(-) diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 5472f8b1..6f535408 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -417,6 +417,7 @@ extern "C" { #define GLFW_OPENGL_PROFILE 0x00022004 #define GLFW_OPENGL_ROBUSTNESS 0x00022005 #define GLFW_RESIZABLE 0x00022006 +#define GLFW_VISIBLE 0x00022007 /* GLFW_OPENGL_ROBUSTNESS mode tokens */ #define GLFW_OPENGL_NO_ROBUSTNESS 0x00000000 diff --git a/readme.html b/readme.html index 580e21cd..c6eedbf3 100644 --- a/readme.html +++ b/readme.html @@ -283,6 +283,7 @@ version of GLFW.

  • Added GLFW_OPENGL_ROBUSTNESS window hint and associated strategy tokens for GL_ARB_robustness support
  • Added GLFW_OPENGL_REVISION window parameter to make up for removal of glfwGetGLVersion
  • Added GLFW_INCLUDE_GL3 macro for telling the GLFW header to include gl3.h header instead of gl.h
  • +
  • Added GLFW_VISIBLE window hint and parameter for controlling and polling window visibility
  • Added windows simple multi-window test program
  • Added sharing simple OpenGL object sharing test program
  • Added modes video mode enumeration and setting test program
  • diff --git a/src/cocoa_window.m b/src/cocoa_window.m index db6d07b8..0d62b0fa 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -131,6 +131,22 @@ return NSTerminateCancel; } +- (void)applicationDidHide:(NSNotification *)notification +{ + _GLFWwindow* window; + + for (window = _glfwLibrary.windowListHead; window; window = window->next) + _glfwInputWindowVisibility(window, GL_FALSE); +} + +- (void)applicationDidUnhide:(NSNotification *)notification +{ + _GLFWwindow* window; + + for (window = _glfwLibrary.windowListHead; window; window = window->next) + _glfwInputWindowVisibility(window, GL_TRUE); +} + @end diff --git a/src/internal.h b/src/internal.h index 1bad7483..8e923d50 100644 --- a/src/internal.h +++ b/src/internal.h @@ -109,6 +109,7 @@ struct _GLFWhints int auxBuffers; GLboolean stereo; GLboolean resizable; + GLboolean visible; int samples; int glMajor; int glMinor; @@ -131,6 +132,7 @@ struct _GLFWwndconfig const char* title; int refreshRate; GLboolean resizable; + GLboolean visible; int glMajor; int glMinor; GLboolean glForward; @@ -181,6 +183,7 @@ struct _GLFWwindow int positionX, positionY; int mode; // GLFW_WINDOW or GLFW_FULLSCREEN GLboolean resizable; // GL_TRUE if user may resize this window + GLboolean visible; // GL_TRUE if this window is visible int refreshRate; // monitor refresh rate void* userPointer; @@ -338,6 +341,7 @@ void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean activated); void _glfwInputWindowPos(_GLFWwindow* window, int x, int y); void _glfwInputWindowSize(_GLFWwindow* window, int width, int height); void _glfwInputWindowIconify(_GLFWwindow* window, int iconified); +void _glfwInputWindowVisibility(_GLFWwindow* window, int visible); void _glfwInputWindowDamage(_GLFWwindow* window); void _glfwInputWindowCloseRequest(_GLFWwindow* window); diff --git a/src/win32_window.c b/src/win32_window.c index ff6941ab..b83d504a 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -418,6 +418,12 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, return 0; } + case WM_SHOWWINDOW: + { + _glfwInputWindowVisibility(window, wParam ? GL_TRUE : GL_FALSE); + break; + } + case WM_SYSCOMMAND: { switch (wParam & 0xfff0) diff --git a/src/window.c b/src/window.c index 4f8a96e6..7e928cf2 100644 --- a/src/window.c +++ b/src/window.c @@ -82,8 +82,9 @@ void _glfwSetDefaultWindowHints(void) _glfwLibrary.hints.glMajor = 1; _glfwLibrary.hints.glMinor = 0; - // The default is to allow window resizing + // The default is to show the window and allow window resizing _glfwLibrary.hints.resizable = GL_TRUE; + _glfwLibrary.hints.visible = GL_TRUE; } @@ -176,6 +177,16 @@ void _glfwInputWindowIconify(_GLFWwindow* window, int iconified) } +//======================================================================== +// Register window visibility events +//======================================================================== + +void _glfwInputWindowVisibility(_GLFWwindow* window, int visible) +{ + window->visible = visible; +} + + //======================================================================== // Register window damage events //======================================================================== @@ -246,6 +257,7 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, wndconfig.title = title; wndconfig.refreshRate = Max(_glfwLibrary.hints.refreshRate, 0); wndconfig.resizable = _glfwLibrary.hints.resizable ? GL_TRUE : GL_FALSE; + wndconfig.visible = _glfwLibrary.hints.visible ? GL_TRUE : GL_FALSE; wndconfig.glMajor = _glfwLibrary.hints.glMajor; wndconfig.glMinor = _glfwLibrary.hints.glMinor; wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE; @@ -318,8 +330,6 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, return GL_FALSE; } - glfwShowWindow(window); - // Cache the actual (as opposed to requested) window parameters _glfwPlatformRefreshWindowParams(window); @@ -353,6 +363,9 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, glClear(GL_COLOR_BUFFER_BIT); _glfwPlatformSwapBuffers(window); + if (wndconfig.visible) + glfwShowWindow(window); + return window; } @@ -413,6 +426,9 @@ GLFWAPI void glfwWindowHint(int target, int hint) case GLFW_RESIZABLE: _glfwLibrary.hints.resizable = hint; break; + case GLFW_VISIBLE: + _glfwLibrary.hints.visible = hint; + break; case GLFW_FSAA_SAMPLES: _glfwLibrary.hints.samples = hint; break; diff --git a/src/x11_window.c b/src/x11_window.c index 90938ccb..b4d62605 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -736,6 +736,7 @@ static void processSingleEvent(void) return; } + _glfwInputWindowVisibility(window, GL_TRUE); _glfwInputWindowIconify(window, GL_FALSE); break; } @@ -750,6 +751,7 @@ static void processSingleEvent(void) return; } + _glfwInputWindowVisibility(window, GL_FALSE); _glfwInputWindowIconify(window, GL_TRUE); break; } From 85576bcb453762008f9c2e609ec310f3a3f85ebd Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 21 Aug 2012 21:19:30 +0200 Subject: [PATCH 05/35] Added credit. --- readme.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/readme.html b/readme.html index c6eedbf3..dd80672e 100644 --- a/readme.html +++ b/readme.html @@ -926,6 +926,9 @@ their skills. Special thanks go out to:

  • Arturo J. Pérez, for a bug fix for cursor tracking on Mac OS X 10.6 Snow Leopard
  • +
  • Riku Salminen, for the initial implementation of + glfwShowWindow and glfwHideWindow
  • +
  • Douglas C. Schmidt and Irfan Pyarali, for their excellent article Strategies for Implementing POSIX Condition Variables on Win32
  • From b665903e14df43f9ca0b9fa8835cabfc022b3bd4 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 21 Aug 2012 21:19:33 +0200 Subject: [PATCH 06/35] Added testing of glfwShowWindow and GLFW_VISIBLE. --- tests/windows.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/windows.c b/tests/windows.c index 894febeb..f4c74bfd 100644 --- a/tests/windows.c +++ b/tests/windows.c @@ -55,6 +55,8 @@ int main(void) for (i = 0; i < 4; i++) { + glfwWindowHint(GLFW_VISIBLE, GL_FALSE); + windows[i] = glfwCreateWindow(200, 200, GLFW_WINDOWED, titles[i], NULL); if (!windows[i]) { @@ -71,6 +73,7 @@ int main(void) 0.f); glfwSetWindowPos(windows[i], 100 + (i & 1) * 300, 100 + (i >> 1) * 300); + glfwShowWindow(windows[i]); } while (running) From 0e63488b407f4f2f1d3ae99ea7b366fa647bcdec Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 21 Aug 2012 21:35:42 +0200 Subject: [PATCH 07/35] Cocoa window visibility fixes. --- src/cocoa_window.m | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 0d62b0fa..35bdd974 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -144,7 +144,10 @@ _GLFWwindow* window; for (window = _glfwLibrary.windowListHead; window; window = window->next) - _glfwInputWindowVisibility(window, GL_TRUE); + { + if ([window->NS.object isVisible]) + _glfwInputWindowVisibility(window, GL_TRUE); + } } @end @@ -1052,6 +1055,7 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window) void _glfwPlatformShowWindow(_GLFWwindow* window) { [window->NS.object makeKeyAndOrderFront:nil]; + _glfwInputWindowVisibility(window, GL_TRUE); } @@ -1062,6 +1066,7 @@ void _glfwPlatformShowWindow(_GLFWwindow* window) void _glfwPlatformHideWindow(_GLFWwindow* window) { [window->NS.object orderOut:nil]; + _glfwInputWindowVisibility(window, GL_FALSE); } //======================================================================== From f6a1bbf782a0fd3e6e460997c3cea529bb85868f Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 21 Aug 2012 21:57:13 +0200 Subject: [PATCH 08/35] Added GLFW_VISIBLE to glfwWindowParam. --- src/window.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/window.c b/src/window.c index 7e928cf2..2507dd5c 100644 --- a/src/window.c +++ b/src/window.c @@ -723,6 +723,8 @@ GLFWAPI int glfwGetWindowParam(GLFWwindow handle, int param) return window->refreshRate; case GLFW_RESIZABLE: return window->resizable; + case GLFW_VISIBLE: + return window->visible; case GLFW_OPENGL_VERSION_MAJOR: return window->glMajor; case GLFW_OPENGL_VERSION_MINOR: From f5bfe41456d6f4bfbe4c1ac4c5eb0ef23cc545c7 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 28 Aug 2012 17:52:22 +0200 Subject: [PATCH 09/35] Moved GLFW_VISIBLE hint use to glfwinfo. --- tests/glfwinfo.c | 2 ++ tests/windows.c | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/glfwinfo.c b/tests/glfwinfo.c index 90fd329f..0019bf66 100644 --- a/tests/glfwinfo.c +++ b/tests/glfwinfo.c @@ -207,6 +207,8 @@ int main(int argc, char** argv) if (strategy) glfwWindowHint(GLFW_OPENGL_ROBUSTNESS, strategy); + glfwWindowHint(GLFW_VISIBLE, GL_FALSE); + // We assume here that we stand a better chance of success by leaving all // possible details of pixel format selection to GLFW diff --git a/tests/windows.c b/tests/windows.c index f4c74bfd..894febeb 100644 --- a/tests/windows.c +++ b/tests/windows.c @@ -55,8 +55,6 @@ int main(void) for (i = 0; i < 4; i++) { - glfwWindowHint(GLFW_VISIBLE, GL_FALSE); - windows[i] = glfwCreateWindow(200, 200, GLFW_WINDOWED, titles[i], NULL); if (!windows[i]) { @@ -73,7 +71,6 @@ int main(void) 0.f); glfwSetWindowPos(windows[i], 100 + (i & 1) * 300, 100 + (i >> 1) * 300); - glfwShowWindow(windows[i]); } while (running) From d5ede068593638647eae61ce3984f20403927bb5 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 28 Aug 2012 21:37:07 +0200 Subject: [PATCH 10/35] Removed WS_VISIBLE from creation flags. --- src/win32_window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win32_window.c b/src/win32_window.c index 5a74955e..13096073 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -753,7 +753,7 @@ static int createWindow(_GLFWwindow* window, WCHAR* wideTitle; // Set common window styles - dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE; + dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN; dwExStyle = WS_EX_APPWINDOW; // Set window style, depending on fullscreen mode From e70ced5e05009b858956f6b04f62d1dc29f903d4 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 7 Sep 2012 02:15:54 +0200 Subject: [PATCH 11/35] Fixed bad editing in Cocoa joystick code. --- readme.html | 2 ++ src/cocoa_joystick.m | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/readme.html b/readme.html index 497546cd..314c392a 100644 --- a/readme.html +++ b/readme.html @@ -924,6 +924,8 @@ their skills. Special thanks go out to:

    Much of the Windows code of GLFW was originally based on Jeff's code +
  • Julian Møller, for reporting a bug in the Cocoa joystick code
  • +
  • Arturo J. Pérez, for a bug fix for cursor tracking on Mac OS X 10.6 Snow Leopard
  • diff --git a/src/cocoa_joystick.m b/src/cocoa_joystick.m index 7eac7f91..04c9e972 100644 --- a/src/cocoa_joystick.m +++ b/src/cocoa_joystick.m @@ -550,15 +550,15 @@ int _glfwPlatformGetJoystickAxes(int joy, float* axes, int numaxes) for (i = 0; i < numaxes; i++) { - _glfwJoystickElement* axes = + _glfwJoystickElement* elements = (_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick.axes, i); - long readScale = axes->maxReport - axes->minReport; + long readScale = elements->maxReport - elements->minReport; if (readScale == 0) - axes[i] = axes->value; + axes[i] = elements->value; else - axes[i] = (2.0f * (axes->value - axes->minReport) / readScale) - 1.0f; + axes[i] = (2.0f * (elements->value - elements->minReport) / readScale) - 1.0f; if (i & 1) axes[i] = -axes[i]; From 4cb569b5b38dadfadfe503e7db33e852ab95165d Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 7 Sep 2012 15:27:41 +0200 Subject: [PATCH 12/35] Replaced guessing with dirent and regex. --- src/x11_init.c | 3 ++- src/x11_joystick.c | 49 ++++++++++++++++++++++++++++++++++------------ src/x11_platform.h | 2 +- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/x11_init.c b/src/x11_init.c index a5277c09..32719cbf 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -648,7 +648,8 @@ int _glfwPlatformInit(void) _glfwLibrary.X11.cursor = createNULLCursor(); - _glfwInitJoysticks(); + if (!_glfwInitJoysticks()) + return GL_FALSE; // Start the timer _glfwInitTimer(); diff --git a/src/x11_joystick.c b/src/x11_joystick.c index 1895dc6a..a383fa02 100644 --- a/src/x11_joystick.c +++ b/src/x11_joystick.c @@ -37,7 +37,8 @@ #include #include #include - +#include +#include #include #include #endif // _GLFW_USE_LINUX_JOYSTICKS @@ -171,30 +172,52 @@ static void pollJoystickEvents(void) // Initialize joystick interface //======================================================================== -void _glfwInitJoysticks(void) +int _glfwInitJoysticks(void) { #ifdef _GLFW_USE_LINUX_JOYSTICKS - int i, j, joy = 0; - char path[20]; - const char* bases[] = + int i, joy = 0; + regex_t regex; + DIR* dir; + const char* directories[] = { - "/dev/input/js", - "/dev/js" + "/dev/input", + "/dev" }; - for (i = 0; i < sizeof(bases) / sizeof(bases[0]); i++) + if (regcomp(®ex, "^js[0-9]\\+$", 0) != 0) { - for (j = 0; j < 50; j++) - { - if (joy > GLFW_JOYSTICK_LAST) - break; + _glfwSetError(GLFW_PLATFORM_ERROR, "X11: Failed to compile regex"); + return GL_FALSE; + } - sprintf(path, "%s%i", bases[i], j); + for (i = 0; i < sizeof(directories) / sizeof(directories[0]); i++) + { + struct dirent* entry; + + dir = opendir(directories[i]); + if (!dir) + continue; + + while ((entry = readdir(dir))) + { + char path[20]; + regmatch_t match; + + if (regexec(®ex, entry->d_name, 1, &match, 0) != 0) + continue; + + snprintf(path, sizeof(path), "%s/%s", directories[i], entry->d_name); if (openJoystickDevice(joy, path)) joy++; } + + closedir(dir); } + + regfree(®ex); #endif // _GLFW_USE_LINUX_JOYSTICKS + + return GL_TRUE; } diff --git a/src/x11_platform.h b/src/x11_platform.h index 75beb745..a6b576ed 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -305,7 +305,7 @@ void _glfwSetVideoMode(int* width, int* height, int* rate); void _glfwRestoreVideoMode(void); // Joystick input -void _glfwInitJoysticks(void); +int _glfwInitJoysticks(void); void _glfwTerminateJoysticks(void); // Unicode support From b4d0223faa6598b20e8e6da2153e38f1c8c32d43 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 7 Sep 2012 15:48:03 +0200 Subject: [PATCH 13/35] Formatting. --- src/x11_joystick.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/x11_joystick.c b/src/x11_joystick.c index a383fa02..c1fb62be 100644 --- a/src/x11_joystick.c +++ b/src/x11_joystick.c @@ -178,7 +178,7 @@ int _glfwInitJoysticks(void) int i, joy = 0; regex_t regex; DIR* dir; - const char* directories[] = + const char* dirs[] = { "/dev/input", "/dev" @@ -190,11 +190,11 @@ int _glfwInitJoysticks(void) return GL_FALSE; } - for (i = 0; i < sizeof(directories) / sizeof(directories[0]); i++) + for (i = 0; i < sizeof(dirs) / sizeof(dirs[0]); i++) { struct dirent* entry; - dir = opendir(directories[i]); + dir = opendir(dirs[i]); if (!dir) continue; @@ -206,7 +206,7 @@ int _glfwInitJoysticks(void) if (regexec(®ex, entry->d_name, 1, &match, 0) != 0) continue; - snprintf(path, sizeof(path), "%s/%s", directories[i], entry->d_name); + snprintf(path, sizeof(path), "%s/%s", dirs[i], entry->d_name); if (openJoystickDevice(joy, path)) joy++; } From a49c61f1a7a062e989a6ba970353e0b0540a0fee Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sat, 8 Sep 2012 20:43:08 +0200 Subject: [PATCH 14/35] Updated TinyCThread. --- support/tinycthread.c | 90 +++++++++++++++++++++---------------------- support/tinycthread.h | 89 ++++++++++++++++++++++++++++-------------- 2 files changed, 106 insertions(+), 73 deletions(-) diff --git a/support/tinycthread.c b/support/tinycthread.c index 9bee2cb5..ced7cf3f 100644 --- a/support/tinycthread.c +++ b/support/tinycthread.c @@ -21,13 +21,6 @@ freely, subject to the following restrictions: distribution. */ -/* Activate some POSIX functionality (e.g. recursive mutexes) */ -#define _GNU_SOURCE -#if !defined(_XOPEN_SOURCE) || (_XOPEN_SOURCE < 500) - #undef _XOPEN_SOURCE - #define _XOPEN_SOURCE 500 -#endif - #include "tinycthread.h" #include @@ -99,9 +92,11 @@ int mtx_lock(mtx_t *mtx) #endif } -int mtx_timedlock(mtx_t *mtx, const xtime *xt) +int mtx_timedlock(mtx_t *mtx, const struct timespec *ts) { /* FIXME! */ + (void)mtx; + (void)ts; return thrd_error; } @@ -290,21 +285,21 @@ int cnd_wait(cnd_t *cond, mtx_t *mtx) #endif } -int cnd_timedwait(cnd_t *cond, mtx_t *mtx, const xtime *xt) +int cnd_timedwait(cnd_t *cond, mtx_t *mtx, const struct timespec *ts) { #if defined(_TTHREAD_WIN32_) - xtime now; - DWORD delta; - xtime_get(&now, TIME_UTC); - delta = (xt->sec - now.sec) * 1000 + - (xt->nsec - now.nsec + 500000) / 1000000; - return _cnd_timedwait_win32(cond, mtx, delta); + struct timespec now; + if (clock_gettime(TIME_UTC, &now) == 0) + { + DWORD delta = (ts->tv_sec - now.tv_sec) * 1000 + + (ts->tv_nsec - now.tv_nsec + 500000) / 1000000; + return _cnd_timedwait_win32(cond, mtx, delta); + } + else + return thrd_error; #else - struct timespec ts; int ret; - ts.tv_sec = xt->sec; - ts.tv_nsec = xt->nsec; - ret = pthread_cond_timedwait(cond, mtx, &ts); + ret = pthread_cond_timedwait(cond, mtx, ts); if (ret == ETIMEDOUT) { return thrd_timeout; @@ -322,9 +317,9 @@ typedef struct { /* Thread wrapper function. */ #if defined(_TTHREAD_WIN32_) -unsigned WINAPI _thrd_wrapper_function(void * aArg) +static unsigned WINAPI _thrd_wrapper_function(void * aArg) #elif defined(_TTHREAD_POSIX_) -void * _thrd_wrapper_function(void * aArg) +static void * _thrd_wrapper_function(void * aArg) #endif { thrd_start_t fun; @@ -401,6 +396,7 @@ thrd_t thrd_current(void) int thrd_detach(thrd_t thr) { /* FIXME! */ + (void)thr; return thrd_error; } @@ -460,9 +456,9 @@ int thrd_join(thrd_t thr, int *res) return thrd_success; } -void thrd_sleep(const xtime *xt) +int thrd_sleep(const struct timespec *time_point, struct timespec *remaining) { - xtime now; + struct timespec now; #if defined(_TTHREAD_WIN32_) DWORD delta; #else @@ -470,20 +466,21 @@ void thrd_sleep(const xtime *xt) #endif /* Get the current time */ - xtime_get(&now, TIME_UTC); + if (clock_gettime(TIME_UTC, &now) != 0) + return -2; // FIXME: Some specific error code? #if defined(_TTHREAD_WIN32_) /* Delta in milliseconds */ - delta = (xt->sec - now.sec) * 1000 + - (xt->nsec - now.nsec + 500000) / 1000000; + delta = (time_point->tv_sec - now.tv_sec) * 1000 + + (time_point->tv_nsec - now.tv_nsec + 500000) / 1000000; if (delta > 0) { Sleep(delta); } #else /* Delta in microseconds */ - delta = (xt->sec - now.sec) * 1000000L + - (xt->nsec - now.nsec + 500L) / 1000L; + delta = (time_point->tv_sec - now.tv_sec) * 1000000L + + (time_point->tv_nsec - now.tv_nsec + 500L) / 1000L; /* On some systems, the usleep argument must be < 1000000 */ while (delta > 999999L) @@ -496,6 +493,14 @@ void thrd_sleep(const xtime *xt) usleep((useconds_t)delta); } #endif + + /* We don't support waking up prematurely (yet) */ + if (remaining) + { + remaining->tv_sec = 0; + remaining->tv_nsec = 0; + } + return 0; } void thrd_yield(void) @@ -563,26 +568,21 @@ int tss_set(tss_t key, void *val) return thrd_success; } -int xtime_get(xtime *xt, int base) +#if defined(_TTHREAD_EMULATE_CLOCK_GETTIME_) +int _tthread_clock_gettime(clockid_t clk_id, struct timespec *ts) { - if (base == TIME_UTC) - { #if defined(_TTHREAD_WIN32_) - struct _timeb tb; - _ftime(&tb); - xt->sec = (time_t)tb.time; - xt->nsec = 1000000 * (long)tb.millitm; + struct _timeb tb; + _ftime(&tb); + ts->tv_sec = (time_t)tb.time; + ts->tv_nsec = 1000000L * (long)tb.millitm; #else - struct timeval tv; - gettimeofday(&tv, NULL); - xt->sec = (time_t)tv.tv_sec; - xt->nsec = 1000 * (long)tv.tv_usec; + struct timeval tv; + gettimeofday(&tv, NULL); + ts->tv_sec = (time_t)tv.tv_sec; + ts->tv_nsec = 1000L * (long)tv.tv_usec; #endif - return base; - } - else - { - return 0; - } + return 0; } +#endif // _TTHREAD_EMULATE_CLOCK_GETTIME_ diff --git a/support/tinycthread.h b/support/tinycthread.h index 8069e3f3..1a9c805c 100644 --- a/support/tinycthread.h +++ b/support/tinycthread.h @@ -57,6 +57,22 @@ freely, subject to the following restrictions: #define _TTHREAD_PLATFORM_DEFINED_ #endif +/* Activate some POSIX functionality (e.g. clock_gettime and recursive mutexes) */ +#if defined(_TTHREAD_POSIX_) + #undef _FEATURES_H + #if !defined(_GNU_SOURCE) + #define _GNU_SOURCE + #endif + #if !defined(_POSIX_C_SOURCE) || ((_POSIX_C_SOURCE - 0) < 199309L) + #undef _POSIX_C_SOURCE + #define _POSIX_C_SOURCE 199309L + #endif + #if !defined(_XOPEN_SOURCE) || ((_XOPEN_SOURCE - 0) < 500) + #undef _XOPEN_SOURCE + #define _XOPEN_SOURCE 500 + #endif +#endif + /* Generic includes */ #include @@ -75,10 +91,42 @@ freely, subject to the following restrictions: #endif #endif +/* Workaround for missing TIME_UTC: If time.h doesn't provide TIME_UTC, + it's quite likely that libc does not support it either. Hence, fall back to + the only other supported time specifier: CLOCK_REALTIME (and if that fails, + we're probably emulating clock_gettime anyway, so anything goes). */ +#ifndef TIME_UTC + #ifdef CLOCK_REALTIME + #define TIME_UTC CLOCK_REALTIME + #else + #define TIME_UTC 0 + #endif +#endif + +/* Workaround for missing clock_gettime (most Windows compilers, afaik) */ +#if defined(_TTHREAD_WIN32_) +#define _TTHREAD_EMULATE_CLOCK_GETTIME_ +/* Emulate struct timespec */ +struct _ttherad_timespec { + time_t tv_sec; + long tv_nsec; +}; +#define timespec _ttherad_timespec + +/* Emulate clockid_t */ +typedef int _tthread_clockid_t; +#define clockid_t _tthread_clockid_t + +/* Emulate clock_gettime */ +int _tthread_clock_gettime(clockid_t clk_id, struct timespec *ts); +#define clock_gettime _tthread_clock_gettime +#endif + + /** TinyCThread version (major number). */ #define TINYCTHREAD_VERSION_MAJOR 1 /** TinyCThread version (minor number). */ -#define TINYCTHREAD_VERSION_MINOR 0 +#define TINYCTHREAD_VERSION_MINOR 1 /** TinyCThread version (full version). */ #define TINYCTHREAD_VERSION (TINYCTHREAD_VERSION_MAJOR * 100 + TINYCTHREAD_VERSION_MINOR) @@ -101,7 +149,7 @@ freely, subject to the following restrictions: * @hideinitializer */ -/* FIXME: Check for a PROPER value of __STDC_VERSION__ to know if we have C11 or */ +/* FIXME: Check for a PROPER value of __STDC_VERSION__ to know if we have C11 */ #if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201102L)) && !defined(_Thread_local) #if defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_CC) || defined(__IBMCPP__) #define _Thread_local __thread @@ -126,12 +174,6 @@ freely, subject to the following restrictions: #define mtx_try 4 #define mtx_recursive 8 -/** Time specification */ -typedef struct { - time_t sec; /**< Seconds */ - long nsec; /**< Nanoseconds */ -} xtime; - /* Mutex */ #if defined(_TTHREAD_WIN32_) typedef struct { @@ -174,7 +216,7 @@ int mtx_lock(mtx_t *mtx); /** NOT YET IMPLEMENTED. */ -int mtx_timedlock(mtx_t *mtx, const xtime *xt); +int mtx_timedlock(mtx_t *mtx, const struct timespec *ts); /** Try to lock the given mutex. * The specified mutex shall support either test and return or timeout. If the @@ -260,7 +302,7 @@ int cnd_wait(cnd_t *cond, mtx_t *mtx); * specified in the call was reached without acquiring the requested resource, or * @ref thrd_error if the request could not be honored. */ -int cnd_timedwait(cnd_t *cond, mtx_t *mtx, const xtime *xt); +int cnd_timedwait(cnd_t *cond, mtx_t *mtx, const struct timespec *ts); /* Thread */ #if defined(_TTHREAD_WIN32_) @@ -326,11 +368,16 @@ void thrd_exit(int res); int thrd_join(thrd_t thr, int *res); /** Put the calling thread to sleep. -* Suspend execution of the calling thread until after the time specified by the -* xtime object. -* @param xt A point in time at which the thread will resume (absolute time). +* Suspend execution of the calling thread. +* @param time_point A point in time at which the thread will resume (absolute time). +* @param remaining If non-NULL, this parameter will hold the remaining time until +* time_point upon return. This will typically be zero, but if +* the thread was woken up by a signal that is not ignored before +* time_point was reached @c remaining will hold a positive +* time. +* @return 0 (zero) on successful sleep, or -1 if an interrupt occurred. */ -void thrd_sleep(const xtime *xt); +int thrd_sleep(const struct timespec *time_point, struct timespec *remaining); /** Yield execution to another thread. * Permit other threads to run, even if the current thread would ordinarily @@ -385,20 +432,6 @@ void *tss_get(tss_t key); */ int tss_set(tss_t key, void *val); -/* Timing */ -enum -{ - TIME_UTC = 1 -}; - -/** Get the current time. -* Set the xtime object to hold the current time based on the given time base. -* @param xt Will be filled out with the current time. -* @param base Time base (must be @c TIME_UTC). -* @return The non-zero value @c base if the function is successful, otherwise -* it returns zero. -*/ -int xtime_get(xtime *xt, int base); #endif /* _TINYTHREAD_H_ */ From bd70e5335207fc45e56f045f843d86bdd32601f3 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sat, 8 Sep 2012 21:08:39 +0200 Subject: [PATCH 15/35] Added missing flags for size hints. --- readme.html | 1 + src/x11_window.c | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/readme.html b/readme.html index 314c392a..31e9217e 100644 --- a/readme.html +++ b/readme.html @@ -349,6 +349,7 @@ version of GLFW.

  • [X11] Bugfix: Some window properties required by the ICCCM were not set
  • [X11] Bugfix: Calling glXCreateContextAttribsARB with an unavailable OpenGL version caused the application to terminate with a BadMatch Xlib error
  • [X11] Bugfix: A synchronization point necessary for jitter-free locked cursor mode was incorrectly removed
  • +
  • [X11] Bugfix: The window size hints were not updated when calling glfwSetWindowSize on a non-resizable window
  • [Win32] Changed port to use Unicode mode only
  • [Win32] Removed explicit support for versions of Windows older than Windows XP
  • [Win32] Bugfix: Window activation and iconification did not work as expected
  • diff --git a/src/x11_window.c b/src/x11_window.c index f219275c..cbc28dd0 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -956,7 +956,6 @@ void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title) void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) { int mode = 0, rate, sizeChanged = GL_FALSE; - XSizeHints* sizehints; rate = window->refreshRate; @@ -970,14 +969,14 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) { // Update window size restrictions to match new window size - sizehints = XAllocSizeHints(); - sizehints->flags = 0; + XSizeHints* hints = XAllocSizeHints(); - sizehints->min_width = sizehints->max_width = width; - sizehints->min_height = sizehints->max_height = height; + hints->flags |= (PMinSize | PMaxSize); + hints->min_width = hints->max_width = width; + hints->min_height = hints->max_height = height; - XSetWMNormalHints(_glfwLibrary.X11.display, window->X11.handle, sizehints); - XFree(sizehints); + XSetWMNormalHints(_glfwLibrary.X11.display, window->X11.handle, hints); + XFree(hints); } // Change window size before changing fullscreen mode? From 2b946289d8922da768b317c3d9ff35e60a17b21d Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 9 Sep 2012 01:31:23 +0200 Subject: [PATCH 16/35] Added direct dependency on librt for threads test on X11. --- tests/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 80a7b82f..11bcfe9e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -8,6 +8,11 @@ else() link_libraries(${glfw_LIBRARIES}) endif() +list(APPEND thread_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) +if (UNIX AND NOT APPLE) + list(APPEND thread_LIBRARIES ${RT_LIBRARY}) +endif() + include_directories(${GLFW_SOURCE_DIR}/include ${GLFW_SOURCE_DIR}/support ${OPENGL_INCLUDE_DIR}) @@ -49,7 +54,7 @@ add_executable(windows WIN32 MACOSX_BUNDLE windows.c) set_target_properties(windows PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Windows") if (BUILD_SHARED_LIBS) - target_link_libraries(threads ${CMAKE_THREAD_LIBS_INIT}) + target_link_libraries(threads ${thread_LIBRARIES}) endif() set(WINDOWS_BINARIES accuracy sharing tearing threads title windows) From 50d68c83bbbfc5fe8fdc7d26e1025ff208f40b93 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 9 Sep 2012 13:56:57 +0200 Subject: [PATCH 17/35] Fixed TinyCThread declaring timespec on OS X. --- support/tinycthread.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/support/tinycthread.h b/support/tinycthread.h index 1a9c805c..18451ef9 100644 --- a/support/tinycthread.h +++ b/support/tinycthread.h @@ -104,14 +104,16 @@ freely, subject to the following restrictions: #endif /* Workaround for missing clock_gettime (most Windows compilers, afaik) */ -#if defined(_TTHREAD_WIN32_) +#if defined(_TTHREAD_WIN32_) || defined(__APPLE_CC__) #define _TTHREAD_EMULATE_CLOCK_GETTIME_ /* Emulate struct timespec */ +#if defined(_TTHREAD_WIN32_) struct _ttherad_timespec { time_t tv_sec; long tv_nsec; }; #define timespec _ttherad_timespec +#endif /* Emulate clockid_t */ typedef int _tthread_clockid_t; From feef05f839e67e86a08095f476805b389899a84a Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 9 Sep 2012 14:22:14 +0200 Subject: [PATCH 18/35] Removed superfluous inclusion. --- src/fullscreen.c | 6 ++---- src/window.c | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/fullscreen.c b/src/fullscreen.c index f632749f..4372d153 100644 --- a/src/fullscreen.c +++ b/src/fullscreen.c @@ -32,10 +32,8 @@ #include "internal.h" #include -#ifdef __APPLE__ -#include -#else -#include +#if _WIN32 + #include #endif diff --git a/src/window.c b/src/window.c index 6c7f5a59..c3944ead 100644 --- a/src/window.c +++ b/src/window.c @@ -33,10 +33,8 @@ #include #include -#ifdef __APPLE__ -#include -#else -#include +#if _WIN32 + #include #endif From 7be55239e73c306d8fa5543ff969dda2b26cf9d2 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Mon, 10 Sep 2012 21:45:06 +0200 Subject: [PATCH 19/35] Disabled native API by default. --- CMakeLists.txt | 8 +++++++- src/CMakeLists.txt | 20 +++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 14eaceb3..c72e00ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,7 @@ set(LIB_SUFFIX "" CACHE STRING "Takes an empty string or 64. Directory where lib option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" ON) option(GLFW_BUILD_TESTS "Build the GLFW test programs" ON) +option(GLFW_NATIVE_API "Build the GLFW native API" OFF) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) find_package(OpenGL REQUIRED) @@ -259,7 +260,12 @@ configure_file(${GLFW_SOURCE_DIR}/src/config.h.in # The src directory's CMakeLists.txt file installs the library #-------------------------------------------------------------------- install(DIRECTORY include/GL DESTINATION include - FILES_MATCHING PATTERN glfw3.h PATTERN glfw3native.h) + FILES_MATCHING PATTERN glfw3.h) + +if (GLFW_NATIVE_API) + install(DIRECTORY include/GL DESTINATION include + FILES_MATCHING PATTERN glfw3native.h) +endif() install(FILES COPYING.txt readme.html DESTINATION share/doc/glfw-${GLFW_VERSION_FULL}) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index eaf37325..ec5508c2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,7 +10,11 @@ if (_GLFW_COCOA_NSGL) set(glfw_HEADERS ${common_HEADERS} cocoa_platform.h) set(glfw_SOURCES ${common_SOURCES} cocoa_clipboard.m cocoa_fullscreen.m cocoa_gamma.c cocoa_init.m cocoa_input.m cocoa_joystick.m - cocoa_native.m cocoa_opengl.m cocoa_time.c cocoa_window.m) + cocoa_opengl.m cocoa_time.c cocoa_window.m) + + if (GLFW_NATIVE_API) + list(APPEND glfw_SOURCES cocoa_native.m) + endif() # For some reason, CMake doesn't know about .m set_source_files_properties(${glfw_SOURCES} PROPERTIES LANGUAGE C) @@ -18,14 +22,20 @@ elseif (_GLFW_WIN32_WGL) set(glfw_HEADERS ${common_HEADERS} win32_platform.h) set(glfw_SOURCES ${common_SOURCES} win32_clipboard.c win32_fullscreen.c win32_gamma.c win32_init.c win32_input.c win32_joystick.c - win32_native.c win32_opengl.c win32_time.c win32_window.c - win32_dllmain.c) + win32_opengl.c win32_time.c win32_window.c win32_dllmain.c) + + if (GLFW_NATIVE_API) + list(APPEND glfw_SOURCES win32_native.c) + endif() elseif (_GLFW_X11_GLX) set(glfw_HEADERS ${common_HEADERS} x11_platform.h) set(glfw_SOURCES ${common_SOURCES} x11_clipboard.c x11_fullscreen.c x11_gamma.c x11_init.c x11_input.c x11_joystick.c - x11_keysym2unicode.c x11_native.c x11_opengl.c x11_time.c - x11_window.c) + x11_keysym2unicode.c x11_opengl.c x11_time.c x11_window.c) + + if (GLFW_NATIVE_API) + list(APPEND glfw_SOURCES x11_native.c) + endif() endif() add_library(glfw ${glfw_SOURCES} ${glfw_HEADERS}) From d214bfdfded62ac933e4388f55597c0ab00a83e4 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 11 Sep 2012 22:23:35 +0200 Subject: [PATCH 20/35] Made defaults test window hidden. --- tests/defaults.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/defaults.c b/tests/defaults.c index 391b4984..2877cfd9 100644 --- a/tests/defaults.c +++ b/tests/defaults.c @@ -83,6 +83,8 @@ int main(void) exit(EXIT_FAILURE); } + glfwWindowHint(GLFW_VISIBLE, GL_FALSE); + window = glfwCreateWindow(0, 0, GLFW_WINDOWED, "Defaults", NULL); if (!window) { From 023b816bcc3ce638bbab63fad38404d5632e5be2 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 11 Sep 2012 23:51:45 +0200 Subject: [PATCH 21/35] Disallowed hiding of fullscreen windows. --- src/window.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/window.c b/src/window.c index ab29725d..04e4f762 100644 --- a/src/window.c +++ b/src/window.c @@ -366,7 +366,7 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, glClear(GL_COLOR_BUFFER_BIT); _glfwPlatformSwapBuffers(window); - if (wndconfig.visible) + if (wndconfig.visible || mode == GLFW_FULLSCREEN) glfwShowWindow(window); return window; @@ -649,15 +649,20 @@ GLFWAPI void glfwIconifyWindow(GLFWwindow handle) // Window show //======================================================================== -GLFWAPI void glfwShowWindow(GLFWwindow window) +GLFWAPI void glfwShowWindow(GLFWwindow handle) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwPlatformShowWindow((_GLFWwindow*)window); + if (window->mode == GLFW_FULLSCREEN) + return; + + _glfwPlatformShowWindow(window); } @@ -665,15 +670,20 @@ GLFWAPI void glfwShowWindow(GLFWwindow window) // Window hide //======================================================================== -GLFWAPI void glfwHideWindow(GLFWwindow window) +GLFWAPI void glfwHideWindow(GLFWwindow handle) { + _GLFWwindow* window = (_GLFWwindow*) handle; + if (!_glfwInitialized) { _glfwSetError(GLFW_NOT_INITIALIZED, NULL); return; } - _glfwPlatformHideWindow((_GLFWwindow*)window); + if (window->mode == GLFW_FULLSCREEN) + return; + + _glfwPlatformHideWindow(window); } From 0e2b12be4305e0636cb735839a5219b3b1065b22 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 11 Sep 2012 23:53:10 +0200 Subject: [PATCH 22/35] Corrected comment. --- src/window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/window.c b/src/window.c index 04e4f762..d4f063f5 100644 --- a/src/window.c +++ b/src/window.c @@ -877,7 +877,7 @@ GLFWAPI void glfwSetWindowIconifyCallback(GLFWwindowiconifyfun cbfun) //======================================================================== -// Poll for new window and input events and close any flagged windows +// Poll for new window and input events //======================================================================== GLFWAPI void glfwPollEvents(void) From e15e92b5838b06dc2835a7bff13292b0cc93a66f Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Tue, 11 Sep 2012 23:56:44 +0200 Subject: [PATCH 23/35] Fixed function grouping. --- src/window.c | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/window.c b/src/window.c index d4f063f5..b46065a7 100644 --- a/src/window.c +++ b/src/window.c @@ -645,6 +645,30 @@ GLFWAPI void glfwIconifyWindow(GLFWwindow handle) } +//======================================================================== +// Window un-iconification +//======================================================================== + +GLFWAPI void glfwRestoreWindow(GLFWwindow handle) +{ + _GLFWwindow* window = (_GLFWwindow*) handle; + + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return; + } + + if (!window->iconified) + return; + + _glfwPlatformRestoreWindow(window); + + if (window->mode == GLFW_FULLSCREEN) + _glfwPlatformRefreshWindowParams(window); +} + + //======================================================================== // Window show //======================================================================== @@ -687,30 +711,6 @@ GLFWAPI void glfwHideWindow(GLFWwindow handle) } -//======================================================================== -// Window un-iconification -//======================================================================== - -GLFWAPI void glfwRestoreWindow(GLFWwindow handle) -{ - _GLFWwindow* window = (_GLFWwindow*) handle; - - if (!_glfwInitialized) - { - _glfwSetError(GLFW_NOT_INITIALIZED, NULL); - return; - } - - if (!window->iconified) - return; - - _glfwPlatformRestoreWindow(window); - - if (window->mode == GLFW_FULLSCREEN) - _glfwPlatformRefreshWindowParams(window); -} - - //======================================================================== // Get window parameter //======================================================================== From 64c677be9e9e8e9ab693000b99ca61ae710ef0c5 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Wed, 12 Sep 2012 03:17:50 +0200 Subject: [PATCH 24/35] Renamed config macro to match convention. --- CMakeLists.txt | 2 +- src/config.h.in | 2 +- src/x11_init.c | 2 +- src/x11_joystick.c | 20 ++++++++++---------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c72e00ae..a1ad4923 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -184,7 +184,7 @@ if (_GLFW_X11_GLX) endif() if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - set(_GLFW_USE_LINUX_JOYSTICKS 1) + set(_GLFW_HAS_LINUX_JOYSTICKS 1) endif() endif() diff --git a/src/config.h.in b/src/config.h.in index 01d541a2..a432d947 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -64,7 +64,7 @@ #cmakedefine _GLFW_HAS_GLXGETPROCADDRESSEXT // Define this to 1 if the Linux joystick API is available -#cmakedefine _GLFW_USE_LINUX_JOYSTICKS +#cmakedefine _GLFW_HAS_LINUX_JOYSTICKS // The GLFW version as used by glfwGetVersionString #define _GLFW_VERSION_FULL "@GLFW_VERSION_FULL@" diff --git a/src/x11_init.c b/src/x11_init.c index 32719cbf..666866de 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -719,7 +719,7 @@ const char* _glfwPlatformGetVersionString(void) #if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK) " clock_gettime" #endif -#if defined(_GLFW_USE_LINUX_JOYSTICKS) +#if defined(_GLFW_HAS_LINUX_JOYSTICKS) " Linux-joystick-API" #else " no-joystick-support" diff --git a/src/x11_joystick.c b/src/x11_joystick.c index c1fb62be..3d2f597d 100644 --- a/src/x11_joystick.c +++ b/src/x11_joystick.c @@ -30,7 +30,7 @@ #include "internal.h" -#ifdef _GLFW_USE_LINUX_JOYSTICKS +#ifdef _GLFW_HAS_LINUX_JOYSTICKS #include #include @@ -41,7 +41,7 @@ #include #include #include -#endif // _GLFW_USE_LINUX_JOYSTICKS +#endif // _GLFW_HAS_LINUX_JOYSTICKS //======================================================================== @@ -50,7 +50,7 @@ static int openJoystickDevice(int joy, const char* path) { -#ifdef _GLFW_USE_LINUX_JOYSTICKS +#ifdef _GLFW_HAS_LINUX_JOYSTICKS char numAxes, numButtons; int fd, version; @@ -97,7 +97,7 @@ static int openJoystickDevice(int joy, const char* path) } _glfwLibrary.X11.joystick[joy].present = GL_TRUE; -#endif // _GLFW_USE_LINUX_JOYSTICKS +#endif // _GLFW_HAS_LINUX_JOYSTICKS return GL_TRUE; } @@ -109,7 +109,7 @@ static int openJoystickDevice(int joy, const char* path) static void pollJoystickEvents(void) { -#ifdef _GLFW_USE_LINUX_JOYSTICKS +#ifdef _GLFW_HAS_LINUX_JOYSTICKS int i; ssize_t result; struct js_event e; @@ -160,7 +160,7 @@ static void pollJoystickEvents(void) } } } -#endif // _GLFW_USE_LINUX_JOYSTICKS +#endif // _GLFW_HAS_LINUX_JOYSTICKS } @@ -174,7 +174,7 @@ static void pollJoystickEvents(void) int _glfwInitJoysticks(void) { -#ifdef _GLFW_USE_LINUX_JOYSTICKS +#ifdef _GLFW_HAS_LINUX_JOYSTICKS int i, joy = 0; regex_t regex; DIR* dir; @@ -215,7 +215,7 @@ int _glfwInitJoysticks(void) } regfree(®ex); -#endif // _GLFW_USE_LINUX_JOYSTICKS +#endif // _GLFW_HAS_LINUX_JOYSTICKS return GL_TRUE; } @@ -227,7 +227,7 @@ int _glfwInitJoysticks(void) void _glfwTerminateJoysticks(void) { -#ifdef _GLFW_USE_LINUX_JOYSTICKS +#ifdef _GLFW_HAS_LINUX_JOYSTICKS int i; for (i = 0; i <= GLFW_JOYSTICK_LAST; i++) @@ -241,7 +241,7 @@ void _glfwTerminateJoysticks(void) _glfwLibrary.X11.joystick[i].present = GL_FALSE; } } -#endif // _GLFW_USE_LINUX_JOYSTICKS +#endif // _GLFW_HAS_LINUX_JOYSTICKS } From 6ac58da26e707ec50bdce04d4f497b5b1225b1a6 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Wed, 12 Sep 2012 21:18:37 +0200 Subject: [PATCH 25/35] Narrowed criteria for non-standard inclusion. --- src/fullscreen.c | 2 +- src/window.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fullscreen.c b/src/fullscreen.c index 4372d153..f59046d8 100644 --- a/src/fullscreen.c +++ b/src/fullscreen.c @@ -32,7 +32,7 @@ #include "internal.h" #include -#if _WIN32 +#if defined(_MSC_VER) #include #endif diff --git a/src/window.c b/src/window.c index b46065a7..817691de 100644 --- a/src/window.c +++ b/src/window.c @@ -33,7 +33,7 @@ #include #include -#if _WIN32 +#if defined(_MSC_VER) #include #endif From c4d5da00901b3cbc0d0a884628204de1495cf19b Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Wed, 12 Sep 2012 21:23:04 +0200 Subject: [PATCH 26/35] Moved DllMain into Win32 init module. --- src/CMakeLists.txt | 2 +- src/win32_dllmain.c | 49 --------------------------------------------- src/win32_init.c | 12 +++++++++++ 3 files changed, 13 insertions(+), 50 deletions(-) delete mode 100644 src/win32_dllmain.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ec5508c2..8a7bdec3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -22,7 +22,7 @@ elseif (_GLFW_WIN32_WGL) set(glfw_HEADERS ${common_HEADERS} win32_platform.h) set(glfw_SOURCES ${common_SOURCES} win32_clipboard.c win32_fullscreen.c win32_gamma.c win32_init.c win32_input.c win32_joystick.c - win32_opengl.c win32_time.c win32_window.c win32_dllmain.c) + win32_opengl.c win32_time.c win32_window.c) if (GLFW_NATIVE_API) list(APPEND glfw_SOURCES win32_native.c) diff --git a/src/win32_dllmain.c b/src/win32_dllmain.c deleted file mode 100644 index 98f9ab2a..00000000 --- a/src/win32_dllmain.c +++ /dev/null @@ -1,49 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL library -// Platform: Win32 -// API version: 3.0 -// WWW: http://www.glfw.org/ -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Marcus Geelnard -// Copyright (c) 2006-2010 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. -// -//======================================================================== - -#include "internal.h" - - -#if defined(_GLFW_BUILD_DLL) - -//======================================================================== -// GLFW DLL entry point -//======================================================================== - -BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) -{ - // NOTE: Some compilers complains about instance and x never being used - - // never mind that (we don't want to use them)! - - return TRUE; -} - -#endif // _GLFW_BUILD_DLL - diff --git a/src/win32_init.c b/src/win32_init.c index 41444b97..21de415b 100644 --- a/src/win32_init.c +++ b/src/win32_init.c @@ -39,6 +39,18 @@ #endif // __BORLANDC__ +//======================================================================== +// GLFW DLL entry point +//======================================================================== + +#if defined(_GLFW_BUILD_DLL) +BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) +{ + return TRUE; +} +#endif // _GLFW_BUILD_DLL + + //======================================================================== // Load necessary libraries (DLLs) //======================================================================== From 1d6d6bc3c6ae75a25c2f6aa5281f2b2c1138297f Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Wed, 12 Sep 2012 21:25:52 +0200 Subject: [PATCH 27/35] Moved display closing to after GL terminate. --- src/x11_init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/x11_init.c b/src/x11_init.c index 666866de..60a0add3 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -672,12 +672,12 @@ int _glfwPlatformTerminate(void) _glfwTerminateGammaRamp(); - terminateDisplay(); - _glfwTerminateJoysticks(); _glfwTerminateOpenGL(); + terminateDisplay(); + // Free clipboard memory if (_glfwLibrary.X11.selection.string) free(_glfwLibrary.X11.selection.string); From 18392837ac85261bd9448d8548173c49f4fc1514 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Wed, 12 Sep 2012 21:34:23 +0200 Subject: [PATCH 28/35] Formatting. --- src/gamma.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/gamma.c b/src/gamma.c index 21940b0e..eed0b66d 100644 --- a/src/gamma.c +++ b/src/gamma.c @@ -61,18 +61,15 @@ GLFWAPI void glfwSetGamma(float gamma) for (i = 0; i < size; i++) { - float value = (float) i / ((float) (size - 1)); + float value; - // Apply gamma + // Calculate intensity + value = (float) i / (float) (size - 1); + // Apply gamma curve value = (float) pow(value, 1.f / gamma) * 65535.f + 0.5f; + // Clamp to value range + value = (float) fmax(fmin(value, 65535.f), 0.f); - // Clamp values - if (value < 0.f) - value = 0.f; - else if (value > 65535.f) - value = 65535.f; - - // Set the gamma ramp values ramp.red[i] = (unsigned short) value; ramp.green[i] = (unsigned short) value; ramp.blue[i] = (unsigned short) value; From 4408d2134c7b2800eef8f1a29bf5331da4e8e6e4 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Wed, 12 Sep 2012 21:37:36 +0200 Subject: [PATCH 29/35] Added use of standard lParam macros. --- src/win32_window.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/win32_window.c b/src/win32_window.c index 13096073..735f9b97 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -33,6 +33,7 @@ #include #include #include +#include //======================================================================== // Hide mouse cursor @@ -559,8 +560,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, int newCursorX, newCursorY; // Get signed (!) cursor position - newCursorX = (int)((short)LOWORD(lParam)); - newCursorY = (int)((short)HIWORD(lParam)); + newCursorX = GET_X_LPARAM(lParam); + newCursorY = GET_Y_LPARAM(lParam); if (newCursorX != window->Win32.oldCursorX || newCursorY != window->Win32.oldCursorY) From d5e4204ed102e2fa118ea22518b88115ac3550e0 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Wed, 12 Sep 2012 21:46:40 +0200 Subject: [PATCH 30/35] POSIX threads should not be preferred on Win32. --- CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a1ad4923..abfee8c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,10 @@ option(BUILD_SHARED_LIBS "Build shared libraries" OFF) find_package(OpenGL REQUIRED) -set(CMAKE_THREAD_PREFER_PTHREADS YES) +if (NOT WIN32) + set(CMAKE_THREAD_PREFER_PTHREADS YES) +endif() + find_package(Threads) if (CMAKE_THREAD_LIBS_INIT) list(APPEND glfw_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) From 89018331f76d257d48aab9691ef872c2bba70aaa Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 13 Sep 2012 17:29:07 +0200 Subject: [PATCH 31/35] Fixed invalid uses of glfwDestroyWindow. --- tests/clipboard.c | 17 +++++++++++++---- tests/gamma.c | 12 ++++++++++-- tests/iconify.c | 17 +++++++++++++---- tests/modes.c | 32 ++++++++++++++++---------------- tests/peter.c | 20 ++++++++++++++------ tests/sharing.c | 19 +++++-------------- 6 files changed, 71 insertions(+), 46 deletions(-) diff --git a/tests/clipboard.c b/tests/clipboard.c index fcd1c307..f83bbfea 100644 --- a/tests/clipboard.c +++ b/tests/clipboard.c @@ -34,6 +34,8 @@ #include "getopt.h" +static GLboolean closed = GL_FALSE; + static void usage(void) { printf("Usage: clipboard [-h]\n"); @@ -45,6 +47,12 @@ static GLboolean control_is_down(GLFWwindow window) glfwGetKey(window, GLFW_KEY_RIGHT_CONTROL); } +static int window_close_callback(GLFWwindow window) +{ + closed = GL_TRUE; + return GL_FALSE; +} + static void key_callback(GLFWwindow window, int key, int action) { if (action != GLFW_PRESS) @@ -53,7 +61,7 @@ static void key_callback(GLFWwindow window, int key, int action) switch (key) { case GLFW_KEY_ESCAPE: - glfwDestroyWindow(window); + closed = GL_TRUE; break; case GLFW_KEY_V: @@ -80,7 +88,7 @@ static void key_callback(GLFWwindow window, int key, int action) } } -static void size_callback(GLFWwindow window, int width, int height) +static void window_size_callback(GLFWwindow window, int width, int height) { glViewport(0, 0, width, height); } @@ -130,7 +138,8 @@ int main(int argc, char** argv) glfwSwapInterval(1); glfwSetKeyCallback(key_callback); - glfwSetWindowSizeCallback(size_callback); + glfwSetWindowSizeCallback(window_size_callback); + glfwSetWindowCloseCallback(window_close_callback); glMatrixMode(GL_PROJECTION); glOrtho(-1.f, 1.f, -1.f, 1.f, -1.f, 1.f); @@ -138,7 +147,7 @@ int main(int argc, char** argv) glClearColor(0.5f, 0.5f, 0.5f, 0); - while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED)) + while (!closed) { glClear(GL_COLOR_BUFFER_BIT); diff --git a/tests/gamma.c b/tests/gamma.c index e74d5b43..c30dd53c 100644 --- a/tests/gamma.c +++ b/tests/gamma.c @@ -37,6 +37,7 @@ #define STEP_SIZE 0.1f +static GLboolean closed = GL_FALSE; static GLfloat gamma_value = 1.0f; static void usage(void) @@ -51,6 +52,12 @@ static void set_gamma(float value) glfwSetGamma(gamma_value); } +static int window_close_callback(GLFWwindow window) +{ + closed = GL_TRUE; + return GL_FALSE; +} + static void key_callback(GLFWwindow window, int key, int action) { if (action != GLFW_PRESS) @@ -60,7 +67,7 @@ static void key_callback(GLFWwindow window, int key, int action) { case GLFW_KEY_ESCAPE: { - glfwDestroyWindow(window); + closed = GL_TRUE; break; } @@ -145,6 +152,7 @@ int main(int argc, char** argv) glfwSwapInterval(1); glfwSetKeyCallback(key_callback); + glfwSetWindowCloseCallback(window_close_callback); glfwSetWindowSizeCallback(size_callback); glMatrixMode(GL_PROJECTION); @@ -153,7 +161,7 @@ int main(int argc, char** argv) glClearColor(0.5f, 0.5f, 0.5f, 0); - while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED)) + while (!closed) { glClear(GL_COLOR_BUFFER_BIT); diff --git a/tests/iconify.c b/tests/iconify.c index 33b6f058..77815358 100644 --- a/tests/iconify.c +++ b/tests/iconify.c @@ -35,11 +35,19 @@ #include "getopt.h" +static GLboolean closed = GL_FALSE; + static void usage(void) { printf("Usage: iconify [-h] [-f]\n"); } +static int window_close_callback(GLFWwindow window) +{ + closed = GL_TRUE; + return GL_FALSE; +} + static void key_callback(GLFWwindow window, int key, int action) { printf("%0.2f Key %s\n", @@ -55,12 +63,12 @@ static void key_callback(GLFWwindow window, int key, int action) glfwIconifyWindow(window); break; case GLFW_KEY_ESCAPE: - glfwDestroyWindow(window); + closed = GL_TRUE; break; } } -static void size_callback(GLFWwindow window, int width, int height) +static void window_size_callback(GLFWwindow window, int width, int height) { printf("%0.2f Size %ix%i\n", glfwGetTime(), width, height); @@ -124,11 +132,12 @@ int main(int argc, char** argv) glfwSwapInterval(1); glfwSetKeyCallback(key_callback); - glfwSetWindowSizeCallback(size_callback); + glfwSetWindowSizeCallback(window_size_callback); + glfwSetWindowCloseCallback(window_close_callback); glEnable(GL_SCISSOR_TEST); - while (!glfwGetWindowParam(window, GLFW_CLOSE_REQUESTED)) + while (!closed) { if (iconified != glfwGetWindowParam(window, GLFW_ICONIFIED) || active != glfwGetWindowParam(window, GLFW_ACTIVE)) diff --git a/tests/modes.c b/tests/modes.c index 5ce65abb..ef1db71c 100644 --- a/tests/modes.c +++ b/tests/modes.c @@ -35,7 +35,7 @@ #include "getopt.h" -static GLFWwindow window = NULL; +static GLFWwindow window_handle = NULL; enum Mode { @@ -68,25 +68,25 @@ static void error_callback(int error, const char* description) fprintf(stderr, "Error: %s\n", description); } -static void window_size_callback(GLFWwindow in_window, int width, int height) +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) +static int window_close_callback(GLFWwindow window) { - window = NULL; + window_handle = NULL; return GL_TRUE; } -static void key_callback(GLFWwindow dummy, int key, int action) +static void key_callback(GLFWwindow window, int key, int action) { if (key == GLFW_KEY_ESCAPE) { glfwDestroyWindow(window); - window = NULL; + window_handle = NULL; } } @@ -132,10 +132,10 @@ static void test_modes(void) printf("Testing mode %u: %s", (unsigned int) i, format_mode(mode)); - window = glfwCreateWindow(mode->width, mode->height, - GLFW_FULLSCREEN, "Video Mode Test", - NULL); - if (!window) + window_handle = glfwCreateWindow(mode->width, mode->height, + GLFW_FULLSCREEN, "Video Mode Test", + NULL); + if (!window_handle) { printf("Failed to enter mode %u: %s\n", (unsigned int) i, @@ -143,7 +143,7 @@ static void test_modes(void) continue; } - glfwMakeContextCurrent(window); + glfwMakeContextCurrent(window_handle); glfwSwapInterval(1); glfwSetTime(0.0); @@ -151,10 +151,10 @@ static void test_modes(void) while (glfwGetTime() < 5.0) { glClear(GL_COLOR_BUFFER_BIT); - glfwSwapBuffers(window); + glfwSwapBuffers(window_handle); glfwPollEvents(); - if (!window) + if (!window_handle) { printf("User terminated program\n"); exit(EXIT_SUCCESS); @@ -165,7 +165,7 @@ static void test_modes(void) glGetIntegerv(GL_GREEN_BITS, ¤t.greenBits); glGetIntegerv(GL_BLUE_BITS, ¤t.blueBits); - glfwGetWindowSize(window, ¤t.width, ¤t.height); + glfwGetWindowSize(window_handle, ¤t.width, ¤t.height); if (current.redBits != mode->redBits || current.greenBits != mode->greenBits || @@ -185,9 +185,9 @@ static void test_modes(void) printf("Closing window\n"); - glfwDestroyWindow(window); + glfwDestroyWindow(window_handle); + window_handle = NULL; glfwPollEvents(); - window = NULL; } } diff --git a/tests/peter.c b/tests/peter.c index ae6e4b7d..59c917e9 100644 --- a/tests/peter.c +++ b/tests/peter.c @@ -35,6 +35,7 @@ #include #include +static GLboolean reopen = GL_FALSE; static GLFWwindow window_handle = NULL; static int cursor_x; static int cursor_y; @@ -77,10 +78,7 @@ static void key_callback(GLFWwindow window, int key, int action) case GLFW_KEY_R: { if (action == GLFW_PRESS) - { - glfwDestroyWindow(window); - open_window(); - } + reopen = GL_TRUE; break; } @@ -121,8 +119,6 @@ int main(void) if (!open_window()) { - glfwTerminate(); - fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError())); exit(EXIT_FAILURE); } @@ -135,6 +131,18 @@ int main(void) glfwSwapBuffers(window_handle); glfwWaitEvents(); + + if (reopen) + { + glfwDestroyWindow(window_handle); + if (!open_window()) + { + fprintf(stderr, "Failed to open GLFW window: %s\n", glfwErrorString(glfwGetError())); + exit(EXIT_FAILURE); + } + + reopen = GL_FALSE; + } } glfwTerminate(); diff --git a/tests/sharing.c b/tests/sharing.c index 95f21342..64e61740 100644 --- a/tests/sharing.c +++ b/tests/sharing.c @@ -37,27 +37,18 @@ #define HEIGHT 400 static GLFWwindow windows[2]; +static GLboolean closed = GL_FALSE; static void key_callback(GLFWwindow window, int key, int action) { if (action == GLFW_PRESS && key == GLFW_KEY_ESCAPE) - glfwDestroyWindow(window); + closed = GL_TRUE; } static int window_close_callback(GLFWwindow window) { - int i; - - for (i = 0; i < 2; i++) - { - if (windows[i] == window) - { - windows[i] = NULL; - break; - } - } - - return GL_TRUE; + closed = GL_TRUE; + return GL_FALSE; } static GLFWwindow open_window(const char* title, GLFWwindow share) @@ -170,7 +161,7 @@ int main(int argc, char** argv) glfwGetWindowPos(windows[0], &x, &y); glfwSetWindowPos(windows[1], x + WIDTH + 50, y); - while (windows[0] && windows[1]) + while (!closed) { glfwMakeContextCurrent(windows[0]); draw_quad(texture); From dbd4d1657ea38ecbb18c66175fd58d365714f6de Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Thu, 13 Sep 2012 21:57:42 +0200 Subject: [PATCH 32/35] Formatting. --- src/win32_window.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/win32_window.c b/src/win32_window.c index 735f9b97..84829d61 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -1130,6 +1130,7 @@ void _glfwPlatformHideWindow(_GLFWwindow* window) ShowWindow(window->Win32.handle, SW_HIDE); } + //======================================================================== // Write back window parameters into GLFW window structure //======================================================================== From d6d5fb26845ebab3383afde878b721839cd8798d Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Wed, 19 Sep 2012 13:17:53 +0200 Subject: [PATCH 33/35] Simplified character input. --- src/win32_window.c | 71 ++++++++++++---------------------------------- 1 file changed, 18 insertions(+), 53 deletions(-) diff --git a/src/win32_window.c b/src/win32_window.c index 84829d61..636fab07 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -305,37 +305,6 @@ static int translateKey(WPARAM wParam, LPARAM lParam) } -//======================================================================== -// Translates a Windows key to Unicode -//======================================================================== - -static void translateChar(_GLFWwindow* window, DWORD wParam, DWORD lParam) -{ - BYTE keyboard_state[256]; - WCHAR unicode_buf[10]; - UINT scan_code; - int i, num_chars; - - GetKeyboardState(keyboard_state); - - // Derive scan code from lParam and action - scan_code = (lParam & 0x01ff0000) >> 16; - - num_chars = ToUnicode( - wParam, // virtual-key code - scan_code, // scan code - keyboard_state, // key-state array - unicode_buf, // buffer for translated key - 10, // size of translated key buffer - 0 // active-menu flag - ); - - // Report characters - for (i = 0; i < num_chars; i++) - _glfwInputChar(window, (int) unicode_buf[i]); -} - - //======================================================================== // Window callback function (handles window events) //======================================================================== @@ -459,13 +428,15 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, case WM_SYSKEYDOWN: { _glfwInputKey(window, translateKey(wParam, lParam), GLFW_PRESS); - - if (_glfwLibrary.charCallback) - translateChar(window, (DWORD) wParam, (DWORD) lParam); - break; } + case WM_CHAR: + { + _glfwInputChar(window, wParam); + return 0; + } + case WM_KEYUP: case WM_SYSKEYUP: { @@ -1177,28 +1148,22 @@ void _glfwPlatformPollEvents(void) while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - switch (msg.message) + if (msg.message == WM_QUIT) { - case WM_QUIT: + // Treat WM_QUIT as a close on all windows + + window = _glfwLibrary.windowListHead; + while (window) { - // Treat WM_QUIT as a close on all windows - - window = _glfwLibrary.windowListHead; - while (window) - { - _glfwInputWindowCloseRequest(window); - window = window->next; - } - - break; - } - - default: - { - DispatchMessage(&msg); - break; + _glfwInputWindowCloseRequest(window); + window = window->next; } } + else + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } } // LSHIFT/RSHIFT fixup (keys tend to "stick" without this fix) From 718af531a332ca876b9438ece39ccab1cdbf11f2 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 23 Sep 2012 14:08:36 +0200 Subject: [PATCH 34/35] Fixed order of operations. --- src/window.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/window.c b/src/window.c index 817691de..383662af 100644 --- a/src/window.c +++ b/src/window.c @@ -336,8 +336,9 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, // Cache the actual (as opposed to requested) window parameters _glfwPlatformRefreshWindowParams(window); - // Cache the actual (as opposed to requested) context parameters glfwMakeContextCurrent(window); + + // Cache the actual (as opposed to requested) context parameters if (!_glfwRefreshContextParams()) { glfwDestroyWindow(window); @@ -353,6 +354,11 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, return GL_FALSE; } + // Clearing the front buffer to black to avoid garbage pixels left over + // from previous uses of our bit of VRAM + glClear(GL_COLOR_BUFFER_BIT); + _glfwPlatformSwapBuffers(window); + // Restore the previously current context (or NULL) glfwMakeContextCurrent(previous); @@ -361,12 +367,7 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, if (mode == GLFW_FULLSCREEN) glfwSetInputMode(window, GLFW_CURSOR_MODE, GLFW_CURSOR_CAPTURED); - // Clearing the front buffer to black to avoid garbage pixels left over - // from previous uses of our bit of VRAM - glClear(GL_COLOR_BUFFER_BIT); - _glfwPlatformSwapBuffers(window); - - if (wndconfig.visible || mode == GLFW_FULLSCREEN) + if (mode == GLFW_FULLSCREEN || wndconfig.visible) glfwShowWindow(window); return window; From c0dcb5a056eb0433cc6dc4a9d22c0d00eb4b1bd0 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 23 Sep 2012 15:08:43 +0200 Subject: [PATCH 35/35] Fixed fullscreen regressions. --- src/cocoa_window.m | 1 + src/win32_window.c | 1 + src/window.c | 2 +- src/x11_window.c | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 477a1fad..efdc0c6b 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -931,6 +931,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window, return GL_FALSE; } + _glfwPlatformShowWindow(window); [[window->NS.object contentView] enterFullScreenMode:[NSScreen mainScreen] withOptions:nil]; } diff --git a/src/win32_window.c b/src/win32_window.c index 636fab07..6b275476 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -956,6 +956,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window, if (window->mode == GLFW_FULLSCREEN) { // Place the window above all topmost windows + _glfwPlatformShowWindow(window); SetWindowPos(window->Win32.handle, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE); } diff --git a/src/window.c b/src/window.c index 383662af..e9da2367 100644 --- a/src/window.c +++ b/src/window.c @@ -367,7 +367,7 @@ GLFWAPI GLFWwindow glfwCreateWindow(int width, int height, if (mode == GLFW_FULLSCREEN) glfwSetInputMode(window, GLFW_CURSOR_MODE, GLFW_CURSOR_CAPTURED); - if (mode == GLFW_FULLSCREEN || wndconfig.visible) + if (mode == GLFW_WINDOWED && wndconfig.visible) glfwShowWindow(window); return window; diff --git a/src/x11_window.c b/src/x11_window.c index 8a0449a6..9cadaeac 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -852,6 +852,7 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window, } #endif /*_GLFW_HAS_XRANDR*/ + _glfwPlatformShowWindow(window); enterFullscreenMode(window); }