Pārlūkot izejas kodu

Added GLFW_FOCUSED window hint.

Fixes #101.
Camilla Berglund 11 gadi atpakaļ
vecāks
revīzija
e9c7314d50
9 mainītis faili ar 56 papildinājumiem un 2 dzēšanām
  1. 1 0
      README.md
  2. 6 0
      docs/news.dox
  3. 5 0
      docs/window.dox
  4. 6 0
      src/cocoa_window.m
  5. 6 0
      src/internal.h
  6. 5 0
      src/win32_window.c
  7. 15 2
      src/window.c
  8. 6 0
      src/wl_window.c
  9. 6 0
      src/x11_window.c

+ 1 - 0
README.md

@@ -68,6 +68,7 @@ GLFW bundles a number of dependencies in the `deps/` directory.
    `GLFW_RELEASE_BEHAVIOR_NONE` for `GL_KHR_context_flush_control` support
    `GLFW_RELEASE_BEHAVIOR_NONE` for `GL_KHR_context_flush_control` support
  - Added `GLFW_INCLUDE_ES31` for including the OpenGL ES 3.1 header
  - Added `GLFW_INCLUDE_ES31` for including the OpenGL ES 3.1 header
  - Added `GLFW_FLOATING` for creating always-on-top windowed mode windows
  - Added `GLFW_FLOATING` for creating always-on-top windowed mode windows
+ - Added `GLFW_FOCUSED` window hint for controlling initial input focus
  - Added *partial and experimental* support for Wayland
  - Added *partial and experimental* support for Wayland
  - Bugfix: The debug context attribute was set from `GL_ARB_debug_output` even
  - Bugfix: The debug context attribute was set from `GL_ARB_debug_output` even
            when a debug context had not been requested
            when a debug context had not been requested

+ 6 - 0
docs/news.dox

@@ -47,6 +47,12 @@ GLFW now supports floating windows, also called topmost or always on top, for
 easier debugging, with the `GLFW_FLOATING` window hint.
 easier debugging, with the `GLFW_FLOATING` window hint.
 
 
 
 
+@subsection news_31_focused Initially unfocused windows
+
+GLFW now supports preventing a windowed mode window from gaining input focus on
+creation, with the `GLFW_FOCUSED` window hint.
+
+
 @subsection news_31_charmods Character with modifiers callback
 @subsection news_31_charmods Character with modifiers callback
 
 
 GLFW now provides a callback for character events with modifier key bits.
 GLFW now provides a callback for character events with modifier key bits.

+ 5 - 0
docs/window.dox

@@ -121,6 +121,10 @@ window decorations such as a border, a close widget, etc.  This hint is ignored
 for full screen windows.  Note that even though a window may lack a close
 for full screen windows.  Note that even though a window may lack a close
 widget, it is usually still possible for the user to generate close events.
 widget, it is usually still possible for the user to generate close events.
 
 
+The `GLFW_FOCUSED` hint specifies whether the (windowed mode) window will be
+given input focus when created.  This hint is ignored for full screen and
+initially hidden windows.
+
 The `GLFW_AUTO_ICONIFY` hint specifies whether the (full screen) window
 The `GLFW_AUTO_ICONIFY` hint specifies whether the (full screen) window
 will automatically iconify and restore the previous video mode on focus loss.
 will automatically iconify and restore the previous video mode on focus loss.
 This hint is ignored for windowed mode windows.
 This hint is ignored for windowed mode windows.
@@ -243,6 +247,7 @@ extension.
 | `GLFW_RESIZABLE`                | `GL_TRUE`                   | `GL_TRUE` or `GL_FALSE` |
 | `GLFW_RESIZABLE`                | `GL_TRUE`                   | `GL_TRUE` or `GL_FALSE` |
 | `GLFW_VISIBLE`                  | `GL_TRUE`                   | `GL_TRUE` or `GL_FALSE` |
 | `GLFW_VISIBLE`                  | `GL_TRUE`                   | `GL_TRUE` or `GL_FALSE` |
 | `GLFW_DECORATED`                | `GL_TRUE`                   | `GL_TRUE` or `GL_FALSE` |
 | `GLFW_DECORATED`                | `GL_TRUE`                   | `GL_TRUE` or `GL_FALSE` |
+| `GLFW_FOCUSED`                  | `GL_TRUE`                   | `GL_TRUE` or `GL_FALSE` |
 | `GLFW_AUTO_ICONIFY`             | `GL_TRUE`                   | `GL_TRUE` or `GL_FALSE` |
 | `GLFW_AUTO_ICONIFY`             | `GL_TRUE`                   | `GL_TRUE` or `GL_FALSE` |
 | `GLFW_FLOATING`                 | `GL_FALSE`                  | `GL_TRUE` or `GL_FALSE` |
 | `GLFW_FLOATING`                 | `GL_FALSE`                  | `GL_TRUE` or `GL_FALSE` |
 | `GLFW_RED_BITS`                 | 8                           | 0 to `INT_MAX` or `GLFW_DONT_CARE` |
 | `GLFW_RED_BITS`                 | 8                           | 0 to `INT_MAX` or `GLFW_DONT_CARE` |

