From a797b00a7fdad9750ae6214db7835e063bafdc9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Wed, 25 Mar 2015 19:43:12 -0700 Subject: [PATCH] Updated GLFW entry to test for exit. --- examples/common/entry/entry_glfw.cpp | 73 ++++++++++++++++++++++++---- src/glcontext_nsgl.mm | 13 +++-- 2 files changed, 71 insertions(+), 15 deletions(-) diff --git a/examples/common/entry/entry_glfw.cpp b/examples/common/entry/entry_glfw.cpp index fe83e9bfd..42a7bc6f0 100644 --- a/examples/common/entry/entry_glfw.cpp +++ b/examples/common/entry/entry_glfw.cpp @@ -12,22 +12,79 @@ #include #include "dbg.h" +// This is just trivial implementation of GLFW3 integration. +// It's here just for testing purpose. + namespace entry { + static void errorCb(int _error, const char* _description) + { + DBG("GLFW error %d: %s", _error, _description); + } + + struct Context + { + Context() + { + } + + int run(int _argc, char** _argv) + { + glfwSetErrorCallback(errorCb); + + glfwInit(); + m_window = glfwCreateWindow(1280, 720, "bgfx", NULL, NULL); + glfwMakeContextCurrent(m_window); + + glfwSetKeyCallback(m_window, keyCb); + + bgfx::glfwSetWindow(m_window); + int result = main(_argc, _argv); + + glfwDestroyWindow(m_window); + glfwTerminate(); + return result; + } + + static void keyCb(GLFWwindow* _window, int _key, int _scancode, int _action, int _mods); + + EventQueue m_eventQueue; + + GLFWwindow* m_window; + }; + + Context s_ctx; + + void Context::keyCb(GLFWwindow* _window, int _key, int _scancode, int _action, int _mods) + { + BX_UNUSED(_window, _scancode, _mods); + if (_key == GLFW_KEY_Q + && _action == GLFW_PRESS + && _mods == GLFW_MOD_CONTROL) + { + s_ctx.m_eventQueue.postExitEvent(); + } + } + const Event* poll() { - return NULL; + glfwPollEvents(); + + if (glfwWindowShouldClose(s_ctx.m_window) ) + { + s_ctx.m_eventQueue.postExitEvent(); + } + return s_ctx.m_eventQueue.poll(); } const Event* poll(WindowHandle _handle) { - BX_UNUSED(_handle); - return NULL; + return s_ctx.m_eventQueue.poll(_handle); } void release(const Event* _event) { - BX_UNUSED(_event); + s_ctx.m_eventQueue.release(_event); } WindowHandle createWindow(int32_t _x, int32_t _y, uint32_t _width, uint32_t _height, uint32_t _flags, const char* _title) @@ -75,12 +132,8 @@ namespace entry int main(int _argc, char** _argv) { - glfwInit(); - GLFWwindow *window = glfwCreateWindow(1280, 720, "bgfx", NULL, NULL); - glfwMakeContextCurrent(window); - - bgfx::glfwSetWindow(window); - return entry::main(_argc, _argv); + using namespace entry; + return s_ctx.run(_argc, _argv); } #endif // ENTRY_CONFIG_USE_GLFW diff --git a/src/glcontext_nsgl.mm b/src/glcontext_nsgl.mm index 77b6c24f9..667fdf4f0 100644 --- a/src/glcontext_nsgl.mm +++ b/src/glcontext_nsgl.mm @@ -48,7 +48,7 @@ namespace bgfx { namespace gl NSWindow* nsWindow = (NSWindow*)g_bgfxNSWindow; m_context = g_bgfxNSGL; - if (NULL == m_context) + if (NULL == g_bgfxNSGL) { NSOpenGLPixelFormatAttribute profile = #if BGFX_CONFIG_RENDERER_OPENGL >= 31 @@ -95,11 +95,14 @@ namespace bgfx { namespace gl void GlContext::destroy() { - NSOpenGLView* glView = (NSOpenGLView*)m_view; - m_view = 0; - m_context = 0; - [glView release]; + if (NULL == g_bgfxNSGL) + { + NSOpenGLView* glView = (NSOpenGLView*)m_view; + [glView release]; + } + m_view = 0; + m_context = 0; bx::dlclose(s_opengl); }