ftp.nice.ch/pub/next/developer/resources/libraries/Mesa.2.0.s.tar.gz#/Mesa-2.0/src-tk/window.c

This is window.c in view mode; [Download] [Up]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "gltk.h"
#include "private.h"

/******************************************************************************/

Display *xDisplay = 0;
int xScreen = 0; 
Window wRoot = 0;
Atom deleteWindowAtom;
WINDOW_REC w = {
    0, 0, 300, 300, TK_RGB|TK_SINGLE|TK_DIRECT
};
float colorMaps[] = {
    0.000000, 1.000000, 0.000000, 1.000000, 0.000000, 1.000000, 
    0.000000, 1.000000, 0.333333, 0.776471, 0.443137, 0.556863, 
    0.443137, 0.556863, 0.219608, 0.666667, 0.666667, 0.333333, 
    0.666667, 0.333333, 0.666667, 0.333333, 0.666667, 0.333333, 
    0.666667, 0.333333, 0.666667, 0.333333, 0.666667, 0.333333, 
    0.666667, 0.333333, 0.039216, 0.078431, 0.117647, 0.156863, 
    0.200000, 0.239216, 0.278431, 0.317647, 0.356863, 0.400000, 
    0.439216, 0.478431, 0.517647, 0.556863, 0.600000, 0.639216, 
    0.678431, 0.717647, 0.756863, 0.800000, 0.839216, 0.878431, 
    0.917647, 0.956863, 0.000000, 0.000000, 0.000000, 0.000000, 
    0.000000, 0.000000, 0.000000, 0.000000, 0.247059, 0.247059, 
    0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
    0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
    0.498039, 0.498039, 0.749020, 0.749020, 0.749020, 0.749020, 
    0.749020, 0.749020, 0.749020, 0.749020, 1.000000, 1.000000, 
    1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
    0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
    0.000000, 0.000000, 0.247059, 0.247059, 0.247059, 0.247059, 
    0.247059, 0.247059, 0.247059, 0.247059, 0.498039, 0.498039, 
    0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
    0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
    0.749020, 0.749020, 1.000000, 1.000000, 1.000000, 1.000000, 
    1.000000, 1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 
    0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
    0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
    0.247059, 0.247059, 0.498039, 0.498039, 0.498039, 0.498039, 
    0.498039, 0.498039, 0.498039, 0.498039, 0.749020, 0.749020, 
    0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
    1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
    1.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
    0.000000, 0.000000, 0.000000, 0.000000, 0.247059, 0.247059, 
    0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
    0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
    0.498039, 0.498039, 0.749020, 0.749020, 0.749020, 0.749020, 
    0.749020, 0.749020, 0.749020, 0.749020, 1.000000, 1.000000, 
    1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
    0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
    0.000000, 0.000000, 0.247059, 0.247059, 0.247059, 0.247059, 
    0.247059, 0.247059, 0.247059, 0.247059, 0.498039, 0.498039, 
    0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
    0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
    0.749020, 0.749020, 1.000000, 1.000000, 1.000000, 1.000000, 
    1.000000, 1.000000, 1.000000, 1.000000, 0.000000, 0.000000, 
    1.000000, 1.000000, 0.000000, 0.000000, 1.000000, 1.000000, 
    0.333333, 0.443137, 0.776471, 0.556863, 0.443137, 0.219608, 
    0.556863, 0.666667, 0.666667, 0.333333, 0.666667, 0.333333, 
    0.666667, 0.333333, 0.666667, 0.333333, 0.666667, 0.333333, 
    0.666667, 0.333333, 0.666667, 0.333333, 0.666667, 0.333333, 
    0.039216, 0.078431, 0.117647, 0.156863, 0.200000, 0.239216, 
    0.278431, 0.317647, 0.356863, 0.400000, 0.439216, 0.478431, 
    0.517647, 0.556863, 0.600000, 0.639216, 0.678431, 0.717647, 
    0.756863, 0.800000, 0.839216, 0.878431, 0.917647, 0.956863, 
    0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
    0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
    0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
    0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
    0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
    0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
    0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
    0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
    0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
    0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
    0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
    0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
    0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
    0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
    0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
    0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
    0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
    0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
    0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
    0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
    0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
    0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
    0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
    0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
    0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
    0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
    0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
    0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
    0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
    0.854902, 1.000000, 0.000000, 0.141176, 0.282353, 0.427451, 
    0.568627, 0.713726, 0.854902, 1.000000, 0.000000, 0.141176, 
    0.282353, 0.427451, 0.568627, 0.713726, 0.854902, 1.000000, 
    0.000000, 0.141176, 0.282353, 0.427451, 0.568627, 0.713726, 
    0.854902, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
    1.000000, 1.000000, 1.000000, 1.000000, 0.333333, 0.443137, 
    0.443137, 0.219608, 0.776471, 0.556863, 0.556863, 0.666667, 
    0.666667, 0.333333, 0.666667, 0.333333, 0.666667, 0.333333, 
    0.666667, 0.333333, 0.666667, 0.333333, 0.666667, 0.333333, 
    0.666667, 0.333333, 0.666667, 0.333333, 0.039216, 0.078431, 
    0.117647, 0.156863, 0.200000, 0.239216, 0.278431, 0.317647, 
    0.356863, 0.400000, 0.439216, 0.478431, 0.517647, 0.556863, 
    0.600000, 0.639216, 0.678431, 0.717647, 0.756863, 0.800000, 
    0.839216, 0.878431, 0.917647, 0.956863, 0.000000, 0.000000, 
    0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
    0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
    0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
    0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
    0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
    0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 
    0.000000, 0.000000, 0.247059, 0.247059, 0.247059, 0.247059, 
    0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
    0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
    0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
    0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
    0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
    0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 0.247059, 
    0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
    0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
    0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
    0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
    0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
    0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 0.498039, 
    0.498039, 0.498039, 0.498039, 0.498039, 0.749020, 0.749020, 
    0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
    0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
    0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
    0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
    0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
    0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 0.749020, 
    0.749020, 0.749020, 1.000000, 1.000000, 1.000000, 1.000000, 
    1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
    1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
    1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
    1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
    1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
    1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 
};
float tkRGBMap[8][3] = {
    {
	0, 0, 0
    },
    {
	1, 0, 0
    },
    {
	0, 1, 0
    },
    {
	1, 1, 0
    },
    {
	0, 0, 1
    },
    {
	1, 0, 1
    },
    {
	0, 1, 1
    },
    {
	1, 1, 1
    }
};

