diff --git a/src/null_init.c b/src/null_init.c index 7236c98c..8d93e944 100644 --- a/src/null_init.c +++ b/src/null_init.c @@ -71,6 +71,7 @@ GLFWbool _glfwConnectNull(int platformID, _GLFWplatform* platform) _glfwGetGammaRampNull, _glfwSetGammaRampNull, _glfwCreateWindowNull, + _glfwAttachWindowNull, _glfwDestroyWindowNull, _glfwSetWindowTitleNull, _glfwSetWindowIconNull, @@ -263,4 +264,3 @@ void _glfwTerminateNull(void) _glfwTerminateOSMesa(); _glfwTerminateEGL(); } - diff --git a/src/null_platform.h b/src/null_platform.h index 6d900111..5d0f4b95 100644 --- a/src/null_platform.h +++ b/src/null_platform.h @@ -210,6 +210,7 @@ GLFWbool _glfwGetGammaRampNull(_GLFWmonitor* monitor, GLFWgammaramp* ramp); void _glfwSetGammaRampNull(_GLFWmonitor* monitor, const GLFWgammaramp* ramp); GLFWbool _glfwCreateWindowNull(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig); +GLFWbool _glfwAttachWindowNull(_GLFWwindow* window, intptr_t native, const _GLFWwndconfig* wndconfig, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig); void _glfwDestroyWindowNull(_GLFWwindow* window); void _glfwSetWindowTitleNull(_GLFWwindow* window, const char* title); void _glfwSetWindowIconNull(_GLFWwindow* window, int count, const GLFWimage* images); @@ -270,4 +271,3 @@ GLFWbool _glfwGetPhysicalDevicePresentationSupportNull(VkInstance instance, VkPh VkResult _glfwCreateWindowSurfaceNull(VkInstance instance, _GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface); void _glfwPollMonitorsNull(void); - diff --git a/src/null_window.c b/src/null_window.c index e0bbb3b6..cb22d715 100644 --- a/src/null_window.c +++ b/src/null_window.c @@ -106,6 +106,39 @@ static int createNativeWindow(_GLFWwindow* window, return GLFW_TRUE; } +static int attachNativeWindow(_GLFWwindow* window, + intptr_t native, + const _GLFWwndconfig* wndconfig, + const _GLFWfbconfig* fbconfig) +{ + if (window->monitor) + fitToMonitor(window); + else + { + if (wndconfig->xpos == GLFW_ANY_POSITION && wndconfig->ypos == GLFW_ANY_POSITION) + { + window->null.xpos = 17; + window->null.ypos = 17; + } + else + { + window->null.xpos = wndconfig->xpos; + window->null.ypos = wndconfig->ypos; + } + + window->null.width = wndconfig->width; + window->null.height = wndconfig->height; + } + + window->null.visible = wndconfig->visible; + window->null.decorated = wndconfig->decorated; + window->null.maximized = wndconfig->maximized; + window->null.floating = wndconfig->floating; + window->null.transparent = fbconfig->transparent; + window->null.opacity = 1.f; + + return GLFW_TRUE; +} ////////////////////////////////////////////////////////////////////////// @@ -166,6 +199,61 @@ GLFWbool _glfwCreateWindowNull(_GLFWwindow* window, return GLFW_TRUE; } +GLFWbool _glfwAttachWindowNull(_GLFWwindow* window, + intptr_t native, + const _GLFWwndconfig* wndconfig, + const _GLFWctxconfig* ctxconfig, + const _GLFWfbconfig* fbconfig) +{ + if (!attachNativeWindow(window, native, wndconfig, fbconfig)) + return GLFW_FALSE; + + if (ctxconfig->client != GLFW_NO_API) + { + if (ctxconfig->source == GLFW_NATIVE_CONTEXT_API || + ctxconfig->source == GLFW_OSMESA_CONTEXT_API) + { + if (!_glfwInitOSMesa()) + return GLFW_FALSE; + if (!_glfwCreateContextOSMesa(window, ctxconfig, fbconfig)) + return GLFW_FALSE; + } + else if (ctxconfig->source == GLFW_EGL_CONTEXT_API) + { + if (!_glfwInitEGL()) + return GLFW_FALSE; + if (!_glfwCreateContextEGL(window, ctxconfig, fbconfig)) + return GLFW_FALSE; + } + + if (!_glfwRefreshContextAttribs(window, ctxconfig)) + return GLFW_FALSE; + } + + if (wndconfig->mousePassthrough) + _glfwSetWindowMousePassthroughNull(window, GLFW_TRUE); + + if (window->monitor) + { + _glfwShowWindowNull(window); + _glfwFocusWindowNull(window); + acquireMonitor(window); + + if (wndconfig->centerCursor) + _glfwCenterCursorInContentArea(window); + } + else + { + if (wndconfig->visible) + { + _glfwShowWindowNull(window); + if (wndconfig->focused) + _glfwFocusWindowNull(window); + } + } + + return GLFW_TRUE; +} void _glfwDestroyWindowNull(_GLFWwindow* window) { @@ -717,4 +805,3 @@ VkResult _glfwCreateWindowSurfaceNull(VkInstance instance, // This seems like the most appropriate error to return here return VK_ERROR_EXTENSION_NOT_PRESENT; } - diff --git a/src/x11_init.c b/src/x11_init.c index a0100f2f..fe2a9f62 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -1206,6 +1206,7 @@ GLFWbool _glfwConnectX11(int platformID, _GLFWplatform* platform) _glfwGetGammaRampX11, _glfwSetGammaRampX11, _glfwCreateWindowX11, + _glfwAttachWindowX11, _glfwDestroyWindowX11, _glfwSetWindowTitleX11, _glfwSetWindowIconX11, @@ -1655,4 +1656,3 @@ void _glfwTerminateX11(void) } #endif // _GLFW_X11 - diff --git a/src/x11_platform.h b/src/x11_platform.h index cdea3957..fc7cdae9 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -902,6 +902,7 @@ int _glfwInitX11(void); void _glfwTerminateX11(void); GLFWbool _glfwCreateWindowX11(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig); +GLFWbool _glfwAttachWindowX11(_GLFWwindow* window, intptr_t native, const _GLFWwndconfig* wndconfig, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig); void _glfwDestroyWindowX11(_GLFWwindow* window); void _glfwSetWindowTitleX11(_GLFWwindow* window, const char* title); void _glfwSetWindowIconX11(_GLFWwindow* window, int count, const GLFWimage* images); @@ -1001,4 +1002,3 @@ GLFWbool _glfwChooseVisualGLX(const _GLFWwndconfig* wndconfig, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig, Visual** visual, int* depth); - diff --git a/src/x11_window.c b/src/x11_window.c index 7da9b965..1df4f8c8 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -2044,6 +2044,15 @@ GLFWbool _glfwCreateWindowX11(_GLFWwindow* window, return GLFW_TRUE; } +GLFWbool _glfwCreateWindowX11(_GLFWwindow* window, + intptr_t native, + const _GLFWwndconfig* wndconfig, + const _GLFWctxconfig* ctxconfig, + const _GLFWfbconfig* fbconfig) { + _glfwInputError(GLFW_PLATFORM_ERROR, "X11 window attachment is not implemented"); + return GLFW_FALSE; +} + void _glfwDestroyWindowX11(_GLFWwindow* window) { if (_glfw.x11.disabledCursorWindow == window) @@ -3352,4 +3361,3 @@ GLFWAPI const char* glfwGetX11SelectionString(void) } #endif // _GLFW_X11 -