I need to create an X window and use GLX to attach an OpenGL context to it. The context creation is working fine; however, the window isn’t showing up on the screen. What am I doing wrong?
Display *disp;
disp=XOpenDisplay(NULL);
XVisualInfo *vinfo;
int screen;
int glx_attr[32];
int glx_nattr;
screen = DefaultScreen(disp);
glx_nattr=0;
glx_attr[glx_nattr++]=GLX_RGBA;
glx_attr[glx_nattr++]=GLX_RED_SIZE;
glx_attr[glx_nattr++]=1;
glx_attr[glx_nattr++]=GLX_GREEN_SIZE;
glx_attr[glx_nattr++]=1;
glx_attr[glx_nattr++]=GLX_BLUE_SIZE;
glx_attr[glx_nattr++]=1;
glx_attr[glx_nattr++]=GLX_ALPHA_SIZE;
glx_attr[glx_nattr++]=1;
glx_attr[glx_nattr++]=GLX_DEPTH_SIZE;
glx_attr[glx_nattr++]=12;
glx_attr[glx_nattr++]=GLX_STENCIL_SIZE;
glx_attr[glx_nattr++]=1;
glx_attr[glx_nattr++]=GLX_DOUBLEBUFFER;
glx_attr[glx_nattr++]=None;
vinfo=glXChooseVisual(disp,screen,glx_attr);
Window win;
XSetWindowAttributes win_attr;
unsigned long win_attr_mask;
win_attr.event_mask=0;
win_attr.background_pixmap=None;
win_attr.background_pixel=0;
win_attr.border_pixel=0;
win_attr.colormap=XCreateColormap(disp,RootWindow(disp,screen),
vinfo->visual,AllocNone);
win_attr.override_redirect=True;
win_attr_mask=CWBackPixmap|CWBorderPixel|CWColormap|CWEventMask|
CWOverrideRedirect;
win=XCreateWindow(disp,RootWindow(disp,screen),0,0,_w,_h,0,vinfo->depth,
InputOutput,vinfo->visual,win_attr_mask,&win_attr);
GLXContext glxctx;
glxctx=glXCreateContext(disp,vinfo,NULL,True);
XFree(vinfo);
glXMakeCurrent(disp,win,glxctx);
XMapWindow(disp,win);
XFlush(disp);
XEvent e;
while(XCheckMaskEvent(disp,~NoEventMask,&e));
while (1) {
// OpenGL drawing to GL_BACK here
glFlush();
XFlush(disp);
glXSwapBuffers(disp,win);
while(XCheckMaskEvent(disp,~NoEventMask,&e));
}