]> git.tdb.fi Git - libs/gui.git/blobdiff - source/glwindow.cpp
Convert GLWindow to use GLX 1.3
[libs/gui.git] / source / glwindow.cpp
index 3ae559050a406dcdfe6aeddb43925d9fa612a050..6657ea623bbbadf8cb5864546602bab1db2d2c97 100644 (file)
@@ -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<int> 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