X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FVideo.cc;h=9e74acbf2b75dae0b09cb53f17883ed1eb4063b8;hp=eeec47e7eb7d4dcc00b4a6b17fd732f8e61fc93a;hb=987971a961454d97082c6448fdc0bbeb540281bb;hpb=e495074443d9fd7bc16137084cf9de3d031b75c4 diff --git a/src/Moof/Video.cc b/src/Moof/Video.cc index eeec47e..9e74acb 100644 --- a/src/Moof/Video.cc +++ b/src/Moof/Video.cc @@ -26,11 +26,9 @@ *******************************************************************************/ -#include - #include "Dispatch.hh" -#include "Engine.hh" -#include "Exception.hh" +#include "Error.hh" +#include "Image.hh" #include "Log.hh" #include "Settings.hh" #include "Video.hh" @@ -65,9 +63,6 @@ Video::Video(const std::string& caption, const std::string& icon) void Video::init(const Attributes& attribs) { - // make sure the engine is initialized before setting up the video - Engine::getInstance(); - mContext = 0; mFlags = 0; mAttribs = attribs; @@ -80,6 +75,8 @@ void Video::init(const Attributes& attribs) setCursorVisible(attribs.cursorVisible); setCursorGrab(attribs.cursorGrab); setVideoMode(attribs.mode); + + video = this; } void Video::recreateContext() @@ -114,6 +111,8 @@ void Video::setOpenGLAttributes() Video::~Video() { SDL_FreeSurface(mContext); + + if (video == this) video = 0; } @@ -136,12 +135,11 @@ void Video::setVideoMode(const long mode[3]) // on win32, creating a new context via SDL_SetVideoMode will wipe // out the GL state, so we gotta notify everyone to reload their // state after the change - Engine::getInstance().dispatch("video.newcontext"); - + core.dispatch("video.newcontext"); logInfo("video context recreated"); #endif } - else throw Exception(ErrorCode::SDL_VIDEOMODE); + else throw Error(Error::SDL_VIDEOMODE); } } @@ -173,12 +171,8 @@ void Video::setIcon() { if (mAttribs.icon != "") { - SDL_Surface* icon = IMG_Load(mAttribs.icon.c_str()); - if (icon) - { - SDL_WM_SetIcon(icon, 0); - SDL_FreeSurface(icon); - } + Image icon(mAttribs.icon); + icon.setAsIcon(); } } @@ -304,7 +298,7 @@ int Video::getHeight() const Video::Attributes::Attributes() { - // Set some sane GL and window defaults (see SDL_video.c:217) + // set some sane GL and window defaults (see SDL_video.c:217) colorBuffer[0] = 3; colorBuffer[1] = 3; colorBuffer[2] = 2; @@ -330,8 +324,6 @@ Video::Attributes::Attributes() cursorVisible = true; cursorGrab = false; - Settings& settings = Settings::getInstance(); - std::vector colors; settings.get("colorbuffers", colors); if (colors.size() > 0) colorBuffer[0] = colors[0]; @@ -363,6 +355,11 @@ Video::Attributes::Attributes() } settings.get("icon", icon); + settings.get("fullscreen", fullscreen); + settings.get("resizable", resizable); + settings.get("showcursor", cursorVisible); + settings.get("grab", cursorGrab); + std::vector dimensions; settings.get("videomode", dimensions); if (dimensions.size() > 1) @@ -370,15 +367,37 @@ Video::Attributes::Attributes() mode[0] = dimensions[0]; mode[1] = dimensions[1]; } - if (dimensions.size() > 2) mode[2] = dimensions[2]; + else if (fullscreen) + { + SDL_Rect** modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE); - settings.get("fullscreen", fullscreen); - settings.get("resizable", resizable); - settings.get("showcursor", cursorVisible); - settings.get("grab", cursorGrab); + if (modes == (SDL_Rect**)0) + { + Mf::logError("no native video mode"); + } + else if (modes == (SDL_Rect**)-1) + { + Mf::logWarning("any resolution allowed; choosing default 800x600"); + mode[0] = 800; + mode[1] = 600; + } + else + { + while (*(modes + 1)) ++modes; // skip to the last + + mode[0] = (*modes)->w; + mode[1] = (*modes)->h; + Mf::logInfo << "choosing native resolution " + << mode[0] << "x" << mode[1] << std::endl; + } + } + if (dimensions.size() > 2) mode[2] = dimensions[2]; } +Video* video = 0; + + } // namespace Mf /** vim: set ts=4 sw=4 tw=80: *************************************************/