1 2 3/* 4 * A demonstration of using the GLX functions. This program is in the 5 * public domain. 6 * 7 * Brian Paul 8 */ 9 10#include <GL/gl.h> 11#include <GL/glx.h> 12#include <stdio.h> 13#include <stdlib.h> 14 15 16 17static void redraw( Display *dpy, Window w ) 18{ 19 printf("Redraw event\n"); 20 21 glClear( GL_COLOR_BUFFER_BIT ); 22 23 glColor3f( 1.0, 1.0, 0.0 ); 24 glRectf( -0.8, -0.8, 0.8, 0.8 ); 25 26 glXSwapBuffers( dpy, w ); 27} 28 29 30 31static void resize( unsigned int width, unsigned int height ) 32{ 33 printf("Resize event\n"); 34 glViewport( 0, 0, width, height ); 35 glMatrixMode( GL_PROJECTION ); 36 glLoadIdentity(); 37 glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 ); 38} 39 40 41 42static Window make_rgb_db_window( Display *dpy, 43 unsigned int width, unsigned int height ) 44{ 45 int attrib[] = { GLX_RGBA, 46 GLX_RED_SIZE, 1, 47 GLX_GREEN_SIZE, 1, 48 GLX_BLUE_SIZE, 1, 49 GLX_DOUBLEBUFFER, 50 None }; 51 int scrnum; 52 XSetWindowAttributes attr; 53 unsigned long mask; 54 Window root; 55 Window win; 56 GLXContext ctx; 57 XVisualInfo *visinfo; 58 59 scrnum = DefaultScreen( dpy ); 60 root = RootWindow( dpy, scrnum ); 61 62 visinfo = glXChooseVisual( dpy, scrnum, attrib ); 63 if (!visinfo) { 64 printf("Error: couldn't get an RGB, Double-buffered visual\n"); 65 exit(1); 66 } 67 68 /* window attributes */ 69 attr.background_pixel = 0; 70 attr.border_pixel = 0; 71 attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); 72 attr.event_mask = StructureNotifyMask | ExposureMask; 73 mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; 74 75 win = XCreateWindow( dpy, root, 0, 0, width, height, 76 0, visinfo->depth, InputOutput, 77 visinfo->visual, mask, &attr ); 78 79 ctx = glXCreateContext( dpy, visinfo, NULL, True ); 80 if (!ctx) { 81 printf("Error: glXCreateContext failed\n"); 82 exit(1); 83 } 84 85 glXMakeCurrent( dpy, win, ctx ); 86 87 return win; 88} 89 90 91static void event_loop( Display *dpy ) 92{ 93 XEvent event; 94 95 while (1) { 96 XNextEvent( dpy, &event ); 97 98 switch (event.type) { 99 case Expose: 100 redraw( dpy, event.xany.window ); 101 break; 102 case ConfigureNotify: 103 resize( event.xconfigure.width, event.xconfigure.height ); 104 break; 105 } 106 } 107} 108 109 110 111int main( int argc, char *argv[] ) 112{ 113 Display *dpy; 114 Window win; 115 116 dpy = XOpenDisplay(NULL); 117 118 win = make_rgb_db_window( dpy, 300, 300 ); 119 120 glShadeModel( GL_FLAT ); 121 glClearColor( 0.5, 0.5, 0.5, 1.0 ); 122 123 XMapWindow( dpy, win ); 124 125 event_loop( dpy ); 126 return 0; 127} 128