[Scummvm-cvs-logs] SF.net SVN: scummvm:[53354] scummvm/trunk/engines/sword25

sev at users.sourceforge.net sev at users.sourceforge.net
Wed Oct 13 01:50:19 CEST 2010


Revision: 53354
          http://scummvm.svn.sourceforge.net/scummvm/?rev=53354&view=rev
Author:   sev
Date:     2010-10-12 23:50:19 +0000 (Tue, 12 Oct 2010)

Log Message:
-----------
SWORD25: Get rid of ScummVMInput class

Modified Paths:
--------------
    scummvm/trunk/engines/sword25/input/inputengine.cpp
    scummvm/trunk/engines/sword25/input/inputengine.h
    scummvm/trunk/engines/sword25/input/inputengine_script.cpp
    scummvm/trunk/engines/sword25/kernel/service_ids.h
    scummvm/trunk/engines/sword25/module.mk

Removed Paths:
-------------
    scummvm/trunk/engines/sword25/input/scummvminput.cpp
    scummvm/trunk/engines/sword25/input/scummvminput.h

Modified: scummvm/trunk/engines/sword25/input/inputengine.cpp
===================================================================
--- scummvm/trunk/engines/sword25/input/inputengine.cpp	2010-10-12 23:49:42 UTC (rev 53353)
+++ scummvm/trunk/engines/sword25/input/inputengine.cpp	2010-10-12 23:50:19 UTC (rev 53354)
@@ -34,21 +34,366 @@
 
 #define BS_LOG_PREFIX "INPUTENGINE"
 
-// -----------------------------------------------------------------------------
-// Includes
-// -----------------------------------------------------------------------------
-
+#include "common/algorithm.h"
+#include "common/events.h"
+#include "common/system.h"
+#include "common/util.h"
+#include "sword25/kernel/kernel.h"
+#include "sword25/kernel/callbackregistry.h"
+#include "sword25/kernel/inputpersistenceblock.h"
+#include "sword25/kernel/outputpersistenceblock.h"
 #include "sword25/input/inputengine.h"
 
