blob: 4ea1f953de2f77e4674ba64d341ee6572ffeefba [file] [view]
---
layout: doc
title: "Starboard Module Reference: event.h"
---
Defines the event system that wraps the Starboard main loop and entry point.
## The Starboard Application Lifecycle ##
```
---------- *
| |
| Preload
| |
| V
Start [ PRELOADING ] ------------
| | |
| Start |
| | |
| V |
----> [ STARTED ] <---- |
| | |
Pause Unpause |
| | Suspend
V | |
-----> [ PAUSED ] ----- |
| | |
Resume Suspend |
| | |
| V |
---- [ SUSPENDED ] <------------
|
Stop
|
V
[ STOPPED ]
```
The first event that a Starboard application receives is either `Start`
(`kSbEventTypeStart`) or `Preload` (`kSbEventTypePreload`). `Start` puts the
application in the `STARTED` state, whereas `Preload` puts the application in
the `PRELOADING` state.
`PRELOADING` can only happen as the first application state. In this state, the
application should start and run as normal, but will not receive any input, and
should not try to initialize graphics resources (via GL or `SbBlitter`). In
`PRELOADING`, the application can receive `Start` or `Suspend` events. `Start`
will receive the same data that was passed into `Preload`.
In the `STARTED` state, the application is in the foreground and can expect to
do all of the normal things it might want to do. Once in the `STARTED` state, it
may receive a `Pause` event, putting the application into the `PAUSED` state.
In the `PAUSED` state, the application is still visible, but has lost focus, or
it is partially obscured by a modal dialog, or it is on its way to being shut
down. The application should pause activity in this state. In this state, it can
receive `Unpause` to be brought back to the foreground state (`STARTED`), or
`Suspend` to be pushed further in the background to the `SUSPENDED` state.
In the `SUSPENDED` state, the application is generally not visible. It should
immediately release all graphics and video resources, and shut down all
background activity (timers, rendering, etc). Additionally, the application
should flush storage to ensure that if the application is killed, the storage
will be up-to-date. The application may be killed at this point, but will
ideally receive a `Stop` event for a more graceful shutdown.
Note that the application is always expected to transition through `PAUSED` to
`SUSPENDED` before receiving `Stop` or being killed.
## Enums ##
### SbEventType ###
An enumeration of all possible event types dispatched directly by the system.
Each event is accompanied by a void* data argument, and each event must define
the type of the value pointed to by that data argument, if any.
#### Values ####
* `kSbEventTypePreload`
Applications should perform initialization and prepare to react to
subsequent events, but must not initialize any graphics resources (through
GL or SbBlitter). The intent of this event is to allow the application to do
as much work as possible ahead of time, so that when the application is
first brought to the foreground, it's as fast as a resume.
The `kSbEventTypeStart` event may be sent at any time, regardless of
initialization state. Input events will not be sent in the `PRELOADING`
state. This event will only be sent once for a given process launch.
SbEventStartData is passed as the data argument.
The system may send `kSbEventTypeSuspend` in `PRELOADING` if it wants to
push the app into a lower resource consumption state. Applications can alo
call SbSystemRequestSuspend() when they are done preloading to request this.
* `kSbEventTypeStart`
The first event that an application receives on startup when starting
normally (i.e. not being preloaded). Applications should perform
initialization, start running, and prepare to react to subsequent events.
Applications that wish to run and then exit must call
`SbSystemRequestStop()` to terminate. This event will only be sent once for
a given process launch. `SbEventStartData` is passed as the data argument.
In case of preload, the `SbEventStartData` will be the same as what was
passed to `kSbEventTypePreload`.
* `kSbEventTypePause`
A dialog will be raised or the application will otherwise be put into a
background-but-visible or partially-obscured state (PAUSED). Graphics and
video resources will still be available, but the application should pause
foreground activity like animations and video playback. Can only be received
after a Start event. The only events that should be dispatched after a Pause
event are Unpause or Suspend. No data argument.
* `kSbEventTypeUnpause`
The application is returning to the foreground (STARTED) after having been
put in the PAUSED (e.g. partially-obscured) state. The application should
unpause foreground activity like animations and video playback. Can only be
received after a Pause or Resume event. No data argument.
* `kSbEventTypeSuspend`
The operating system will put the application into a Suspended state after
this event is handled. The application is expected to stop periodic
background work, release ALL graphics and video resources, and flush any
pending SbStorage writes. Some platforms will terminate the application if
work is done or resources are retained after suspension. Can only be
received after a Pause event. The only events that should be dispatched
after a Suspend event are Resume or Stop. On some platforms, the process may
also be killed after Suspend without a Stop event. No data argument.
* `kSbEventTypeResume`
The operating system has restored the application to the PAUSED state from
the SUSPENDED state. This is the first event the application will receive
coming out of SUSPENDED, and it will only be received after a Suspend event.
The application will now be in the PAUSED state. No data argument.
* `kSbEventTypeStop`
The operating system will shut the application down entirely after this
event is handled. Can only be recieved after a Suspend event, in the
SUSPENDED state. No data argument.
* `kSbEventTypeInput`
A user input event, including keyboard, mouse, gesture, or something else.
SbInputData (from input.h) is passed as the data argument.
* `kSbEventTypeUser`
A user change event, which means a new user signed-in or signed-out, or the
current user changed. No data argument, call SbUserGetSignedIn() and
SbUserGetCurrent() to get the latest changes.
* `kSbEventTypeLink`
A navigational link has come from the system, and the application should
consider handling it by navigating to the corresponding application
location. The data argument is an application-specific, null-terminated
string.
* `kSbEventTypeVerticalSync`
The beginning of a vertical sync has been detected. This event is very
timing-sensitive, so as little work as possible should be done on the main
thread if the application wants to receive this event in a timely manner. No
data argument.
* `kSbEventTypeNetworkDisconnect`
The platform has detected a network disconnection. The platform should make
a best effort to send an event of this type when the network disconnects,
but there are likely to be cases where the platform cannot detect the
disconnection (e.g. if the connection is via a powered hub which becomes
disconnected), so the current network state cannot always be inferred from
the sequence of Connect/Disconnect events.
* `kSbEventTypeNetworkConnect`
The platform has detected a network connection. This event may be sent at
application start-up, and should always be sent if the network reconnects
since a disconnection event was sent.
* `kSbEventTypeScheduled`
An event type reserved for scheduled callbacks. It will only be sent in
response to an application call to SbEventSchedule(), and it will call the
callback directly, so SbEventHandle should never receive this event
directly. The data type is an internally-defined structure.
* `kSbEventTypeAccessiblitySettingsChanged`
The platform's accessibility settings have changed. The application should
query the accessibility settings using the appropriate APIs to get the new
settings. Note this excludes captions settings changes, which causes
kSbEventTypeAccessibilityCaptionSettingsChanged to fire.
* `kSbEventTypeLowMemory`
An optional event that platforms may send to indicate that the application
may soon be terminated (or crash) due to low memory availability. The
application may respond by reducing memory consumption by running a Garbage
Collection, flushing caches, or something similar. There is no requirement
to respond to or handle this event, it is only advisory.
* `kSbEventTypeWindowSizeChanged`
The size or position of a SbWindow has changed. The data is
SbEventWindowSizeChangedData .
* `kSbEventTypeOnScreenKeyboardShown`
The platform has shown the on screen keyboard. This event is triggered by
the system or by the application's OnScreenKeyboard show method. The event
has int data representing a ticket. The ticket is used by the application to
mark individual calls to the show method as successfully completed. Events
triggered by the application have tickets passed in via
SbWindowShowOnScreenKeyboard. System-triggered events have ticket value
kSbEventOnScreenKeyboardInvalidTicket.
* `kSbEventTypeOnScreenKeyboardHidden`
The platform has hidden the on screen keyboard. This event is triggered by
the system or by the application's OnScreenKeyboard hide method. The event
has int data representing a ticket. The ticket is used by the application to
mark individual calls to the hide method as successfully completed. Events
triggered by the application have tickets passed in via
SbWindowHideOnScreenKeyboard. System-triggered events have ticket value
kSbEventOnScreenKeyboardInvalidTicket.
* `kSbEventTypeOnScreenKeyboardFocused`
The platform has focused the on screen keyboard. This event is triggered by
the system or by the application's OnScreenKeyboard focus method. The event
has int data representing a ticket. The ticket is used by the application to
mark individual calls to the focus method as successfully completed. Events
triggered by the application have tickets passed in via
SbWindowFocusOnScreenKeyboard. System-triggered events have ticket value
kSbEventOnScreenKeyboardInvalidTicket.
* `kSbEventTypeOnScreenKeyboardBlurred`
The platform has blurred the on screen keyboard. This event is triggered by
the system or by the application's OnScreenKeyboard blur method. The event
has int data representing a ticket. The ticket is used by the application to
mark individual calls to the blur method as successfully completed. Events
triggered by the application have tickets passed in via
SbWindowBlurOnScreenKeyboard. System-triggered events have ticket value
kSbEventOnScreenKeyboardInvalidTicket.
* `kSbEventTypeAccessibilityCaptionSettingsChanged`
One or more of the fields returned by SbAccessibilityGetCaptionSettings has
changed.
## Typedefs ##
### SbEventCallback ###
A function that can be called back from the main Starboard event pump.
#### Definition ####
```
typedef void(* SbEventCallback) (void *context)
```
### SbEventDataDestructor ###
A function that will cleanly destroy an event data instance of a specific type.
#### Definition ####
```
typedef void(* SbEventDataDestructor) (void *data)
```
### SbEventId ###
An ID that can be used to refer to a scheduled event.
#### Definition ####
```
typedef uint32_t SbEventId
```
## Structs ##
### SbEvent ###
Structure representing a Starboard event and its data.
#### Members ####
* `SbEventType type`
* `void * data`
### SbEventStartData ###
Event data for kSbEventTypeStart events.
#### Members ####
* `char ** argument_values`
The command-line argument values (argv).
* `int argument_count`
The command-line argument count (argc).
* `const char * link`
The startup link, if any.
### SbEventWindowSizeChangedData ###
Event data for kSbEventTypeWindowSizeChanged events.
#### Members ####
* `SbWindow window`
* `SbWindowSize size`
## Functions ##
### SbEventCancel ###
Cancels the specified `event_id`. Note that this function is a no-op if the
event already fired. This function can be safely called from any thread, but the
only way to guarantee that the event does not run anyway is to call it from the
main Starboard event loop thread.
#### Declaration ####
```
void SbEventCancel(SbEventId event_id)
```
### SbEventHandle ###
The entry point that Starboard applications MUST implement. Any memory pointed
at by `event` or the `data` field inside `event` is owned by the system, and
that memory is reclaimed after this function returns, so the implementation must
copy this data to extend its life. This behavior should also be assumed of all
fields within the `data` object, unless otherwise explicitly specified.
This function is only called from the main Starboard thread. There is no
specification about what other work might happen on this thread, so the
application should generally do as little work as possible on this thread, and
just dispatch it over to another thread.
#### Declaration ####
```
SB_IMPORT void SbEventHandle(const SbEvent *event)
```
### SbEventIsIdValid ###
Returns whether the given event handle is valid.
#### Declaration ####
```
static bool SbEventIsIdValid(SbEventId handle)
```
### SbEventSchedule ###
Schedules an event `callback` into the main Starboard event loop. This function
may be called from any thread, but `callback` is always called from the main
Starboard thread, queued with other pending events.
`callback`: The callback function to be called. `context`: The context that is
passed to the `callback` function. `delay`: The minimum number of microseconds
to wait before calling the `callback` function. Set `delay` to `0` to call the
callback as soon as possible.
#### Declaration ####
```
SbEventId SbEventSchedule(SbEventCallback callback, void *context, SbTime delay)
```