void CL_OpenGLWindowProvider_GLX::create(CL_DisplayWindowSite *new_site, const CL_DisplayWindowDescription &desc) { site = new_site; bool create_provider_flag = false; Display *disp = x11_window.get_display(); if (!opengl_context) { // FBConfigs were added in GLX version 1.3. int glx_major, glx_minor; if ( !glx.glXQueryVersion( disp, &glx_major, &glx_minor ) || ( ( glx_major == 1 ) && ( glx_minor < 3 ) ) || ( glx_major < 1 ) ) { glx_1_3 = false; } else { glx_1_3 = true; } create_provider_flag = true; if (glx_1_3) { create_glx_1_3(new_site, desc, disp); } else { create_glx_1_2(new_site, desc, disp); } if (!glx.glXIsDirect(disp, opengl_context)) printf("No hardware acceleration available. I hope you got a really fast machine.\n"); } x11_window.create(opengl_visual_info, site, desc); if (create_provider_flag) { CL_OpenGLWindowDescription gldesc(desc); gc = CL_GraphicContext(new CL_OpenGLGraphicContextProvider(new CL_GL_RenderWindowProvider_GLX(*this, opengl_context, false), gldesc)); std::vector<CL_GraphicContextProvider*> &gc_providers = CL_SharedGCData::get_gc_providers(); gc_providers.push_back(gc.get_provider()); } setup_swap_interval_pointers(); swap_interval = desc.get_swap_interval(); if (swap_interval != -1) { if (glXSwapIntervalSGI) { glXSwapIntervalSGI(swap_interval); } else if (glXSwapIntervalMESA) { glXSwapIntervalMESA(swap_interval); } } }
CL_DisplayWindow_OpenGL::CL_DisplayWindow_OpenGL() : left_ctrl_down(false), left_alt_down(false), left_shift_down(false), right_ctrl_down(false), right_alt_down(false), right_shift_down(false), fullscreen(false), fullscreen_width(0), fullscreen_height(0), saved_position(0, 0, 0, 0), context(0), window(0) { gc = CL_GraphicContext(new CL_GraphicContext_OpenGL(this)); }
CL_OpenGLWindowProvider_GLX::~CL_OpenGLWindowProvider_GLX() { if (opengl_visual_info) { XFree(opengl_visual_info); opengl_visual_info = NULL; } if (opengl_context) { // save gc provider pointer so we can delete it later from shared list CL_GraphicContextProvider *destroyed_gc_provider = gc.get_provider(); // Delete context from list of gc's that share textures. if (CL_SharedGCData::get_instance()) // Check that the cache hasn't been destroyed yet { std::vector<CL_GraphicContextProvider*> &gc_providers = CL_SharedGCData::get_gc_providers(); if (gc_providers.size() == 1) CL_SharedGCData::dispose_objects(); for (std::vector<CL_GraphicContextProvider*>::iterator it=gc_providers.begin(); it != gc_providers.end(); ++it) { if (destroyed_gc_provider == (*it)) { gc_providers.erase(it); break; } } } // Destroy graphic context before the window is destroyed gc = CL_GraphicContext(); // Delete the context Display *disp = x11_window.get_display(); if (glx.glXGetCurrentContext() == opengl_context) { CL_OpenGL::set_active(NULL); } if (disp) { glx.glXDestroyContext(disp, opengl_context); } opengl_context = 0; } }
CL_DisplayWindow_OpenGL::CL_DisplayWindow_OpenGL() : left_ctrl_down(false), left_alt_down(false), left_shift_down(false), right_ctrl_down(false), right_alt_down(false), right_shift_down(false), fullscreen(false), fullscreen_width(0), fullscreen_height(0), saved_position(0, 0, 0, 0), context(0), win_context(0), fs_context(0), window_ref(0) { static bool first_call = true; if (first_call) { // Enable key-up: SetEventMask(everyEvent); target_ref = GetEventDispatcherTarget(); first_call = false; } gc = CL_GraphicContext(new CL_GraphicContext_OpenGL(this)); }