/******************************************************************************/

void tkCloseWindow(void)
{

    if (xDisplay) {
	cursorNum = 0;

	ExposeFunc = 0;
	ReshapeFunc = 0;
	IdleFunc = 0;
	DisplayFunc = 0;
	KeyDownFunc = 0;
	MouseDownFunc = 0;
	MouseUpFunc = 0;
	MouseMoveFunc = 0;

	glFlush();
	glFinish();
	if (TK_HAS_OVERLAY(w.type)) {
#ifdef GLX_MESA_release_buffers
            glXReleaseBuffersMESA( xDisplay, w.wOverlay );
#endif
	    XDestroyWindow(xDisplay, w.wOverlay);
	    glXDestroyContext(xDisplay, w.cOverlay);
	    XFreeColormap(xDisplay, w.cMapOverlay);
	    XFree((char *)w.vInfoOverlay);
	}
#ifdef GLX_MESA_release_buffers
        glXReleaseBuffersMESA( xDisplay, w.wMain );
#endif
	XDestroyWindow(xDisplay, w.wMain);
	glXDestroyContext(xDisplay, w.cMain);
        if (w.cMapAllocated)
            XFreeColormap(xDisplay, w.cMapMain);
	XFree((char *)w.vInfoMain);
	XCloseDisplay(xDisplay);
	xDisplay = 0;
    }
}

/******************************************************************************/

void tkInitDisplayMode(GLenum type)
{

    w.type = type;
}

/******************************************************************************/

void tkInitPosition(int x, int y, int width, int height)
{

    w.x = x;
    w.y = y;
    w.w = width;
    w.h = height;
}

/******************************************************************************/

