summaryrefslogtreecommitdiff
path: root/slideshow/source/engine/eventqueue.cxx
diff options
context:
space:
mode:
authorChristian Lippka <christian.lippka@sun.com>2010-01-04 15:43:22 +0100
committerChristian Lippka <christian.lippka@sun.com>2010-01-04 15:43:22 +0100
commitb71823a291b10fe67cd96b81bce3fb0d91dcb893 (patch)
tree756017bd26f549770d70b47488b4fe11aaff1504 /slideshow/source/engine/eventqueue.cxx
parentdada72080460ab3a1bf4228a38454339b1d5f204 (diff)
parenteb86211c1db0bb492669e7ac8302b89254ed4793 (diff)
merge to m68
Diffstat (limited to 'slideshow/source/engine/eventqueue.cxx')
-rw-r--r--slideshow/source/engine/eventqueue.cxx78
1 files changed, 74 insertions, 4 deletions
diff --git a/slideshow/source/engine/eventqueue.cxx b/slideshow/source/engine/eventqueue.cxx
index 9d7b7ed65eb1..44e1cad2f45e 100644
--- a/slideshow/source/engine/eventqueue.cxx
+++ b/slideshow/source/engine/eventqueue.cxx
@@ -35,6 +35,7 @@
#include <canvas/debug.hxx>
#include <tools/diagnose_ex.h>
#include <canvas/verbosetrace.hxx>
+#include "debug.hxx"
#include <comphelper/anytostring.hxx>
#include <cppuhelper/exc_hlp.hxx>
@@ -66,6 +67,7 @@ namespace slideshow
: maMutex(),
maEvents(),
maNextEvents(),
+ maNextNextEvents(),
mpTimer( pPresTimer )
{
}
@@ -103,6 +105,13 @@ namespace slideshow
{
::osl::MutexGuard aGuard( maMutex );
+#if OSL_DEBUG_LEVEL > 1 && defined (SLIDESHOW_ADD_DESCRIPTIONS_TO_EVENTS)
+ OSL_TRACE("adding at %f event [%s] at %x with delay %f\r",
+ mpTimer->getElapsedTime(),
+ OUStringToOString(rEvent->GetDescription(), RTL_TEXTENCODING_UTF8).getStr(),
+ rEvent.get(),
+ rEvent->getActivationTime(0.0));
+#endif
ENSURE_OR_RETURN( rEvent,
"EventQueue::addEvent: event ptr NULL" );
@@ -124,6 +133,14 @@ namespace slideshow
{
::osl::MutexGuard aGuard( maMutex );
+#if OSL_DEBUG_LEVEL > 1 && defined (SLIDESHOW_ADD_DESCRIPTIONS_TO_EVENTS)
+ OSL_TRACE("adding at %f event [%s] at %x for next round with delay %f\r",
+ mpTimer->getElapsedTime(),
+ OUStringToOString(rEvent->GetDescription(), RTL_TEXTENCODING_UTF8).getStr(),
+ rEvent.get(),
+ rEvent->getActivationTime(0.0));
+#endif
+
ENSURE_OR_RETURN( rEvent.get() != NULL,
"EventQueue::addEvent: event ptr NULL" );
maNextEvents.push_back(
@@ -132,6 +149,30 @@ namespace slideshow
return true;
}
+ bool EventQueue::addEventWhenQueueIsEmpty (const EventSharedPtr& rpEvent)
+ {
+ ::osl::MutexGuard aGuard( maMutex );
+
+#if OSL_DEBUG_LEVEL > 1 && defined (SLIDESHOW_ADD_DESCRIPTIONS_TO_EVENTS)
+ OSL_TRACE("adding at %f event [%s] at %x for execution when queue is empty with delay %f\r",
+ mpTimer->getElapsedTime(),
+ OUStringToOString(rpEvent->GetDescription(), RTL_TEXTENCODING_UTF8).getStr(),
+ rpEvent.get(),
+ rpEvent->getActivationTime(0.0));
+#endif
+
+ ENSURE_OR_RETURN(
+ rpEvent.get() != NULL,
+ "EventQueue::addEvent: event ptr NULL");
+
+ maNextNextEvents.push(
+ EventEntry(
+ rpEvent,
+ rpEvent->getActivationTime(mpTimer->getElapsedTime())));
+
+ return true;
+ }
+
void EventQueue::forceEmpty()
{
::osl::MutexGuard aGuard( maMutex );
@@ -163,6 +204,17 @@ namespace slideshow
const double nCurrTime( mpTimer->getElapsedTime() );
+ // When maEvents does not contain any events that are due now
+ // then process one event from maNextNextEvents.
+ if (!maNextNextEvents.empty()
+ && !bFireAllEvents
+ && (maEvents.empty() || maEvents.top().nTime > nCurrTime))
+ {
+ const EventEntry aEvent (maNextNextEvents.top());
+ maNextNextEvents.pop();
+ maEvents.push(aEvent);
+ }
+
// process ready/elapsed events. Note that the 'perceived'
// current time remains constant for this loop, thus we're
// processing only those events which where ready when we
@@ -189,6 +241,14 @@ namespace slideshow
event.pEvent.get(),
event.pEvent->getActivationTime(0.0) );
#endif
+#if OSL_DEBUG_LEVEL > 1 && defined (SLIDESHOW_ADD_DESCRIPTIONS_TO_EVENTS)
+ OSL_TRACE("firing at %f event [%s] at %x with delay %f\r",
+ mpTimer->getElapsedTime(),
+ OUStringToOString(event.pEvent->GetDescription(),
+ RTL_TEXTENCODING_UTF8).getStr(),
+ event.pEvent.get(),
+ event.pEvent->getActivationTime(0.0));
+#endif
event.pEvent->fire();
}
@@ -243,7 +303,7 @@ namespace slideshow
{
::osl::MutexGuard aGuard( maMutex );
- return maEvents.empty();
+ return maEvents.empty() && maNextEvents.empty() && maNextNextEvents.empty();
}
double EventQueue::nextTimeout() const
@@ -251,9 +311,16 @@ namespace slideshow
::osl::MutexGuard aGuard( maMutex );
// return time for next entry (if any)
- return isEmpty() ?
- ::std::numeric_limits<double>::max() :
- maEvents.top().nTime - mpTimer->getElapsedTime();
+ double nTimeout (::std::numeric_limits<double>::max());
+ const double nCurrentTime (mpTimer->getElapsedTime());
+ if ( ! maEvents.empty())
+ nTimeout = maEvents.top().nTime - nCurrentTime;
+ if ( ! maNextEvents.empty())
+ nTimeout = ::std::min(nTimeout, maNextEvents.front().nTime - nCurrentTime);
+ if ( ! maNextNextEvents.empty())
+ nTimeout = ::std::min(nTimeout, maNextNextEvents.top().nTime - nCurrentTime);
+
+ return nTimeout;
}
void EventQueue::clear()
@@ -263,6 +330,9 @@ namespace slideshow
// TODO(P1): Maybe a plain vector and vector.swap will
// be faster here. Profile.
maEvents = ImplQueueType();
+
+ maNextEvents.clear();
+ maNextNextEvents = ImplQueueType();
}
}
}