+ 6 - 0
src/cocoa_window.m

@@ -1155,6 +1155,12 @@ void _glfwPlatformShowWindow(_GLFWwindow* window)
     _glfwInputWindowVisibility(window, GL_TRUE);
     _glfwInputWindowVisibility(window, GL_TRUE);
 }
 }
 
 
+void _glfwPlatformUnhideWindow(_GLFWwindow* window)
+{
+    [window->ns.object orderFront:nil];
+    _glfwInputWindowVisibility(window, GL_TRUE);
+}
+
 void _glfwPlatformHideWindow(_GLFWwindow* window)
 void _glfwPlatformHideWindow(_GLFWwindow* window)
 {
 {
     [window->ns.object orderOut:nil];
     [window->ns.object orderOut:nil];

+ 6 - 0
src/internal.h

@@ -152,6 +152,7 @@ struct _GLFWwndconfig
     GLboolean     resizable;
     GLboolean     resizable;
     GLboolean     visible;
     GLboolean     visible;
     GLboolean     decorated;
     GLboolean     decorated;
+    GLboolean     focused;
     GLboolean     autoIconify;
     GLboolean     autoIconify;
     GLboolean     floating;
     GLboolean     floating;
     _GLFWmonitor* monitor;
     _GLFWmonitor* monitor;
@@ -326,6 +327,7 @@ struct _GLFWlibrary
         int         resizable;
         int         resizable;
         int         visible;
         int         visible;
         int         decorated;
         int         decorated;
+        int         focused;
         int         autoIconify;
         int         autoIconify;
         int         floating;
         int         floating;
         int         samples;
         int         samples;
@@ -562,6 +564,10 @@ void _glfwPlatformRestoreWindow(_GLFWwindow* window);
  */
  */
 void _glfwPlatformShowWindow(_GLFWwindow* window);
 void _glfwPlatformShowWindow(_GLFWwindow* window);
 
 
+/*! @ingroup platform
+ */
+void _glfwPlatformUnhideWindow(_GLFWwindow* window);
+
 /*! @copydoc glfwHideWindow
 /*! @copydoc glfwHideWindow
  *  @ingroup platform
  *  @ingroup platform
  */
  */

+ 5 - 0
src/win32_window.c

@@ -1183,6 +1183,11 @@ void _glfwPlatformShowWindow(_GLFWwindow* window)
     SetFocus(window->win32.handle);
     SetFocus(window->win32.handle);
 }
 }
 
 
