/* * Copyright (C) 2006 Claudio Ciccani * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include "internal.h" /*****************************************************************************/ static int g_display_changed = 0; /*****************************************************************************/ void GLUTAPIENTRY glutGameModeString( const char *string ) { int x, y, bpp; char *tmp; if (!string) return; tmp = strchr( string, 'x' ); if (tmp) { x = strtol( string, NULL, 10 ); y = strtol( tmp+1, NULL, 10 ); if (x > 0 && y > 0) { g_width = x; g_height = y; } } tmp = strchr( string, ':' ); if (tmp) { bpp = strtol( tmp+1, NULL, 10 ); if (bpp > 0) g_bpp = bpp; } } int GLUTAPIENTRY glutEnterGameMode( void ) { DFBDisplayLayerConfig prev, cur; glutInit( NULL, NULL ); primary->GetConfiguration( primary, &prev ); primary->SetCooperativeLevel( primary, DLSCL_EXCLUSIVE ); if (g_game) __glutDestroyWindow( g_game ); g_game = __glutCreateWindow( GL_TRUE ); if (!g_game) return 0; __glutSetWindow( g_game ); g_game->cursor = GLUT_CURSOR_NONE; primary->GetConfiguration( primary, &cur ); g_display_changed = (cur.width != prev.width || cur.height != prev.height || cur.pixelformat != prev.pixelformat); return g_game->id; } void GLUTAPIENTRY glutLeaveGameMode( void ) { if (g_game) __glutDestroyWindow( g_game ); primary->SetCooperativeLevel( primary, DLSCL_ADMINISTRATIVE ); } int GLUTAPIENTRY glutGameModeGet( GLenum type ) { switch (type) { case GLUT_GAME_MODE_ACTIVE: return (g_game != NULL); case GLUT_GAME_MODE_POSSIBLE: if (primary) { DFBDisplayLayerConfig c; c.flags = DLCONF_WIDTH | DLCONF_HEIGHT; c.width = g_width; c.height = g_height; /* XXX: bpp */ if (primary->TestConfiguration( primary, &c, 0 ) == DFB_OK) return 1; } break; case GLUT_GAME_MODE_WIDTH: if (g_game) { int w; g_game->surface->GetSize( g_game->surface, &w, 0 ); return w; } break; case GLUT_GAME_MODE_HEIGHT: if (g_game) { int h; g_game->surface->GetSize( g_game->surface, 0, &h ); return h; } break; case GLUT_GAME_MODE_PIXEL_DEPTH: if (g_game) { DFBSurfacePixelFormat f; g_game->surface->GetPixelFormat( g_game->surface, &f ); return DFB_COLOR_BITS_PER_PIXEL( f ); } break; case GLUT_GAME_MODE_REFRESH_RATE: return 60; /* assume 60hz */ case GLUT_GAME_MODE_DISPLAY_CHANGED: return g_display_changed; default: break; } return 0; }