blob: 04a8479b985fbe1ca1b3e0d116223e7bdb2618ac [file] [log] [blame]
/***********************************************************
* Copyright (C) 1997, Be Inc. Copyright (C) 1999, Jake Hamby.
*
* This program is freely distributable without licensing fees
* and is provided without guarantee or warrantee expressed or
* implied. This program is -not- in the public domain.
*
*
* FILE: glutGet.cpp
*
* DESCRIPTION: get state information from GL
***********************************************************/
/***********************************************************
* Headers
***********************************************************/
#include <GL/glut.h>
#include <string.h>
#include <Autolock.h>
#include <Screen.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;
}