static int ErrorHandler(Display *xDisplay, XErrorEvent *event)
{
    char buf[80];

    printf("\nReceived X error!\n");
    printf("\tError code   : %d\n", event->error_code);
    printf("\tRequest code : %d\n", event->request_code);
    printf("\tMinor code   : %d\n\n", event->minor_code);
    XGetErrorText(xDisplay, event->error_code, buf, 80);
    printf("\tError text : '%s'\n\n", buf);
    return 0;
}

static XVisualInfo *FindMainVisual(GLenum type)
{
    int list[32], i;

    i = 0;

    list[i++] = GLX_LEVEL;
    list[i++] = 0;

    if (TK_IS_DOUBLE(type)) {
	list[i++] = GLX_DOUBLEBUFFER;
    }

    if (TK_IS_RGB(type)) {
	list[i++] = GLX_RGBA;
	list[i++] = GLX_RED_SIZE;
	list[i++] = 1;
	list[i++] = GLX_GREEN_SIZE;
	list[i++] = 1;
	list[i++] = GLX_BLUE_SIZE;
	list[i++] = 1;
	if (TK_HAS_ALPHA(type)) {
	    list[i++] = GLX_ALPHA_SIZE;
	    list[i++] = 1;
	}
	if (TK_HAS_ACCUM(type)) {
	    list[i++] = GLX_ACCUM_RED_SIZE;
	    list[i++] = 1;
	    list[i++] = GLX_ACCUM_GREEN_SIZE;
	    list[i++] = 1;
	    list[i++] = GLX_ACCUM_BLUE_SIZE;
	    list[i++] = 1;
	    if (TK_HAS_ALPHA(type)) {
		list[i++] = GLX_ACCUM_ALPHA_SIZE;
		list[i++] = 1;
	    }
	}
    } else if (TK_IS_INDEX(type)) {
	list[i++] = GLX_BUFFER_SIZE;
	list[i++] = 1;
    }

    if (TK_HAS_DEPTH(type)) {
	list[i++] = GLX_DEPTH_SIZE;
	list[i++] = 1;
    }

    if (TK_HAS_STENCIL(type)) {
	list[i++] = GLX_STENCIL_SIZE;
	list[i++] = 1;
    }

    list[i] = (int)None;

    return glXChooseVisual(xDisplay, xScreen, list);
}

static XVisualInfo *FindOverlayVisual(void)
{
    int list[10];

    list[0] = GLX_LEVEL;
    list[1] = 1;
    list[2] = (int)None;
/*
    list[2] = GLX_TRANSPARENT_TYPE;
    list[3] = GLX_TRANSPARENT_INDEX;
    list[4] = None;
*/
    return glXChooseVisual(xDisplay, xScreen, list);
}

static GLenum GetMainWindowType(XVisualInfo *vi)
{
    GLenum mask;
    int x, y, z;

    mask = 0;

    glXGetConfig(xDisplay, vi, GLX_DOUBLEBUFFER, &x);
    if (x) {
	mask |= TK_DOUBLE;
    } else {
	mask |= TK_SINGLE;
    }

    glXGetConfig(xDisplay, vi, GLX_RGBA, &x);
    if (x) {
	mask |= TK_RGB;
	glXGetConfig(xDisplay, vi, GLX_ALPHA_SIZE, &x);
	if (x > 0) {
	    mask |= TK_ALPHA;
	}
	glXGetConfig(xDisplay, vi, GLX_ACCUM_RED_SIZE, &x);
	glXGetConfig(xDisplay, vi, GLX_ACCUM_GREEN_SIZE, &y);
	glXGetConfig(xDisplay, vi, GLX_ACCUM_BLUE_SIZE, &z);
	if (x > 0 && y > 0 && z > 0) {
	    mask |= TK_ACCUM;
	}
    } else {
	mask |= TK_INDEX;
    }

    glXGetConfig(xDisplay, vi, GLX_DEPTH_SIZE, &x);
    if (x > 0) {
	mask |= TK_DEPTH;
    }

    glXGetConfig(xDisplay, vi, GLX_STENCIL_SIZE, &x);
    if (x > 0) {
	mask |= TK_STENCIL;
    }

    if (glXIsDirect(xDisplay, w.cMain)) {
	mask |= TK_DIRECT;
    } else {
	mask |= TK_INDIRECT;
    }

    return mask;
}

