Xlib and GLX: Part 1

From Sidvind

Jump to: navigation, search

Contents

[edit] Description

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.

[edit] Xlib basics

[Write a basic description of how X works here]

[edit] Opening a connection

Code:
#include <X11/Xlib.h>

Display* dpy = XOpenDisplay(NULL);
	
if( dpy == NULL ) {
	printf("Could not connect to an X server\n");
	exit(0);
}

[edit] GLX

[edit] Complete sample

Code:
#include <X11/Xlib.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glx.h>

struct GLWindow {
	Display*			dpy;
	Window				win;
	Window				root;
	GLXFBConfig*			fbConfigs;
	GLXWindow			glxWin;
	GLXContext			ctx;
	XVisualInfo*			vi;
	Colormap			cmap;
	XSetWindowAttributes 		swa;
	int				width;
	int				height;
} GLWindow;

void init(int w, int h){
	/********************/
	/* ===== XLIB ===== */
	/********************/
	
	/* Open display */
	GLWindow.dpy = XOpenDisplay(NULL);
	
	if(GLWindow.dpy == NULL) {
		printf("Could not connect to an X server\n");
		exit(0);
	}
	
	/* Retrieve a mode */
	int doubleBufferAttributes[] = {
		GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
		GLX_RENDER_TYPE,
		GLX_RGBA_BIT,
		GLX_DOUBLEBUFFER,  True,
		GLX_RED_SIZE,      1,
		GLX_BLUE_SIZE,     1,
		None
	};
	
	GLWindow.root = DefaultRootWindow(GLWindow.dpy);
	
	int numReturned = 0;
	GLWindow.fbConfigs = glXChooseFBConfig( GLWindow.dpy, DefaultScreen(GLWindow.dpy), doubleBufferAttributes, &numReturned );
	
	if ( GLWindow.fbConfigs == NULL ) {
		printf( "No double buffered config available\n" );
		exit( EXIT_FAILURE );
	}
	
	GLWindow.vi = glXGetVisualFromFBConfig(GLWindow.dpy, GLWindow.fbConfigs[0]);
	
	if(GLWindow.vi == NULL) {
		printf("No appropriate visual found\n");
		exit(0);
	}
	
	GLWindow.cmap = XCreateColormap(GLWindow.dpy, GLWindow.root, GLWindow.vi->visual, AllocNone);
	GLWindow.swa.colormap = GLWindow.cmap;
	GLWindow.swa.event_mask = ExposureMask | KeyPressMask;
	
	/* Create a window */
	GLWindow.win = XCreateWindow(GLWindow.dpy, GLWindow.root, 0, 0, w, h, 0, GLWindow.vi->depth, InputOutput, GLWindow.vi->visual, CWColormap | CWEventMask, &GLWindow.swa);
	
	XMapWindow(GLWindow.dpy, GLWindow.win);
	XStoreName(GLWindow.dpy, GLWindow.win, "ImageBrowser");
	
	/* Create an OpenGL context */
	GLWindow.ctx = glXCreateContext(GLWindow.dpy, GLWindow.vi, NULL, GL_TRUE);
	glXMakeCurrent(GLWindow.dpy, GLWindow.win, GLWindow.ctx);
	
	/* Store the size */
	GLWindow.width = w;
	GLWindow.height = h;

	/********************/
	/* ==== OpenGL ==== */
	/********************/
	
	/* Viewport related */
	glViewport(0, 0, w, h);
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	gluPerspective(45.0f,(GLfloat)w/(GLfloat)h,0.1f,100.0f);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	
	/* Settings */
	glEnable(GL_TEXTURE_2D);
	glShadeModel(GL_SMOOTH);
	glClearColor(1.0f, 0.0f, 0.0f, 0.5f);
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
	glClearStencil(0);
	
	glEnable(GL_CULL_FACE);
}
-->
Views
Personal tools
Navigation
Toolbox