X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglwindow.cpp;h=6657ea623bbbadf8cb5864546602bab1db2d2c97;hb=d39a783c839c08be8ac36a040f4f8b2ee0da8d56;hp=3ae559050a406dcdfe6aeddb43925d9fa612a050;hpb=935c50bdcc95fe95d39931182461a2b25ac30b9d;p=libs%2Fgui.git diff --git a/source/glwindow.cpp b/source/glwindow.cpp index 3ae5590..6657ea6 100644 --- a/source/glwindow.cpp +++ b/source/glwindow.cpp @@ -15,6 +15,7 @@ namespace Msp { GLDisplayOptions::GLDisplayOptions(): alpha(false), + stencil(false), doublebuffer(true), multisample(0) { } @@ -36,13 +37,14 @@ GLWindow::GLWindow(const DisplayOptions &dopt, const GLDisplayOptions &gl_dopt) GLWindow::~GLWindow() { - glXMakeCurrent(display, 0, 0); + glXMakeContextCurrent(display, 0, 0, 0); + glXDestroyWindow(display, glx_wnd); glXDestroyContext(display, context); } void GLWindow::swap_buffers() { - glXSwapBuffers(display, window); + glXSwapBuffers(display, glx_wnd); } void GLWindow::init() @@ -50,39 +52,72 @@ void GLWindow::init() prepare(); vector attribs; - attribs.push_back(GLX_RGBA); - attribs.push_back(GLX_BUFFER_SIZE); - attribs.push_back(24); + + attribs.push_back(GLX_RENDER_TYPE); + attribs.push_back(GLX_RGBA_BIT); + + attribs.push_back(GLX_DRAWABLE_TYPE); + attribs.push_back(GLX_WINDOW_BIT); + + attribs.push_back(GLX_DEPTH_SIZE); + attribs.push_back(1); + if(gl_options.alpha) { attribs.push_back(GLX_ALPHA_SIZE); attribs.push_back(1); } + + if(gl_options.stencil) + { + attribs.push_back(GLX_STENCIL_SIZE); + attribs.push_back(1); + } + if(gl_options.doublebuffer) + { attribs.push_back(GLX_DOUBLEBUFFER); + attribs.push_back(true); + } + if(gl_options.multisample>0) { attribs.push_back(GLX_SAMPLE_BUFFERS_ARB); attribs.push_back(gl_options.multisample); } - attribs.push_back(0); + + attribs.push_back(None); - XVisualInfo *visual=glXChooseVisual(display, DefaultScreen(display), &attribs.front()); - if(!visual) - throw Exception("Couldn't get a matching GLX visual"); + int count; + GLXFBConfig *config=glXChooseFBConfig(display, DefaultScreen(display), &attribs.front(), &count); + if(!config) + throw Exception("Couldn't get a GLX framebuffer configuration"); - context=glXCreateContext(display, visual, 0, true); + context=glXCreateNewContext(display, config[0], GLX_RGBA_TYPE, 0, true); if(!context) throw Exception("Couldn't create a GLX context"); - create(); + XVisualInfo *vi=glXGetVisualFromFBConfig(display, config[0]); + Handle root=RootWindow(display, vi->screen); + + Colormap cmap=XCreateColormap(display, root, vi->visual, AllocNone); + XSetWindowAttributes attr; + attr.colormap=cmap; + + Handle wnd=XCreateWindow(display, root, 0, 0, options.width, options.height, 0, vi->depth, InputOutput, vi->visual, CWColormap, &attr); + set_window(wnd); + + glx_wnd=glXCreateWindow(display, config[0], wnd, 0); + + glXMakeContextCurrent(display, glx_wnd, glx_wnd, context); - glXMakeCurrent(display, window, context); + XFree(config); } -void GLWindow::on_resize() +void GLWindow::on_event(const XEvent &event) { - glViewport(0, 0, options.width, options.height); + if(event.type==ConfigureNotify) + glViewport(0, 0, options.width, options.height); } } // namespace Msp