Xlib and GLX: Part 1

From Sidvind
Jump to: navigation, search

Description[edit]

Programming with Xlib can be a pain-in-the-ass for starters. And using Xlib and GLX together might seem impossible. Almost no good tutorial covers this topics. And those who do uses many deprecated function calls.

Xlib basics[edit]

[Write a basic description of how X works here]

Opening a connection[edit]

Code:

  1. #include <X11/Xlib.h>
  2.  
  3. Display* dpy = XOpenDisplay(NULL);
  4.        
  5. if( dpy == NULL ) {
  6.         printf("Could not connect to an X server\n");
  7.         exit(0);
  8. }

GLX[edit]

Complete sample[edit]

Code: glx1.c (view, download)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <X11/Xlib.h>
  4. #include <GL/gl.h>
  5. #include <GL/glu.h>
  6. #include <GL/glx.h>
  7.  
  8. struct GLWindow {
  9.         Display*                        dpy;
  10.         Window                          win;
  11.         Window                          root;
  12.         GLXFBConfig*                    fbConfigs;
  13.         GLXWindow                       glxWin;
  14.         GLXContext                      ctx;
  15.         XVisualInfo*                    vi;
  16.         Colormap                        cmap;
  17.         XSetWindowAttributes            swa;
  18.         int                             width;
  19.         int                             height;
  20. } GLWindow;
  21.  
  22. void init(int w, int h){
  23.         /********************/
  24.         /* ===== XLIB ===== */
  25.         /********************/
  26.        
  27.         /* Open display */
  28.         GLWindow.dpy = XOpenDisplay(NULL);
  29.        
  30.         if(GLWindow.dpy == NULL) {
  31.                 printf("Could not connect to an X server\n");
  32.                 exit(0);
  33.         }
  34.        
  35.         /* Retrieve a mode */
  36.         int doubleBufferAttributes[] = {
  37.                 GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
  38.                 GLX_RENDER_TYPE,
  39.                 GLX_RGBA_BIT,
  40.                 GLX_DOUBLEBUFFER,  True,
  41.                 GLX_RED_SIZE,      1,
  42.                 GLX_BLUE_SIZE,     1,
  43.                 None
  44.         };
  45.        
  46.         GLWindow.root = DefaultRootWindow(GLWindow.dpy);
  47.        
  48.         int numReturned = 0;
  49.         GLWindow.fbConfigs = glXChooseFBConfig( GLWindow.dpy, DefaultScreen(GLWindow.dpy), doubleBufferAttributes, &numReturned );
  50.        
  51.         if ( GLWindow.fbConfigs == NULL ) {
  52.                 printf( "No double buffered config available\n" );
  53.                 exit( EXIT_FAILURE );
  54.         }
  55.        
  56.         GLWindow.vi = glXGetVisualFromFBConfig(GLWindow.dpy, GLWindow.fbConfigs[0]);
  57.        
  58.         if(GLWindow.vi == NULL) {
  59.                 printf("No appropriate visual found\n");
  60.                 exit(0);
  61.         }
  62.        
  63.         GLWindow.cmap = XCreateColormap(GLWindow.dpy, GLWindow.root, GLWindow.vi->visual, AllocNone);
  64.         GLWindow.swa.colormap = GLWindow.cmap;
  65.         GLWindow.swa.event_mask = ExposureMask | KeyPressMask;
  66.        
  67.         /* Create a window */
  68.         GLWindow.win = XCreateWindow(GLWindow.dpy, GLWindow.root, 0, 0, w, h, 0, GLWindow.vi->depth, InputOutput, GLWindow.vi->visual, CWColormap | CWEventMask, &GLWindow.swa);
  69.        
  70.         XMapWindow(GLWindow.dpy, GLWindow.win);
  71.         XStoreName(GLWindow.dpy, GLWindow.win, "ImageBrowser");
  72.        
  73.         /* Create an OpenGL context */
  74.         GLWindow.ctx = glXCreateContext(GLWindow.dpy, GLWindow.vi, NULL, GL_TRUE);
  75.         glXMakeCurrent(GLWindow.dpy, GLWindow.win, GLWindow.ctx);
  76.        
  77.         /* Store the size */
  78.         GLWindow.width = w;
  79.         GLWindow.height = h;
  80.  
  81.         /********************/
  82.         /* ==== OpenGL ==== */
  83.         /********************/
  84.        
  85.         /* Viewport related */
  86.         glViewport(0, 0, w, h);
  87.        
  88.         glMatrixMode(GL_PROJECTION);
  89.         glLoadIdentity();
  90.  
  91.         gluPerspective(45.0f,(GLfloat)w/(GLfloat)h,0.1f,100.0f);
  92.  
  93.         glMatrixMode(GL_MODELVIEW);
  94.         glLoadIdentity();
  95.        
  96.         /* Settings */
  97.         glEnable(GL_TEXTURE_2D);
  98.         glShadeModel(GL_SMOOTH);
  99.         glClearColor(1.0f, 0.0f, 0.0f, 0.5f);
  100.         glClearDepth(1.0f);
  101.         glEnable(GL_DEPTH_TEST);
  102.         glDepthFunc(GL_LEQUAL);
  103.         glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  104.         glClearStencil(0);
  105.        
  106.         glEnable(GL_CULL_FACE);
  107. }
  108.  
  109. int main (int argc, const char* argv[]){
  110.         init(640,480);
  111.         return 0;
  112. }