#define USE_MINIGLX 1 /* 1 = use Mini GLX, 0 = use Xlib/GLX */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <GL/gl.h> #if USE_MINIGLX #include <GL/miniglx.h> #else #include <GL/glx.h> #include <X11/Xlib.h> #endif static void _subset_Rectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ) { glBegin( GL_QUADS ); glVertex2f( x1, y1 ); glVertex2f( x2, y1 ); glVertex2f( x2, y2 ); glVertex2f( x1, y2 ); glEnd(); } /* * Create a simple double-buffered RGBA window. */ static Window MakeWindow(Display * dpy, unsigned int width, unsigned int height) { int visAttributes[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DOUBLEBUFFER, None }; XSetWindowAttributes attr; unsigned long attrMask; Window root; Window win; GLXContext ctx; XVisualInfo *visinfo; root = RootWindow(dpy, 0); /* Choose GLX visual / pixel format */ visinfo = glXChooseVisual(dpy, 0, visAttributes); if (!visinfo) { printf("Error: couldn't get an RGB, Double-buffered visual\n"); exit(1); } /* Create the window */ attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone); attrMask = CWBackPixel | CWBorderPixel | CWColormap; win = XCreateWindow(dpy, root, 0, 0, width, height, 0, visinfo->depth, InputOutput, visinfo->visual, attrMask, &attr); if (!win) { printf("Error: XCreateWindow failed\n"); exit(1); } /* Display the window */ XMapWindow(dpy, win); /* Create GLX rendering context */ ctx = glXCreateContext(dpy, visinfo, NULL, True); if (!ctx) { printf("Error: glXCreateContext failed\n"); exit(1); } /* Bind the rendering context and window */ glXMakeCurrent(dpy, win, ctx); glViewport(0, 0, width, height); return win; } /* * Draw a few frames of a rotating square. */ static void DrawFrames(Display * dpy, Window win) { int angle; glShadeModel(GL_FLAT); glClearColor(0.5, 0.5, 0.5, 1.0); for (angle = 0; angle < 360; angle += 10) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 0.0); glPushMatrix(); glRotatef(angle, 0, 0, 1); _subset_Rectf(-0.8, -0.8, 0.8, 0.8); glPopMatrix(); glXSwapBuffers(dpy, win); sleep(1); } } int main(int argc, char *argv[]) { Display *dpy; Window win; dpy = XOpenDisplay(NULL); if (!dpy) { printf("Error: XOpenDisplay failed\n"); return 1; } win = MakeWindow(dpy, 300, 300); DrawFrames(dpy, win); return 0; }