-// -----------------------------------------------------------------------------
-
 namespace Sword25 {
 
-InputEngine::InputEngine(Kernel *pKernel) : Service(pKernel) {
-	if (!_RegisterScriptBindings())
+#define DOUBLE_CLICK_TIME 500
+#define DOUBLE_CLICK_RECT_SIZE 4
+
+InputEngine::InputEngine(Kernel *pKernel) :
+	Service(pKernel),
+	m_CurrentState(0),
+	m_LeftMouseDown(false),
+	m_RightMouseDown(false),
+	m_MouseX(0),
+	m_MouseY(0),
+	m_LeftDoubleClick(false),
+	m_DoubleClickTime(DOUBLE_CLICK_TIME),
+	m_DoubleClickRectWidth(DOUBLE_CLICK_RECT_SIZE),
+	m_DoubleClickRectHeight(DOUBLE_CLICK_RECT_SIZE),
+	m_LastLeftClickTime(0),
+	m_LastLeftClickMouseX(0),
+	m_LastLeftClickMouseY(0) {
+	memset(m_KeyboardState[0], 0, sizeof(m_KeyboardState[0]));
+	memset(m_KeyboardState[1], 0, sizeof(m_KeyboardState[1]));
+	m_LeftMouseState[0] = false;
+	m_LeftMouseState[1] = false;
+	m_RightMouseState[0] = false;
+	m_RightMouseState[1] = false;
+
+	if (!registerScriptBindings())
 		BS_LOG_ERRORLN("Script bindings could not be registered.");
 	else
 		BS_LOGLN("Script bindings registered.");
 }
 
+Service *InputEngine_CreateObject(Kernel *pKernel) {
+	return new InputEngine(pKernel);
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::Init() {
+	// No initialisation needed
+	return true;
+}
+
+// -----------------------------------------------------------------------------
+
+void InputEngine::Update() {
+	Common::Event event;
+	m_CurrentState ^= 1;
+
+	// Loop through processing any pending events
+	bool handleEvents = true;
+	while (handleEvents && g_system->getEventManager()->pollEvent(event)) {
+		switch (event.type) {
+		case Common::EVENT_LBUTTONDOWN:
+		case Common::EVENT_LBUTTONUP:
+			m_LeftMouseDown = event.type == Common::EVENT_LBUTTONDOWN;
+			m_MouseX = event.mouse.x;
+			m_MouseY = event.mouse.y;
+			handleEvents = false;
+			break;
+		case Common::EVENT_RBUTTONDOWN:
+		case Common::EVENT_RBUTTONUP:
+			m_RightMouseDown = event.type == Common::EVENT_RBUTTONDOWN;
+			m_MouseX = event.mouse.x;
+			m_MouseY = event.mouse.y;
+			handleEvents = false;
+			break;
+
+		case Common::EVENT_MOUSEMOVE:
+			m_MouseX = event.mouse.x;
+			m_MouseY = event.mouse.y;
+			break;
+
+		case Common::EVENT_KEYDOWN:
+		case Common::EVENT_KEYUP:
+			AlterKeyboardState(event.kbd.keycode, (event.type == Common::EVENT_KEYDOWN) ? 0x80 : 0);
+			break;
+
+		case Common::EVENT_QUIT:
+			Kernel::GetInstance()->GetWindow()->SetWindowAlive(false);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	m_LeftMouseState[m_CurrentState] = m_LeftMouseDown;
+	m_RightMouseState[m_CurrentState] = m_RightMouseDown;
+
+	TestForLeftDoubleClick();
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::IsLeftMouseDown() {
+	return m_LeftMouseDown;
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::IsRightMouseDown() {
+	return m_RightMouseDown;
+}
+
+// -----------------------------------------------------------------------------
+
+void InputEngine::TestForLeftDoubleClick() {
+	m_LeftDoubleClick = false;
+
+	// Only bother checking for a double click if the left mouse button was clicked
+	if (WasLeftMouseDown()) {
+		// Get the time now
+		uint Now = Kernel::GetInstance()->GetMilliTicks();
+
+		// A double click is signalled if
+		// 1. The two clicks are close enough together
+		// 2. The mouse cursor hasn't moved much
+		if (Now - m_LastLeftClickTime <= m_DoubleClickTime &&
+		        ABS(m_MouseX - m_LastLeftClickMouseX) <= m_DoubleClickRectWidth / 2 &&
+		        ABS(m_MouseY - m_LastLeftClickMouseY) <= m_DoubleClickRectHeight / 2) {
+			m_LeftDoubleClick = true;
+
+			// Reset the time and position of the last click, so that clicking is not
+			// interpreted as the first click of a further double-click
+			m_LastLeftClickTime = 0;
+			m_LastLeftClickMouseX = 0;
+			m_LastLeftClickMouseY = 0;
+		} else {
+			// There is no double click. Remember the position and time of the click,
+			// in case it's the first click of a double-click sequence
+			m_LastLeftClickTime = Now;
+			m_LastLeftClickMouseX = m_MouseX;
+			m_LastLeftClickMouseY = m_MouseY;
+		}
+	}
+}
+
+// -----------------------------------------------------------------------------
+
+void InputEngine::AlterKeyboardState(int keycode, byte newState) {
+	m_KeyboardState[m_CurrentState][keycode] = newState;
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::IsLeftDoubleClick() {
+	return m_LeftDoubleClick;
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::WasLeftMouseDown() {
+	return (m_LeftMouseState[m_CurrentState] == false) && (m_LeftMouseState[m_CurrentState ^ 1] == true);
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::WasRightMouseDown() {
+	return (m_RightMouseState[m_CurrentState] == false) && (m_RightMouseState[m_CurrentState ^ 1] == true);
+}
+
+// -----------------------------------------------------------------------------
+
+int InputEngine::GetMouseX() {
+	return m_MouseX;
+}
+
+// -----------------------------------------------------------------------------
+
+int InputEngine::GetMouseY() {
+	return m_MouseY;
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::IsKeyDown(uint KeyCode) {
+	return (m_KeyboardState[m_CurrentState][KeyCode] & 0x80) != 0;
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::WasKeyDown(uint KeyCode) {
+	return ((m_KeyboardState[m_CurrentState][KeyCode] & 0x80) == 0) &&
+	       ((m_KeyboardState[m_CurrentState ^ 1][KeyCode] & 0x80) != 0);
+}
+
+// -----------------------------------------------------------------------------
+
+void InputEngine::SetMouseX(int PosX) {
+	m_MouseX = PosX;
+	g_system->warpMouse(m_MouseX, m_MouseY);
+}
+
+// -----------------------------------------------------------------------------
+
+void InputEngine::SetMouseY(int PosY) {
+	m_MouseY = PosY;
+	g_system->warpMouse(m_MouseX, m_MouseY);
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::RegisterCharacterCallback(CharacterCallback Callback) {
+	if (Common::find(m_CharacterCallbacks.begin(), m_CharacterCallbacks.end(), Callback) == m_CharacterCallbacks.end()) {
+		m_CharacterCallbacks.push_back(Callback);
+		return true;
+	} else {
+		BS_LOG_WARNINGLN("Tried to register an CharacterCallback that was already registered.");
+		return false;
+	}
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::UnregisterCharacterCallback(CharacterCallback Callback) {
+	Common::List<CharacterCallback>::iterator CallbackIter = Common::find(m_CharacterCallbacks.begin(),
+	        m_CharacterCallbacks.end(), Callback);
+	if (CallbackIter != m_CharacterCallbacks.end()) {
+		m_CharacterCallbacks.erase(CallbackIter);
+		return true;
+	} else {
+		BS_LOG_WARNINGLN("Tried to unregister an CharacterCallback that was not previously registered.");
+		return false;
+	}
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::RegisterCommandCallback(CommandCallback Callback) {
+	if (Common::find(m_CommandCallbacks.begin(), m_CommandCallbacks.end(), Callback) == m_CommandCallbacks.end()) {
+		m_CommandCallbacks.push_back(Callback);
+		return true;
+	} else {
+		BS_LOG_WARNINGLN("Tried to register an CommandCallback that was already registered.");
+		return false;
+	}
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::UnregisterCommandCallback(CommandCallback Callback) {
+	Common::List<CommandCallback>::iterator CallbackIter =
+	    Common::find(m_CommandCallbacks.begin(), m_CommandCallbacks.end(), Callback);
+	if (CallbackIter != m_CommandCallbacks.end()) {
+		m_CommandCallbacks.erase(CallbackIter);
+		return true;
+	} else {
+		BS_LOG_WARNINGLN("Tried to unregister an CommandCallback that was not previously registered.");
+		return false;
+	}
+}
+
+// -----------------------------------------------------------------------------
+
+void InputEngine::ReportCharacter(byte Character) {
+	Common::List<CharacterCallback>::const_iterator CallbackIter = m_CharacterCallbacks.begin();
+	while (CallbackIter != m_CharacterCallbacks.end()) {
+		// Iterator vor dem Aufruf erhöhen und im Folgendem auf einer Kopie arbeiten.
+		// Dieses Vorgehen ist notwendig da der Iterator möglicherweise von der Callbackfunktion durch das Deregistrieren des Callbacks
+		// invalidiert wird.
+		Common::List<CharacterCallback>::const_iterator CurCallbackIter = CallbackIter;
+		++CallbackIter;
+
+		(*CurCallbackIter)(Character);
+	}
+}
+
+// -----------------------------------------------------------------------------
+
+void InputEngine::ReportCommand(KEY_COMMANDS Command) {
+	Common::List<CommandCallback>::const_iterator CallbackIter = m_CommandCallbacks.begin();
+	while (CallbackIter != m_CommandCallbacks.end()) {
+		// Iterator vor dem Aufruf erhöhen und im Folgendem auf einer Kopie arbeiten.
+		// Dieses Vorgehen ist notwendig da der Iterator möglicherweise von der Callbackfunktion durch das Deregistrieren des Callbacks
+		// invalidiert wird.
+		Common::List<CommandCallback>::const_iterator CurCallbackIter = CallbackIter;
+		++CallbackIter;
+
+		(*CurCallbackIter)(Command);
+	}
+}
+
+// -----------------------------------------------------------------------------
+// Persistenz
+// -----------------------------------------------------------------------------
+
+bool InputEngine::persist(OutputPersistenceBlock &writer) {
+	// Anzahl an Command-Callbacks persistieren.
+	writer.write(m_CommandCallbacks.size());
+
+	// Alle Command-Callbacks einzeln persistieren.
+	{
+		Common::List<CommandCallback>::const_iterator It = m_CommandCallbacks.begin();
+		while (It != m_CommandCallbacks.end()) {
+			writer.write(CallbackRegistry::getInstance().resolveCallbackPointer(*It));
+			++It;
+		}
+	}
+
+	// Anzahl an Character-Callbacks persistieren.
+	writer.write(m_CharacterCallbacks.size());
+
+	// Alle Character-Callbacks einzeln persistieren.
+	{
+		Common::List<CharacterCallback>::const_iterator It = m_CharacterCallbacks.begin();
+		while (It != m_CharacterCallbacks.end()) {
+			writer.write(CallbackRegistry::getInstance().resolveCallbackPointer(*It));
+			++It;
+		}
+	}
+
+	return true;
+}
+
+// -----------------------------------------------------------------------------
+
+bool InputEngine::unpersist(InputPersistenceBlock &reader) {
+	// Command-Callbackliste leeren.
+	m_CommandCallbacks.clear();
+
+	// Anzahl an Command-Callbacks lesen.
+	uint CommandCallbackCount;
+	reader.read(CommandCallbackCount);
+
+	// Alle Command-Callbacks wieder herstellen.
+	for (uint i = 0; i < CommandCallbackCount; ++i) {
+		Common::String CallbackFunctionName;
+		reader.read(CallbackFunctionName);
+
+		m_CommandCallbacks.push_back(reinterpret_cast<CommandCallback>(
+		                                 CallbackRegistry::getInstance().resolveCallbackFunction(CallbackFunctionName)));
+	}
+
+	// Character-Callbackliste leeren.
+	m_CharacterCallbacks.clear();
+
+	// Anzahl an Character-Callbacks lesen.
+	uint CharacterCallbackCount;
+	reader.read(CharacterCallbackCount);
+
+	// Alle Character-Callbacks wieder herstellen.
+	for (uint i = 0; i < CharacterCallbackCount; ++i) {
+		Common::String CallbackFunctionName;
+		reader.read(CallbackFunctionName);
+
+		m_CharacterCallbacks.push_back(reinterpret_cast<CharacterCallback>(CallbackRegistry::getInstance().resolveCallbackFunction(CallbackFunctionName)));
+	}
+
+	return reader.isGood();
+}
+
 } // End of namespace Sword25

Modified: scummvm/trunk/engines/sword25/input/inputengine.h
===================================================================
--- scummvm/trunk/engines/sword25/input/inputengine.h	2010-10-12 23:49:42 UTC (rev 53353)
+++ scummvm/trunk/engines/sword25/input/inputengine.h	2010-10-12 23:50:19 UTC (rev 53354)
@@ -58,7 +58,7 @@
 class InputEngine : public Service, public Persistable {
 public:
 	InputEngine(Kernel *pKernel);
-	virtual ~InputEngine() {};
+	~InputEngine() {};
 
 	// NOTE: These codes are registered in inputengine_script.cpp
 	// Any changes to these enums must also adjust the above file.
@@ -176,7 +176,7 @@
 	 * Initialises the input engine
 	 * @return          Returns a true on success, otherwise false.
 	 */
-	virtual bool Init() = 0;
+	bool Init();
 
 	/**
 	 * Performs a "tick" of the input engine.
@@ -185,17 +185,17 @@
 	 * of the input engine that are not running in their own thread, or to perform
 	 * additional administrative tasks that are needed.
 	 */
-	virtual void Update() = 0;
+	void Update();
 
 	/**
 	 * Returns true if the left mouse button is pressed
 	 */
-	virtual bool IsLeftMouseDown() = 0;
+	bool IsLeftMouseDown();
 
 	/**
 	 * Returns true if the right mouse button is pressed.
 	*/
-	virtual bool IsRightMouseDown() = 0;
+	bool IsRightMouseDown();
 
 	/**
 	 * Returns true if the left mouse button was pressed and released.
@@ -203,7 +203,7 @@
 	 * The difference between this and IsLeftMouseDown() is that this only returns
 	 * true when the left mouse button is released.
 	*/
-	virtual bool WasLeftMouseDown() = 0;
+	bool WasLeftMouseDown();
 
 	/**
 	 * Returns true if the right mouse button was pressed and released.
@@ -211,39 +211,39 @@
 	 * The difference between this and IsRightMouseDown() is that this only returns
 	 * true when the right mouse button is released.
 	*/
-	virtual bool WasRightMouseDown() = 0;
+	bool WasRightMouseDown();
 
 	/**
 	 * Returns true if the left mouse button double click was done
 	 */
-	virtual bool IsLeftDoubleClick() = 0;
+	bool IsLeftDoubleClick();
 
 	/**
 	 * Returns the X position of the cursor in pixels
 	*/
-	virtual int GetMouseX() = 0;
+	int GetMouseX();
 
 	/**
 	 * Returns the Y position of the cursor in pixels
 	 */
-	virtual int GetMouseY() = 0;
+	int GetMouseY();
 
 	/**
 	 * Sets the X position of the cursor in pixels
 	 */
-	virtual void SetMouseX(int PosX) = 0;
+	void SetMouseX(int PosX);
 
 	/**
 	 * Sets the Y position of the cursor in pixels
 	 */
-	virtual void SetMouseY(int PosY) = 0;
+	void SetMouseY(int PosY);
 
 	/**
 	 * Returns true if a given key was pressed
 	 * @param KeyCode       The key code to be checked
 	 * @return              Returns true if the given key is done, otherwise false.
 	 */
-	virtual bool IsKeyDown(uint KeyCode) = 0;
+	bool IsKeyDown(uint KeyCode);
 
 	/**
 	 * Returns true if a certain key was pushed and released.
@@ -253,7 +253,7 @@
 	 * strings that users type.
 	 * @param KeyCode       The key code to be checked
 	 */
-	virtual bool WasKeyDown(uint KeyCode) = 0;
+	bool WasKeyDown(uint KeyCode);
 
 	typedef CallbackPtr CharacterCallback;
 
@@ -269,13 +269,13 @@
 	 * The input of strings by the user through use of callbacks should be implemented.
 	 * @return              Returns true if the function was registered, otherwise false.
 	*/
-	virtual bool RegisterCharacterCallback(CallbackPtr Callback) = 0;
+	bool RegisterCharacterCallback(CallbackPtr Callback);
 
 	/**
 	 * De-registeres a previously registered callback function.
 	 * @return              Returns true if the function could be de-registered, otherwise false.
 	 */
-	virtual bool UnregisterCharacterCallback(CallbackPtr Callback) = 0;
+	bool UnregisterCharacterCallback(CallbackPtr Callback);
 
 	typedef CallbackPtr CommandCallback;
 
@@ -288,19 +288,44 @@
 	 * The input of strings by the user through the use of callbacks should be implemented.
 	 * @return              Returns true if the function was registered, otherwise false.
 	 */
-	virtual bool RegisterCommandCallback(CallbackPtr Callback) = 0;
+	bool RegisterCommandCallback(CallbackPtr Callback);
 
 	/**
 	 * Un-register a callback function for the input of commands that can have an influence on the string input.
 	 * @return              Returns true if the function could be de-registered, otherwise false.
 	 */
-	virtual bool UnregisterCommandCallback(CommandCallback Callback) = 0;
+	bool UnregisterCommandCallback(CommandCallback Callback);
 
-	virtual void ReportCharacter(byte Character) = 0;
-	virtual void ReportCommand(KEY_COMMANDS Command) = 0;
+	void ReportCharacter(byte Character);
+	void ReportCommand(KEY_COMMANDS Command);
 
+	bool persist(OutputPersistenceBlock &writer);
+	bool unpersist(InputPersistenceBlock &reader);
+
 private:
-	bool _RegisterScriptBindings();
+	bool registerScriptBindings();
+
+private:
+	void TestForLeftDoubleClick();
+	void AlterKeyboardState(int keycode, byte newState);
+
+	byte                            m_KeyboardState[2][256];
+	bool                            m_LeftMouseState[2];
+	bool                            m_RightMouseState[2];
+	uint                    m_CurrentState;
+	int                             m_MouseX;
+	int                             m_MouseY;
+	bool                            m_LeftMouseDown;
+	bool                            m_RightMouseDown;
+	bool                            m_LeftDoubleClick;
+	uint                    m_DoubleClickTime;
+	int                             m_DoubleClickRectWidth;
+	int                             m_DoubleClickRectHeight;
+	uint                    m_LastLeftClickTime;
+	int                             m_LastLeftClickMouseX;
+	int                             m_LastLeftClickMouseY;
+	Common::List<CommandCallback>       m_CommandCallbacks;
+	Common::List<CharacterCallback> m_CharacterCallbacks;
 };
 
 } // End of namespace Sword25

Modified: scummvm/trunk/engines/sword25/input/inputengine_script.cpp
===================================================================
--- scummvm/trunk/engines/sword25/input/inputengine_script.cpp	2010-10-12 23:49:42 UTC (rev 53353)
+++ scummvm/trunk/engines/sword25/input/inputengine_script.cpp	2010-10-12 23:50:19 UTC (rev 53354)
@@ -335,7 +335,7 @@
 
 // -----------------------------------------------------------------------------
 
-bool InputEngine::_RegisterScriptBindings() {
+bool InputEngine::registerScriptBindings() {
 	Kernel *pKernel = Kernel::GetInstance();
 	BS_ASSERT(pKernel);
 	ScriptEngine *pScript = static_cast<ScriptEngine *>(pKernel->GetService("script"));

Deleted: scummvm/trunk/engines/sword25/input/scummvminput.cpp
===================================================================
--- scummvm/trunk/engines/sword25/input/scummvminput.cpp	2010-10-12 23:49:42 UTC (rev 53353)
+++ scummvm/trunk/engines/sword25/input/scummvminput.cpp	2010-10-12 23:50:19 UTC (rev 53354)
@@ -1,403 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-/*
- * This code is based on Broken Sword 2.5 engine
- *
- * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer
- *
- * Licensed under GNU GPL v2
- *
- */
-
-#include "common/algorithm.h"
-#include "common/events.h"
-#include "common/system.h"
-#include "common/util.h"
-#include "sword25/kernel/kernel.h"
-#include "sword25/kernel/callbackregistry.h"
-#include "sword25/kernel/inputpersistenceblock.h"
-#include "sword25/kernel/outputpersistenceblock.h"
-#include "sword25/input/scummvminput.h"
-
-#define BS_LOG_PREFIX "SCUMMVMINPUT"
-
-namespace Sword25 {
-
-#define DOUBLE_CLICK_TIME 500
-#define DOUBLE_CLICK_RECT_SIZE 4
-
-// -----------------------------------------------------------------------------
-// Constructor / Destructor
-// -----------------------------------------------------------------------------
-
-ScummVMInput::ScummVMInput(Kernel *pKernel) :
-	m_CurrentState(0),
-	m_LeftMouseDown(false),
-	m_RightMouseDown(false),
-	m_MouseX(0),
-	m_MouseY(0),
-	m_LeftDoubleClick(false),
-	m_DoubleClickTime(DOUBLE_CLICK_TIME),
-	m_DoubleClickRectWidth(DOUBLE_CLICK_RECT_SIZE),
-	m_DoubleClickRectHeight(DOUBLE_CLICK_RECT_SIZE),
-	m_LastLeftClickTime(0),
-	m_LastLeftClickMouseX(0),
-	m_LastLeftClickMouseY(0),
-	InputEngine(pKernel) {
-	memset(m_KeyboardState[0], 0, sizeof(m_KeyboardState[0]));
-	memset(m_KeyboardState[1], 0, sizeof(m_KeyboardState[1]));
-	m_LeftMouseState[0] = false;
-	m_LeftMouseState[1] = false;
-	m_RightMouseState[0] = false;
-	m_RightMouseState[1] = false;
-}
-
-ScummVMInput::~ScummVMInput() {
-}
-
-// -----------------------------------------------------------------------------
-
-Service *ScummVMInput_CreateObject(Kernel *pKernel) {
-	return new ScummVMInput(pKernel);
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::Init() {
-	// No initialisation needed
-	return true;
-}
-
-// -----------------------------------------------------------------------------
-
-void ScummVMInput::Update() {
-	Common::Event event;
-	m_CurrentState ^= 1;
-
-	// Loop through processing any pending events
-	bool handleEvents = true;
-	while (handleEvents && g_system->getEventManager()->pollEvent(event)) {
-		switch (event.type) {
-		case Common::EVENT_LBUTTONDOWN:
-		case Common::EVENT_LBUTTONUP:
-			m_LeftMouseDown = event.type == Common::EVENT_LBUTTONDOWN;
-			m_MouseX = event.mouse.x;
-			m_MouseY = event.mouse.y;
-			handleEvents = false;
-			break;
-		case Common::EVENT_RBUTTONDOWN:
-		case Common::EVENT_RBUTTONUP:
-			m_RightMouseDown = event.type == Common::EVENT_RBUTTONDOWN;
-			m_MouseX = event.mouse.x;
-			m_MouseY = event.mouse.y;
-			handleEvents = false;
-			break;
-
-		case Common::EVENT_MOUSEMOVE:
-			m_MouseX = event.mouse.x;
-			m_MouseY = event.mouse.y;
-			break;
-
-		case Common::EVENT_KEYDOWN:
-		case Common::EVENT_KEYUP:
-			AlterKeyboardState(event.kbd.keycode, (event.type == Common::EVENT_KEYDOWN) ? 0x80 : 0);
-			break;
-
-		case Common::EVENT_QUIT:
-			Kernel::GetInstance()->GetWindow()->SetWindowAlive(false);
-			break;
-
-		default:
-			break;
-		}
-	}
-
-	m_LeftMouseState[m_CurrentState] = m_LeftMouseDown;
-	m_RightMouseState[m_CurrentState] = m_RightMouseDown;
-
-	TestForLeftDoubleClick();
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::IsLeftMouseDown() {
-	return m_LeftMouseDown;
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::IsRightMouseDown() {
-	return m_RightMouseDown;
-}
-
-// -----------------------------------------------------------------------------
-
-void ScummVMInput::TestForLeftDoubleClick() {
-	m_LeftDoubleClick = false;
-
-	// Only bother checking for a double click if the left mouse button was clicked
-	if (WasLeftMouseDown()) {
-		// Get the time now
-		uint Now = Kernel::GetInstance()->GetMilliTicks();
-
-		// A double click is signalled if
-		// 1. The two clicks are close enough together
-		// 2. The mouse cursor hasn't moved much
-		if (Now - m_LastLeftClickTime <= m_DoubleClickTime &&
-		        ABS(m_MouseX - m_LastLeftClickMouseX) <= m_DoubleClickRectWidth / 2 &&
-		        ABS(m_MouseY - m_LastLeftClickMouseY) <= m_DoubleClickRectHeight / 2) {
-			m_LeftDoubleClick = true;
-
-			// Reset the time and position of the last click, so that clicking is not
-			// interpreted as the first click of a further double-click
-			m_LastLeftClickTime = 0;
-			m_LastLeftClickMouseX = 0;
-			m_LastLeftClickMouseY = 0;
-		} else {
-			// There is no double click. Remember the position and time of the click,
-			// in case it's the first click of a double-click sequence
-			m_LastLeftClickTime = Now;
-			m_LastLeftClickMouseX = m_MouseX;
-			m_LastLeftClickMouseY = m_MouseY;
-		}
-	}
-}
-
-// -----------------------------------------------------------------------------
-
-void ScummVMInput::AlterKeyboardState(int keycode, byte newState) {
-	m_KeyboardState[m_CurrentState][keycode] = newState;
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::IsLeftDoubleClick() {
-	return m_LeftDoubleClick;
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::WasLeftMouseDown() {
-	return (m_LeftMouseState[m_CurrentState] == false) && (m_LeftMouseState[m_CurrentState ^ 1] == true);
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::WasRightMouseDown() {
-	return (m_RightMouseState[m_CurrentState] == false) && (m_RightMouseState[m_CurrentState ^ 1] == true);
-}
-
-// -----------------------------------------------------------------------------
-
-int ScummVMInput::GetMouseX() {
-	return m_MouseX;
-}
-
-// -----------------------------------------------------------------------------
-
-int ScummVMInput::GetMouseY() {
-	return m_MouseY;
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::IsKeyDown(uint KeyCode) {
-	return (m_KeyboardState[m_CurrentState][KeyCode] & 0x80) != 0;
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::WasKeyDown(uint KeyCode) {
-	return ((m_KeyboardState[m_CurrentState][KeyCode] & 0x80) == 0) &&
-	       ((m_KeyboardState[m_CurrentState ^ 1][KeyCode] & 0x80) != 0);
-}
-
-// -----------------------------------------------------------------------------
-
-void ScummVMInput::SetMouseX(int PosX) {
-	m_MouseX = PosX;
-	g_system->warpMouse(m_MouseX, m_MouseY);
-}
-
-// -----------------------------------------------------------------------------
-
-void ScummVMInput::SetMouseY(int PosY) {
-	m_MouseY = PosY;
-	g_system->warpMouse(m_MouseX, m_MouseY);
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::RegisterCharacterCallback(CharacterCallback Callback) {
-	if (Common::find(m_CharacterCallbacks.begin(), m_CharacterCallbacks.end(), Callback) == m_CharacterCallbacks.end()) {
-		m_CharacterCallbacks.push_back(Callback);
-		return true;
-	} else {
-		BS_LOG_WARNINGLN("Tried to register an CharacterCallback that was already registered.");
-		return false;
-	}
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::UnregisterCharacterCallback(CharacterCallback Callback) {
-	Common::List<CharacterCallback>::iterator CallbackIter = Common::find(m_CharacterCallbacks.begin(),
-	        m_CharacterCallbacks.end(), Callback);
-	if (CallbackIter != m_CharacterCallbacks.end()) {
-		m_CharacterCallbacks.erase(CallbackIter);
-		return true;
-	} else {
-		BS_LOG_WARNINGLN("Tried to unregister an CharacterCallback that was not previously registered.");
-		return false;
-	}
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::RegisterCommandCallback(CommandCallback Callback) {
-	if (Common::find(m_CommandCallbacks.begin(), m_CommandCallbacks.end(), Callback) == m_CommandCallbacks.end()) {
-		m_CommandCallbacks.push_back(Callback);
-		return true;
-	} else {
-		BS_LOG_WARNINGLN("Tried to register an CommandCallback that was already registered.");
-		return false;
-	}
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::UnregisterCommandCallback(CommandCallback Callback) {
-	Common::List<CommandCallback>::iterator CallbackIter =
-	    Common::find(m_CommandCallbacks.begin(), m_CommandCallbacks.end(), Callback);
-	if (CallbackIter != m_CommandCallbacks.end()) {
-		m_CommandCallbacks.erase(CallbackIter);
-		return true;
-	} else {
-		BS_LOG_WARNINGLN("Tried to unregister an CommandCallback that was not previously registered.");
-		return false;
-	}
-}
-
-// -----------------------------------------------------------------------------
-
-void ScummVMInput::ReportCharacter(byte Character) {
-	Common::List<CharacterCallback>::const_iterator CallbackIter = m_CharacterCallbacks.begin();
-	while (CallbackIter != m_CharacterCallbacks.end()) {
-		// Iterator vor dem Aufruf erh\xF6hen und im Folgendem auf einer Kopie arbeiten.
-		// Dieses Vorgehen ist notwendig da der Iterator m\xF6glicherweise von der Callbackfunktion durch das Deregistrieren des Callbacks
-		// invalidiert wird.
-		Common::List<CharacterCallback>::const_iterator CurCallbackIter = CallbackIter;
-		++CallbackIter;
-
-		(*CurCallbackIter)(Character);
-	}
-}
-
-// -----------------------------------------------------------------------------
-
-void ScummVMInput::ReportCommand(KEY_COMMANDS Command) {
-	Common::List<CommandCallback>::const_iterator CallbackIter = m_CommandCallbacks.begin();
-	while (CallbackIter != m_CommandCallbacks.end()) {
-		// Iterator vor dem Aufruf erh\xF6hen und im Folgendem auf einer Kopie arbeiten.
-		// Dieses Vorgehen ist notwendig da der Iterator m\xF6glicherweise von der Callbackfunktion durch das Deregistrieren des Callbacks
-		// invalidiert wird.
-		Common::List<CommandCallback>::const_iterator CurCallbackIter = CallbackIter;
-		++CallbackIter;
-
-		(*CurCallbackIter)(Command);
-	}
-}
-
-// -----------------------------------------------------------------------------
-// Persistenz
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::persist(OutputPersistenceBlock &writer) {
-	// Anzahl an Command-Callbacks persistieren.
-	writer.write(m_CommandCallbacks.size());
-
-	// Alle Command-Callbacks einzeln persistieren.
-	{
-		Common::List<CommandCallback>::const_iterator It = m_CommandCallbacks.begin();
-		while (It != m_CommandCallbacks.end()) {
-			writer.write(CallbackRegistry::getInstance().resolveCallbackPointer(*It));
-			++It;
-		}
-	}
-
-	// Anzahl an Character-Callbacks persistieren.
-	writer.write(m_CharacterCallbacks.size());
-
-	// Alle Character-Callbacks einzeln persistieren.
-	{
-		Common::List<CharacterCallback>::const_iterator It = m_CharacterCallbacks.begin();
-		while (It != m_CharacterCallbacks.end()) {
-			writer.write(CallbackRegistry::getInstance().resolveCallbackPointer(*It));
-			++It;
-		}
-	}
-
-	return true;
-}
-
-// -----------------------------------------------------------------------------
-
-bool ScummVMInput::unpersist(InputPersistenceBlock &reader) {
-	// Command-Callbackliste leeren.
-	m_CommandCallbacks.clear();
-
-	// Anzahl an Command-Callbacks lesen.
-	uint CommandCallbackCount;
-	reader.read(CommandCallbackCount);
-
-	// Alle Command-Callbacks wieder herstellen.
-	for (uint i = 0; i < CommandCallbackCount; ++i) {
-		Common::String CallbackFunctionName;
-		reader.read(CallbackFunctionName);
-
-		m_CommandCallbacks.push_back(reinterpret_cast<CommandCallback>(
-		                                 CallbackRegistry::getInstance().resolveCallbackFunction(CallbackFunctionName)));
-	}
-
-	// Character-Callbackliste leeren.
-	m_CharacterCallbacks.clear();
-
-	// Anzahl an Character-Callbacks lesen.
-	uint CharacterCallbackCount;
-	reader.read(CharacterCallbackCount);
-
-	// Alle Character-Callbacks wieder herstellen.
-	for (uint i = 0; i < CharacterCallbackCount; ++i) {
-		Common::String CallbackFunctionName;
-		reader.read(CallbackFunctionName);
-
-		m_CharacterCallbacks.push_back(reinterpret_cast<CharacterCallback>(CallbackRegistry::getInstance().resolveCallbackFunction(CallbackFunctionName)));
-	}
-
-	return reader.isGood();
-}
-
-} // End of namespace Sword25

Deleted: scummvm/trunk/engines/sword25/input/scummvminput.h
===================================================================
--- scummvm/trunk/engines/sword25/input/scummvminput.h	2010-10-12 23:49:42 UTC (rev 53353)
+++ scummvm/trunk/engines/sword25/input/scummvminput.h	2010-10-12 23:50:19 UTC (rev 53354)
@@ -1,103 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-/*
- * This code is based on Broken Sword 2.5 engine
- *
- * Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdoerfer
- *
- * Licensed under GNU GPL v2
- *
- */
-
-#ifndef SWORD25_STDWININPUT_H
-#define SWORD25_STDWININPUT_H
-
-/// Includes
-#include "common/scummsys.h"
-#include "common/list.h"
-#include "sword25/kernel/common.h"
-#include "sword25/input/inputengine.h"
-
-namespace Sword25 {
-
-/// Forward class definitions
-class Kernel;
-
-/// Class definitions
-class ScummVMInput : public InputEngine {
-public:
-	ScummVMInput(Kernel *pKernel);
-	virtual ~ScummVMInput();
-
-	virtual bool Init();
-	virtual void Update();
-	virtual bool IsLeftMouseDown();
-	virtual bool IsRightMouseDown();
-	virtual bool WasLeftMouseDown();
-	virtual bool WasRightMouseDown();
-	virtual bool IsLeftDoubleClick();
-	virtual int GetMouseX();
-	virtual int GetMouseY();
-	virtual bool IsKeyDown(uint KeyCode);
-	virtual bool WasKeyDown(uint KeyCode);
-	virtual void SetMouseX(int PosX);
-	virtual void SetMouseY(int PosY);
-	virtual bool RegisterCharacterCallback(CallbackPtr Callback);
-	virtual bool UnregisterCharacterCallback(CallbackPtr Callback);
-	virtual bool RegisterCommandCallback(CallbackPtr Callback);
-	virtual bool UnregisterCommandCallback(CallbackPtr Callback);
-	virtual void ReportCharacter(byte Character);
-	virtual void ReportCommand(KEY_COMMANDS Command);
-
-	bool persist(OutputPersistenceBlock &writer);
-	bool unpersist(InputPersistenceBlock &reader);
-
-private:
-	void TestForLeftDoubleClick();
-	void AlterKeyboardState(int keycode, byte newState);
-
-	byte                            m_KeyboardState[2][256];
-	bool                            m_LeftMouseState[2];
-	bool                            m_RightMouseState[2];
-	uint                    m_CurrentState;
-	int                             m_MouseX;
-	int                             m_MouseY;
-	bool                            m_LeftMouseDown;
-	bool                            m_RightMouseDown;
-	bool                            m_LeftDoubleClick;
-	uint                    m_DoubleClickTime;
-	int                             m_DoubleClickRectWidth;
-	int                             m_DoubleClickRectHeight;
-	uint                    m_LastLeftClickTime;
-	int                             m_LastLeftClickMouseX;
-	int                             m_LastLeftClickMouseY;
-	Common::List<CommandCallback>       m_CommandCallbacks;
-	Common::List<CharacterCallback> m_CharacterCallbacks;
-};
-
-} // End of namespace Sword25
-
-#endif

Modified: scummvm/trunk/engines/sword25/kernel/service_ids.h
===================================================================
--- scummvm/trunk/engines/sword25/kernel/service_ids.h	2010-10-12 23:49:42 UTC (rev 53353)
+++ scummvm/trunk/engines/sword25/kernel/service_ids.h	2010-10-12 23:50:19 UTC (rev 53354)
@@ -51,7 +51,7 @@
 
 Service *OpenGLGfx_CreateObject(Kernel *pKernel);
 Service *PackageManager_CreateObject(Kernel *pKernel);
-Service *ScummVMInput_CreateObject(Kernel *pKernel);
+Service *InputEngine_CreateObject(Kernel *pKernel);
 Service *FMODExSound_CreateObject(Kernel *pKernel);
 Service *LuaScriptEngine_CreateObject(Kernel *pKernel);
 Service *Geometry_CreateObject(Kernel *pKernel);
@@ -66,7 +66,7 @@
 	// BS_ServiceInfo("Superclass", "Service", CreateMethod)
 	BS_ServiceInfo("gfx", "opengl", OpenGLGfx_CreateObject),
 	BS_ServiceInfo("package", "archiveFS", PackageManager_CreateObject),
-	BS_ServiceInfo("input", "winapi", ScummVMInput_CreateObject),
+	BS_ServiceInfo("input", "winapi", InputEngine_CreateObject),
 	BS_ServiceInfo("sfx", "fmodex", FMODExSound_CreateObject),
 	BS_ServiceInfo("script", "lua", LuaScriptEngine_CreateObject),
 	BS_ServiceInfo("geometry", "std", Geometry_CreateObject),

Modified: scummvm/trunk/engines/sword25/module.mk
===================================================================
--- scummvm/trunk/engines/sword25/module.mk	2010-10-12 23:49:42 UTC (rev 53353)
+++ scummvm/trunk/engines/sword25/module.mk	2010-10-12 23:50:19 UTC (rev 53354)
@@ -43,7 +43,6 @@
 	gfx/opengl/swimage.o \
 	input/inputengine.o \
 	input/inputengine_script.o \
-	input/scummvminput.o \
 	kernel/callbackregistry.o \
 	kernel/filesystemutil.o \
 	kernel/inputpersistenceblock.o \


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list