Browse Source

Add GLFW_COCOA_RETINA_FRAMEBUFFER

Look, a can of worms!  I wonder what's inside.

This adds the first platform specific window hint, transforming
a compile-time option to a run-time per-window one.
Camilla Löwy 8 years ago
parent
commit
58ceab5f1e
10 changed files with 32 additions and 22 deletions
  1. 0 5
      CMakeLists.txt
  2. 2 0
      README.md
  3. 0 6
      docs/compile.dox
  4. 13 0
      docs/window.dox
  5. 6 3
      include/GLFW/glfw3.h
  6. 0 3
      src/cocoa_init.m
  7. 2 3
      src/cocoa_window.m
  8. 0 2
      src/glfw_config.h.in
  9. 3 0
      src/internal.h
  10. 6 0
      src/window.c

+ 0 - 5
CMakeLists.txt

@@ -39,7 +39,6 @@ endif()
 if (APPLE)
 if (APPLE)
     option(GLFW_USE_CHDIR "Make glfwInit chdir to Contents/Resources" ON)
     option(GLFW_USE_CHDIR "Make glfwInit chdir to Contents/Resources" ON)
     option(GLFW_USE_MENUBAR "Populate the menu bar on first window creation" ON)
     option(GLFW_USE_MENUBAR "Populate the menu bar on first window creation" ON)
-    option(GLFW_USE_RETINA "Use the full resolution of Retina displays" ON)
 endif()
 endif()
 
 
 if (UNIX AND NOT APPLE)
 if (UNIX AND NOT APPLE)
@@ -355,10 +354,6 @@ if (_GLFW_COCOA)
         set(_GLFW_USE_CHDIR 1)
         set(_GLFW_USE_CHDIR 1)
     endif()
     endif()
 
 