static int WaitForMainWindow(Display *d, XEvent *e, char *arg)
{

    if (e->type == MapNotify && e->xmap.window == w.wMain) {
	return GL_TRUE;
    } else {
	return GL_FALSE;
    }
}

static int WaitForOverlayWindow(Display *d, XEvent *e, char *arg)
{

    if (e->type == MapNotify && e->xmap.window == w.wOverlay) {
	return GL_TRUE;
    } else {
	return GL_FALSE;
    }
}

GLenum tkInitWindow(char *title)
{
    XSetWindowAttributes wa;
    XTextProperty tp;
    XSizeHints sh;
    XEvent e;
    int erb, evb;
    GLenum overlayFlag;

    if (!xDisplay) {
	xDisplay = XOpenDisplay(0);
	if (!xDisplay) {
	    fprintf(stderr, "Can't connect to xDisplay!\n");
	    return GL_FALSE;
	}
	if (!glXQueryExtension(xDisplay, &erb, &evb)) {
	    fprintf(stderr, "No glx extension!\n");
	    return GL_FALSE;
	}
	xScreen = DefaultScreen(xDisplay);
	wRoot = RootWindow(xDisplay, xScreen);
	XSetErrorHandler(ErrorHandler);
    }

    if (TK_HAS_OVERLAY(w.type)) {
	overlayFlag = GL_TRUE;
    } else {
	overlayFlag = GL_FALSE;
    }
    w.type &= ~TK_OVERLAY;

    w.vInfoMain = FindMainVisual(w.type);
    if (!w.vInfoMain) {
       if (TK_IS_RGB(w.type)) {
	  fprintf(stderr, "Couldn't find visual for RGB mode!\n");
       }
       else {
	  fprintf(stderr, "Couldn't find visual for Color Index mode!\n");
       }
       xDisplay = 0;  /* to prevent crash in tkCloseWindow */
       return GL_FALSE;
    }

    w.cMain = glXCreateContext(xDisplay, w.vInfoMain, None,
			       (TK_IS_DIRECT(w.type))?GL_TRUE:GL_FALSE);
    if (!w.cMain) {
	fprintf(stderr, "Can't create a context!\n");
	return GL_FALSE;
    }

    w.type = GetMainWindowType(w.vInfoMain);

    w.cMapAllocated = 1;
    if (TK_IS_INDEX(w.type)) {
        /* Color Indexed windows needs a writable colormap */
	if (w.vInfoMain->class != StaticColor &&
	    w.vInfoMain->class != StaticGray) {
	    w.cMapMain = XCreateColormap(xDisplay, wRoot, w.vInfoMain->visual,
				         AllocAll);
	} else {
	    w.cMapMain = XCreateColormap(xDisplay, wRoot, w.vInfoMain->visual,
				         AllocNone);
	}
    } else {
        /* RGB colormap is AllocNone, share the root colormap if possible */
	Screen *scr = DefaultScreenOfDisplay(xDisplay);
	int scrnum = DefaultScreen(xDisplay);
	if (MaxCmapsOfScreen(scr)==1
	    && w.vInfoMain->visual==DefaultVisual(xDisplay,scrnum)) {
	   /* the window and root are of the same visual type */
	   char *private_cmap = getenv("MESA_PRIVATE_CMAP");
	   if (private_cmap) {
	      /* user doesn't want to share colormaps */
	      w.cMapMain = XCreateColormap(xDisplay, wRoot,
					   w.vInfoMain->visual, AllocNone);
	   }
	   else {
	      /* share the root colormap */
	      w.cMapMain = DefaultColormap(xDisplay,scrnum);
	   }
	}
	else {
	   /* window and root are different visual types, allocate new cmap */
/****  ad@lms.be:  Added initialization for HP color recovery  *******/
           Atom hp_cr_maps = XInternAtom(xDisplay, "_HP_RGB_SMOOTH_MAP_LIST", True);
           w.cMapMain = 0;
           if (hp_cr_maps) {
                XStandardColormap* colmaps = 0;
                int nrColmaps = 0;
                int i;
                XGetRGBColormaps( xDisplay, RootWindow(xDisplay, scrnum)
                                , &colmaps, &nrColmaps, hp_cr_maps);
                for (i=0; i<nrColmaps; i++) {
                    if (colmaps[i].visualid == w.vInfoMain->visual->visualid) {
                        w.cMapMain = colmaps[i].colormap;
                        w.cMapAllocated = 0;
                        break;
                    }
                }
           }  /*** end HP color recovery ***/
           if (!w.cMapMain) {
               if (w.vInfoMain->class==DirectColor) {
                  w.cMapMain = XCreateColormap(xDisplay, wRoot,
                                               w.vInfoMain->visual, AllocAll);
               }
               else {
                  w.cMapMain = XCreateColormap(xDisplay, wRoot,
                                               w.vInfoMain->visual, AllocNone);
               }
           }
	}
    }
    if (TK_IS_INDEX(w.type) || w.vInfoMain->class==DirectColor) {
       tkSetRGBMap(256, colorMaps);
    }
    wa.colormap = w.cMapMain;
    wa.background_pixmap = None;
    wa.border_pixel = 0;
    wa.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask |
		    ButtonPressMask | ButtonReleaseMask | PointerMotionMask;
    w.wMain = XCreateWindow(xDisplay, wRoot, w.x, w.y, w.w, w.h, 0,
			    w.vInfoMain->depth, InputOutput,
			    w.vInfoMain->visual,
			    CWBackPixmap|CWBorderPixel|CWEventMask|CWColormap,
			    &wa);

    /*OLD: XInstallColormap( xDisplay, w.cMapMain );*/
    XSetWMColormapWindows( xDisplay, w.wMain, &w.wMain, 1 );

    XStringListToTextProperty(&title, 1, &tp);
    sh.flags = USPosition | USSize;
    XSetWMProperties(xDisplay, w.wMain, &tp, &tp, 0, 0, &sh, 0, 0);
    XFree(tp.value);
    deleteWindowAtom = XInternAtom(xDisplay, "WM_DELETE_WINDOW", False);
    XSetWMProtocols(xDisplay, w.wMain, &deleteWindowAtom, 1);
    XMapWindow(xDisplay, w.wMain);
    drawAllowFlag = GL_FALSE;
    XIfEvent(xDisplay, &e, WaitForMainWindow, 0);

    if (overlayFlag == GL_TRUE) {
	w.vInfoOverlay = FindOverlayVisual();
	if (w.vInfoOverlay) {
	    w.cOverlay = glXCreateContext(xDisplay, w.vInfoOverlay, None,
					  GL_TRUE);
	    w.cMapOverlay = XCreateColormap(xDisplay, wRoot,
					    w.vInfoOverlay->visual,AllocNone);
	    tkSetOverlayMap(256, colorMaps);
	    wa.colormap = w.cMapOverlay;
	    wa.background_pixmap = None;
	    wa.border_pixel = 0;
	    w.wOverlay = XCreateWindow(xDisplay, w.wMain, 0, 0, w.w, w.h, 0,
				       w.vInfoOverlay->depth, InputOutput,
				       w.vInfoOverlay->visual,
				       CWBackPixmap|CWBorderPixel|CWColormap,
				       &wa);
	    XMapWindow(xDisplay, w.wOverlay);
	    XSetWMColormapWindows(xDisplay, w.wMain, &w.wOverlay, 1);
	    w.type |= TK_OVERLAY;
	} else {
	    fprintf(stderr, "Can't create a overlay plane!\n");
	}
    }

    if (!glXMakeCurrent(xDisplay, w.wMain, w.cMain)) {
	fprintf(stderr, "Can't make window current drawable!\n");
	return GL_FALSE;
    }
    XFlush(xDisplay);

    return GL_TRUE;
}

/******************************************************************************/

void tkQuit(void)
{

    tkCloseWindow();
    exit(0);
}

/******************************************************************************/

void tkSwapBuffers(void)
{

    if (xDisplay) {
	glXSwapBuffers(xDisplay, w.wMain);
    }
}

/******************************************************************************/

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.