129 lines
2.6 KiB
C
129 lines
2.6 KiB
C
|
|
#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;
|
|
}
|