X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FVideo.cc;h=544e172ad7a00dac196867689e69c8429fd7e0be;hp=c49bb1e41124de28f0dfa1769ae4547c5d0f6377;hb=be9ebc1104574e5e81e19c5caba0c23b54df826d;hpb=a31d65a998121df0651c57bfb68782e2a07d2e2f diff --git a/src/Moof/Video.cc b/src/Moof/Video.cc index c49bb1e..544e172 100644 --- a/src/Moof/Video.cc +++ b/src/Moof/Video.cc @@ -26,11 +26,10 @@ *******************************************************************************/ -#include - -#include - -#include "Dispatcher.hh" +#include "Dispatch.hh" +#include "Engine.hh" +#include "Error.hh" +#include "Image.hh" #include "Log.hh" #include "Settings.hh" #include "Video.hh" @@ -129,15 +128,16 @@ void Video::setVideoMode(const long mode[3]) mAttribs.mode[1] = mode[1]; mAttribs.mode[2] = mode[2]; -#if defined(_WIN32) || defined (_WIN64) || defined(__WIN32__) +#if defined(_WIN32) || defined(__WIN32__) // 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 - Mf::dispatcher::dispatch("video.context_recreated"); + engine.dispatch("video.newcontext"); + logInfo("video context recreated"); #endif } - else throw Exception(Exception::SDL_ERROR); + else throw Error(Error::SDL_VIDEOMODE); } } @@ -169,12 +169,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(); } } @@ -183,6 +179,11 @@ std::string Video::getCaption() const return mAttribs.caption; } +const std::string& Video::getIcon() const +{ + return mAttribs.icon; +} + void Video::setFull(bool full) { @@ -276,12 +277,6 @@ void Video::setCursorGrab(bool cursorGrab) } -void Video::makeActive() -{ - // NOP until the day SDL supports more than only one window. - // Still waiting... -} - void Video::swap() { SDL_GL_SwapBuffers(); @@ -360,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) @@ -367,12 +367,31 @@ 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]; }