diff engine/core/controller/engine.cpp @ 654:5d6b1820b953

* Added the ability to change screen modes on the fly. This works both in OpenGL and SDL modes. * Added IEngineChangeListener so the client can update the cameras viewport if the screen mode has been changed. I chose to do it this way because the engine has no way to know which camera it should update. It will be up to the client to do it. * The cursor surface is now correctly freed when exiting. * Added DeviceCaps::getNearestScreenMode() for the client to request a supported screen mode. closes[t:315]
author prock@33b003aa-7bff-0310-803a-e67f0ece8222
date Thu, 21 Oct 2010 18:50:50 +0000
parents 01acc9fc35ea
children e3140f01749d
line wrap: on
line diff
--- a/engine/core/controller/engine.cpp	Fri Oct 15 18:54:34 2010 +0000
+++ b/engine/core/controller/engine.cpp	Thu Oct 21 18:50:50 2010 +0000
@@ -74,6 +74,8 @@
 #include "view/renderers/cellselectionrenderer.h"
 #include "view/renderers/blockinginforenderer.h"
 #include "view/renderers/genericrenderer.h"
+#include "video/image.h"
+#include "gui/console/console.h"
 #include "engine.h"
 
 #ifdef USE_COCOA
@@ -105,7 +107,8 @@
 		m_logmanager(0),
 		m_cursor(0),
 		m_settings(),
-		m_devcaps(){
+		m_devcaps(),
+		m_changelisteners() {
 #ifdef USE_COCOA
 		// The next lines ensure that Cocoa is initialzed correctly.
 		// This is needed for SDL to function properly on MAC OS X.
@@ -131,6 +134,26 @@
 		return m_devcaps;
 	}
 
+	Image* Engine::changeScreenMode(const ScreenMode& mode){
+		m_cursor->invalidate();
+		m_imagepool->invalidateLoadedImages();
+		m_defaultfont->invalidate();
+		m_guimanager->invalidateFonts();
+
+		Image* screen = m_renderbackend->setScreenMode(mode);
+
+		m_guimanager->resizeTopContainer(0,0,mode.getWidth(), mode.getHeight());
+		m_guimanager->getConsole()->reLayout();
+
+		std::vector<IEngineChangeListener*>::iterator i = m_changelisteners.begin();
+		while (i != m_changelisteners.end()) {
+			(*i)->onScreenModeChanged(mode);
+			++i;
+		}
+
+		return screen;
+	}
+
 	void Engine::preInit() {
 		m_logmanager = LogManager::instance();
 
@@ -248,7 +271,7 @@
 			m_settings.getDefaultFontSize(),
 			m_settings.getDefaultFontGlyphs());
 		FL_LOG(_log, "Initializing GUI manager");
-		m_guimanager->init(m_gui_graphics, m_settings.getScreenWidth(), m_settings.getScreenHeight());
+		m_guimanager->init(m_gui_graphics, m_renderbackend->getScreenWidth(), m_renderbackend->getScreenHeight());
 		FL_LOG(_log, "GUI manager initialized");
 		SDL_EnableUNICODE(1);
 
@@ -343,6 +366,21 @@
 	void Engine::finalizePumping() {
 		// nothing here at the moment..
 	}
+
+	void Engine::addChangeListener(IEngineChangeListener* listener) {
+		m_changelisteners.push_back(listener);
+	}
+
+	void Engine::removeChangeListener(IEngineChangeListener* listener) {
+		std::vector<IEngineChangeListener*>::iterator i = m_changelisteners.begin();
+		while (i != m_changelisteners.end()) {
+			if ((*i) == listener) {
+				m_changelisteners.erase(i);
+				return;
+			}
+			++i;
+		}
+	}
 }//FIFE
 
 /* vim: set noexpandtab: set shiftwidth=2: set tabstop=2: */