[Scummvm-git-logs] scummvm master -> 806e5827f1599d650836546b7abadc7d61d0bc28

dreammaster dreammaster at scummvm.org
Wed Nov 9 02:11:17 CET 2016


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
806e5827f1 TITANIC: Fix spurious drag starts happening after view changes


Commit: 806e5827f1599d650836546b7abadc7d61d0bc28
    https://github.com/scummvm/scummvm/commit/806e5827f1599d650836546b7abadc7d61d0bc28
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2016-11-08T20:11:11-05:00

Commit Message:
TITANIC: Fix spurious drag starts happening after view changes

Changed paths:
    engines/titanic/events.cpp
    engines/titanic/events.h
    engines/titanic/game_state.cpp
    engines/titanic/input_translator.cpp
    engines/titanic/main_game_window.cpp
    engines/titanic/main_game_window.h
    engines/titanic/pet_control/pet_rooms_glyphs.cpp



diff --git a/engines/titanic/events.cpp b/engines/titanic/events.cpp
index 6ca1b61..89ad338 100644
--- a/engines/titanic/events.cpp
+++ b/engines/titanic/events.cpp
@@ -31,7 +31,7 @@
 namespace Titanic {
 
 Events::Events(TitanicEngine *vm): _vm(vm), _frameCounter(1),
-		_priorFrameTime(0) {
+		_priorFrameTime(0), _specialButtons(0) {
 }
 
 void Events::pollEvents() {
@@ -47,26 +47,32 @@ void Events::pollEvents() {
 		eventTarget()->mouseMove(_mousePos);
 		break;
 	case Common::EVENT_LBUTTONDOWN:
+		_specialButtons |= MK_LBUTTON;
 		_mousePos = event.mouse;
 		eventTarget()->leftButtonDown(_mousePos);
 		break;
 	case Common::EVENT_LBUTTONUP:
+		_specialButtons &= ~MK_LBUTTON;
 		_mousePos = event.mouse;
 		eventTarget()->leftButtonUp(_mousePos);
 		break;
 	case Common::EVENT_MBUTTONDOWN:
+		_specialButtons |= MK_MBUTTON;
 		_mousePos = event.mouse;
 		eventTarget()->middleButtonDown(_mousePos);
 		break;
 	case Common::EVENT_MBUTTONUP:
+		_specialButtons &= ~MK_MBUTTON;
 		_mousePos = event.mouse;
 		eventTarget()->middleButtonUp(_mousePos);
 		break;
 	case Common::EVENT_RBUTTONDOWN:
+		_specialButtons |= MK_RBUTTON;
 		_mousePos = event.mouse;
 		eventTarget()->rightButtonDown(_mousePos);
 		break;
 	case Common::EVENT_RBUTTONUP:
+		_specialButtons &= ~MK_RBUTTON;
 		_mousePos = event.mouse;
 		eventTarget()->rightButtonUp(_mousePos);
 		break;
@@ -76,9 +82,11 @@ void Events::pollEvents() {
 		eventTarget()->mouseWheel(_mousePos, event.type == Common::EVENT_WHEELUP);
 		break;
 	case Common::EVENT_KEYDOWN:
+		handleKbdSpecial(event.kbd);
 		eventTarget()->keyDown(event.kbd);
 		break;
 	case Common::EVENT_KEYUP:
+		handleKbdSpecial(event.kbd);
 		eventTarget()->keyUp(event.kbd);
 		break;
 	default:
@@ -132,29 +140,15 @@ void Events::sleep(uint time) {
 bool Events::waitForPress(uint expiry) {
 	CGameManager *gameManager = g_vm->_window->_gameManager;
 	uint32 delayEnd = g_system->getMillis() + expiry;
+	CPressTarget pressTarget;
+	addTarget(&pressTarget);
 
-	while (!_vm->shouldQuit() && g_system->getMillis() < delayEnd) {
-		g_system->delayMillis(10);
-		checkForNextFrameCounter();
-
-		// Regularly update the sound mixer
-		if (gameManager)
-			gameManager->_sound.updateMixer();
-
-		Common::Event event;
-		if (g_system->getEventManager()->pollEvent(event)) {
-			switch (event.type) {
-			case Common::EVENT_LBUTTONDOWN:
-			case Common::EVENT_MBUTTONDOWN:
-			case Common::EVENT_KEYDOWN:
-				return true;
-			default:
-				break;
-			}
-		}
+	while (!_vm->shouldQuit() && g_system->getMillis() < delayEnd && !pressTarget._pressed) {
+		pollEventsAndWait();
 	}
 
-	return false;
+	removeTarget();
+	return pressTarget._pressed;
 }
 
 void Events::setMousePos(const Common::Point &pt) {
@@ -163,4 +157,16 @@ void Events::setMousePos(const Common::Point &pt) {
 	eventTarget()->mouseMove(_mousePos);
 }
 
+void Events::handleKbdSpecial(Common::KeyState keyState) {
+	if (keyState.flags & Common::KBD_CTRL)
+		_specialButtons |= MK_CONTROL;
+	else
+		_specialButtons &= ~MK_CONTROL;
+
+	if (keyState.flags & Common::KBD_SHIFT)
+		_specialButtons |= MK_SHIFT;
+	else
+		_specialButtons &= ~MK_SHIFT;
+}
+
 } // End of namespace Titanic
diff --git a/engines/titanic/events.h b/engines/titanic/events.h
index 03b2715..52e900c 100644
--- a/engines/titanic/events.h
+++ b/engines/titanic/events.h
@@ -70,6 +70,21 @@ public:
 	virtual void keyUp(Common::KeyState keyState) {}
 };
 
+/**
+ * An eent target used for waiting for a mouse or keypress
+ */
+class CPressTarget : public CEventTarget {
+public:
+	bool _pressed;
+public:
+	CPressTarget() : _pressed(false) {}
+	virtual ~CPressTarget() {}
+	virtual void leftButtonDown(const Point &mousePos) { _pressed = true; }
+	virtual void middleButtonDown(const Point &mousePos) { _pressed = true; }
+	virtual void rightButtonDown(const Point &mousePos) { _pressed = true; }
+	virtual void keyDown(Common::KeyState keyState) { _pressed = true; }
+};
+
 class Events {
 private:
 	TitanicEngine *_vm;
@@ -77,6 +92,7 @@ private:
 	uint32 _frameCounter;
 	uint32 _priorFrameTime;
 	Common::Point _mousePos;
+	uint _specialButtons;
 
 	/**
 	 * Check whether it's time to display the next screen frame
@@ -89,6 +105,11 @@ private:
 	CEventTarget *eventTarget() const {
 		return _eventTargets.top();
 	}
+
+	/**
+	 * Handles setting/resettings special buttons on key up/down
+	 */
+	void handleKbdSpecial(Common::KeyState keyState);
 public:
 	Events(TitanicEngine *vm);
 	~Events() {}
@@ -149,6 +170,18 @@ public:
 	 * Sets the mouse position
 	 */
 	void setMousePos(const Common::Point &pt);
+
+	/*
+	 * Return whether a given special key is currently pressed
+	 */
+	bool isSpecialPressed(SpecialButtons btn) const {
+		return (_specialButtons & btn) != 0;
+	}
+
+	/**
+	 * Returns the bitset of the currently pressed special buttons
+	 */
+	uint getSpecialButtons() const { return _specialButtons; }
 };
 
 } // End of namespace Titanic
diff --git a/engines/titanic/game_state.cpp b/engines/titanic/game_state.cpp
index ecff021..5b6d34a 100644
--- a/engines/titanic/game_state.cpp
+++ b/engines/titanic/game_state.cpp
@@ -129,7 +129,7 @@ void CGameState::changeView(CViewItem *newView, CMovieClip *clip) {
 	oldView->leaveView(newView);
 
 	// If Shift key is pressed, skip showing the transition clip
-	if (g_vm->_window->isSpecialPressed(MK_SHIFT))
+	if (g_vm->_events->isSpecialPressed(MK_SHIFT))
 		clip = nullptr;
 
 	if (_mode == GSMODE_CUTSCENE) {
diff --git a/engines/titanic/input_translator.cpp b/engines/titanic/input_translator.cpp
index a909b80..0f717de 100644
--- a/engines/titanic/input_translator.cpp
+++ b/engines/titanic/input_translator.cpp
@@ -113,7 +113,7 @@ void CInputTranslator::keyDown(const Common::KeyState &keyState) {
 }
 
 bool CInputTranslator::isMousePressed() const {
-	return g_vm->_window->getSpecialButtons() & (MK_LBUTTON | MK_RBUTTON | MK_MBUTTON);
+	return g_vm->_events->getSpecialButtons() & (MK_LBUTTON | MK_RBUTTON | MK_MBUTTON);
 }
 
 } // End of namespace Titanic
diff --git a/engines/titanic/main_game_window.cpp b/engines/titanic/main_game_window.cpp
index 6438929..de0ac71 100644
--- a/engines/titanic/main_game_window.cpp
+++ b/engines/titanic/main_game_window.cpp
@@ -32,8 +32,7 @@
 namespace Titanic {
 
 CMainGameWindow::CMainGameWindow(TitanicEngine *vm): _vm(vm),
-		_specialButtons(0), _priorLeftDownTime(0),
-		_priorMiddleDownTime(0), _priorRightDownTime(0) {
+		_priorLeftDownTime(0), _priorMiddleDownTime(0), _priorRightDownTime(0) {
 	_gameView = nullptr;
 	_gameManager = nullptr;
 	_project = nullptr;
@@ -248,7 +247,7 @@ void CMainGameWindow::onIdle() {
 }
 
 #define HANDLE_MESSAGE(METHOD) 	if (_inputAllowed) { \
-	_gameManager->_inputTranslator.METHOD(_specialButtons, mousePos); \
+	_gameManager->_inputTranslator.METHOD(g_vm->_events->getSpecialButtons(), mousePos); \
 	mouseChanged(); \
 	}
 
@@ -264,8 +263,6 @@ void CMainGameWindow::leftButtonDown(const Point &mousePos) {
 	if (!isMouseControlEnabled())
 		return;
 
-	_specialButtons |= MK_LBUTTON;
-
 	if ((_vm->_events->getTicksCount() - _priorLeftDownTime) < DOUBLE_CLICK_TIME) {
 		_priorLeftDownTime = 0;
 		leftButtonDoubleClick(mousePos);
@@ -279,7 +276,6 @@ void CMainGameWindow::leftButtonUp(const Point &mousePos) {
 	if (!isMouseControlEnabled())
 		return;
 
-	_specialButtons &= ~MK_LBUTTON;
 	HANDLE_MESSAGE(leftButtonUp)
 }
 
@@ -294,8 +290,6 @@ void CMainGameWindow::middleButtonDown(const Point &mousePos) {
 	if (!isMouseControlEnabled())
 		return;
 
-	_specialButtons |= MK_MBUTTON;
-
 	if ((_vm->_events->getTicksCount() - _priorMiddleDownTime) < DOUBLE_CLICK_TIME) {
 		_priorMiddleDownTime = 0;
 		middleButtonDoubleClick(mousePos);
@@ -309,7 +303,6 @@ void CMainGameWindow::middleButtonUp(const Point &mousePos) {
 	if (!isMouseControlEnabled())
 		return;
 
-	_specialButtons &= ~MK_MBUTTON;
 	HANDLE_MESSAGE(middleButtonUp)
 }
 
@@ -324,8 +317,6 @@ void CMainGameWindow::rightButtonDown(const Point &mousePos) {
 	if (!isMouseControlEnabled())
 		return;
 
-	_specialButtons |= MK_RBUTTON;
-
 	if ((_vm->_events->getTicksCount() - _priorRightDownTime) < DOUBLE_CLICK_TIME) {
 		_priorRightDownTime = 0;
 		rightButtonDoubleClick(mousePos);
@@ -339,7 +330,6 @@ void CMainGameWindow::rightButtonUp(const Point &mousePos) {
 	if (!isMouseControlEnabled())
 		return;
 
-	_specialButtons &= ~MK_RBUTTON;
 	HANDLE_MESSAGE(rightButtonUp)
 }
 
@@ -359,8 +349,6 @@ void CMainGameWindow::rightButtonDoubleClick(const Point &mousePos) {
 }
 
 void CMainGameWindow::keyDown(Common::KeyState keyState) {
-	handleKbdSpecial(keyState);
-
 	if (keyState.keycode == Common::KEYCODE_d && (keyState.flags & Common::KBD_CTRL)) {
 		// Attach to the debugger
 		_vm->_debugger->attach();
@@ -371,22 +359,6 @@ void CMainGameWindow::keyDown(Common::KeyState keyState) {
 		_gameManager->_inputTranslator.keyDown(keyState);
 }
 
-void CMainGameWindow::keyUp(Common::KeyState keyState) {
-	handleKbdSpecial(keyState);
-}
-
-void CMainGameWindow::handleKbdSpecial(Common::KeyState keyState) {
-	if (keyState.flags & Common::KBD_CTRL)
-		_specialButtons |= MK_CONTROL;
-	else
-		_specialButtons &= ~MK_CONTROL;
-
-	if (keyState.flags & Common::KBD_SHIFT)
-		_specialButtons |= MK_SHIFT;
-	else
-		_specialButtons &= ~MK_SHIFT;
-}
-
 bool CMainGameWindow::isMouseControlEnabled() const {
 	CScreenManager *screenMan = CScreenManager::_screenManagerPtr;
 	if (!screenMan || !screenMan->_mouseCursor)
diff --git a/engines/titanic/main_game_window.h b/engines/titanic/main_game_window.h
index c70aa47..52d4267 100644
--- a/engines/titanic/main_game_window.h
+++ b/engines/titanic/main_game_window.h
@@ -39,7 +39,6 @@ class CMainGameWindow : public CEventTarget {
 private:
 	TitanicEngine *_vm;
 	int _pendingLoadSlot;
-	uint _specialButtons;
 	uint32 _priorLeftDownTime;
 	uint32 _priorMiddleDownTime;
 	uint32 _priorRightDownTime;
@@ -74,7 +73,6 @@ private:
 	void leftButtonDoubleClick(const Point &mousePos);
 	void middleButtonDoubleClick(const Point &mousePos);
 	void rightButtonDoubleClick(const Point &mousePos);
-	void handleKbdSpecial(Common::KeyState keyState);
 
 	/**
 	 * Returns true if the player can control the mouse
@@ -105,7 +103,6 @@ public:
 	virtual void rightButtonUp(const Point &mousePos);
 	virtual void mouseWheel(const Point &mousePos, bool wheelUp);
 	virtual void keyDown(Common::KeyState keyState);
-	virtual void keyUp(Common::KeyState keyState);
 
 	/**
 	 * Called when the application starts
@@ -131,18 +128,6 @@ public:
 	 * Schedules a savegame to be loaded
 	 */
 	void loadGame(int slotId);
-
-	/*
-	 * Return whether a given special key is currently pressed
-	 */
-	bool isSpecialPressed(SpecialButtons btn) const {
-		return (_specialButtons & btn) != 0;
-	}
-
-	/**
-	 * Returns the bitset of the currently pressed special buttons
-	 */
-	uint getSpecialButtons() const { return _specialButtons; }
 };
 
 } // End of namespace Titanic
diff --git a/engines/titanic/pet_control/pet_rooms_glyphs.cpp b/engines/titanic/pet_control/pet_rooms_glyphs.cpp
index 6855e5b..0f7a582 100644
--- a/engines/titanic/pet_control/pet_rooms_glyphs.cpp
+++ b/engines/titanic/pet_control/pet_rooms_glyphs.cpp
@@ -103,7 +103,7 @@ void CPetRoomsGlyph::drawAt(CScreenManager *screenManager, const Point &pt, bool
 
 void CPetRoomsGlyph::selectGlyph(const Point &topLeft, const Point &pt) {
 	if (!isAssigned()) {
-		bool isShiftPressed = g_vm->_window->getSpecialButtons() & MK_SHIFT;
+		bool isShiftPressed = g_vm->_events->getSpecialButtons() & MK_SHIFT;
 
 		if (isShiftPressed) {
 			int selection = getSelection(topLeft, pt);
@@ -116,7 +116,7 @@ void CPetRoomsGlyph::selectGlyph(const Point &topLeft, const Point &pt) {
 }
 
 bool CPetRoomsGlyph::dragGlyph(const Point &topLeft, CMouseDragStartMsg *msg) {
-	bool isShiftPressed = g_vm->_window->getSpecialButtons() & MK_SHIFT;
+	bool isShiftPressed = g_vm->_events->getSpecialButtons() & MK_SHIFT;
 	CPetControl *petControl = getPetControl();
 
 	if (!isShiftPressed && petControl) {





More information about the Scummvm-git-logs mailing list