]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Video.cc
moved log level from configure to setting
[chaz/yoink] / src / Moof / Video.cc
index c49bb1e41124de28f0dfa1769ae4547c5d0f6377..544e172ad7a00dac196867689e69c8429fd7e0be 100644 (file)
 
 *******************************************************************************/
 
-#include <stdexcept>
-
-#include <SDL/SDL_image.h>
-
-#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<long> 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];
 }
 
 
This page took 0.020021 seconds and 4 git commands to generate.