///////////////////////////////////////////////////////// // createMess // ///////////////////////////////////////////////////////// bool gemglfw2window :: create(void) { int mode = GLFW_WINDOW; if(0!=s_window) { error("window already made!"); return false; } if(m_fullscreen) mode=GLFW_FULLSCREEN; glfwOpenWindowHint(GLFW_FSAA_SAMPLES, m_fsaa); if(m_profile_major) { glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, m_profile_major); // We want OpenGL 3.3 glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, m_profile_minor); glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //We don't want the old OpenGL } if (!glfwOpenWindow(m_width, m_height, 8, 8, 8, 8, /* RGBA bits */ 24, 8, /* depth/stencil bits */ mode)) { error("glfw couldn't create window"); return false; } // FIXXME: single/double buffering if(!createGemWindow()) { destroyMess(); return false; } s_window=this; titleMess(m_title); offsetMess(m_xoffset, m_yoffset); cursorMess(m_cursor); glfwSetWindowSizeCallback (windowsizeCb); glfwSetWindowCloseCallback (windowcloseCb); glfwSetWindowRefreshCallback(windowrefreshCb); glfwSetKeyCallback (keyCb); glfwSetCharCallback (charCb); glfwSetMouseButtonCallback (mousebuttonCb); glfwSetMousePosCallback (mouseposCb); glfwSetMouseWheelCallback (mousewheelCb); dispatch(); return (0!=s_window); }
///////////////////////////////////////////////////////// // createMess // ///////////////////////////////////////////////////////// bool gemglxwindow :: create(void) { bool success=true; /* * hmm, this crashes when enabled * when disabled, we don't get textures on two screens */ //~#warning context-sharing disabled bool context_sharing=false; if(!m_context && context_sharing) { /* gemglxwindow::PIMPL::s_shared.count(m_display)>0 */ gemglxwindow::PIMPL*sharedPimpl=&gemglxwindow::PIMPL::s_shared[m_display]; if(!sharedPimpl->glxcontext) { try { int x=0, y=0; unsigned int w=1, h=1; success=sharedPimpl->create(m_display, 2, false, false, x, y, w, h, m_transparent); } catch (GemException&ex) { error("creation of shared glxcontext failed: %s", ex.what()); verbose(0, "continuing at your own risk!"); } if(!sharedPimpl->gemcontext) { try { sharedPimpl->gemcontext = createContext(); } catch (GemException&ex) { sharedPimpl->gemcontext = NULL; error("creation of shared gem::context failed: %s", ex.what()); } } } m_context=sharedPimpl->gemcontext; } else { // no context sharing /* creation of gem::Context is deferred until *after* window creation */ } int modeNum=4; #ifdef HAVE_LIBXXF86VM XF86VidModeModeInfo **modes; #endif char svalue[3]; snprintf(svalue, 3, "%d", m_fsaa); svalue[2]=0; if (m_fsaa!=0) { setenv("__GL_FSAA_MODE", svalue, 1); // this works only for NVIDIA-cards } try { success=m_pimpl->create(m_display, m_buffer, m_fullscreen, m_border, m_xoffset, m_yoffset, m_width, m_height, m_transparent); } catch (GemException&x) { x.report(); success=false; } if(!success) { return false; } /* create a gem::context if we don't already have (a shared) one */ if(!m_context) { try { m_context = createContext(); } catch (GemException&x) { m_context = NULL; error("creation of gem::context failed: %s", x.what()); } } XMapRaised(m_pimpl->dpy, m_pimpl->win); // XMapWindow(m_pimpl->dpy, m_pimpl->win); XEvent report; XIfEvent(m_pimpl->dpy, &report, WaitForNotify, (char*)m_pimpl->win); if (glXIsDirect(m_pimpl->dpy, m_pimpl->glxcontext)) { post("Direct Rendering enabled!"); } cursorMess(m_cursor); titleMess(m_title); return createGemWindow(); }