diff --git a/src/lib/platform/CMSWindowsDesks.cpp b/src/lib/platform/CMSWindowsDesks.cpp index 18729ae0..b8fd8150 100644 --- a/src/lib/platform/CMSWindowsDesks.cpp +++ b/src/lib/platform/CMSWindowsDesks.cpp @@ -29,6 +29,7 @@ #include "TMethodJob.h" #include "CArchMiscWindows.h" #include +#include "IEventQueue.h" // these are only defined when WINVER >= 0x0500 #if !defined(SPI_GETMOUSESPEED) @@ -89,8 +90,9 @@ // CMSWindowsDesks::CMSWindowsDesks( - bool isPrimary, bool noHooks, HINSTANCE hookLibrary, - const IScreenSaver* screensaver, IJob* updateKeys) : + bool isPrimary, bool noHooks, HINSTANCE hookLibrary, + const IScreenSaver* screensaver, IEventQueue& eventQueue, + IJob* updateKeys) : m_isPrimary(isPrimary), m_noHooks(noHooks), m_is95Family(CArchMiscWindows::isWindows95Family()), @@ -107,7 +109,8 @@ CMSWindowsDesks::CMSWindowsDesks( m_activeDeskName(), m_mutex(), m_deskReady(&m_mutex, false), - m_updateKeys(updateKeys) + m_updateKeys(updateKeys), + m_eventQueue(eventQueue) { if (hookLibrary != NULL) queryHookLibrary(hookLibrary); @@ -138,8 +141,8 @@ CMSWindowsDesks::enable() // which desk is active and reinstalls the hooks as necessary. // we wouldn't need this if windows notified us of a desktop // change but as far as i can tell it doesn't. - m_timer = EVENTQUEUE->newTimer(0.2, NULL); - EVENTQUEUE->adoptHandler(CEvent::kTimer, m_timer, + m_timer = m_eventQueue.newTimer(0.2, NULL); + m_eventQueue.adoptHandler(CEvent::kTimer, m_timer, new TMethodEventJob( this, &CMSWindowsDesks::handleCheckDesk)); @@ -151,8 +154,8 @@ CMSWindowsDesks::disable() { // remove timer if (m_timer != NULL) { - EVENTQUEUE->removeHandler(CEvent::kTimer, m_timer); - EVENTQUEUE->deleteTimer(m_timer); + m_eventQueue.removeHandler(CEvent::kTimer, m_timer); + m_eventQueue.deleteTimer(m_timer); m_timer = NULL; } diff --git a/src/lib/platform/CMSWindowsDesks.h b/src/lib/platform/CMSWindowsDesks.h index 0029c7d5..115791b0 100644 --- a/src/lib/platform/CMSWindowsDesks.h +++ b/src/lib/platform/CMSWindowsDesks.h @@ -34,6 +34,7 @@ class CEventQueueTimer; class CThread; class IJob; class IScreenSaver; +class IEventQueue; //! Microsoft Windows desk handling /*! @@ -62,8 +63,10 @@ public: updated in a thread attached to the current desk. \p hookLibrary must be a handle to the hook library. */ - CMSWindowsDesks(bool isPrimary, bool noHooks, HINSTANCE hookLibrary, - const IScreenSaver* screensaver, IJob* updateKeys); + CMSWindowsDesks( + bool isPrimary, bool noHooks, HINSTANCE hookLibrary, + const IScreenSaver* screensaver, IEventQueue& eventQueue, + IJob* updateKeys); ~CMSWindowsDesks(); //! @name manipulators @@ -289,8 +292,10 @@ private: // hook library stuff InstallFunc m_install; UninstallFunc m_uninstall; - InstallScreenSaverFunc m_installScreensaver; - UninstallScreenSaverFunc m_uninstallScreensaver; + InstallScreenSaverFunc + m_installScreensaver; + UninstallScreenSaverFunc + m_uninstallScreensaver; // keyboard stuff IJob* m_updateKeys; @@ -298,6 +303,8 @@ private: // options bool m_leaveForegroundOption; + + IEventQueue& m_eventQueue; }; #endif diff --git a/src/lib/platform/CMSWindowsScreen.cpp b/src/lib/platform/CMSWindowsScreen.cpp index a9cc314a..17834fef 100644 --- a/src/lib/platform/CMSWindowsScreen.cpp +++ b/src/lib/platform/CMSWindowsScreen.cpp @@ -122,6 +122,7 @@ CMSWindowsScreen::CMSWindowsScreen(bool isPrimary, bool noHooks, const CGameDevi m_desks = new CMSWindowsDesks( m_isPrimary, m_noHooks, m_hookLibrary, m_screensaver, + *EVENTQUEUE, new TMethodJob(this, &CMSWindowsScreen::updateKeysCB)); m_keyState = new CMSWindowsKeyState(m_desks, getEventTarget()); diff --git a/src/test/integtests/platform/CMSWindowsKeyStateTests.cpp b/src/test/integtests/platform/CMSWindowsKeyStateTests.cpp index 02957be3..35dc5270 100644 --- a/src/test/integtests/platform/CMSWindowsKeyStateTests.cpp +++ b/src/test/integtests/platform/CMSWindowsKeyStateTests.cpp @@ -17,6 +17,10 @@ #include #include + +#define TEST_ENV +#include "Global.h" + #include "CMSWindowsKeyState.h" #include "CMSWindowsDesks.h" #include "CMSWindowsScreen.h" @@ -39,21 +43,19 @@ protected: // load synrgyhk.dll m_hookLibrary = m_hookLibraryLoader.openHookLibrary("synrgyhk"); m_screensaver = new CMSWindowsScreenSaver(); - m_desks = new CMSWindowsDesks( - true, false, m_hookLibrary, m_screensaver, - new TMethodJob( - this, &CMSWindowsKeyStateTests::updateKeysCB)); } virtual void TearDown() { delete m_screensaver; - delete m_desks; } - CMSWindowsDesks* getDesks() const + CMSWindowsDesks* newDesks(IEventQueue& eventQueue) { - return m_desks; + return new CMSWindowsDesks( + true, false, m_hookLibrary, m_screensaver, eventQueue, + new TMethodJob( + this, &CMSWindowsKeyStateTests::updateKeysCB)); } void* getEventTarget() const @@ -65,70 +67,75 @@ private: void updateKeysCB(void*) { } HINSTANCE m_hookLibrary; IScreenSaver* m_screensaver; - CMSWindowsDesks* m_desks; CMSWindowsHookLibraryLoader m_hookLibraryLoader; }; TEST_F(CMSWindowsKeyStateTests, disable_nonWin95OS_eventQueueNotUsed) { NiceMock eventQueue; + CMSWindowsDesks* desks = newDesks(eventQueue); CMockKeyMap keyMap; - CMSWindowsKeyState keyState(getDesks(), getEventTarget(), eventQueue, keyMap); + CMSWindowsKeyState keyState(desks, getEventTarget(), eventQueue, keyMap); // in anything above win95-family, event handler should not be called. EXPECT_CALL(eventQueue, removeHandler(_, _)).Times(0); keyState.disable(); + delete desks; } TEST_F(CMSWindowsKeyStateTests, testAutoRepeat_noRepeatAndButtonIsZero_resultIsTrue) { NiceMock eventQueue; + CMSWindowsDesks* desks = newDesks(eventQueue); CMockKeyMap keyMap; - CMSWindowsKeyState keyState(getDesks(), getEventTarget(), eventQueue, keyMap); + CMSWindowsKeyState keyState(desks, getEventTarget(), eventQueue, keyMap); keyState.setLastDown(1); bool actual = keyState.testAutoRepeat(true, false, 1); ASSERT_TRUE(actual); + delete desks; } TEST_F(CMSWindowsKeyStateTests, testAutoRepeat_pressFalse_lastDownIsZero) { NiceMock eventQueue; + CMSWindowsDesks* desks = newDesks(eventQueue); CMockKeyMap keyMap; - CMSWindowsKeyState keyState(getDesks(), getEventTarget(), eventQueue, keyMap); + CMSWindowsKeyState keyState(desks, getEventTarget(), eventQueue, keyMap); keyState.setLastDown(1); keyState.testAutoRepeat(false, false, 1); ASSERT_EQ(0, keyState.getLastDown()); + delete desks; } TEST_F(CMSWindowsKeyStateTests, saveModifiers_noModifiers_savedModifiers0) { NiceMock eventQueue; + CMSWindowsDesks* desks = newDesks(eventQueue); CMockKeyMap keyMap; - CMSWindowsKeyState keyState(getDesks(), getEventTarget(), eventQueue, keyMap); + CMSWindowsKeyState keyState(desks, getEventTarget(), eventQueue, keyMap); keyState.saveModifiers(); ASSERT_EQ(0, keyState.getSavedModifiers()); + delete desks; } - -/* -// TODO: fix Assertion failed: s_instance != NULL, -// file ..\..\..\..\src\lib\base\IEventQueue.cpp, line 37 + TEST_F(CMSWindowsKeyStateTests, saveModifiers_shiftKeyDown_savedModifiers4) { NiceMock eventQueue; + CMSWindowsDesks* desks = newDesks(eventQueue); CMockKeyMap keyMap; - CMSWindowsKeyState keyState(getDesks(), getEventTarget(), eventQueue, keyMap); - getDesks()->enable(); - getDesks()->fakeKeyEvent(1, 1, true, false); + CMSWindowsKeyState keyState(desks, getEventTarget(), eventQueue, keyMap); + desks->enable(); + desks->fakeKeyEvent(1, 1, true, false); keyState.saveModifiers(); ASSERT_EQ(1, keyState.getSavedModifiers()); + delete desks; } -*/