#include <GL/glut.h>
#include <string.h>
#include <Autolock.h>
#include <Screen.h>
#include "glutint.h"
#include "glutState.h"
const float dots_per_mm = (72/25.4);
int glutGet(GLenum state) {
switch(state) {
case GLUT_WINDOW_X:
{BAutolock winlock(gState.currentWindow->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: case GLUT_WINDOW_DEPTH_SIZE:
return 32;
case GLUT_WINDOW_STENCIL_SIZE:
case GLUT_WINDOW_RED_SIZE: 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: case GLUT_WINDOW_RGBA:
return 1;
case GLUT_WINDOW_COLORMAP_SIZE: case GLUT_WINDOW_NUM_SAMPLES:
case GLUT_WINDOW_STEREO:
return 0;
case GLUT_WINDOW_CURSOR:
return gState.currentWindow->cursor;
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); 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); default:
__glutWarning("invalid glutGet parameter: %d", state);
return -1;
}
}
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;
}
}
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; 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;
}
}
int glutGetModifiers() {
if(gState.modifierKeys == (int) ~0) {
__glutWarning(
"glutCurrentModifiers: do not call outside core input callback.");
return 0;
}
return gState.modifierKeys;
}