]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Video.cc
cleaned up interpolator classes
[chaz/yoink] / src / Moof / Video.cc
index 9fdd47893652109704f589acc8aa0a5c6b6ad337..62addb406dc804b7a31644ef586b3a43b3dd1dce 100644 (file)
 
 *******************************************************************************/
 
-#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"
@@ -76,6 +75,8 @@ void Video::init(const Attributes& attribs)
        setCursorVisible(attribs.cursorVisible);
        setCursorGrab(attribs.cursorGrab);
        setVideoMode(attribs.mode);
+
+       video = this;
 }
 
 void Video::recreateContext()
@@ -110,6 +111,8 @@ void Video::setOpenGLAttributes()
 Video::~Video()
 {
        SDL_FreeSurface(mContext);
+
+       if (video == this) video = 0;
 }
 
 
@@ -128,15 +131,12 @@ void Video::setVideoMode(const long mode[3])
                        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
-                       Mf::dispatcher::dispatch("video.context_recreated");
+#if !defined(linux) && !defined(__linux) && !defined(__linux__)
                        logInfo("video context recreated");
+                       core.dispatch("video.newcontext");
 #endif
                }
-               else throw Exception(ErrorCode::SDL_VIDEOMODE);
+               else Error(Error::SDL_VIDEOMODE).raise();
        }
 }
 
@@ -168,12 +168,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();
        }
 }
 
@@ -182,6 +178,11 @@ std::string Video::getCaption() const
        return mAttribs.caption;
 }
 
+const std::string& Video::getIcon() const
+{
+       return mAttribs.icon;
+}
+
 
 void Video::setFull(bool full)
 {
@@ -275,12 +276,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();
@@ -300,7 +295,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;
@@ -326,8 +321,6 @@ Video::Attributes::Attributes()
        cursorVisible = true;
        cursorGrab = false;
 
-       Settings& settings = Settings::getInstance();
-
        std::vector<long> colors;
        settings.get("colorbuffers", colors);
        if (colors.size() > 0) colorBuffer[0] = colors[0];
@@ -359,6 +352,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<long> dimensions;
        settings.get("videomode", dimensions);
        if (dimensions.size() > 1)
@@ -366,15 +364,35 @@ 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
+               {
+                       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: *************************************************/
This page took 0.022226 seconds and 4 git commands to generate.