-    if (GLFW_USE_RETINA)
-        set(_GLFW_USE_RETINA 1)
-    endif()
-
     list(APPEND glfw_LIBRARIES
     list(APPEND glfw_LIBRARIES
         "-framework Cocoa"
         "-framework Cocoa"
         "-framework IOKit"
         "-framework IOKit"

+ 2 - 0
README.md

@@ -110,6 +110,8 @@ information on what to include when reporting a bug.
 - Added `glfwSetWindowAttrib` function for changing window attributes (#537)
 - Added `glfwSetWindowAttrib` function for changing window attributes (#537)
 - Added headless [OSMesa](http://mesa3d.org/osmesa.html) backend (#281,#850)
 - Added headless [OSMesa](http://mesa3d.org/osmesa.html) backend (#281,#850)
 - Added definition of `GLAPIENTRY` to public header
 - Added definition of `GLAPIENTRY` to public header
+- Added macOS specific `GLFW_COCOA_RETINA_FRAMEBUFFER` window hint
+- Removed `GLFW_USE_RETINA` compile-time option
 - Bugfix: Calling `glfwMaximizeWindow` on a full screen window was not ignored
 - Bugfix: Calling `glfwMaximizeWindow` on a full screen window was not ignored
 - Bugfix: `GLFW_INCLUDE_VULKAN` could not be combined with the corresponding
 - Bugfix: `GLFW_INCLUDE_VULKAN` could not be combined with the corresponding
           OpenGL and OpenGL ES header macros
           OpenGL and OpenGL ES header macros

+ 0 - 6
docs/compile.dox

@@ -229,10 +229,6 @@ directory of bundled applications to the `Contents/Resources` directory.
 __GLFW_USE_MENUBAR__ determines whether the first call to @ref glfwCreateWindow
 __GLFW_USE_MENUBAR__ determines whether the first call to @ref glfwCreateWindow
 sets up a minimal menu bar.
 sets up a minimal menu bar.
 
 
-@anchor GLFW_USE_RETINA
-__GLFW_USE_RETINA__ determines whether windows will use the full resolution of
-Retina displays.
-
 
 
 @subsubsection compile_options_win32 Windows specific CMake options
 @subsubsection compile_options_win32 Windows specific CMake options
 
 
@@ -298,8 +294,6 @@ available:
    application bundle during @ref glfwInit (recommended)
    application bundle during @ref glfwInit (recommended)
  - @b _GLFW_USE_MENUBAR to create and populate the menu bar when the first window
  - @b _GLFW_USE_MENUBAR to create and populate the menu bar when the first window
    is created (recommended)
    is created (recommended)
- - @b _GLFW_USE_RETINA to have windows use the full resolution of Retina displays
-   (recommended)
 
 
 @note None of the @ref build_macros may be defined during the compilation of
 @note None of the @ref build_macros may be defined during the compilation of
 GLFW.  If you define any of these in your build files, make sure they are not
 GLFW.  If you define any of these in your build files, make sure they are not

+ 13 - 0
docs/window.dox

@@ -146,6 +146,11 @@ context.  These hints are set to their default values each time the library is
 initialized with @ref glfwInit, can be set individually with @ref glfwWindowHint
 initialized with @ref glfwInit, can be set individually with @ref glfwWindowHint
 and reset all at once to their defaults with @ref glfwDefaultWindowHints.
 and reset all at once to their defaults with @ref glfwDefaultWindowHints.
 
 
+Some hints are platform specific.  These are always valid to set on any
+platform but they will only affect their specific platform.  Other platforms
+will simply ignore them.  Setting these hints requires no platform specific
+headers or calls.
+
 Note that hints need to be set _before_ the creation of the window and context
 Note that hints need to be set _before_ the creation of the window and context
 you wish to have the specified attributes.
 you wish to have the specified attributes.
 
 
@@ -400,6 +405,13 @@ fail on early drivers where this flag is supported without those extensions
 being listed.
 being listed.
 
 
 
 
+@subsubsection window_hints_osx macOS specific hints
+
+@anchor GLFW_COCOA_RETINA_FRAMEBUFFER_hint
+__GLFW_COCOA_RETINA_FRAMEBUFFER__ specifies whether to use full resolution
+framebuffers on Retina displays.  This is ignored on other platforms.
+
+
 @subsubsection window_hints_values Supported and default values
 @subsubsection window_hints_values Supported and default values
 
 
 Window hint                   | Default value               | Supported values
 Window hint                   | Default value               | Supported values
@@ -436,6 +448,7 @@ GLFW_CONTEXT_RELEASE_BEHAVIOR | `GLFW_ANY_RELEASE_BEHAVIOR` | `GLFW_ANY_RELEASE_
 GLFW_OPENGL_FORWARD_COMPAT    | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`
 GLFW_OPENGL_FORWARD_COMPAT    | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`
 GLFW_OPENGL_DEBUG_CONTEXT     | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`
 GLFW_OPENGL_DEBUG_CONTEXT     | `GLFW_FALSE`                | `GLFW_TRUE` or `GLFW_FALSE`
 GLFW_OPENGL_PROFILE           | `GLFW_OPENGL_ANY_PROFILE`   | `GLFW_OPENGL_ANY_PROFILE`, `GLFW_OPENGL_COMPAT_PROFILE` or `GLFW_OPENGL_CORE_PROFILE`
 GLFW_OPENGL_PROFILE           | `GLFW_OPENGL_ANY_PROFILE`   | `GLFW_OPENGL_ANY_PROFILE`, `GLFW_OPENGL_COMPAT_PROFILE` or `GLFW_OPENGL_CORE_PROFILE`
+GLFW_COCOA_RETINA_FRAMEBUFFER | `GLFW_TRUE`                 | `GLFW_TRUE` or `GLFW_FALSE`
 
 
 
 
 @section window_events Window event processing
 @section window_events Window event processing

+ 6 - 3
include/GLFW/glfw3.h

@@ -776,6 +776,8 @@ extern "C" {
 #define GLFW_CONTEXT_NO_ERROR       0x0002200A
 #define GLFW_CONTEXT_NO_ERROR       0x0002200A
 #define GLFW_CONTEXT_CREATION_API   0x0002200B
 #define GLFW_CONTEXT_CREATION_API   0x0002200B
 
 
+#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001
+
 #define GLFW_NO_API                          0
 #define GLFW_NO_API                          0
 #define GLFW_OPENGL_API             0x00030001
 #define GLFW_OPENGL_API             0x00030001
 #define GLFW_OPENGL_ES_API          0x00030002
 #define GLFW_OPENGL_ES_API          0x00030002
@@ -1972,9 +1974,10 @@ GLFWAPI void glfwWindowHint(int hint, int value);
  *  [compile-time option](@ref compile_options_osx).
  *  [compile-time option](@ref compile_options_osx).
  *
  *
  *  @remark @macos On OS X 10.10 and later the window frame will not be rendered
  *  @remark @macos On OS X 10.10 and later the window frame will not be rendered
- *  at full resolution on Retina displays unless the `NSHighResolutionCapable`
- *  key is enabled in the application bundle's `Info.plist`.  For more
- *  information, see
+ *  at full resolution on Retina displays unless the
+ *  [GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint)
+ *  hint is `GLFW_TRUE` and the `NSHighResolutionCapable` key is enabled in the
+ *  application bundle's `Info.plist`.  For more information, see
  *  [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html)
  *  [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html)
  *  in the Mac Developer Library.  The GLFW test and example programs use
  *  in the Mac Developer Library.  The GLFW test and example programs use
  *  a custom `Info.plist` template for this, which can be found as
  *  a custom `Info.plist` template for this, which can be found as

+ 0 - 3
src/cocoa_init.m

@@ -381,9 +381,6 @@ const char* _glfwPlatformGetVersionString(void)
 #if defined(_GLFW_USE_MENUBAR)
 #if defined(_GLFW_USE_MENUBAR)
         " menubar"
         " menubar"
 #endif
 #endif
-#if defined(_GLFW_USE_RETINA)
-        " retina"
-#endif
 #if defined(_GLFW_BUILD_DLL)
 #if defined(_GLFW_BUILD_DLL)
         " dynamic"
         " dynamic"
 #endif
 #endif

+ 2 - 3
src/cocoa_window.m

@@ -1038,9 +1038,8 @@ static GLFWbool createNativeWindow(_GLFWwindow* window,
 
 
     window->ns.view = [[GLFWContentView alloc] initWithGlfwWindow:window];
     window->ns.view = [[GLFWContentView alloc] initWithGlfwWindow:window];
 
 
-#if defined(_GLFW_USE_RETINA)
-    [window->ns.view setWantsBestResolutionOpenGLSurface:YES];
-#endif /*_GLFW_USE_RETINA*/
+    if (wndconfig->ns.retina)
+        [window->ns.view setWantsBestResolutionOpenGLSurface:YES];
 
 
     [window->ns.object setContentView:window->ns.view];
     [window->ns.object setContentView:window->ns.view];
     [window->ns.object makeFirstResponder:window->ns.view];
     [window->ns.object makeFirstResponder:window->ns.view];

+ 0 - 2
src/glfw_config.h.in

@@ -62,6 +62,4 @@
 #cmakedefine _GLFW_USE_CHDIR
 #cmakedefine _GLFW_USE_CHDIR
 // Define this to 1 if glfwCreateWindow should populate the menu bar
 // Define this to 1 if glfwCreateWindow should populate the menu bar
 #cmakedefine _GLFW_USE_MENUBAR
 #cmakedefine _GLFW_USE_MENUBAR
-// Define this to 1 if windows should use full resolution on Retina displays
-#cmakedefine _GLFW_USE_RETINA
 
 

+ 3 - 0
src/internal.h

@@ -264,6 +264,9 @@ struct _GLFWwndconfig
     GLFWbool      autoIconify;
     GLFWbool      autoIconify;
     GLFWbool      floating;
     GLFWbool      floating;
     GLFWbool      maximized;
     GLFWbool      maximized;
+    struct {
+        GLFWbool  retina;
+    } ns;
 };
 };
 
 
 /*! @brief Context configuration.
 /*! @brief Context configuration.

+ 6 - 0
src/window.c

@@ -266,6 +266,9 @@ void glfwDefaultWindowHints(void)
 
 
     // The default is to select the highest available refresh rate
     // The default is to select the highest available refresh rate
     _glfw.hints.refreshRate = GLFW_DONT_CARE;
     _glfw.hints.refreshRate = GLFW_DONT_CARE;
+
+    // The default is to use full Retina resolution framebuffers
+    _glfw.hints.window.ns.retina = GLFW_TRUE;
 }
 }
 
 
 GLFWAPI void glfwWindowHint(int hint, int value)
 GLFWAPI void glfwWindowHint(int hint, int value)
@@ -340,6 +343,9 @@ GLFWAPI void glfwWindowHint(int hint, int value)
         case GLFW_VISIBLE:
         case GLFW_VISIBLE:
             _glfw.hints.window.visible = value ? GLFW_TRUE : GLFW_FALSE;
             _glfw.hints.window.visible = value ? GLFW_TRUE : GLFW_FALSE;
             break;
             break;
+        case GLFW_COCOA_RETINA_FRAMEBUFFER:
+            _glfw.hints.window.ns.retina = value ? GLFW_TRUE : GLFW_FALSE;
+            break;
         case GLFW_CLIENT_API:
         case GLFW_CLIENT_API:
             _glfw.hints.context.client = value;
             _glfw.hints.context.client = value;
             break;
             break;