diff --git a/include/GLFW/glfw3.h b/include/GLFW/glfw3.h index 9a6ad6fd..f66019b6 100644 --- a/include/GLFW/glfw3.h +++ b/include/GLFW/glfw3.h @@ -1129,6 +1129,7 @@ extern "C" { /*! @brief Win32 specific [window hint](@ref GLFW_WIN32_SHOWDEFAULT_hint). */ #define GLFW_WIN32_SHOWDEFAULT 0x00025002 +#define GLFW_WIN32_HWND_PARENT 0x00025003 /*! @brief Wayland specific * [window hint](@ref GLFW_WAYLAND_APP_ID_hint). * @@ -3052,6 +3053,14 @@ GLFWAPI void glfwDefaultWindowHints(void); */ GLFWAPI void glfwWindowHint(int hint, int value); +/*! @brief Sets the specified window hint to the desired value. + * + * @since Added in version 3.4.x. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHintPointer(int hint, void* value); + /*! @brief Sets the specified window hint to the desired value. * * This function sets hints for the next call to @ref glfwCreateWindow. The diff --git a/src/internal.h b/src/internal.h index 76f3ede2..413b144c 100644 --- a/src/internal.h +++ b/src/internal.h @@ -416,6 +416,7 @@ struct _GLFWwndconfig struct { GLFWbool keymenu; GLFWbool showDefault; + void* handleParent; } win32; struct { char appId[256]; diff --git a/src/win32_platform.h b/src/win32_platform.h index a2f86852..bf155bda 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -413,6 +413,7 @@ typedef struct _GLFWlibraryWGL typedef struct _GLFWwindowWin32 { HWND handle; + HWND handleParent; HICON bigIcon; HICON smallIcon; diff --git a/src/win32_window.c b/src/win32_window.c index 7d26f0b1..ad1129d2 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -45,17 +45,22 @@ static DWORD getWindowStyle(const _GLFWwindow* window) style |= WS_POPUP; else { - style |= WS_SYSMENU | WS_MINIMIZEBOX; - - if (window->decorated) + if (!window->win32.handleParent) { - style |= WS_CAPTION; + style |= WS_SYSMENU | WS_MINIMIZEBOX; - if (window->resizable) - style |= WS_MAXIMIZEBOX | WS_THICKFRAME; + if (window->decorated) + { + style |= WS_CAPTION; + + if (window->resizable) + style |= WS_MAXIMIZEBOX | WS_THICKFRAME; + } + else + style |= WS_POPUP; } else - style |= WS_POPUP; + style |= WS_CHILD; } return style; @@ -1384,13 +1389,14 @@ static int createNativeWindow(_GLFWwindow* window, if (!wideTitle) return GLFW_FALSE; + window->win32.handleParent = wndconfig->win32.handleParent; window->win32.handle = CreateWindowExW(exStyle, MAKEINTATOM(_glfw.win32.mainWindowClass), wideTitle, style, frameX, frameY, frameWidth, frameHeight, - NULL, // No parent window + (HWND)wndconfig->win32.handleParent, NULL, // No window menu _glfw.win32.instance, (LPVOID) wndconfig); diff --git a/src/window.c b/src/window.c index 8b5d9f34..435b1109 100644 --- a/src/window.c +++ b/src/window.c @@ -436,6 +436,18 @@ GLFWAPI void glfwWindowHint(int hint, int value) _glfwInputError(GLFW_INVALID_ENUM, "Invalid window hint 0x%08X", hint); } +GLFWAPI void glfwWindowHintPointer(int hint, void* value) +{ + _GLFW_REQUIRE_INIT(); + + switch (hint) + { + case GLFW_WIN32_HWND_PARENT: + _glfw.hints.window.win32.handleParent = value; + break; + } +} + GLFWAPI void glfwWindowHintString(int hint, const char* value) { assert(value != NULL);