/* * (c) Copyright 1993, Silicon Graphics, Inc. * ALL RIGHTS RESERVED * Permission to use, copy, modify, and distribute this software for * any purpose and without fee is hereby granted, provided that the above * copyright notice appear in all copies and that both the copyright notice * and this permission notice appear in supporting documentation, and that * the name of Silicon Graphics, Inc. not be used in advertising * or publicity pertaining to distribution of the software without specific, * written prior permission. * * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. * * US Government Users Restricted Rights * Use, duplication, or disclosure by the Government is subject to * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph * (c)(1)(ii) of the Rights in Technical Data and Computer Software * clause at DFARS 252.227-7013 and/or in similar or successor * clauses in the FAR or the DOD or NASA FAR Supplement. * Unpublished-- rights reserved under the copyright laws of the * United States. Contractor/manufacturer is Silicon Graphics, * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. * * OpenGL(TM) is a trademark of Silicon Graphics, Inc. */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* remember to put this back into battalion.c once it is retrieved * from the mac. This funxtion should be useful for the mac tk * library as well as the unix one ... if the window coordinates * match the code written for the mouse down below should be the * same for the mac else it should work with some slight tweaking GLenum mouseKey(int key, GLenum mask) { if ((mode == DEMOMODE) && showOptions) processKey(key, mask); return GL_TRUE; } */ #include #include #include #include #include "battalion.h" #if defined(__cplusplus) || defined(c_plusplus) #define class c_class #endif /******************************************************************************/ static struct _WINDOWINFO { int x, y; int width, height; GLenum type; } windInfo = { -1, -1, 100, 100, 0}; static Display *display = 0; static XVisualInfo *visualInfo = 0; static Window window = 0; static int screen = 0; static GLXContext context = 0; static GLenum (*KeyDownFunc)(int, GLenum) = NULL; static GLenum (*MouseDownFunc)(int, int, GLenum) = NULL; static GLenum (*MouseUpFunc)(int, int, GLenum) = NULL; static GLenum (*MouseMoveFunc)(int, int, GLenum) = NULL; static int lastEventType = -1; static Colormap colorMap; static 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, }; /******************************************************************************/ void tkCloseWindow(void) { if (display) { glFlush(); glFinish(); XDestroyWindow(display, window); glXDestroyContext(display, context); XFreeColormap(display, colorMap); XFree((char *)visualInfo); display = 0; KeyDownFunc = 0; MouseDownFunc = 0; MouseUpFunc = 0; MouseMoveFunc = 0; lastEventType = -1; } } /******************************************************************************/ static GLenum DoNextEvent(void) { XEvent current, ahead; char buf[1000]; KeySym ks; int key; GLenum mask; extern int paused; float winClickX, winClickY; XNextEvent(display, ¤t); switch (current.type) { case MappingNotify: XRefreshKeyboardMapping((XMappingEvent *)¤t); lastEventType = MappingNotify; return GL_FALSE; case UnmapNotify: paused = 1; return GL_FALSE; case Expose: while (XEventsQueued(current.xexpose.display, QueuedAfterReading) > 0) { XPeekEvent(current.xexpose.display, &ahead); if (ahead.xexpose.window != current.xexpose.window || ahead.type != Expose) { break; } XNextEvent(display, ¤t); } if (current.xexpose.count == 0) { reshape(windInfo.width, windInfo.height); if (lastEventType == ConfigureNotify) { lastEventType = Expose; return GL_FALSE; } else { lastEventType = Expose; return GL_TRUE; } } return GL_FALSE; case ConfigureNotify: lastEventType = ConfigureNotify; windInfo.width = current.xconfigure.width; windInfo.height = current.xconfigure.height; reshape(windInfo.width, windInfo.height); return GL_TRUE; case ButtonPress: lastEventType = ButtonPress; mask = 0; if (current.xbutton.button == 1) { mask |= TK_LEFTBUTTON; } if (current.xbutton.button == 2) { mask |= TK_MIDDLEBUTTON; } if (current.xbutton.button == 3) { mask |= TK_RIGHTBUTTON; } /* here we are going to do a little kludge to allow the user to pick the monsters using the mouse rather than the 6-9 keys. If the user clicks the mouse within a specified area then the appropriate digit will be sent to simulate that number being pressed */ #define col_1_left 0.17 #define col_1_right 0.386 #define col_2_left 0.657 #define col_2_right 0.814 #define row_1_top 0.327 #define row_1_bottom 0.49 #define row_2_top 0.655 #define row_2_bottom 0.836 winClickX = (float) current.xbutton.x / windInfo.width; winClickY = (float) current.xbutton.y / windInfo.height; if ((winClickX > col_1_left) && (winClickX < col_1_right) && (winClickY > row_1_top) && (winClickY < row_1_bottom)) mouseKey(TK_6, 0); if ((winClickX > col_1_left) && (winClickX < col_1_right) && (winClickY > row_2_top) && (winClickY < row_2_bottom)) mouseKey(TK_8, 0); if ((winClickX > col_2_left) && (winClickX < col_2_right) && (winClickY > row_1_top) && (winClickY < row_1_bottom)) mouseKey(TK_7, 0); if ((winClickX > col_2_left) && (winClickX < col_2_right) && (winClickY > row_2_top) && (winClickY < row_2_bottom)) mouseKey(TK_9, 0); return MouseDown(current.xbutton.x, current.xbutton.y, mask); case ButtonRelease: lastEventType = ButtonRelease; mask = 0; if (current.xbutton.button == 1) { mask |= TK_LEFTBUTTON; } if (current.xbutton.button == 2) { mask |= TK_MIDDLEBUTTON; } if (current.xbutton.button == 3) { mask |= TK_RIGHTBUTTON; } return MouseUp(current.xbutton.x, current.xbutton.y, mask); case KeyPress: lastEventType = KeyPress; XLookupString(¤t.xkey, buf, sizeof(buf), &ks, 0); switch (ks) { case XK_a: key = TK_a; break; case XK_A: key = TK_A; break; case XK_z: key = TK_z; break; case XK_Z: key = TK_Z; break; case XK_Control_L: key = TK_CONTROL_L; break; case XK_Control_R: key = TK_CONTROL_R; break; case XK_Left: key = TK_LEFT; break; case XK_Up: key = TK_UP; break; case XK_Right: key = TK_RIGHT; break; case XK_Down: key = TK_DOWN; break; case XK_I: key = TK_I; break; case XK_J: key = TK_J; break; case XK_K: key = TK_K; break; case XK_L: key = TK_L; break; case XK_i: key = TK_i; break; case XK_j: key = TK_j; break; case XK_k: key = TK_k; break; case XK_l: key = TK_l; break; case XK_1: key = TK_1; break; case XK_2: key = TK_2; break; case XK_3: key = TK_3; break; case XK_4: key = TK_4; break; case XK_D: key = TK_D; break; case XK_H: key = TK_H; break; case XK_M: key = TK_M; break; case XK_P: key = TK_P; break; case XK_S: key = TK_S; break; /* T? */ case XK_T: key = TK_T; break; case XK_d: key = TK_d; break; case XK_h: key = TK_h; break; case XK_m: key = TK_m; break; case XK_p: key = TK_p; break; case XK_s: key = TK_s; break; case XK_6: key = TK_6; break; case XK_7: key = TK_7; break; case XK_8: key = TK_8; break; case XK_9: key = TK_9; break; case XK_space: key = TK_SPACE; break; case XK_Escape: key = TK_ESCAPE; break; case XK_q: key = TK_q; break; case XK_w: key = TK_w; break; case XK_Q: key = TK_q; break; case XK_W: key = TK_w; break; case XK_g: key = TK_g; break; case XK_G: key = TK_G; break; default: key = GL_FALSE; break; } if (key) { return processKey(key, 0); } else { return GL_FALSE; } /* * Stuff below added by Johan Hagman for ctrl key to turn weapon on * rather than as a toggle for the weapon */ case KeyRelease: lastEventType = KeyPress; XLookupString(¤t.xkey, buf, sizeof(buf), &ks, 0); switch (ks) { case XK_Control_L: key = TK_CONTROL_L; break; default: key = GL_FALSE; break; } if (key) return processKeyRelease(key); else return GL_FALSE; } return GL_FALSE; } /******************************************************************************/ /******************************************** Andy's new shorter version of the tkExec function to try and speed things up a bit ********************************************/ void tkExec(void) { while (GL_TRUE) { id(); while (XPending(display)) DoNextEvent(); } } /******************************************************************************/ void tkGetMouseLoc(int *x, int *y) { int junk; *x = 0; *y = 0; XQueryPointer(display, window, (Window *)&junk, (Window *)&junk, &junk, &junk, x, y, (unsigned int *)&junk); } /******************************************************************************/ static XVisualInfo *FindVisual(GLenum type) { int list[32]; int i; i = 0; list[i++] = GLX_LEVEL; list[i++] = 0; if (TK_IS_DOUBLE(type)) { list[i++] = (int) 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] = None; return glXChooseVisual(display, screen, (int *) list); } /******************************************************************************/ static int MakeVisualType(XVisualInfo *vi) { GLenum mask; int x, y, z; mask = 0; glXGetConfig(display, vi, GLX_RGBA, &x); if (x) { mask |= TK_RGB; glXGetConfig(display, vi, GLX_ALPHA_SIZE, &x); if (x > 0) { mask |= TK_ALPHA; } glXGetConfig(display, vi, GLX_ACCUM_RED_SIZE, &x); glXGetConfig(display, vi, GLX_ACCUM_GREEN_SIZE, &y); glXGetConfig(display, vi, GLX_ACCUM_BLUE_SIZE, &z); if (x > 0 && y > 0 && z > 0) { mask |= TK_ACCUM; } } else { mask |= TK_INDEX; } glXGetConfig(display, vi, GLX_DOUBLEBUFFER, &x); if (x) { mask |= TK_DOUBLE; } else { mask |= TK_SINGLE; } glXGetConfig(display, vi, GLX_DEPTH_SIZE, &x); if (x > 0) { mask |= TK_DEPTH; } glXGetConfig(display, vi, GLX_STENCIL_SIZE, &x); if (x > 0) { mask |= TK_STENCIL; } if (glXIsDirect(display, context)) { mask |= TK_DIRECT; } else { mask |= TK_INDIRECT; } return mask; } /******************************************************************************/ static int WaitForMapNotify(Display *d, XEvent *e, char *arg) { Display *display; char *arguments; display = d; arguments = arg; if (e->type == MapNotify && e->xmap.window == window) { return GL_TRUE; } return GL_FALSE; } /******************************************************************************/ void tkInitPosition(int x, int y, int width, int height) { windInfo.x = x; windInfo.y = y; windInfo.width = width; windInfo.height = height; } /******************************************************************************/ void tkInitDisplayMode(GLenum type) { windInfo.type = type; } /******************************************************************************/ GLenum tkInitWindow(char *title) { XSetWindowAttributes wa; XSizeHints sh; XEvent e; int erb, evb; unsigned long mask; if (!display) { display = XOpenDisplay(0); if (!display) { fprintf(stderr, "Can't connect to display!\n"); return GL_FALSE; } if (!glXQueryExtension(display, &erb, &evb)) { fprintf(stderr, "No glx extension!\n"); return GL_FALSE; } screen = DefaultScreen(display); } visualInfo = FindVisual(windInfo.type); if (!visualInfo) { fprintf(stderr, "Window type not found!\n"); return GL_FALSE; } context = glXCreateContext(display, visualInfo, None, (TK_IS_DIRECT(windInfo.type)) ? GL_TRUE : GL_FALSE); if (!context) { fprintf(stderr, "Can't create a context!\n"); return GL_FALSE; } windInfo.type = MakeVisualType(visualInfo); if (TK_IS_INDEX(windInfo.type)) { if (visualInfo->class != StaticColor && visualInfo->class != StaticGray) { colorMap = XCreateColormap(display, RootWindow(display, screen), visualInfo->visual, AllocAll); } else { colorMap = XCreateColormap(display, RootWindow(display, screen), visualInfo->visual, AllocNone); } wa.colormap = colorMap; tkSetRGBMap(256, colorMaps); wa.background_pixel = 7; wa.border_pixel = 0; } else { colorMap = XCreateColormap(display, RootWindow(display, screen), visualInfo->visual, AllocNone); wa.colormap = colorMap; tkSetRGBMap(256, colorMaps); wa.background_pixel = 0xFFFFFFFF; wa.border_pixel = 0; } wa.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask; mask = CWBackPixel | CWBorderPixel | CWEventMask | CWColormap; window = XCreateWindow(display, RootWindow(display, screen), 0, 0, windInfo.width, windInfo.height, 0, visualInfo->depth, InputOutput, visualInfo->visual, mask, &wa); if ((windInfo.x != -1) && (windInfo.y != -1)) { sh.flags = USPosition; sh.x = windInfo.x + 10; sh.y = windInfo.y + 10; XSetStandardProperties(display, window, title, title, None, 0, 0, &sh); } else { XSetStandardProperties(display, window, title, title, None, 0, 0, 0); } XMapWindow(display, window); XIfEvent(display, &e, WaitForMapNotify, 0); XSetWMColormapWindows(display, window, &window, 1); if (!glXMakeCurrent(display, window, context)) { fprintf(stderr, "Can't make window current drawable!\n"); return GL_FALSE; } XFlush(display); return GL_TRUE; } /******************************************************************************/ static int Ignore(Display *parm1, XErrorEvent *parm2) { Display *display; XErrorEvent *error; display = parm1; error = parm2; return 0; } /******************************************************************************/ void tkSetRGBMap(int size, float *rgb) { XErrorHandler old_handler; XColor c; int rShift, gShift, bShift, max, i; old_handler = XSetErrorHandler(Ignore); switch (visualInfo->class) { case DirectColor: max = (size > visualInfo->colormap_size) ? visualInfo->colormap_size : size; for (i = 0; i < max; i++) { rShift = ffs((unsigned int)visualInfo->red_mask) - 1; gShift = ffs((unsigned int)visualInfo->green_mask) - 1; bShift = ffs((unsigned int)visualInfo->blue_mask) - 1; c.pixel = ((i << rShift) & visualInfo->red_mask) | ((i << gShift) & visualInfo->green_mask) | ((i << bShift) & visualInfo->blue_mask); c.red = (unsigned short)(rgb[i] * 65535.0 + 0.5); c.green = (unsigned short)(rgb[size+i] * 65535.0 + 0.5); c.blue = (unsigned short)(rgb[size*2+i] * 65535.0 + 0.5); c.flags = DoRed | DoGreen | DoBlue; XStoreColor(display, colorMap, &c); } break; case GrayScale: case PseudoColor: max = (size > visualInfo->colormap_size) ? visualInfo->colormap_size : size; for (i = 0; i < max; i++) { c.pixel = i; c.red = (unsigned short)(rgb[i] * 65535.0 + 0.5); c.green = (unsigned short)(rgb[size+i] * 65535.0 + 0.5); c.blue = (unsigned short)(rgb[size*2+i] * 65535.0 + 0.5); c.flags = DoRed | DoGreen | DoBlue; XStoreColor(display, colorMap, &c); } break; } XSync(display, 0); XSetErrorHandler(old_handler); } /******************************************************************************/ void tkSwapBuffers(void) { if (display) { glXSwapBuffers(display, window); } } /******************************************************************************/ /* * Stuff below added by Johan Hagman for pointer * grabbing in Solaris battalion */ void unGrabPointer() { /* Ungrab the pointer */ XUngrabPointer(display, CurrentTime); } void grabPointer() { /* Grab the pointer so you cannot move the mouse out of the main * window. Also set the cursor to a new cursor with no shape. */ if (XGrabPointer(display, window, True, ButtonReleaseMask | ButtonPressMask, GrabModeAsync, GrabModeAsync, window, None, CurrentTime) != GrabSuccess) { /* Error while grab - not too bad but let user know */ fprintf(stderr, "Warning: Pointer grab unsuccessful."); } } /******************************************************************************/ /******************************************** * void tkExec(void) { GLenum flag; while (GL_TRUE) { if (IdleFunc) { if (IdleFunc) { (*IdleFunc)(); } flag = GL_FALSE; while (XPending(display)) { flag |= DoNextEvent(); } if (flag == GL_TRUE) { if (DisplayFunc) { (*DisplayFunc)(); } } } else { if (DoNextEvent() == GL_TRUE) { if (DisplayFunc) { (*DisplayFunc)(); } } } } } ************************************************/ /* void tkSetOneColor(int index, float r, float g, float b) { XErrorHandler old_handler; XColor c; int rShift, gShift, bShift; old_handler = XSetErrorHandler(Ignore); switch (visualInfo->class) { case DirectColor: rShift = ffs((unsigned int)visualInfo->red_mask) - 1; gShift = ffs((unsigned int)visualInfo->green_mask) - 1; bShift = ffs((unsigned int)visualInfo->blue_mask) - 1; c.pixel = ((index << rShift) & visualInfo->red_mask) | ((index << gShift) & visualInfo->green_mask) | ((index << bShift) & visualInfo->blue_mask); c.red = (unsigned short)(r * 65535.0 + 0.5); c.green = (unsigned short)(g * 65535.0 + 0.5); c.blue = (unsigned short)(b * 65535.0 + 0.5); c.flags = DoRed | DoGreen | DoBlue; XStoreColor(display, colorMap, &c); break; case GrayScale: case PseudoColor: if (index < visualInfo->colormap_size) { c.pixel = index; c.red = (unsigned short)(r * 65535.0 + 0.5); c.green = (unsigned short)(g * 65535.0 + 0.5); c.blue = (unsigned short)(b * 65535.0 + 0.5); c.flags = DoRed | DoGreen | DoBlue; XStoreColor(display, colorMap, &c); } break; } XSync(display, 0); XSetErrorHandler(old_handler); } */ /******************************************************************************/ /* void tkSetFogRamp(int density, int startIndex) { XErrorHandler old_handler; XColor c[256]; int rShift, gShift, bShift, intensity, fogValues, colorValues; int i, j, k; old_handler = XSetErrorHandler(Ignore); switch (visualInfo->class) { case DirectColor: fogValues = 1 << density; colorValues = 1 << startIndex; for (i = 0; i < colorValues; i++) { for (j = 0; j < fogValues; j++) { k = i * fogValues + j; intensity = i * fogValues + j * colorValues; if (intensity > visualInfo->colormap_size) { intensity = visualInfo->colormap_size; } intensity = (intensity << 8) | intensity; rShift = ffs((unsigned int)visualInfo->red_mask) - 1; gShift = ffs((unsigned int)visualInfo->green_mask) - 1; bShift = ffs((unsigned int)visualInfo->blue_mask) - 1; c[k].pixel = ((k << rShift) & visualInfo->red_mask) | ((k << gShift) & visualInfo->green_mask) | ((k << bShift) & visualInfo->blue_mask); c[k].red = (unsigned short)intensity; c[k].green = (unsigned short)intensity; c[k].blue = (unsigned short)intensity; c[k].flags = DoRed | DoGreen | DoBlue; } } XStoreColors(display, colorMap, c, visualInfo->colormap_size); break; case GrayScale: case PseudoColor: fogValues = 1 << density; colorValues = 1 << startIndex; for (i = 0; i < colorValues; i++) { for (j = 0; j < fogValues; j++) { k = i * fogValues + j; intensity = i * fogValues + j * colorValues; if (intensity > visualInfo->colormap_size) { intensity = visualInfo->colormap_size; } intensity = (intensity << 8) | intensity; c[k].pixel = k; c[k].red = (unsigned short)intensity; c[k].green = (unsigned short)intensity; c[k].blue = (unsigned short)intensity; c[k].flags = DoRed | DoGreen | DoBlue; } } XStoreColors(display, colorMap, c, visualInfo->colormap_size); break; } XSync(display, 0); XSetErrorHandler(old_handler); } */ /******************************************************************************/ /* void tkSetGreyRamp(void) { XErrorHandler old_handler; XColor c[256]; float intensity; int rShift, gShift, bShift, i; old_handler = XSetErrorHandler(Ignore); switch (visualInfo->class) { case DirectColor: for (i = 0; i < visualInfo->colormap_size; i++) { intensity = (float)i / (float)visualInfo->colormap_size * 65535.0 + 0.5; rShift = ffs((unsigned int)visualInfo->red_mask) - 1; gShift = ffs((unsigned int)visualInfo->green_mask) - 1; bShift = ffs((unsigned int)visualInfo->blue_mask) - 1; c[i].pixel = ((i << rShift) & visualInfo->red_mask) | ((i << gShift) & visualInfo->green_mask) | ((i << bShift) & visualInfo->blue_mask); c[i].red = (unsigned short)intensity; c[i].green = (unsigned short)intensity; c[i].blue = (unsigned short)intensity; c[i].flags = DoRed | DoGreen | DoBlue; } XStoreColors(display, colorMap, c, visualInfo->colormap_size); break; case GrayScale: case PseudoColor: for (i = 0; i < visualInfo->colormap_size; i++) { intensity = (float)i / (float)visualInfo->colormap_size * 65535.0 + 0.5; c[i].pixel = i; c[i].red = (unsigned short)intensity; c[i].green = (unsigned short)intensity; c[i].blue = (unsigned short)intensity; c[i].flags = DoRed | DoGreen | DoBlue; } XStoreColors(display, colorMap, c, visualInfo->colormap_size); break; } XSync(display, 0); XSetErrorHandler(old_handler); } */ /* case MotionNotify: lastEventType = MotionNotify; if (MouseMoveFunc) { GLenum mask; mask = 0; if (current.xmotion.state & Button1Mask) { mask |= TK_LEFTBUTTON; } if (current.xmotion.state & Button2Mask) { mask |= TK_MIDDLEBUTTON; } if (current.xmotion.state & Button3Mask) { mask |= TK_RIGHTBUTTON; } return (*MouseMoveFunc)(current.xmotion.x, current.xmotion.y, mask); } else { return GL_FALSE; } */ /* 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 tkQuit(void) { exit(0); } */ /******************************************************************************/ /* void tkExposeFunc(void (*Func)(int, int)) { ExposeFunc = Func; } */ /******************************************************************************/ /* void tkReshapeFunc(void (*Func)(int, int)) { ReshapeFunc = Func; } */ /******************************************************************************/ /* void tkDisplayFunc(void (*Func)(void)) { DisplayFunc = Func; } */ /******************************************************************************/ /* void tkKeyDownFunc(GLenum (*Func)(int, GLenum)) { KeyDownFunc = Func; } */ /******************************************************************************/ /* void tkMouseDownFunc(GLenum (*Func)(int, int, GLenum)) { MouseDownFunc = Func; } */ /******************************************************************************/ /* void tkMouseUpFunc(GLenum (*Func)(int, int, GLenum)) { MouseUpFunc = Func; } */ /******************************************************************************/ /* void tkMouseMoveFunc(GLenum (*Func)(int, int, GLenum)) { MouseMoveFunc = Func; } */ /******************************************************************************/ /* void tkIdleFunc(void (*Func)(void)) { IdleFunc = Func; } */ /******************************************************************************/ /* GLint tkGetColorMapSize(void) { if (!display) { return 0; } else { return visualInfo->colormap_size; } } */ /******************************************************************************/ /* Display *tkGetXDisplay(void) { return display; } */ /******************************************************************************/ /* Window tkGetXWindow(void) { return window; } */ /* static void (*ExposeFunc)(int, int) = NULL; static void (*ReshapeFunc)(int, int) = NULL; static void (*DisplayFunc)(void) = NULL; static void (*IdleFunc)(void) = NULL; */ /* case XK_0: key = TK_0; break; case XK_5: key = TK_5; break; case XK_B: key = TK_B; break; case XK_C: key = TK_C; break; case XK_E: key = TK_E; break; case XK_F: key = TK_F; break; case XK_G: key = TK_G; break; case XK_N: key = TK_N; break; case XK_O: key = TK_O; break; case XK_Q: key = TK_Q; break; case XK_R: key = TK_R; break; case XK_U: key = TK_U; break; case XK_V: key = TK_V; break; case XK_W: key = TK_W; break; case XK_X: key = TK_X; break; case XK_Y: key = TK_Y; break; case XK_b: key = TK_b; break; case XK_c: key = TK_c; break; case XK_e: key = TK_e; break; case XK_f: key = TK_f; break; case XK_g: key = TK_g; break; case XK_n: key = TK_n; break; case XK_o: key = TK_o; break; case XK_r: key = TK_r; break; case XK_t: key = TK_t; break; case XK_u: key = TK_u; break; case XK_v: key = TK_v; break; case XK_x: key = TK_x; break; case XK_y: key = TK_y; break; case XK_Shift_L: key = TK_SHIFT_L; break; case XK_Shift_R: key = TK_SHIFT_R; break; case XK_Return: key = TK_RETURN; break; */