From 33c04d0d5d8fd89c77708da6f5af25bc5a4b73b1 Mon Sep 17 00:00:00 2001 From: Jim Carroll Date: Sun, 11 Nov 2012 17:34:13 -0500 Subject: [fix] This allows the Monitor to receive onScreensaverDeactivated callbacks while in DoModal. This may have further reaching effects sicne it effecively allows the DoModal call to repeatedly invoke makePendingCalls avoiding the need for extraneous PulseActionEvent calls. --- xbmc/interfaces/legacy/LanguageHook.h | 2 +- xbmc/interfaces/legacy/Window.cpp | 18 ++++++++++++------ xbmc/interfaces/legacy/Window.h | 2 +- xbmc/interfaces/python/LanguageHook.cpp | 13 ++++--------- xbmc/interfaces/python/LanguageHook.h | 2 +- xbmc/interfaces/python/XBPython.cpp | 8 +++++--- xbmc/interfaces/python/XBPython.h | 2 +- 7 files changed, 25 insertions(+), 22 deletions(-) diff --git a/xbmc/interfaces/legacy/LanguageHook.h b/xbmc/interfaces/legacy/LanguageHook.h index 87ff6cccbf..ae671bd162 100644 --- a/xbmc/interfaces/legacy/LanguageHook.h +++ b/xbmc/interfaces/legacy/LanguageHook.h @@ -117,7 +117,7 @@ namespace XBMCAddon virtual void unregisterPlayerCallback(IPlayerCallback* player) = 0; virtual void registerMonitorCallback(XBMCAddon::xbmc::Monitor* player) = 0; virtual void unregisterMonitorCallback(XBMCAddon::xbmc::Monitor* player) = 0; - virtual void waitForEvent(CEvent& hEvent) = 0; + virtual bool waitForEvent(CEvent& hEvent, unsigned int milliseconds) = 0; static void setLanguageHook(LanguageHook* languageHook); static LanguageHook* getLanguageHook(); diff --git a/xbmc/interfaces/legacy/Window.cpp b/xbmc/interfaces/legacy/Window.cpp index b4fa531809..a043ad843d 100644 --- a/xbmc/interfaces/legacy/Window.cpp +++ b/xbmc/interfaces/legacy/Window.cpp @@ -371,13 +371,13 @@ namespace XBMCAddon m_actionEvent.Set(); } - void Window::WaitForActionEvent() + bool Window::WaitForActionEvent(unsigned int milliseconds) { TRACE; // DO NOT MAKE THIS A DELAYED CALL!!!! - if (languageHook) - languageHook->waitForEvent(m_actionEvent); + bool ret = languageHook == NULL ? m_actionEvent.WaitMSec(milliseconds) : languageHook->waitForEvent(m_actionEvent,milliseconds); m_actionEvent.Reset(); + return ret; } bool Window::OnAction(const CAction &action) @@ -672,10 +672,16 @@ namespace XBMCAddon // break; // } languageHook->makePendingCalls(); // MakePendingCalls + + bool stillWaiting; + do { - DelayedCallGuard dcguard(languageHook); - WaitForActionEvent(); - } + { + DelayedCallGuard dcguard(languageHook); + stillWaiting = WaitForActionEvent(10) ? false : true; + } + languageHook->makePendingCalls(); + } while (stillWaiting); } } } diff --git a/xbmc/interfaces/legacy/Window.h b/xbmc/interfaces/legacy/Window.h index daacd73e4a..bbbf4c9d93 100644 --- a/xbmc/interfaces/legacy/Window.h +++ b/xbmc/interfaces/legacy/Window.h @@ -126,7 +126,7 @@ namespace XBMCAddon Control* GetControlById(int iControlId) throw (WindowException); SWIGHIDDENVIRTUAL void PulseActionEvent(); - SWIGHIDDENVIRTUAL void WaitForActionEvent(); + SWIGHIDDENVIRTUAL bool WaitForActionEvent(unsigned int milliseconds); #endif public: diff --git a/xbmc/interfaces/python/LanguageHook.cpp b/xbmc/interfaces/python/LanguageHook.cpp index 4256808fcd..d7a66f4fdf 100644 --- a/xbmc/interfaces/python/LanguageHook.cpp +++ b/xbmc/interfaces/python/LanguageHook.cpp @@ -174,15 +174,10 @@ namespace XBMCAddon void LanguageHook::unregisterPlayerCallback(IPlayerCallback* player) { g_pythonParser.UnregisterPythonPlayerCallBack(player); } void LanguageHook::registerMonitorCallback(XBMCAddon::xbmc::Monitor* monitor) { g_pythonParser.RegisterPythonMonitorCallBack(monitor); } void LanguageHook::unregisterMonitorCallback(XBMCAddon::xbmc::Monitor* monitor) { g_pythonParser.UnregisterPythonMonitorCallBack(monitor); } - void LanguageHook::waitForEvent(CEvent& hEvent) { g_pythonParser.WaitForEvent(hEvent); } - -// void LanguageHook::constructing(AddonClass* beingConstructed) -// { -// } -// -// void LanguageHook::destructing(AddonClass* beingDestructed) -// { -// } + bool LanguageHook::waitForEvent(CEvent& hEvent, unsigned int milliseconds) + { + return g_pythonParser.WaitForEvent(hEvent,milliseconds); + } } } diff --git a/xbmc/interfaces/python/LanguageHook.h b/xbmc/interfaces/python/LanguageHook.h index cb07ea4287..3f1700bc17 100644 --- a/xbmc/interfaces/python/LanguageHook.h +++ b/xbmc/interfaces/python/LanguageHook.h @@ -78,7 +78,7 @@ namespace XBMCAddon virtual void unregisterPlayerCallback(IPlayerCallback* player); virtual void registerMonitorCallback(XBMCAddon::xbmc::Monitor* monitor); virtual void unregisterMonitorCallback(XBMCAddon::xbmc::Monitor* monitor); - virtual void waitForEvent(CEvent& hEvent); + virtual bool waitForEvent(CEvent& hEvent, unsigned int milliseconds); static LanguageHook* getInstance(); }; diff --git a/xbmc/interfaces/python/XBPython.cpp b/xbmc/interfaces/python/XBPython.cpp index c48fbdb746..266f320fe6 100644 --- a/xbmc/interfaces/python/XBPython.cpp +++ b/xbmc/interfaces/python/XBPython.cpp @@ -863,12 +863,14 @@ void XBPython::PulseGlobalEvent() m_globalEvent.Set(); } -void XBPython::WaitForEvent(CEvent& hEvent) +bool XBPython::WaitForEvent(CEvent& hEvent, unsigned int milliseconds) { // wait for either this event our our global event XbmcThreads::CEventGroup eventGroup(&hEvent, &m_globalEvent, NULL); - eventGroup.wait(); - m_globalEvent.Reset(); + CEvent* ret = eventGroup.wait(milliseconds); + if (ret) + m_globalEvent.Reset(); + return ret == NULL ? false : true; } // execute script, returns -1 if script doesn't exist diff --git a/xbmc/interfaces/python/XBPython.h b/xbmc/interfaces/python/XBPython.h index 3e1364d424..3fccf6ef9e 100644 --- a/xbmc/interfaces/python/XBPython.h +++ b/xbmc/interfaces/python/XBPython.h @@ -85,7 +85,7 @@ public: void Process(); void PulseGlobalEvent(); - void WaitForEvent(CEvent& hEvent); + bool WaitForEvent(CEvent& hEvent, unsigned int milliseconds); int ScriptsSize(); int GetPythonScriptId(int scriptPosition); -- cgit v1.2.3