diff options
Diffstat (limited to 'nx-X11/extras/Mesa_6.4.1/src/glut/dos/state.c')
-rw-r--r-- | nx-X11/extras/Mesa_6.4.1/src/glut/dos/state.c | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/nx-X11/extras/Mesa_6.4.1/src/glut/dos/state.c b/nx-X11/extras/Mesa_6.4.1/src/glut/dos/state.c new file mode 100644 index 000000000..b0d5d8ae9 --- /dev/null +++ b/nx-X11/extras/Mesa_6.4.1/src/glut/dos/state.c @@ -0,0 +1,238 @@ +/* + * DOS/DJGPP Mesa Utility Toolkit + * Version: 1.0 + * + * Copyright (C) 2005 Daniel Borca All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * DANIEL BORCA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#include <stdio.h> + +#include "internal.h" + + +#define FREQUENCY 100 /* set this to zero to use the default timer */ + + +static int timer_installed; +#if FREQUENCY +static volatile int ticks; + + +static void +ticks_timer (void *p) +{ + (void)p; + ticks++; +} ENDOFUNC(ticks_timer) +#else +#include <time.h> + +static struct timeval then; +#endif + + +int APIENTRY +glutGet (GLenum type) +{ + switch (type) { + case GLUT_WINDOW_X: + return _glut_current->xpos; + case GLUT_WINDOW_Y: + return _glut_current->ypos; + case GLUT_WINDOW_WIDTH: + return _glut_current->width; + case GLUT_WINDOW_HEIGHT: + return _glut_current->height; + case GLUT_WINDOW_STENCIL_SIZE: + return _glut_visual.stencil; + case GLUT_WINDOW_DEPTH_SIZE: + return _glut_visual.depth; + case GLUT_WINDOW_RGBA: + return !(_glut_default.mode & GLUT_INDEX); + case GLUT_WINDOW_COLORMAP_SIZE: + return (_glut_default.mode & GLUT_INDEX) ? (256 - RESERVED_COLORS) : 0; + case GLUT_SCREEN_WIDTH: + return _glut_visual.geometry[0]; + case GLUT_SCREEN_HEIGHT: + return _glut_visual.geometry[1]; + case GLUT_INIT_WINDOW_X: + return _glut_default.x; + case GLUT_INIT_WINDOW_Y: + return _glut_default.y; + case GLUT_INIT_WINDOW_WIDTH: + return _glut_default.width; + case GLUT_INIT_WINDOW_HEIGHT: + return _glut_default.height; + case GLUT_INIT_DISPLAY_MODE: + return _glut_default.mode; + case GLUT_ELAPSED_TIME: +#if FREQUENCY + if (!timer_installed) { + timer_installed = GL_TRUE; + LOCKDATA(ticks); + LOCKFUNC(ticks_timer); + pc_install_int(ticks_timer, NULL, FREQUENCY); + } + return ticks * 1000 / FREQUENCY; +#else + if (!timer_installed) { + timer_installed = GL_TRUE; + gettimeofday(&then, NULL); + return 0; + } else { + struct timeval now; + gettimeofday(&now, NULL); + return (now.tv_usec - then.tv_usec) / 1000 + + (now.tv_sec - then.tv_sec) * 1000; + } +#endif + default: + return -1; + } +} + + +int APIENTRY +glutDeviceGet (GLenum type) +{ + switch (type) { + case GLUT_HAS_KEYBOARD: + return GL_TRUE; + case GLUT_HAS_MOUSE: + return (_glut_mouse != 0); + case GLUT_NUM_MOUSE_BUTTONS: + return _glut_mouse; + case GLUT_HAS_SPACEBALL: + case GLUT_HAS_DIAL_AND_BUTTON_BOX: + case GLUT_HAS_TABLET: + return GL_FALSE; + case GLUT_NUM_SPACEBALL_BUTTONS: + case GLUT_NUM_BUTTON_BOX_BUTTONS: + case GLUT_NUM_DIALS: + case GLUT_NUM_TABLET_BUTTONS: + return 0; + default: + return -1; + } +} + + +int APIENTRY +glutGetModifiers (void) +{ + int mod = 0; + int shifts = pc_keyshifts(); + + if (shifts & (KB_SHIFT_FLAG | KB_CAPSLOCK_FLAG)) { + mod |= GLUT_ACTIVE_SHIFT; + } + + if (shifts & KB_ALT_FLAG) { + mod |= GLUT_ACTIVE_ALT; + } + + if (shifts & KB_CTRL_FLAG) { + mod |= GLUT_ACTIVE_CTRL; + } + + return mod; +} + + +void APIENTRY +glutReportErrors (void) +{ + /* reports all the OpenGL errors that happened till now */ +} + + +/* GAME MODE + * Hack alert: incomplete... what is GameMode, anyway? + */ +static GLint game; +static GLboolean game_possible; +static GLboolean game_active; +static GLuint game_width; +static GLuint game_height; +static GLuint game_bpp; +static GLuint game_refresh; + + +void APIENTRY +glutGameModeString (const char *string) +{ + if (sscanf(string, "%ux%u:%u@%u", &game_width, &game_height, &game_bpp, &game_refresh) == 4) { + game_possible = GL_TRUE; + } +} + + +int APIENTRY +glutGameModeGet (GLenum mode) +{ + switch (mode) { + case GLUT_GAME_MODE_ACTIVE: + return game_active; + case GLUT_GAME_MODE_POSSIBLE: + return game_possible && !_glut_current; + case GLUT_GAME_MODE_WIDTH: + return game_active ? (int)game_width : -1; + case GLUT_GAME_MODE_HEIGHT: + return game_active ? (int)game_height : -1; + case GLUT_GAME_MODE_PIXEL_DEPTH: + return game_active ? (int)game_bpp : -1; + case GLUT_GAME_MODE_REFRESH_RATE: + return game_active ? (int)game_refresh : -1; + default: + return -1; + } +} + + +int APIENTRY +glutEnterGameMode (void) +{ + if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE)) { + _glut_visual.bpp = game_bpp; + _glut_visual.refresh = game_refresh; + + glutInitWindowSize(game_width, game_height); + + if ((game = glutCreateWindow("<game>")) > 0) { + game_active = GL_TRUE; + } + + return game; + } else { + return 0; + } +} + + +void GLUTAPIENTRY +glutLeaveGameMode (void) +{ + if (glutGameModeGet(GLUT_GAME_MODE_ACTIVE)) { + game_active = GL_FALSE; + + glutDestroyWindow(game); + } +} |