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