1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/* 3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2006 The Android Open Source Project 4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file. 7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifndef SkEvent_DEFINED 11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SkEvent_DEFINED 12f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkDOM.h" 14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkMetaData.h" 15f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkString.h" 16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/** Unique 32bit id used to identify an instance of SkEventSink. When events are 18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger posted, they are posted to a specific sinkID. When it is time to dispatch the 19f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger event, the sinkID is used to find the specific SkEventSink object. If it is found, 20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger its doEvent() method is called with the event. 21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger*/ 22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergertypedef uint32_t SkEventSinkID; 23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/** 25f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * \class SkEvent 26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 27f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * When an event is dispatched from the event queue, it is either sent to 28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * the eventsink matching the target ID (if not 0), or the target proc is 29f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * called (if not NULL). 30f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkEvent { 32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: 33f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Function pointer that takes an event, returns true if it "handled" it. 35f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger typedef bool (*Proc)(const SkEvent& evt); 37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 38f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkEvent(); 39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger explicit SkEvent(const SkString& type, SkEventSinkID = 0); 40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger explicit SkEvent(const char type[], SkEventSinkID = 0); 41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkEvent(const SkEvent& src); 42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger ~SkEvent(); 43f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Copy the event's type into the specified SkString parameter */ 45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void getType(SkString* str) const; 46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Returns true if the event's type matches exactly the specified type (case sensitive) */ 48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool isType(const SkString& str) const; 49f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Returns true if the event's type matches exactly the specified type (case sensitive) */ 51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool isType(const char type[], size_t len = 0) const; 52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Set the event's type to the specified string. 55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void setType(const SkString&); 57f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 58f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 59f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Set the event's type to the specified string. 60f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 61f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void setType(const char type[], size_t len = 0); 62f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 63f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 64f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Return the target ID, or 0 if there is none. 65f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 66f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * When an event is dispatched from the event queue, it is either sent to 67f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * the eventsink matching the targetID (if not 0), or the target proc is 68f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * called (if not NULL). 69f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 70f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkEventSinkID getTargetID() const { return fTargetID; } 71f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 72f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 73f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Set the target ID for this event. 0 means none. Calling this will 74f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * automatically clear the targetProc to null. 75f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 76f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * When an event is dispatched from the event queue, it is either sent to 77f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * the eventsink matching the targetID (if not 0), or the target proc is 78f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * called (if not NULL). 79f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 80f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkEvent* setTargetID(SkEventSinkID targetID) { 81f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fTargetProc = NULL; 82f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fTargetID = targetID; 83f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return this; 84f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 85f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 86f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 87f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Return the target proc, or NULL if it has none. 88f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 89f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * When an event is dispatched from the event queue, it is either sent to 90f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * the eventsink matching the targetID (if not 0), or the target proc is 91f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * called (if not NULL). 92f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 93f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger Proc getTargetProc() const { return fTargetProc; } 94f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 95f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 96f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Set the target ID for this event. NULL means none. Calling this will 97f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * automatically clear the targetID to 0. 98f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 99f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * When an event is dispatched from the event queue, it is either sent to 100f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * the eventsink matching the targetID (if not 0), or the target proc is 101f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * called (if not NULL). 102f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 103f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkEvent* setTargetProc(Proc proc) { 104f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fTargetID = 0; 105f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fTargetProc = proc; 106f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return this; 107f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 108f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 109f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 110f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Return the event's unnamed 32bit field. Default value is 0 111f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 112f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger uint32_t getFast32() const { return f32; } 113f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 114f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 115f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Set the event's unnamed 32bit field. 116f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 117f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void setFast32(uint32_t x) { f32 = x; } 118f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 119f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Return true if the event contains the named 32bit field, and return the field 120f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger in value (if value is non-null). If there is no matching named field, return false 121f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger and ignore the value parameter. 122f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 123f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool findS32(const char name[], int32_t* value = NULL) const { return fMeta.findS32(name, value); } 124f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Return true if the event contains the named SkScalar field, and return the field 125f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger in value (if value is non-null). If there is no matching named field, return false 126f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger and ignore the value parameter. 127f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 128f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool findScalar(const char name[], SkScalar* value = NULL) const { return fMeta.findScalar(name, value); } 129f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Return true if the event contains the named SkScalar field, and return the fields 130f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger in value[] (if value is non-null), and return the number of SkScalars in count (if count is non-null). 131f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger If there is no matching named field, return false and ignore the value and count parameters. 132f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 133f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkScalar* findScalars(const char name[], int* count, SkScalar values[] = NULL) const { return fMeta.findScalars(name, count, values); } 134f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Return the value of the named string field, or if no matching named field exists, return null. 135f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 136f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const char* findString(const char name[]) const { return fMeta.findString(name); } 137f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Return true if the event contains the named pointer field, and return the field 138f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger in value (if value is non-null). If there is no matching named field, return false 139f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger and ignore the value parameter. 140f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 141f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool findPtr(const char name[], void** value) const { return fMeta.findPtr(name, value); } 142f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool findBool(const char name[], bool* value) const { return fMeta.findBool(name, value); } 143f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const void* findData(const char name[], size_t* byteCount = NULL) const { 144f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return fMeta.findData(name, byteCount); 145f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 146f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 147f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Returns true if ethe event contains the named 32bit field, and if it equals the specified value */ 148f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool hasS32(const char name[], int32_t value) const { return fMeta.hasS32(name, value); } 149f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Returns true if ethe event contains the named SkScalar field, and if it equals the specified value */ 150f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool hasScalar(const char name[], SkScalar value) const { return fMeta.hasScalar(name, value); } 151f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Returns true if ethe event contains the named string field, and if it equals (using strcmp) the specified value */ 152f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool hasString(const char name[], const char value[]) const { return fMeta.hasString(name, value); } 153f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Returns true if ethe event contains the named pointer field, and if it equals the specified value */ 154f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool hasPtr(const char name[], void* value) const { return fMeta.hasPtr(name, value); } 155f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool hasBool(const char name[], bool value) const { return fMeta.hasBool(name, value); } 156f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool hasData(const char name[], const void* data, size_t byteCount) const { 157f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return fMeta.hasData(name, data, byteCount); 158f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 159f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 160f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Add/replace the named 32bit field to the event. In XML use the subelement <data name=... s32=... /> */ 161f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void setS32(const char name[], int32_t value) { fMeta.setS32(name, value); } 162f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Add/replace the named SkScalar field to the event. In XML use the subelement <data name=... scalar=... /> */ 163f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void setScalar(const char name[], SkScalar value) { fMeta.setScalar(name, value); } 164f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Add/replace the named SkScalar[] field to the event. */ 165f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkScalar* setScalars(const char name[], int count, const SkScalar values[] = NULL) { return fMeta.setScalars(name, count, values); } 166f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Add/replace the named string field to the event. In XML use the subelement <data name=... string=... */ 167f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void setString(const char name[], const SkString& value) { fMeta.setString(name, value.c_str()); } 168f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Add/replace the named string field to the event. In XML use the subelement <data name=... string=... */ 169f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void setString(const char name[], const char value[]) { fMeta.setString(name, value); } 170f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Add/replace the named pointer field to the event. There is no XML equivalent for this call */ 171f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void setPtr(const char name[], void* value) { fMeta.setPtr(name, value); } 172f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void setBool(const char name[], bool value) { fMeta.setBool(name, value); } 173f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void setData(const char name[], const void* data, size_t byteCount) { 174f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fMeta.setData(name, data, byteCount); 175f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 176f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 177f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Return the underlying metadata object */ 178f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkMetaData& getMetaData() { return fMeta; } 179f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Return the underlying metadata object */ 180f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkMetaData& getMetaData() const { return fMeta; } 181f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 182f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Call this to initialize the event from the specified XML node */ 183f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void inflate(const SkDOM&, const SkDOM::Node*); 184f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 185f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkDEBUGCODE(void dump(const char title[] = NULL);) 186f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 187f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /////////////////////////////////////////////////////////////////////////// 188f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 189f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 190f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Post to the event queue using the event's targetID or target-proc. 191f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 192f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * The event must be dynamically allocated, as ownership is transferred to 193f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * the event queue. It cannot be allocated on the stack or in a global. 194f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 195f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void post() { 196f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return this->postDelay(0); 197f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 198f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 199f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 200f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Post to the event queue using the event's targetID or target-proc and 201f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * the specifed millisecond delay. 202f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 203f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * The event must be dynamically allocated, as ownership is transferred to 204f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * the event queue. It cannot be allocated on the stack or in a global. 205f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 206f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void postDelay(SkMSec delay); 207f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 208f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 209f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Post to the event queue using the event's targetID or target-proc. 210f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * The event will be delivered no sooner than the specified millisecond 211f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * time, as measured by SkTime::GetMSecs(). 212f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 213f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * The event must be dynamically allocated, as ownership is transferred to 214f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * the event queue. It cannot be allocated on the stack or in a global. 215f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 216f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void postTime(SkMSec time); 217f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 218f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /////////////////////////////////////////////// 219f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Porting layer must call these functions **/ 220f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /////////////////////////////////////////////// 221f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 222f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Global initialization function for the SkEvent system. Should be called exactly 223f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger once before any other event method is called, and should be called after the 224f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger call to SkGraphics::Init(). 225f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 226f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static void Init(); 227f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Global cleanup function for the SkEvent system. Should be called exactly once after 228f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger all event methods have been called, and should be called before calling SkGraphics::Term(). 229f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 230f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static void Term(); 231f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 232f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Call this to process one event from the queue. If it returns true, there are more events 233f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger to process. 234f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 235f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static bool ProcessEvent(); 236f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Call this whenever the requested timer has expired (requested by a call to SetQueueTimer). 237f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger It will post any delayed events whose time as "expired" onto the event queue. 238f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger It may also call SignalQueueTimer() and SignalNonEmptyQueue(). 239f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 240f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static void ServiceQueueTimer(); 241f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 242f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Return the number of queued events. note that this value may be obsolete 243f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger upon return, since another thread may have called ProcessEvent() or 244f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger Post() after the count was made. 245f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 246f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static int CountEventsOnQueue(); 247f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 248f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger //////////////////////////////////////////////////// 249f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Porting layer must implement these functions **/ 250f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger //////////////////////////////////////////////////// 251f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 252f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Called whenever an SkEvent is posted to an empty queue, so that the OS 253f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger can be told to later call Dequeue(). 254f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 255f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static void SignalNonEmptyQueue(); 256f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** Called whenever the delay until the next delayed event changes. If zero is 257f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger passed, then there are no more queued delay events. 258f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 259f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static void SignalQueueTimer(SkMSec delay); 260f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 261f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifndef SK_USE_WXWIDGETS 262f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_BUILD_FOR_WIN 263f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static bool WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 264f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#elif defined(SK_BUILD_FOR_UNIXx) 265f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static uint32_t HandleTimer(uint32_t, void*); 266f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static bool WndProc(Display*, Window, XEvent&); 267f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 268f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#else 269f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // Don't know yet what this will be 270f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger //static bool CustomEvent(); 271f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 272f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 273f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate: 274f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkMetaData fMeta; 275f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger mutable char* fType; // may be characters with low bit set to know that it is not a pointer 276f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger uint32_t f32; 277f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 278f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // 'there can be only one' (non-zero) between target-id and target-proc 279f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkEventSinkID fTargetID; 280f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger Proc fTargetProc; 281f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 282f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // these are for our implementation of the event queue 283f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkMSec fTime; 284f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkEvent* fNextEvent; // either in the delay or normal event queue 285f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 286f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void initialize(const char* type, size_t typeLen, SkEventSinkID); 287f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 288f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static bool Enqueue(SkEvent* evt); 289f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static SkMSec EnqueueTime(SkEvent* evt, SkMSec time); 290f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static SkEvent* Dequeue(); 291f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger static bool QHasEvents(); 292f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}; 293f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 294f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 295f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 296