/* * (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. */ #include #include #include #include #include #include #include "tk.h" #define static #if defined(__cplusplus) || defined(c_plusplus) #define class c_class #endif static struct { int keyField; void (*KeyFunc)(void); } keyTable[200]; static struct { int mouseField; void (*MouseFunc)(AUX_EVENTREC *); } mouseDownTable[20], mouseUpTable[20], mouseLocTable[20]; static int keyTableCount = 0; static int mouseDownTableCount = 0; static int mouseUpTableCount = 0; static int mouseLocTableCount = 0; static GLenum displayModeType = 0; GLenum APIENTRY auxInitWindowAW(LPCSTR title, BOOL bUnicode); static void DefaultHandleReshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho((GLdouble)0.0, (GLdouble)w, (GLdouble)0.0, (GLdouble)h, (GLdouble)-1.0, (GLdouble)1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } static void DefaultHandleExpose(int w, int h) { } static GLenum MouseLoc(int x, int y, GLenum button) { AUX_EVENTREC info; GLenum flag; int i; flag = GL_FALSE; for (i = 0; i < mouseLocTableCount; i++) { if ((int)(button & AUX_LEFTBUTTON) == mouseLocTable[i].mouseField) { info.event = AUX_MOUSELOC; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_LEFTBUTTON; (*mouseLocTable[i].MouseFunc)(&info); flag |= GL_TRUE; } if ((int)(button & AUX_RIGHTBUTTON) == mouseLocTable[i].mouseField) { info.event = AUX_MOUSELOC; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_RIGHTBUTTON; (*mouseLocTable[i].MouseFunc)(&info); flag |= GL_TRUE; } if ((int)(button & AUX_MIDDLEBUTTON) == mouseLocTable[i].mouseField) { info.event = AUX_MOUSELOC; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_MIDDLEBUTTON; (*mouseLocTable[i].MouseFunc)(&info); flag |= GL_TRUE; } } return flag; } static GLenum MouseUp(int x, int y, GLenum button) { AUX_EVENTREC info; GLenum flag; int i; flag = GL_FALSE; for (i = 0; i < mouseUpTableCount; i++) { if ((int)(button & AUX_LEFTBUTTON) == mouseUpTable[i].mouseField) { info.event = AUX_MOUSEUP; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_LEFTBUTTON; (*mouseUpTable[i].MouseFunc)(&info); flag |= GL_TRUE; } if ((int)(button & AUX_RIGHTBUTTON) == mouseUpTable[i].mouseField) { info.event = AUX_MOUSEUP; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_RIGHTBUTTON; (*mouseUpTable[i].MouseFunc)(&info); flag |= GL_TRUE; } if ((int)(button & AUX_MIDDLEBUTTON) == mouseUpTable[i].mouseField) { info.event = AUX_MOUSEUP; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_MIDDLEBUTTON; (*mouseUpTable[i].MouseFunc)(&info); flag |= GL_TRUE; } } return flag; } static GLenum MouseDown(int x, int y, GLenum button) { AUX_EVENTREC info; GLenum flag; int i; flag = GL_FALSE; for (i = 0; i < mouseDownTableCount; i++) { if ((int)(button & AUX_LEFTBUTTON) == mouseDownTable[i].mouseField) { info.event = AUX_MOUSEDOWN; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_LEFTBUTTON; (*mouseDownTable[i].MouseFunc)(&info); flag |= GL_TRUE; } if ((int)(button & AUX_RIGHTBUTTON) == mouseDownTable[i].mouseField) { info.event = AUX_MOUSEDOWN; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_RIGHTBUTTON; (*mouseDownTable[i].MouseFunc)(&info); flag |= GL_TRUE; } if ((int)(button & AUX_MIDDLEBUTTON) == mouseDownTable[i].mouseField) { info.event = AUX_MOUSEDOWN; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_MIDDLEBUTTON; (*mouseDownTable[i].MouseFunc)(&info); flag |= GL_TRUE; } } return flag; } static GLenum KeyDown(int key, GLenum status) { GLenum flag; int i; flag = GL_FALSE; if (keyTableCount) { for (i = 0; i < keyTableCount; i++) { if (key == keyTable[i].keyField) { (*keyTable[i].KeyFunc)(); flag |= GL_TRUE; } } } return flag; } void auxExposeFunc(AUXEXPOSEPROC Func) { tkExposeFunc(Func); } void auxReshapeFunc(AUXRESHAPEPROC Func) { tkExposeFunc((AUXEXPOSEPROC) Func); tkReshapeFunc(Func); } void auxIdleFunc(AUXIDLEPROC Func) { tkIdleFunc(Func); } void auxKeyFunc(int key, AUXKEYPROC Func) { keyTable[keyTableCount].keyField = key; keyTable[keyTableCount++].KeyFunc = Func; } void auxMouseFunc(int mouse, int mode, AUXMOUSEPROC Func) { if (mode == AUX_MOUSEDOWN) { mouseDownTable[mouseDownTableCount].mouseField = mouse; mouseDownTable[mouseDownTableCount++].MouseFunc = Func; } else if (mode == AUX_MOUSEUP) { mouseUpTable[mouseUpTableCount].mouseField = mouse; mouseUpTable[mouseUpTableCount++].MouseFunc = Func; } else if (mode == AUX_MOUSELOC) { mouseLocTable[mouseLocTableCount].mouseField = mouse; mouseLocTable[mouseLocTableCount++].MouseFunc = Func; } } void auxMainLoop(AUXMAINPROC Func) { tkDisplayFunc(Func); tkExec(); } void auxInitPosition(int x, int y, int width, int height) { tkInitPosition(x, y, width, height); } void auxInitDisplayMode(GLenum type) { displayModeType = type; tkInitDisplayMode(type); } void auxInitDisplayModePolicy(GLenum type) { tkInitDisplayModePolicy(type); } GLenum auxInitDisplayModeID(GLint id) { return tkInitDisplayModeID(id); } GLenum APIENTRY auxInitWindowA(LPCSTR title) { return auxInitWindowAW(title,FALSE); } GLenum APIENTRY auxInitWindowW(LPCWSTR title) { return auxInitWindowAW((LPCSTR)title,TRUE); } GLenum APIENTRY auxInitWindowAW(LPCSTR title, BOOL bUnicode) { int useDoubleAsSingle = 0; if (tkInitWindowAW((char *)title, bUnicode) == GL_FALSE) { if (AUX_WIND_IS_SINGLE(displayModeType)) { tkInitDisplayMode(displayModeType | AUX_DOUBLE); if (tkInitWindowAW((char *)title, bUnicode) == GL_FALSE) { return GL_FALSE; /* curses, foiled again */ } MESSAGEBOX(GetFocus(), "Can't initialize a single buffer visual. " "Will use a double buffer visual instead, " "only drawing into the front buffer.", "Warning", MB_OK); displayModeType = displayModeType | AUX_DOUBLE; useDoubleAsSingle = 1; } } tkReshapeFunc(DefaultHandleReshape); tkExposeFunc(DefaultHandleExpose); tkMouseUpFunc(MouseUp); tkMouseDownFunc(MouseDown); tkMouseMoveFunc(MouseLoc); tkKeyDownFunc(KeyDown); auxKeyFunc(AUX_ESCAPE, auxQuit); glClearColor((GLclampf)0.0, (GLclampf)0.0, (GLclampf)0.0, (GLclampf)1.0); glClearIndex((GLfloat)0.0); glLoadIdentity(); if (useDoubleAsSingle) glDrawBuffer(GL_FRONT); return GL_TRUE; } void auxCloseWindow(void) { tkCloseWindow(); keyTableCount = 0; mouseDownTableCount = 0; mouseUpTableCount = 0; mouseLocTableCount = 0; } void auxQuit(void) { tkQuit(); } void auxSwapBuffers(void) { tkSwapBuffers(); } HWND auxGetHWND(void) { return tkGetHWND(); } HDC auxGetHDC(void) { return tkGetHDC(); } HGLRC auxGetHGLRC(void) { return tkGetHRC(); } GLenum auxGetDisplayModePolicy(void) { return tkGetDisplayModePolicy(); } GLint auxGetDisplayModeID(void) { return tkGetDisplayModeID(); } GLenum auxGetDisplayMode(void) { return tkGetDisplayMode(); } void auxSetOneColor(int index, float r, float g, float b) { tkSetOneColor(index, r, g, b); } void auxSetFogRamp(int density, int startIndex) { tkSetFogRamp(density, startIndex); } void auxSetGreyRamp(void) { tkSetGreyRamp(); } void auxSetRGBMap(int size, float *rgb) { tkSetRGBMap(size, rgb); } int auxGetColorMapSize(void) { return tkGetColorMapSize(); } void auxGetMouseLoc(int *x, int *y) { tkGetMouseLoc(x, y); }