11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
40b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */
80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#ifndef SkEvent_DEFINED
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#define SkEvent_DEFINED
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkDOM.h"
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkMetaData.h"
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkString.h"
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/** Unique 32bit id used to identify an instance of SkEventSink. When events are
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    posted, they are posted to a specific sinkID. When it is time to dispatch the
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    event, the sinkID is used to find the specific SkEventSink object. If it is found,
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    its doEvent() method is called with the event.
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger*/
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergertypedef uint32_t SkEventSinkID;
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/**
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  \class SkEvent
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  When an event is dispatched from the event queue, it is either sent to
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  the eventsink matching the target ID (if not 0), or the target proc is
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  called (if not NULL).
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkEvent {
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Function pointer that takes an event, returns true if it "handled" it.
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef bool (*Proc)(const SkEvent& evt);
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkEvent();
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    explicit SkEvent(const SkString& type, SkEventSinkID = 0);
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    explicit SkEvent(const char type[], SkEventSinkID = 0);
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkEvent(const SkEvent& src);
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ~SkEvent();
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Copy the event's type into the specified SkString parameter */
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void getType(SkString* str) const;
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Returns true if the event's type matches exactly the specified type (case sensitive) */
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool isType(const SkString& str) const;
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Returns true if the event's type matches exactly the specified type (case sensitive) */
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool isType(const char type[], size_t len = 0) const;
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Set the event's type to the specified string.
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setType(const SkString&);
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Set the event's type to the specified string.
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setType(const char type[], size_t len = 0);
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Return the target ID, or 0 if there is none.
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  When an event is dispatched from the event queue, it is either sent to
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the eventsink matching the targetID (if not 0), or the target proc is
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  called (if not NULL).
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkEventSinkID getTargetID() const { return fTargetID; }
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Set the target ID for this event. 0 means none. Calling this will
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  automatically clear the targetProc to null.
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  When an event is dispatched from the event queue, it is either sent to
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the eventsink matching the targetID (if not 0), or the target proc is
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  called (if not NULL).
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkEvent* setTargetID(SkEventSinkID targetID) {
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fTargetProc = NULL;
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fTargetID = targetID;
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return this;
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Return the target proc, or NULL if it has none.
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  When an event is dispatched from the event queue, it is either sent to
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the eventsink matching the targetID (if not 0), or the target proc is
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  called (if not NULL).
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    Proc getTargetProc() const { return fTargetProc; }
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Set the target ID for this event. NULL means none. Calling this will
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  automatically clear the targetID to 0.
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  When an event is dispatched from the event queue, it is either sent to
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the eventsink matching the targetID (if not 0), or the target proc is
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  called (if not NULL).
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkEvent* setTargetProc(Proc proc) {
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fTargetID = 0;
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fTargetProc = proc;
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return this;
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Return the event's unnamed 32bit field. Default value is 0
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    uint32_t getFast32() const { return f32; }
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Set the event's unnamed 32bit field.
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setFast32(uint32_t x) { f32 = x; }
1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Return true if the event contains the named 32bit field, and return the field
1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        in value (if value is non-null). If there is no matching named field, return false
1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        and ignore the value parameter.
1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool findS32(const char name[], int32_t* value = NULL) const { return fMeta.findS32(name, value); }
1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Return true if the event contains the named SkScalar field, and return the field
1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        in value (if value is non-null). If there is no matching named field, return false
1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        and ignore the value parameter.
1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool findScalar(const char name[], SkScalar* value = NULL) const { return fMeta.findScalar(name, value); }
1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Return true if the event contains the named SkScalar field, and return the fields
1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        in value[] (if value is non-null), and return the number of SkScalars in count (if count is non-null).
1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        If there is no matching named field, return false and ignore the value and count parameters.
1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const SkScalar* findScalars(const char name[], int* count, SkScalar values[] = NULL) const { return fMeta.findScalars(name, count, values); }
1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Return the value of the named string field, or if no matching named field exists, return null.
1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const char* findString(const char name[]) const { return fMeta.findString(name); }
1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Return true if the event contains the named pointer field, and return the field
1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        in value (if value is non-null). If there is no matching named field, return false
1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        and ignore the value parameter.
1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool findPtr(const char name[], void** value) const { return fMeta.findPtr(name, value); }
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool findBool(const char name[], bool* value) const { return fMeta.findBool(name, value); }
1430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    const void* findData(const char name[], size_t* byteCount = NULL) const {
1440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return fMeta.findData(name, byteCount);
1450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Returns true if ethe event contains the named 32bit field, and if it equals the specified value */
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool hasS32(const char name[], int32_t value) const { return fMeta.hasS32(name, value); }
1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Returns true if ethe event contains the named SkScalar field, and if it equals the specified value */
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool hasScalar(const char name[], SkScalar value) const { return fMeta.hasScalar(name, value); }
1510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Returns true if ethe event contains the named string field, and if it equals (using strcmp) the specified value */
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool hasString(const char name[], const char value[]) const { return fMeta.hasString(name, value); }
1530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Returns true if ethe event contains the named pointer field, and if it equals the specified value */
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool hasPtr(const char name[], void* value) const { return fMeta.hasPtr(name, value); }
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool hasBool(const char name[], bool value) const { return fMeta.hasBool(name, value); }
1560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bool hasData(const char name[], const void* data, size_t byteCount) const {
1570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return fMeta.hasData(name, data, byteCount);
1580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Add/replace the named 32bit field to the event. In XML use the subelement <data name=... s32=... /> */
1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setS32(const char name[], int32_t value) { fMeta.setS32(name, value); }
1620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Add/replace the named SkScalar field to the event. In XML use the subelement <data name=... scalar=... /> */
1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setScalar(const char name[], SkScalar value) { fMeta.setScalar(name, value); }
1640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Add/replace the named SkScalar[] field to the event. */
1650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkScalar* setScalars(const char name[], int count, const SkScalar values[] = NULL) { return fMeta.setScalars(name, count, values); }
1660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Add/replace the named string field to the event. In XML use the subelement <data name=... string=... */
1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setString(const char name[], const SkString& value) { fMeta.setString(name, value.c_str()); }
1680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Add/replace the named string field to the event. In XML use the subelement <data name=... string=... */
1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setString(const char name[], const char value[]) { fMeta.setString(name, value); }
1700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Add/replace the named pointer field to the event. There is no XML equivalent for this call */
1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setPtr(const char name[], void* value) { fMeta.setPtr(name, value); }
1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void setBool(const char name[], bool value) { fMeta.setBool(name, value); }
1730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void setData(const char name[], const void* data, size_t byteCount) {
1740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fMeta.setData(name, data, byteCount);
1750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Return the underlying metadata object */
1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkMetaData& getMetaData() { return fMeta; }
1790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Return the underlying metadata object */
1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkMetaData& getMetaData() const { return fMeta; }
1810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Call this to initialize the event from the specified XML node */
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void inflate(const SkDOM&, const SkDOM::Node*);
1840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkDEBUGCODE(void dump(const char title[] = NULL);)
1860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ///////////////////////////////////////////////////////////////////////////
1880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Post to the event queue using the event's targetID or target-proc.
1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  The event must be dynamically allocated, as ownership is transferred to
1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the event queue. It cannot be allocated on the stack or in a global.
1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void post() {
1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return this->postDelay(0);
1970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
2001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Post to the event queue using the event's targetID or target-proc and
2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the specifed millisecond delay.
2021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  The event must be dynamically allocated, as ownership is transferred to
2041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the event queue. It cannot be allocated on the stack or in a global.
2051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void postDelay(SkMSec delay);
2071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
2091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Post to the event queue using the event's targetID or target-proc.
2101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  The event will be delivered no sooner than the specified millisecond
2111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  time, as measured by SkTime::GetMSecs().
2121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
2131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  The event must be dynamically allocated, as ownership is transferred to
2141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the event queue. It cannot be allocated on the stack or in a global.
2151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void postTime(SkMSec time);
2170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ///////////////////////////////////////////////
2190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Porting layer must call these functions **/
2200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ///////////////////////////////////////////////
2210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Global initialization function for the SkEvent system. Should be called exactly
2230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        once before any other event method is called, and should be called after the
2240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        call to SkGraphics::Init().
2250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
2261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static void Init();
2270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Global cleanup function for the SkEvent system. Should be called exactly once after
2280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        all event methods have been called, and should be called before calling SkGraphics::Term().
2290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
2301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static void Term();
2310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Call this to process one event from the queue. If it returns true, there are more events
2330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        to process.
2340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
2351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static bool ProcessEvent();
2360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Call this whenever the requested timer has expired (requested by a call to SetQueueTimer).
2370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        It will post any delayed events whose time as "expired" onto the event queue.
2380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        It may also call SignalQueueTimer() and SignalNonEmptyQueue().
2390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
2401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static void ServiceQueueTimer();
2410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Return the number of queued events. note that this value may be obsolete
2430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        upon return, since another thread may have called ProcessEvent() or
2440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        Post() after the count was made.
2450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
2460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static int CountEventsOnQueue();
2470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ////////////////////////////////////////////////////
2490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Porting layer must implement these functions **/
2500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ////////////////////////////////////////////////////
2510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Called whenever an SkEvent is posted to an empty queue, so that the OS
2530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        can be told to later call Dequeue().
2540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
2550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static void SignalNonEmptyQueue();
2560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /** Called whenever the delay until the next delayed event changes. If zero is
2570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        passed, then there are no more queued delay events.
2580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    */
2590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static void SignalQueueTimer(SkMSec delay);
2600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#ifndef SK_USE_WXWIDGETS
2620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#ifdef SK_BUILD_FOR_WIN
2630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static bool WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
2640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#elif defined(SK_BUILD_FOR_UNIXx)
2650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger  static uint32_t HandleTimer(uint32_t, void*);
2660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger  static bool WndProc(Display*, Window, XEvent&);
2670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif
2680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#else
2690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // Don't know yet what this will be
2700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    //static bool CustomEvent();
2710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif
2720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
2740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkMetaData      fMeta;
2750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    mutable char*   fType;  // may be characters with low bit set to know that it is not a pointer
2760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    uint32_t        f32;
2770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // 'there can be only one' (non-zero) between target-id and target-proc
2790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkEventSinkID   fTargetID;
2801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    Proc            fTargetProc;
2811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // these are for our implementation of the event queue
2830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkMSec          fTime;
2840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkEvent*        fNextEvent; // either in the delay or normal event queue
2851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void initialize(const char* type, size_t typeLen, SkEventSinkID);
2870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static bool Enqueue(SkEvent* evt);
2890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkMSec EnqueueTime(SkEvent* evt, SkMSec time);
2901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static SkEvent* Dequeue();
2910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static bool     QHasEvents();
2920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
2930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
2940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif
2950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
296