retool SkEvent to own its target ID or target proc
git-svn-id: http://skia.googlecode.com/svn/trunk@2041 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/animator/SkAnimateMaker.cpp b/src/animator/SkAnimateMaker.cpp
index ce4ddfd..414e728 100644
--- a/src/animator/SkAnimateMaker.cpp
+++ b/src/animator/SkAnimateMaker.cpp
@@ -121,9 +121,11 @@
void SkAnimateMaker::delayEnable(SkApply* apply, SkMSec time) {
int index = fDelayed.find(apply);
- if (index < 0)
+ if (index < 0) {
*fDelayed.append() = apply;
- (new SkEvent(SK_EventType_Delay))->postTime(fAnimator->getSinkID(), time);
+ }
+
+ (new SkEvent(SK_EventType_Delay, fAnimator->getSinkID()))->postTime(time);
}
void SkAnimateMaker::deleteMembers() {
diff --git a/src/animator/SkAnimator.cpp b/src/animator/SkAnimator.cpp
index 9b5b061..a8f23fe 100644
--- a/src/animator/SkAnimator.cpp
+++ b/src/animator/SkAnimator.cpp
@@ -479,7 +479,7 @@
#else
SkASSERT(sinkID == this->getSinkID() || this->getHostEventSinkID() == sinkID);
#endif
- SkEvent::Post(evt, sinkID);
+ evt->setTargetID(sinkID)->post();
}
void SkAnimator::onEventPostTime(SkEvent* evt, SkEventSinkID sinkID, SkMSec time)
@@ -493,7 +493,7 @@
#else
SkASSERT(sinkID == this->getSinkID() || this->getHostEventSinkID() == sinkID);
#endif
- SkEvent::PostTime(evt, sinkID, time);
+ evt->setTargetID(sinkID)->postTime(time);
}
void SkAnimator::reset() {
diff --git a/src/utils/mac/SkOSWindow_Mac.cpp b/src/utils/mac/SkOSWindow_Mac.cpp
index 5731a4d..2940cbd 100644
--- a/src/utils/mac/SkOSWindow_Mac.cpp
+++ b/src/utils/mac/SkOSWindow_Mac.cpp
@@ -204,8 +204,7 @@
void SkOSWindow::onHandleInval(const SkIRect& r)
{
- SkEvent* evt = new SkEvent("inval-imageview");
- evt->post(this->getSinkID());
+ (new SkEvent("inval-imageview", this->getSinkID()))->post();
}
bool SkOSWindow::onEvent(const SkEvent& evt) {
diff --git a/src/views/SkEvent.cpp b/src/views/SkEvent.cpp
index d330636..c7ac638 100644
--- a/src/views/SkEvent.cpp
+++ b/src/views/SkEvent.cpp
@@ -9,21 +9,22 @@
#include "SkEvent.h"
-void SkEvent::initialize(const char* type, size_t typeLen) {
+void SkEvent::initialize(const char* type, size_t typeLen,
+ SkEventSinkID targetID) {
fType = NULL;
setType(type, typeLen);
f32 = 0;
+ fTargetID = targetID;
+ fTargetProc = NULL;
#ifdef SK_DEBUG
- fTargetID = 0;
fTime = 0;
fNextEvent = NULL;
#endif
- SkDEBUGCODE(fDebugTrace = false;)
}
SkEvent::SkEvent()
{
- initialize("", 0);
+ initialize("", 0, 0);
}
SkEvent::SkEvent(const SkEvent& src)
@@ -33,15 +34,15 @@
setType(src.fType);
}
-SkEvent::SkEvent(const SkString& type)
+SkEvent::SkEvent(const SkString& type, SkEventSinkID targetID)
{
- initialize(type.c_str(), type.size());
+ initialize(type.c_str(), type.size(), targetID);
}
-SkEvent::SkEvent(const char type[])
+SkEvent::SkEvent(const char type[], SkEventSinkID targetID)
{
SkASSERT(type);
- initialize(type, strlen(type));
+ initialize(type, strlen(type), targetID);
}
SkEvent::~SkEvent()
@@ -288,90 +289,50 @@
return rec;
}
-bool SkEvent::Post(SkEvent* evt, SkEventSinkID sinkID, SkMSec delay)
-{
- if (delay)
- return SkEvent::PostTime(evt, sinkID, SkTime::GetMSecs() + delay);
+///////////////////////////////////////////////////////////////////////////////
- SkEvent_Globals& globals = *(SkEvent_Globals*)SkGlobals::Find(SK_Event_GlobalsTag, create_globals);
-
- evt->fTargetID = sinkID;
-
-#ifdef SK_TRACE_EVENTS
- {
- SkString str("SkEvent::Post(");
- str.append(evt->getType());
- str.append(", 0x");
- str.appendHex(sinkID);
- str.append(", ");
- str.appendS32(delay);
- str.append(")");
- event_log(str.c_str());
- }
-#endif
-
- globals.fEventMutex.acquire();
- bool wasEmpty = SkEvent::Enqueue(evt);
- globals.fEventMutex.release();
-
- // call outside of us holding the mutex
- if (wasEmpty)
- SkEvent::SignalNonEmptyQueue();
- return true;
-}
-
-#if defined(SK_SIMULATE_FAILED_MALLOC) && defined(SK_FIND_MEMORY_LEAKS)
-SkMSec gMaxDrawTime;
-#endif
-
-bool SkEvent::PostTime(SkEvent* evt, SkEventSinkID sinkID, SkMSec time)
-{
-#if defined(SK_SIMULATE_FAILED_MALLOC) && defined(SK_FIND_MEMORY_LEAKS)
- gMaxDrawTime = time;
-#endif
- SkEvent_Globals& globals = *(SkEvent_Globals*)SkGlobals::Find(SK_Event_GlobalsTag, create_globals);
-
- evt->fTargetID = sinkID;
-
-#ifdef SK_TRACE_EVENTS
- {
- SkString str("SkEvent::Post(");
- str.append(evt->getType());
- str.append(", 0x");
- str.appendHex(sinkID);
- str.append(", ");
- str.appendS32(time);
- str.append(")");
- event_log(str.c_str());
- }
-#endif
-
- globals.fEventMutex.acquire();
- SkMSec queueDelay = SkEvent::EnqueueTime(evt, time);
- globals.fEventMutex.release();
-
- // call outside of us holding the mutex
- if ((int32_t)queueDelay != ~0)
- SkEvent::SignalQueueTimer(queueDelay);
- return true;
-}
-
-bool SkEvent::postDelay(SkMSec delay) {
- return SkEvent::Post(this, this->getTargetID(), delay);
-}
-
-bool SkEvent::postTime(SkMSec time) {
- SkEventSinkID target = this->getTargetID();
- if (target) {
- return SkEvent::PostTime(this, target, time);
- } else {
+void SkEvent::postDelay(SkMSec delay) {
+ if (!fTargetID && !fTargetProc) {
delete this;
- return false;
+ return;
+ }
+
+ if (delay) {
+ this->postTime(SkTime::GetMSecs() + delay);
+ return;
+ }
+
+ SkEvent_Globals& globals = *(SkEvent_Globals*)SkGlobals::Find(SK_Event_GlobalsTag, create_globals);
+
+ globals.fEventMutex.acquire();
+ bool wasEmpty = SkEvent::Enqueue(this);
+ globals.fEventMutex.release();
+
+ // call outside of us holding the mutex
+ if (wasEmpty) {
+ SkEvent::SignalNonEmptyQueue();
}
}
-bool SkEvent::Enqueue(SkEvent* evt)
-{
+void SkEvent::postTime(SkMSec time) {
+ if (!fTargetID && !fTargetProc) {
+ delete this;
+ return;
+ }
+
+ SkEvent_Globals& globals = *(SkEvent_Globals*)SkGlobals::Find(SK_Event_GlobalsTag, create_globals);
+
+ globals.fEventMutex.acquire();
+ SkMSec queueDelay = SkEvent::EnqueueTime(this, time);
+ globals.fEventMutex.release();
+
+ // call outside of us holding the mutex
+ if ((int32_t)queueDelay != ~0) {
+ SkEvent::SignalQueueTimer(queueDelay);
+ }
+}
+
+bool SkEvent::Enqueue(SkEvent* evt) {
SkEvent_Globals& globals = *(SkEvent_Globals*)SkGlobals::Find(SK_Event_GlobalsTag, create_globals);
// gEventMutex acquired by caller
@@ -387,37 +348,29 @@
evt->fNextEvent = NULL;
SkDEBUGCODE(++globals.fEventCounter);
-// SkDebugf("Enqueue: count=%d\n", gEventCounter);
return wasEmpty;
}
-SkEvent* SkEvent::Dequeue(SkEventSinkID* sinkID)
-{
+SkEvent* SkEvent::Dequeue() {
SkEvent_Globals& globals = *(SkEvent_Globals*)SkGlobals::Find(SK_Event_GlobalsTag, create_globals);
globals.fEventMutex.acquire();
SkEvent* evt = globals.fEventQHead;
- if (evt)
- {
+ if (evt) {
SkDEBUGCODE(--globals.fEventCounter);
- if (sinkID)
- *sinkID = evt->fTargetID;
-
globals.fEventQHead = evt->fNextEvent;
- if (globals.fEventQHead == NULL)
+ if (globals.fEventQHead == NULL) {
globals.fEventQTail = NULL;
+ }
}
globals.fEventMutex.release();
-// SkDebugf("Dequeue: count=%d\n", gEventCounter);
-
return evt;
}
-bool SkEvent::QHasEvents()
-{
+bool SkEvent::QHasEvents() {
SkEvent_Globals& globals = *(SkEvent_Globals*)SkGlobals::Find(SK_Event_GlobalsTag, create_globals);
// this is not thread accurate, need a semaphore for that
@@ -428,60 +381,49 @@
static int gDelayDepth;
#endif
-SkMSec SkEvent::EnqueueTime(SkEvent* evt, SkMSec time)
-{
-#ifdef SK_TRACE_EVENTS
- SkDebugf("enqueue-delay %s %d (%d)", evt->getType(), time, gDelayDepth);
- const char* idStr = evt->findString("id");
- if (idStr)
- SkDebugf(" (%s)", idStr);
- SkDebugf("\n");
- ++gDelayDepth;
-#endif
-
+SkMSec SkEvent::EnqueueTime(SkEvent* evt, SkMSec time) {
SkEvent_Globals& globals = *(SkEvent_Globals*)SkGlobals::Find(SK_Event_GlobalsTag, create_globals);
// gEventMutex acquired by caller
SkEvent* curr = globals.fDelayQHead;
SkEvent* prev = NULL;
- while (curr)
- {
- if (SkMSec_LT(time, curr->fTime))
+ while (curr) {
+ if (SkMSec_LT(time, curr->fTime)) {
break;
+ }
prev = curr;
curr = curr->fNextEvent;
}
evt->fTime = time;
evt->fNextEvent = curr;
- if (prev == NULL)
+ if (prev == NULL) {
globals.fDelayQHead = evt;
- else
+ } else {
prev->fNextEvent = evt;
+ }
SkMSec delay = globals.fDelayQHead->fTime - SkTime::GetMSecs();
- if ((int32_t)delay <= 0)
+ if ((int32_t)delay <= 0) {
delay = 1;
+ }
return delay;
}
-//////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
#include "SkEventSink.h"
-bool SkEvent::ProcessEvent()
-{
- SkEventSinkID sinkID;
- SkEvent* evt = SkEvent::Dequeue(&sinkID);
+bool SkEvent::ProcessEvent() {
+ SkEvent* evt = SkEvent::Dequeue();
SkAutoTDelete<SkEvent> autoDelete(evt);
- bool again = false;
+ bool again = false;
EVENT_LOGN("ProcessEvent", (int32_t)evt);
- if (evt)
- {
- (void)SkEventSink::DoEvent(*evt, sinkID);
+ if (evt) {
+ (void)SkEventSink::DoEvent(*evt);
again = SkEvent::QHasEvents();
}
return again;
diff --git a/src/views/SkEventSink.cpp b/src/views/SkEventSink.cpp
index 3c3aa5d..9d3482a 100644
--- a/src/views/SkEventSink.cpp
+++ b/src/views/SkEventSink.cpp
@@ -213,58 +213,33 @@
return this->findTagList(kListeners_SkTagList) != NULL;
}
-void SkEventSink::postToListeners(const SkEvent& evt, SkMSec delay)
-{
+void SkEventSink::postToListeners(const SkEvent& evt, SkMSec delay) {
SkListenersTagList* list = (SkListenersTagList*)this->findTagList(kListeners_SkTagList);
- if (list)
- {
+ if (list) {
SkASSERT(list->countListners() > 0);
const SkEventSinkID* iter = list->fIDs;
const SkEventSinkID* stop = iter + list->countListners();
- while (iter < stop)
- (SkNEW_ARGS(SkEvent, (evt)))->post(*iter++, delay);
+ while (iter < stop) {
+ SkEvent* copy = SkNEW_ARGS(SkEvent, (evt));
+ copy->setTargetID(*iter++)->postDelay(delay);
+ }
}
}
///////////////////////////////////////////////////////////////////////////////
-SkEventSink::EventResult SkEventSink::DoEvent(const SkEvent& evt, SkEventSinkID sinkID)
-{
- SkEventSink* sink = SkEventSink::FindSink(sinkID);
-
- if (sink)
- {
-#ifdef SK_DEBUG
- if (evt.isDebugTrace())
- {
- SkString etype;
- evt.getType(&etype);
- SkDebugf("SkEventTrace: dispatching event <%s> to 0x%x", etype.c_str(), sinkID);
- const char* idStr = evt.findString("id");
- if (idStr)
- SkDebugf(" (%s)", idStr);
- SkDebugf("\n");
- }
-#endif
+SkEventSink::EventResult SkEventSink::DoEvent(const SkEvent& evt) {
+ SkEvent::Proc proc = evt.getTargetProc();
+ if (proc) {
+ return proc(evt) ? kHandled_EventResult : kNotHandled_EventResult;
+ }
+
+ SkEventSink* sink = SkEventSink::FindSink(evt.getTargetID());
+ if (sink) {
return sink->doEvent(evt) ? kHandled_EventResult : kNotHandled_EventResult;
}
- else
- {
-#ifdef SK_DEBUG
- if (sinkID)
- SkDebugf("DoEvent: Can't find sink for ID(%x)\n", sinkID);
- else
- SkDebugf("Event sent to 0 sinkID\n");
- if (evt.isDebugTrace())
- {
- SkString etype;
- evt.getType(&etype);
- SkDebugf("SkEventTrace: eventsink not found <%s> for 0x%x\n", etype.c_str(), sinkID);
- }
-#endif
- return kSinkNotFound_EventResult;
- }
+ return kSinkNotFound_EventResult;
}
SkEventSink* SkEventSink::FindSink(SkEventSinkID sinkID)