+void _glfwPlatformUnhideWindow(_GLFWwindow* window)
+{
+    ShowWindow(window->win32.handle, SW_SHOW);
+}
+
 void _glfwPlatformHideWindow(_GLFWwindow* window)
 void _glfwPlatformHideWindow(_GLFWwindow* window)
 {
 {
     ShowWindow(window->win32.handle, SW_HIDE);
     ShowWindow(window->win32.handle, SW_HIDE);

+ 15 - 2
src/window.c

@@ -163,6 +163,7 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
     wndconfig.resizable     = _glfw.hints.resizable ? GL_TRUE : GL_FALSE;
     wndconfig.resizable     = _glfw.hints.resizable ? GL_TRUE : GL_FALSE;
     wndconfig.visible       = _glfw.hints.visible ? GL_TRUE : GL_FALSE;
     wndconfig.visible       = _glfw.hints.visible ? GL_TRUE : GL_FALSE;
     wndconfig.decorated     = _glfw.hints.decorated ? GL_TRUE : GL_FALSE;
     wndconfig.decorated     = _glfw.hints.decorated ? GL_TRUE : GL_FALSE;
+    wndconfig.focused       = _glfw.hints.focused ? GL_TRUE : GL_FALSE;
     wndconfig.autoIconify   = _glfw.hints.autoIconify ? GL_TRUE : GL_FALSE;
     wndconfig.autoIconify   = _glfw.hints.autoIconify ? GL_TRUE : GL_FALSE;
     wndconfig.floating      = _glfw.hints.floating ? GL_TRUE : GL_FALSE;
     wndconfig.floating      = _glfw.hints.floating ? GL_TRUE : GL_FALSE;
     wndconfig.monitor       = (_GLFWmonitor*) monitor;
     wndconfig.monitor       = (_GLFWmonitor*) monitor;
@@ -190,6 +191,7 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
     {
     {
         wndconfig.resizable = GL_TRUE;
         wndconfig.resizable = GL_TRUE;
         wndconfig.visible   = GL_TRUE;
         wndconfig.visible   = GL_TRUE;
+        wndconfig.focused   = GL_TRUE;
 
 
         // Set up desired video mode
         // Set up desired video mode
         window->videoMode.width       = width;
         window->videoMode.width       = width;
@@ -200,6 +202,8 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
         window->videoMode.refreshRate = _glfw.hints.refreshRate;
         window->videoMode.refreshRate = _glfw.hints.refreshRate;
     }
     }
 
 
+    // Transfer window hints that are persistent settings and not
+    // just initial states
     window->monitor     = wndconfig.monitor;
     window->monitor     = wndconfig.monitor;
     window->resizable   = wndconfig.resizable;
     window->resizable   = wndconfig.resizable;
     window->decorated   = wndconfig.decorated;
     window->decorated   = wndconfig.decorated;
@@ -257,7 +261,12 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
     else
     else
     {
     {
         if (wndconfig.visible)
         if (wndconfig.visible)
-            _glfwPlatformShowWindow(window);
+        {
+            if (wndconfig.focused)
+                _glfwPlatformShowWindow(window);
+            else
+                _glfwPlatformUnhideWindow(window);
+        }
     }
     }
 
 
     return (GLFWwindow*) window;
     return (GLFWwindow*) window;
@@ -274,10 +283,11 @@ void glfwDefaultWindowHints(void)
     _glfw.hints.major = 1;
     _glfw.hints.major = 1;
     _glfw.hints.minor = 0;
     _glfw.hints.minor = 0;
 
 
-    // The default is a visible, resizable window with decorations
+    // The default is a focused, visible, resizable window with decorations
     _glfw.hints.resizable   = GL_TRUE;
     _glfw.hints.resizable   = GL_TRUE;
     _glfw.hints.visible     = GL_TRUE;
     _glfw.hints.visible     = GL_TRUE;
     _glfw.hints.decorated   = GL_TRUE;
     _glfw.hints.decorated   = GL_TRUE;
+    _glfw.hints.focused     = GL_TRUE;
     _glfw.hints.autoIconify = GL_TRUE;
     _glfw.hints.autoIconify = GL_TRUE;
 
 
     // The default is 24 bits of color, 24 bits of depth and 8 bits of stencil,
     // The default is 24 bits of color, 24 bits of depth and 8 bits of stencil,
@@ -345,6 +355,9 @@ GLFWAPI void glfwWindowHint(int target, int hint)
         case GLFW_DECORATED:
         case GLFW_DECORATED:
             _glfw.hints.decorated = hint;
             _glfw.hints.decorated = hint;
             break;
             break;
+        case GLFW_FOCUSED:
+            _glfw.hints.focused = hint;
+            break;
         case GLFW_AUTO_ICONIFY:
         case GLFW_AUTO_ICONIFY:
             _glfw.hints.autoIconify = hint;
             _glfw.hints.autoIconify = hint;
             break;
             break;

+ 6 - 0
src/wl_window.c

@@ -325,6 +325,12 @@ void _glfwPlatformShowWindow(_GLFWwindow* window)
     wl_shell_surface_set_toplevel(window->wl.shell_surface);
     wl_shell_surface_set_toplevel(window->wl.shell_surface);
 }
 }
 
 
+void _glfwPlatformUnhideWindow(_GLFWwindow* window)
+{
+    // TODO
+    fprintf(stderr, "_glfwPlatformUnhideWindow not implemented yet\n");
+}
+
 void _glfwPlatformHideWindow(_GLFWwindow* window)
 void _glfwPlatformHideWindow(_GLFWwindow* window)
 {
 {
     wl_surface_attach(window->wl.surface, NULL, 0, 0);
     wl_surface_attach(window->wl.surface, NULL, 0, 0);

+ 6 - 0
src/x11_window.c

@@ -1577,6 +1577,12 @@ void _glfwPlatformShowWindow(_GLFWwindow* window)
     XFlush(_glfw.x11.display);
     XFlush(_glfw.x11.display);
 }
 }
 
 
+void _glfwPlatformUnhideWindow(_GLFWwindow* window)
+{
+    XMapWindow(_glfw.x11.display, window->x11.handle);
+    XFlush(_glfw.x11.display);
+}
+
 void _glfwPlatformHideWindow(_GLFWwindow* window)
 void _glfwPlatformHideWindow(_GLFWwindow* window)
 {
 {
     XUnmapWindow(_glfw.x11.display, window->x11.handle);
     XUnmapWindow(_glfw.x11.display, window->x11.handle);