/* * Create an RGB, double-buffered window. * Return the window and context handles. */ static void make_window( Display *dpy, const char *name, int x, int y, int width, int height, GLboolean fullscreen, Window *winRet, GLXContext *ctxRet) { int attrib[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DOUBLEBUFFER, GLX_DEPTH_SIZE, 1, None }; int scrnum; XSetWindowAttributes attr; unsigned long mask; Window root; Window win; GLXContext ctx; XVisualInfo *visinfo; scrnum = DefaultScreen( dpy ); root = RootWindow( dpy, scrnum ); if (fullscreen) { x = y = 0; width = DisplayWidth( dpy, scrnum ); height = DisplayHeight( dpy, scrnum ); } visinfo = glXChooseVisual( dpy, scrnum, attrib ); if (!visinfo) { printf("Error: couldn't get an RGB, Double-buffered visual\n"); exit(1); } /* window attributes */ attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; win = XCreateWindow( dpy, root, 0, 0, width, height, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &attr ); /* set hints and properties */ { XSizeHints sizehints; sizehints.x = x; sizehints.y = y; sizehints.width = width; sizehints.height = height; sizehints.flags = USSize | USPosition; XSetNormalHints(dpy, win, &sizehints); XSetStandardProperties(dpy, win, name, name, None, (char **)NULL, 0, &sizehints); } if (fullscreen) no_border(dpy, win); ctx = glXCreateContext( dpy, visinfo, NULL, True ); if (!ctx) { printf("Error: glXCreateContext failed\n"); exit(1); } XFree(visinfo); *winRet = win; *ctxRet = ctx; }
/* * Create an RGB, double-buffered window. * Return the window and context handles. */ static void make_window( Display *dpy, const char *name, int x, int y, int width, int height, Window *winRet, GLXContext *ctxRet) { int attribs[64]; int i = 0; int scrnum; XSetWindowAttributes attr; unsigned long mask; Window root; Window win; GLXContext ctx; XVisualInfo *visinfo; /* Singleton attributes. */ attribs[i++] = GLX_RGBA; attribs[i++] = GLX_DOUBLEBUFFER; if (stereo) attribs[i++] = GLX_STEREO; /* Key/value attributes. */ attribs[i++] = GLX_RED_SIZE; attribs[i++] = 1; attribs[i++] = GLX_GREEN_SIZE; attribs[i++] = 1; attribs[i++] = GLX_BLUE_SIZE; attribs[i++] = 1; attribs[i++] = GLX_DEPTH_SIZE; attribs[i++] = 1; if (samples > 0) { attribs[i++] = GLX_SAMPLE_BUFFERS; attribs[i++] = 1; attribs[i++] = GLX_SAMPLES; attribs[i++] = samples; } attribs[i++] = None; scrnum = DefaultScreen( dpy ); root = RootWindow( dpy, scrnum ); if (visualid) { XVisualInfo vtemp; int n=0; vtemp.visualid=visualid; visinfo=XGetVisualInfo(dpy, VisualIDMask, &vtemp, &n); } else visinfo = glXChooseVisual(dpy, scrnum, attribs); if (!visinfo) { printf("Error: couldn't get an RGB, Double-buffered"); if (stereo) printf(", Stereo"); if (samples > 0) printf(", Multisample"); printf(" visual\n"); exit(1); } printf("Visual ID: 0x%.2x\n", (unsigned int)visinfo->visualid); /* window attributes */ attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; /* XXX this is a bad way to get a borderless window! */ mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; win = XCreateWindow( dpy, root, x, y, width, height, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &attr ); if (fullscreen) no_border(dpy, win); /* set hints and properties */ { XSizeHints sizehints; sizehints.x = x; sizehints.y = y; sizehints.width = width; sizehints.height = height; sizehints.flags = USSize | USPosition; XSetNormalHints(dpy, win, &sizehints); XSetStandardProperties(dpy, win, name, name, None, (char **)NULL, 0, &sizehints); } ctx = glXCreateContext( dpy, visinfo, NULL, True ); if (!ctx) { printf("Error: glXCreateContext failed\n"); exit(1); } XFree(visinfo); *winRet = win; *ctxRet = ctx; }