*******************************************************************************/
-#include <SDL/SDL_image.h>
-
-#include "Dispatcher.hh"
-#include "Exception.hh"
+#include "Dispatch.hh"
+#include "Error.hh"
+#include "Image.hh"
#include "Log.hh"
#include "Settings.hh"
#include "Video.hh"
setCursorVisible(attribs.cursorVisible);
setCursorGrab(attribs.cursorGrab);
setVideoMode(attribs.mode);
+
+ video = this;
}
void Video::recreateContext()
Video::~Video()
{
SDL_FreeSurface(mContext);
+
+ if (video == this) video = 0;
}
// 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");
+ core.dispatch("video.newcontext");
logInfo("video context recreated");
#endif
}
- else throw Exception(ErrorCode::SDL_VIDEOMODE);
+ else throw Error(Error::SDL_VIDEOMODE);
}
}
{
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();
}
}
return mAttribs.caption;
}
+const std::string& Video::getIcon() const
+{
+ return mAttribs.icon;
+}
+
void Video::setFull(bool full)
{
}
-void Video::makeActive()
-{
- // NOP until the day SDL supports more than only one window.
- // Still waiting...
-}
-
void Video::swap()
{
SDL_GL_SwapBuffers();
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;
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("icon", icon);
+ settings.get("fullscreen", fullscreen);
+ settings.get("resizable", resizable);
+ settings.get("showcursor", cursorVisible);
+ settings.get("grab", cursorGrab);
+
std::vector<long> dimensions;
settings.get("videomode", dimensions);
if (dimensions.size() > 1)
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: *************************************************/