*******************************************************************************/
#include "Dispatch.hh"
-#include "Engine.hh"
#include "Error.hh"
#include "Image.hh"
#include "Log.hh"
Video::Video()
{
- init(mAttribs);
+ init();
}
-Video::Video(const Attributes& attribs)
+Video::Video(const Attributes& attribs) :
+ mAttribs(attribs)
{
- init(attribs);
+ init();
}
Video::Video(const std::string& caption, const std::string& icon)
{
- if (mAttribs.caption == "Untitled")
- {
- mAttribs.caption = caption;
- }
- if (mAttribs.icon == "")
- {
- mAttribs.icon = icon;
- }
+ mAttribs.caption = caption;
+ mAttribs.icon = icon;
- init(mAttribs);
+ init();
}
-void Video::init(const Attributes& attribs)
+void Video::init()
{
+ Error error = Backend::getError();
+ if (error) error.raise();
+
mContext = 0;
mFlags = 0;
- mAttribs = attribs;
- setFull(attribs.fullscreen);
- setResizable(attribs.resizable);
+ setFull(mAttribs.fullscreen);
+ setResizable(mAttribs.resizable);
setOpenGLAttributes();
- setCaption(attribs.caption);
+ setCaption(mAttribs.caption);
setIcon();
- setCursorVisible(attribs.cursorVisible);
- setCursorGrab(attribs.cursorGrab);
- setVideoMode(attribs.mode);
+ setCursorVisible(mAttribs.cursorVisible);
+ setCursorGrab(mAttribs.cursorGrab);
+ setVideoMode(mAttribs.mode);
+
+ video = this;
}
void Video::recreateContext()
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, mAttribs.multisampleBuffers);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, mAttribs.multisampleSamples);
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, mAttribs.swapControl);
- SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, mAttribs.hardwareonly);
+ SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, mAttribs.hardwareOnly);
}
Video::~Video()
{
SDL_FreeSurface(mContext);
+
+ if (video == this) video = 0;
}
mAttribs.mode[1] = mode[1];
mAttribs.mode[2] = mode[2];
-#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
- engine.dispatch("video.newcontext");
-
+#if !defined(linux) && !defined(__linux) && !defined(__linux__)
logInfo("video context recreated");
+ core.dispatch("video.newcontext");
#endif
}
- else throw Error(Error::SDL_VIDEOMODE);
+ else Error(Error::SDL_VIDEOMODE).raise();
}
}
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;
multisampleBuffers = 0;
multisampleSamples = 0;
swapControl = false;
- hardwareonly = false;
+ hardwareOnly = false;
mode[0] = 640;
mode[1] = 480;
mode[2] = 0;
cursorVisible = true;
cursorGrab = false;
- Settings& settings = Settings::getInstance();
-
std::vector<long> colors;
settings.get("colorbuffers", colors);
if (colors.size() > 0) colorBuffer[0] = colors[0];
settings.get("multiesamplebuffers", multisampleBuffers);
settings.get("multiesamplesamples", multisampleSamples);
settings.get("swapcontrol", swapControl);
- settings.get("hardwareonly", hardwareonly);
+ settings.get("hardwareonly", hardwareOnly);
if (!settings.get("caption", caption))
{
mode[0] = dimensions[0];
mode[1] = dimensions[1];
}
- else if (fullscreen)
+ else if (fullscreen && Backend::isInitialized())
{
SDL_Rect** modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE);
}
else
{
- while (*(modes + 1)) ++modes; // skip to the last
-
mode[0] = (*modes)->w;
mode[1] = (*modes)->h;
Mf::logInfo << "choosing native resolution "
}
+Video* video = 0;
+
+
} // namespace Mf
/** vim: set ts=4 sw=4 tw=80: *************************************************/