summaryrefslogtreecommitdiff
path: root/src/glut/beos/glutGet.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/glut/beos/glutGet.cpp')
-rw-r--r--src/glut/beos/glutGet.cpp240
1 files changed, 240 insertions, 0 deletions
diff --git a/src/glut/beos/glutGet.cpp b/src/glut/beos/glutGet.cpp
new file mode 100644
index 0000000000..33355afb83
--- /dev/null
+++ b/src/glut/beos/glutGet.cpp
@@ -0,0 +1,240 @@
+/***********************************************************
+ * Copyright (C) 1997, Be Inc. All rights reserved.
+ *
+ * FILE: glutGet.cpp
+ *
+ * DESCRIPTION: get state information from GL
+ ***********************************************************/
+
+/***********************************************************
+ * Headers
+ ***********************************************************/
+#include <GL/glut.h>
+#include <string.h>
+#include <Autolock.h>
+#include "glutint.h"
+#include "glutState.h"
+
+/***********************************************************
+ * Global variables
+ ***********************************************************/
+// rough guess, since we don't know how big the monitor really is
+const float dots_per_mm = (72/25.4); // dots per millimeter
+
+/***********************************************************
+ * FUNCTION: glutGet (9.1)
+ *
+ * DESCRIPTION: retrieve window and GL state
+ ***********************************************************/
+int glutGet(GLenum state) {
+ switch(state) {
+ case GLUT_WINDOW_X:
+ {BAutolock winlock(gState.currentWindow->Window()); // need to lock the window
+ if (gState.currentWindow->parent)
+ return (int)gState.currentWindow->Frame().left;
+ else
+ return (int)gState.currentWindow->Window()->Frame().left;
+ }
+ case GLUT_WINDOW_Y:
+ {BAutolock winlock(gState.currentWindow->Window());
+ if (gState.currentWindow->parent)
+ return (int)gState.currentWindow->Frame().top;
+ else
+ return (int)gState.currentWindow->Window()->Frame().top;
+ }
+ case GLUT_WINDOW_WIDTH:
+ {BAutolock winlock(gState.currentWindow->Window());
+ return gState.currentWindow->m_width;
+ }
+ case GLUT_WINDOW_HEIGHT:
+ {BAutolock winlock(gState.currentWindow->Window());
+ return gState.currentWindow->m_height;
+ }
+ case GLUT_WINDOW_PARENT:
+ {BAutolock winlock(gState.currentWindow->Window());
+ if(gState.currentWindow->parent)
+ return gState.currentWindow->parent->num + 1;
+ else
+ return 0;
+ }
+ case GLUT_WINDOW_NUM_CHILDREN:
+ {BAutolock winlock(gState.currentWindow->Window());
+ int num = 0;
+ GlutWindow *children = gState.currentWindow->children;
+ while (children) {
+ num++;
+ children = children->siblings;
+ }
+ return num;
+ }
+ case GLUT_WINDOW_BUFFER_SIZE: // best guesses
+ case GLUT_WINDOW_DEPTH_SIZE:
+ return 32;
+
+ case GLUT_WINDOW_STENCIL_SIZE:
+ case GLUT_WINDOW_RED_SIZE: // always 24-bit color
+ case GLUT_WINDOW_GREEN_SIZE:
+ case GLUT_WINDOW_BLUE_SIZE:
+ case GLUT_WINDOW_ALPHA_SIZE:
+ case GLUT_WINDOW_ACCUM_RED_SIZE:
+ case GLUT_WINDOW_ACCUM_GREEN_SIZE:
+ case GLUT_WINDOW_ACCUM_BLUE_SIZE:
+ case GLUT_WINDOW_ACCUM_ALPHA_SIZE:
+ return 8;
+
+ case GLUT_WINDOW_DOUBLEBUFFER: // always double-buffered RGBA
+ case GLUT_WINDOW_RGBA:
+ return 1;
+
+ case GLUT_WINDOW_COLORMAP_SIZE: // don't support these
+ case GLUT_WINDOW_NUM_SAMPLES:
+ case GLUT_WINDOW_STEREO:
+ return 0;
+
+ case GLUT_WINDOW_CURSOR:
+ return gState.currentWindow->cursor; // don't need to lock window since it won't change
+
+ case GLUT_SCREEN_WIDTH:
+ return (int)(BScreen().Frame().Width()) + 1;
+ case GLUT_SCREEN_HEIGHT:
+ return (int)(BScreen().Frame().Height()) + 1;
+ case GLUT_SCREEN_WIDTH_MM:
+ return (int)((BScreen().Frame().Width() + 1) / dots_per_mm);
+ case GLUT_SCREEN_HEIGHT_MM:
+ return (int)((BScreen().Frame().Height() + 1) / dots_per_mm);
+ case GLUT_MENU_NUM_ITEMS:
+ return gState.currentMenu->num;
+ case GLUT_DISPLAY_MODE_POSSIBLE:
+ return __glutConvertDisplayMode(0); // returns 1 if possible
+ case GLUT_INIT_DISPLAY_MODE:
+ return gState.displayMode;
+ case GLUT_INIT_WINDOW_X:
+ return gState.initX;
+ case GLUT_INIT_WINDOW_Y:
+ return gState.initY;
+ case GLUT_INIT_WINDOW_WIDTH:
+ return gState.initWidth;
+ case GLUT_INIT_WINDOW_HEIGHT:
+ return gState.initHeight;
+ case GLUT_ELAPSED_TIME:
+ bigtime_t elapsed, beginning, now;
+ __glutInitTime(&beginning);
+ now = system_time();
+ elapsed = now - beginning;
+ return (int) (elapsed / 1000); // 1000 ticks in a millisecond
+ default:
+ __glutWarning("invalid glutGet parameter: %d", state);
+ return -1;
+ }
+}
+
+/***********************************************************
+ * FUNCTION: glutLayerGet (9.2)
+ *
+ * DESCRIPTION: since we don't support layers, this is easy
+ ***********************************************************/
+int glutLayerGet(GLenum info) {
+ switch(info) {
+ case GLUT_OVERLAY_POSSIBLE:
+ case GLUT_HAS_OVERLAY:
+ return 0;
+ case GLUT_LAYER_IN_USE:
+ return GLUT_NORMAL;
+ case GLUT_TRANSPARENT_INDEX:
+ return -1;
+ case GLUT_NORMAL_DAMAGED:
+ return gState.currentWindow->displayEvent;
+ case GLUT_OVERLAY_DAMAGED:
+ return -1;
+ default:
+ __glutWarning("invalid glutLayerGet param: %d", info);
+ return -1;
+ }
+}
+
+/***********************************************************
+ * FUNCTION: glutDeviceGet (9.3)
+ *
+ * DESCRIPTION: get info about I/O devices we support
+ * easy, since BeOS only supports a keyboard and mouse now
+ ***********************************************************/
+int glutDeviceGet(GLenum info) {
+ switch(info) {
+ case GLUT_HAS_KEYBOARD:
+ case GLUT_HAS_MOUSE:
+ return 1;
+
+ case GLUT_HAS_SPACEBALL:
+ case GLUT_HAS_DIAL_AND_BUTTON_BOX:
+ case GLUT_HAS_TABLET:
+ case GLUT_NUM_SPACEBALL_BUTTONS:
+ case GLUT_NUM_BUTTON_BOX_BUTTONS:
+ case GLUT_NUM_DIALS:
+ case GLUT_NUM_TABLET_BUTTONS:
+ return 0;
+
+ case GLUT_NUM_MOUSE_BUTTONS:
+ {
+ int32 mouseButtons = 3; // good guess
+ if(get_mouse_type(&mouseButtons) != B_OK) {
+ __glutWarning("error getting number of mouse buttons");
+ }
+ return mouseButtons;
+ }
+
+ default:
+ __glutWarning("invalid glutDeviceGet parameter: %d", info);
+ return -1;
+ }
+}
+
+/***********************************************************
+ * FUNCTION: glutGetModifiers (9.4)
+ *
+ * DESCRIPTION: get the modifier key state for the current window
+ ***********************************************************/
+int glutGetModifiers() {
+ if(gState.modifierKeys == (int) ~0) {
+ __glutWarning(
+ "glutCurrentModifiers: do not call outside core input callback.");
+ return 0;
+ }
+ return gState.modifierKeys;
+}
+
+/***********************************************************
+ * FUNCTION: glutExtensionSupported (9.5)
+ *
+ * DESCRIPTION: is an OpenGL extension supported (from glut_ext.c)
+ ***********************************************************/
+int glutExtensionSupported(const char *extension) {
+ static const GLubyte *extensions = NULL;
+ const GLubyte *start;
+ GLubyte *where, *terminator;
+
+ /* Extension names should not have spaces. */
+ where = (GLubyte *) strchr(extension, ' ');
+ if (where || *extension == '\0')
+ return 0;
+
+ if (!extensions)
+ extensions = glGetString(GL_EXTENSIONS);
+ /* It takes a bit of care to be fool-proof about parsing the
+ OpenGL extensions string. Don't be fooled by sub-strings,
+
+ etc. */
+ start = extensions;
+ for (;;) {
+ where = (GLubyte *) strstr((const char *) start, extension);
+ if (!where)
+ break;
+ terminator = where + strlen(extension);
+ if (where == start || *(where - 1) == ' ') {
+ if (*terminator == ' ' || *terminator == '\0') {
+ return 1;
+ }
+ }
+ start = terminator;
+ }
+ return 0;
+}