123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- /*
- * GLX overlay test/demo.
- *
- * Brian Paul
- * 18 July 2005
- */
-
- #include <GL/gl.h>
- #include <GL/glx.h>
- #include <X11/keysym.h>
- #include <assert.h>
- #include <stdio.h>
- #include <stdlib.h>
-
- static int WinWidth = 300, WinHeight = 300;
- static Window NormalWindow = 0;
- static Window OverlayWindow = 0;
- static GLXContext NormalContext = 0;
- static GLXContext OverlayContext = 0;
- static GLboolean RGBOverlay = GL_FALSE;
- static GLfloat Angle = 0.0;
-
-
- static void
- RedrawNormal(Display *dpy)
- {
- glXMakeCurrent(dpy, NormalWindow, NormalContext);
- glViewport(0, 0, WinWidth, WinHeight);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
- glMatrixMode(GL_MODELVIEW);
- glClearColor(0.5, 0.5, 0.5, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
- glColor3f(1.0, 1.0, 0.0);
- glPushMatrix();
- glRotatef(Angle, 0, 0, 1);
- glRectf(-0.8, -0.8, 0.8, 0.8);
- glPopMatrix();
- glXSwapBuffers(dpy, NormalWindow);
- }
-
-
- static void
- RedrawOverlay(Display *dpy)
- {
- glXMakeCurrent(dpy, OverlayWindow, OverlayContext);
- glViewport(0, 0, WinWidth, WinHeight);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
- glMatrixMode(GL_MODELVIEW);
- glClear(GL_COLOR_BUFFER_BIT);
- if (RGBOverlay) {
- glColor3f(0.0, 1.0, 1.0);
- }
- else {
- glIndexi(2);
- }
- glBegin(GL_LINES);
- glVertex2f(-1, -1);
- glVertex2f(1, 1);
- glVertex2f(1, -1);
- glVertex2f(-1, 1);
- glEnd();
- glXSwapBuffers(dpy, OverlayWindow);
- }
-
-
- static Window
- MakeWindow(Display *dpy, XVisualInfo *visinfo, Window parent,
- unsigned int width, unsigned int height)
- {
- int scrnum;
- XSetWindowAttributes attr;
- unsigned long mask;
- Window root;
- Window win;
-
- scrnum = DefaultScreen(dpy);
- root = RootWindow(dpy, scrnum);
-
- /* window attributes */
- attr.background_pixel = 0;
- attr.border_pixel = 0;
- attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone);
- attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
- mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
-
- win = XCreateWindow(dpy, parent, 0, 0, width, height,
- 0, visinfo->depth, InputOutput,
- visinfo->visual, mask, &attr);
- return win;
- }
-
-
- static void
- MakeNormalWindow(Display *dpy)
- {
- int attrib[] = { GLX_RGBA,
- GLX_RED_SIZE, 1,
- GLX_GREEN_SIZE, 1,
- GLX_BLUE_SIZE, 1,
- GLX_DOUBLEBUFFER,
- None };
- int scrnum;
- Window root;
- XVisualInfo *visinfo;
-
- scrnum = DefaultScreen(dpy);
- root = RootWindow(dpy, scrnum);
-
- visinfo = glXChooseVisual(dpy, scrnum, attrib);
- if (!visinfo) {
- printf("Error: couldn't get an RGB, Double-buffered visual\n");
- exit(1);
- }
-
- NormalWindow = MakeWindow(dpy, visinfo, root, WinWidth, WinHeight);
- assert(NormalWindow);
-
- NormalContext = glXCreateContext(dpy, visinfo, NULL, True);
- assert(NormalContext);
- }
-
-
- static void
- MakeOverlayWindow(Display *dpy)
- {
- int rgbAttribs[] = {
- GLX_RGBA,
- GLX_RED_SIZE, 1,
- GLX_GREEN_SIZE, 1,
- GLX_BLUE_SIZE, 1,
- GLX_DOUBLEBUFFER,
- GLX_LEVEL, 1,
- None
- };
- int indexAttribs[] = {
- /*GLX_RGBA, leave this out */
- GLX_RED_SIZE, 1,
- GLX_GREEN_SIZE, 1,
- GLX_BLUE_SIZE, 1,
- GLX_DOUBLEBUFFER,
- GLX_LEVEL, 1,
- None
- };
- int scrnum;
- Window root;
- XVisualInfo *visinfo;
-
- scrnum = DefaultScreen(dpy);
- root = RootWindow(dpy, scrnum);
-
- visinfo = glXChooseVisual(dpy, scrnum, rgbAttribs);
- if (visinfo) {
- printf("Found RGB overlay visual 0x%x\n", (int) visinfo->visualid);
- RGBOverlay = GL_TRUE;
- }
- else {
- visinfo = glXChooseVisual(dpy, scrnum, indexAttribs);
- if (visinfo) {
- printf("Found Color Index overlay visual 0x%x\n",
- (int) visinfo->visualid);
- /* XXX setup the colormap entries! */
- }
- else {
- printf("Error: couldn't get an overlay visual!\n");
- exit(1);
- }
- }
-
- OverlayWindow = MakeWindow(dpy, visinfo, NormalWindow, WinWidth, WinHeight);
- assert(OverlayWindow);
-
- OverlayContext = glXCreateContext(dpy, visinfo, NULL, True);
- assert(OverlayContext);
- }
-
-
- static void
- EventLoop(Display *dpy)
- {
- XEvent event;
-
- while (1) {
- XNextEvent(dpy, &event);
-
- switch (event.type) {
- case Expose:
- RedrawNormal(dpy);
- RedrawOverlay(dpy);
- break;
- case ConfigureNotify:
- WinWidth = event.xconfigure.width;
- WinHeight = event.xconfigure.height;
- if (event.xconfigure.window == NormalWindow)
- XResizeWindow(dpy, OverlayWindow, WinWidth, WinHeight);
- break;
- case KeyPress:
- {
- char buffer[10];
- int r, code;
- code = XLookupKeysym(&event.xkey, 0);
- r = XLookupString(&event.xkey, buffer, sizeof(buffer),
- NULL, NULL);
- if (buffer[0] == 27) {
- /* escape */
- return;
- }
- else if (buffer[0] == ' ') {
- Angle += 5.0;
- RedrawNormal(dpy);
- }
- }
- break;
- default:
- ; /* nothing */
- }
- }
- }
-
-
- int
- main(int argc, char *argv[])
- {
- Display *dpy = XOpenDisplay(NULL);
-
- assert(dpy);
-
- MakeNormalWindow(dpy);
- MakeOverlayWindow(dpy);
-
- XMapWindow(dpy, NormalWindow);
- XMapWindow(dpy, OverlayWindow);
-
- EventLoop(dpy);
-
- glXDestroyContext(dpy, OverlayContext);
- glXDestroyContext(dpy, NormalContext);
- XDestroyWindow(dpy, OverlayWindow);
- XDestroyWindow(dpy, NormalWindow);
-
- return 0;
- }
|