blob: 09eb0692ee188e2a93df7fb0a2211af35b2a3d55 [file] [log] [blame] [view]
<link rel="stylesheet" href="../style.css" />
[TOC]
# fuchsia.ui.input3
<h1>Physical keyboard events</h1>
<p>Fuchsia's Keyboard service provides a mechanism for delivering physical keyboard
events to all interested clients.</p>
<h2>Rendered Docs</h2>
<ul>
<li><a href="https://fuchsia.dev/reference/fidl/fuchsia.ui.input3">FIDL</a></li>
<li><a href="https://fuchsia-docs.firebaseapp.com/rust/fidl_fuchsia_ui_input3/index.html">Rust</a></li>
</ul>
<h2>Overview</h2>
<p>Key events are delivered only to the components subscribed via <code>Keyboard</code> FIDL
protocol. Components interested in the service, should list FIDL service in the
components manifest, and it will be injected when the component is started.</p>
<p>Typical use-cases:</p>
<ul>
<li>TAB navigation between form fields.</li>
<li>Arrow keys navigation in menus, lists.</li>
<li>Pressing “f” to open a <strong>F</strong>ile from a menu.</li>
<li>Closing popups on ESC.</li>
<li>WASD navigation in games.</li>
</ul>
<p>Media buttons, shortcuts, and text entry (IME) related events are delivered
separately via specialized interfaces.</p>
<p>Key events are only delivered to components in the Scenic focus chain.
Only focused components receive key events.</p>
<p>Key events are delivered in root to leaf order - i.e. parent components first.</p>
<p>Parent components have the ability to block further event propagation via
<code>KeyboardListener.OnKeyEvent</code> by returning <code>KeyEventStatus.Handled</code> to prevent
event’s propagation.</p>
<p>Clients are notified of keys being pressed or released via <code>Pressed</code> and
<code>Released</code> event types.</p>
<p>Clients are notified of keys pressed or released while client wasn't available
(e.g. not focused, or not started) via <code>Sync</code> and <code>Cancel</code> event types. Those
events will delivered for relevant events only, e.g. keys pressed and held while
client was not available.</p>
<h2>Example</h2>
<pre><code class="language-rust">use fidl_fuchsia_ui_input3 as ui_input;
let keyboard = connect_to_protocol::&lt;ui_input::KeyboardMarker&gt;()
.context(&quot;Failed to connect to Keyboard service&quot;)?;
let (listener_client_end, mut listener_stream) =
create_request_stream::&lt;ui_input::KeyboardListenerMarker&gt;()?;
keyboard.add_listener(view_ref, listener_client_end).await.expect(&quot;add_listener&quot;);
match listener_stream.next().await {
Some(Ok(ui_input::KeyboardListenerRequest::OnKeyEvent { event, responder, .. })) =&gt; {
assert_eq!(event.key, Some(fuchsia_input::Key::A));
responder.send(ui_input::Status::Handled).expect(&quot;response from key listener&quot;)
},
}
</code></pre>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 7</span></div>
## **PROTOCOLS**
## KeyEventInjector {#KeyEventInjector}
*Defined in [fuchsia.ui.input3/keyboard.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.ui.input3/keyboard.fidl;l=69)*
<p>Provides the ability to inject <code>KeyEvent</code>s into the keyboard subsystem.</p>
<h1>Roles</h1>
<p>This protocol will typically be:</p>
<ul>
<li>Implemented by platform components which process and deliver keyboard
events.</li>
<li>Consumed by components which originiate keyboard events. E.g.
an on-screen keyboard, or the Session Framework Input Pipeline.</li>
</ul>
<h1>Related protocols</h1>
<p>This protocol should be using in preference to legacy protocols which provide
similar functionality. Specifically, this means this protocol should be preferred
over</p>
<ul>
<li><code>fuchsia.ui.input.ImeService</code> which provides <code>InjectInput()</code>, <code>DispatchKey()</code>,
and <code>DispatchKey3()</code></li>
<li><code>fuchsia.ui.input.InputMethodEditor</code>, which provides <code>InjectInput()</code> and
<code>DispatchKey3()</code></li>
</ul>
<h1>Notes</h1>
<p>Products should take care to limit access to this protocol, as events injected
with this protocol are indistinguishable from those coming from physical devices.</p>
### Inject {#KeyEventInjector.Inject}
<p>Inject an event into the keyboard subsystem.</p>
<h1>Returns</h1>
<ul>
<li><code>HANDLED</code> if the keyboard subsystem delivered the event to a consumer,
and the consumer reported that it <code>HANDLED</code> the event</li>
<li><code>NOT_HANDLED</code> if the keyboard subsystem did not deliever the event to
any consumers, or no consumer reported that it <code>HANDLED</code> the event.</li>
</ul>
#### Request {#KeyEventInjector.Inject_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>key_event</code></td>
<td>
<code><a class='link' href='#KeyEvent'>KeyEvent</a></code>
</td>
</tr>
</table>
#### Response {#KeyEventInjector.Inject_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>status</code></td>
<td>
<code><a class='link' href='#KeyEventStatus'>KeyEventStatus</a></code>
</td>
</tr>
</table>
## Keyboard {#Keyboard}
*Defined in [fuchsia.ui.input3/keyboard.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.ui.input3/keyboard.fidl;l=11)*
<p>Components may request this service from their namespace to be notified of
physical key events.</p>
### AddListener {#Keyboard.AddListener}
<p>Add a key event listener for the specified View.
If multiple listeners are added, each will receive key events independently and
should respond with a <code>Status</code>.</p>
<p>The client calling <code>AddListener</code> should keep the connection to <code>Keyboard</code> alive
for as long as the events from <code>KeyboardListener</code> need to be received. Dropping the
connection to the <code>Keyboard</code> protocol will terminate <code>KeyboardListener</code> as well.</p>
#### Request {#Keyboard.AddListener_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>view_ref</code></td>
<td>
<code><a class='link' href='../fuchsia.ui.views/'>fuchsia.ui.views</a>/<a class='link' href='../fuchsia.ui.views/#ViewRef'>ViewRef</a></code>
</td>
</tr>
<tr>
<td><code>listener</code></td>
<td>
<code><a class='link' href='#KeyboardListener'>KeyboardListener</a></code>
</td>
</tr>
</table>
#### Response {#Keyboard.AddListener_Response}
&lt;EMPTY&gt;
## KeyboardListener {#KeyboardListener}
*Defined in [fuchsia.ui.input3/keyboard.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.ui.input3/keyboard.fidl;l=26)*
<p>Client should implement this protocol to get notified of key events.</p>
### OnKeyEvent {#KeyboardListener.OnKeyEvent}
<p>Called when a key event takes place, such as key press or release.</p>
<p>Protocol implementers must respond to acknowledge the event by returning Status
in a timely manner, i.e. not introducing significant delays to the
input pipeline (typically 10s of milliseconds).</p>
<p>Returning <code>NOT_HANDLED</code> means the event may be offered to other
clients of other related APIs.</p>
<p>Clients that do not acknowledge their events will eventually be disconnected.</p>
<p>Notification is only dispatched to a view that has focus. No other views,
including parents or children, will get notified specifically via <code>OnKeyEvent</code>.</p>
#### Request {#KeyboardListener.OnKeyEvent_Request}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>event</code></td>
<td>
<code><a class='link' href='#KeyEvent'>KeyEvent</a></code>
</td>
</tr>
</table>
#### Response {#KeyboardListener.OnKeyEvent_Response}
<table>
<tr><th>Name</th><th>Type</th></tr>
<tr>
<td><code>status</code></td>
<td>
<code><a class='link' href='#KeyEventStatus'>KeyEventStatus</a></code>
</td>
</tr>
</table>
## **ENUMS**
### KeyEventStatus [strict](/fuchsia-src/reference/fidl/language/language.md#strict-vs-flexible){:.fidl-attribute} {#KeyEventStatus data-text="KeyEventStatus"}
Type: <code>uint32</code>
*Defined in [fuchsia.ui.input3/keyboard.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.ui.input3/keyboard.fidl;l=87)*
<p>Return type for clients key events listener.</p>
<p>We do not expect new values to be added to this enum.</p>
<table>
<tr><th>Name</th><th>Value</th><th>Description</th></tr>
<tr id="KeyEventStatus.HANDLED">
<td><h3 id="KeyEventStatus.HANDLED" class="add-link hide-from-toc">HANDLED</h3></td>
<td><code>1</code></td>
<td><p>The key event was handled and its further propagation should be stopped.</p>
</td>
</tr>
<tr id="KeyEventStatus.NOT_HANDLED">
<td><h3 id="KeyEventStatus.NOT_HANDLED" class="add-link hide-from-toc">NOT_HANDLED</h3></td>
<td><code>2</code></td>
<td><p>The key event wasn't handled and should be delivered to other clients or listeners.</p>
</td>
</tr>
</table>
### KeyEventType [strict](/fuchsia-src/reference/fidl/language/language.md#strict-vs-flexible){:.fidl-attribute} {#KeyEventType data-text="KeyEventType"}
Type: <code>uint32</code>
*Defined in [fuchsia.ui.input3/events.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.ui.input3/events.fidl;l=12)*
<p>Type of the keyboard key input event.</p>
<p>We do not expect new values to be added into this enum.</p>
<table>
<tr><th>Name</th><th>Value</th><th>Description</th></tr>
<tr id="KeyEventType.PRESSED">
<td><h3 id="KeyEventType.PRESSED" class="add-link hide-from-toc">PRESSED</h3></td>
<td><code>1</code></td>
<td><p>Key is actuated.</p>
<p>Receiving this event type means that a key has been actuated
at the timestamp when the event is received, and while the event
recipient is focused.</p>
<p>For example, if the key is a keyboard key, then it was just
pressed.</p>
</td>
</tr>
<tr id="KeyEventType.RELEASED">
<td><h3 id="KeyEventType.RELEASED" class="add-link hide-from-toc">RELEASED</h3></td>
<td><code>2</code></td>
<td><p>Key is no longer actuated.</p>
<p>Receiving this event type means that a key has been de-actuated
at the timestamp when the event is received, and while the event
recipient is focused.</p>
<p>For example, if the key is a keyboard key, then it was just
released.</p>
</td>
</tr>
<tr id="KeyEventType.SYNC">
<td><h3 id="KeyEventType.SYNC" class="add-link hide-from-toc">SYNC</h3></td>
<td><code>3</code></td>
<td><p>Key was actuated while the client wasn't able to receive it,
and is still actuated now that the client is able to receive
key events.</p>
<p>This may happen in a few ways:</p>
<pre><code>- A new device was connected while its key was actuated.
- The key was actuated while the event recipient did not
have focus.
</code></pre>
<p>Therefore, this is not a &quot;regular&quot; key actuation. It reports
now that the key has been actuated in the unknown past. Some
event recipients may therefore decide that this is not an
actionable key event, while some others may decide that it is.</p>
<p>For example, recipients that trigger some user action may
decide to ignore <code>SYNC</code> events, to avoid spurious actions. In
contrast, recipients that keep track of the keyboard
state may want to consider a <code>SYNC</code> event as a signal
to update the key's state to actuated.</p>
</td>
</tr>
<tr id="KeyEventType.CANCEL">
<td><h3 id="KeyEventType.CANCEL" class="add-link hide-from-toc">CANCEL</h3></td>
<td><code>4</code></td>
<td><p>Key may have been actuated, but its actuation has
become invalid due to an event other than a key
de-actuation.</p>
<p>This may happen in a few ways:</p>
<pre><code>- A device was disconnected while its key was actuated.
- The event recipient just lost focus.
</code></pre>
<p>Therefore, this is not a &quot;regular&quot; key de-actuation. It reports
the key is no longer validly actuated due to an event other than
a key release. Some event recipients may therefore decide that
this is not an actionable key event, while some others may
decide that it is.</p>
<p>For example, recipients which trigger some user action may
decide to ignore <code>CANCEL</code> events, to avoid spurious actions. In
contrast, recipients that keep track of the keyboard
state may want to consider a <code>CANCEL</code> event as a signal to update
the key's state to being de-actuated.</p>
</td>
</tr>
</table>
### NonPrintableKey [flexible](/fuchsia-src/reference/fidl/language/language.md#strict-vs-flexible){:.fidl-attribute} {#NonPrintableKey data-text="NonPrintableKey"}
Type: <code>uint32</code>
*Defined in [fuchsia.ui.input3/events.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.ui.input3/events.fidl;l=119)*
<p>NonPrintableKey represents the meaning of a non-symbolic key on a keyboard.</p>
<p>The definition of each key is derived from <a href="https://www.w3.org/TR/uievents-key/#named-key-attribute-values">W3C named values of a key
attribute</a>.</p>
<h2>API version 9 and onwards</h2>
<p>Starting from API version 9, the enum value space is subdivided based on the
subsection numbers of the section <a href="https://www.w3.org/TR/uievents-key/#named-key-attribute-values">Named Key Attribute Values</a>, multiplied
by 0x1000.</p>
<p>For example, the keys from section <a href="https://www.w3.org/TR/uievents-key/#keys-multimedia">3.10 Multimedia keys</a> will be located
at <code>0xa000</code>-<code>0xafff</code>. The values and reservations that were present
in this enum prior to the introduction of the convention have not been moved,
and values that go logically into pre-existing sections have been inserted
into their logical place using the prior convention (see below). This allows
us to extract the section ranges if this is for some reason useful to the
application.</p>
<h2>Prior to API version 9</h2>
<p>The space of the nonprintable keys is subdivided roughly to correspond to the
subsections of Section 3 of the document Named Key Attribute Values.
The choice for the section values is arbitrary, so long as blocks of
values are allocated at once, and the keys with similar purpose are kept
together.</p>
<h2>Reserved ranges</h2>
<p>The space of possible values for [NonPrintableKey] is subdivided into a
number of ranges, with the intention that the enum values are placed in
the appropriate range when added.</p>
<ul>
<li>Special keys: 0x00-0x10</li>
<li>Modifier keys: 0x11-0x30</li>
<li>Whitespace keys: 0x31-0x40</li>
<li>Navigation keys: 0x61-0x80</li>
<li>General-purpose function keys: 0x9000-0x9FFF</li>
</ul>
<table>
<tr><th>Name</th><th>Value</th><th>Description</th></tr>
<tr id="NonPrintableKey.UNIDENTIFIED">
<td><h3 id="NonPrintableKey.UNIDENTIFIED" class="add-link hide-from-toc">UNIDENTIFIED</h3></td>
<td><code>0</code></td>
<td><p>This key value is used when an implementation is unable to identify
another key value, due to either hardware, platform, or software
constraints.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.ALT">
<td><h3 id="NonPrintableKey.ALT" class="add-link hide-from-toc">ALT</h3></td>
<td><code>17</code></td>
<td><p>The Alt (Alternative) key.</p>
<p>This key enables the alternate modifier function for interpreting concurrent
or subsequent keyboard input.
This key value is also used for the Apple Option key.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.ALT_GRAPH">
<td><h3 id="NonPrintableKey.ALT_GRAPH" class="add-link hide-from-toc">ALT_GRAPH</h3></td>
<td><code>18</code></td>
<td><p>The Alternate Graphics (AltGr or AltGraph).</p>
<p>This key is used enable the ISO Level 3 shift modifier (the standard Shift key is the level
2 modifier). See <a href="http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=51645">ISO9995-1</a>.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.CAPS_LOCK">
<td><h3 id="NonPrintableKey.CAPS_LOCK" class="add-link hide-from-toc">CAPS_LOCK</h3></td>
<td><code>19</code></td>
<td><p>The Caps Lock (Capital) key.</p>
<p>Toggle capital character lock function for interpreting subsequent keyboard input event.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.CONTROL">
<td><h3 id="NonPrintableKey.CONTROL" class="add-link hide-from-toc">CONTROL</h3></td>
<td><code>20</code></td>
<td><p>The Control or Ctrl key, to enable control modifier function for interpreting concurrent or
subsequent keyboard input.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.FN">
<td><h3 id="NonPrintableKey.FN" class="add-link hide-from-toc">FN</h3></td>
<td><code>21</code></td>
<td><p>The Function switch Fn key.</p>
<p>Activating this key simultaneously with another key changes that key’s value to an alternate
character or function. This key is often handled directly in the keyboard hardware and does
not usually generate key events.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.FN_LOCK">
<td><h3 id="NonPrintableKey.FN_LOCK" class="add-link hide-from-toc">FN_LOCK</h3></td>
<td><code>22</code></td>
<td><p>The Function-Lock (FnLock or F-Lock) key.</p>
<p>Activating this key switches the mode of the keyboard to changes some keys' values to an
alternate character or function. This key is often handled directly in the keyboard hardware
and does not usually generate key events.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.META">
<td><h3 id="NonPrintableKey.META" class="add-link hide-from-toc">META</h3></td>
<td><code>23</code></td>
<td><p>The Meta key, to enable meta modifier function for interpreting concurrent or subsequent
keyboard input.</p>
<p>This key value is used for the Windows Logo key and the Apple Command or ⌘ key.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.NUM_LOCK">
<td><h3 id="NonPrintableKey.NUM_LOCK" class="add-link hide-from-toc">NUM_LOCK</h3></td>
<td><code>24</code></td>
<td><p>The NumLock or Number Lock key, to toggle numpad mode function for interpreting subsequent
keyboard input.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.SCROLL_LOCK">
<td><h3 id="NonPrintableKey.SCROLL_LOCK" class="add-link hide-from-toc">SCROLL_LOCK</h3></td>
<td><code>25</code></td>
<td><p>The Scroll Lock key, to toggle between scrolling and cursor movement modes.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.SHIFT">
<td><h3 id="NonPrintableKey.SHIFT" class="add-link hide-from-toc">SHIFT</h3></td>
<td><code>26</code></td>
<td><p>The Shift key, to enable shift modifier function for interpreting concurrent or subsequent
keyboard input.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.SYMBOL">
<td><h3 id="NonPrintableKey.SYMBOL" class="add-link hide-from-toc">SYMBOL</h3></td>
<td><code>27</code></td>
<td><p>The Symbol modifier key (used on some virtual keyboards).</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.SYMBOL_LOCK">
<td><h3 id="NonPrintableKey.SYMBOL_LOCK" class="add-link hide-from-toc">SYMBOL_LOCK</h3></td>
<td><code>28</code></td>
<td><p>The Symbol Lock key.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.HYPER">
<td><h3 id="NonPrintableKey.HYPER" class="add-link hide-from-toc">HYPER</h3></td>
<td><code>29</code></td>
<td><p>The Hyper key. A legacy modifier.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.SUPER">
<td><h3 id="NonPrintableKey.SUPER" class="add-link hide-from-toc">SUPER</h3></td>
<td><code>30</code></td>
<td><p>The Super key. A legacy modifier.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.ENTER">
<td><h3 id="NonPrintableKey.ENTER" class="add-link hide-from-toc">ENTER</h3></td>
<td><code>49</code></td>
<td><p>The Enter or ↵ key, to activate current selection or accept current input.
This key value is also used for the Return (Macintosh numpad) key.</p>
</td>
</tr>
<tr id="NonPrintableKey.TAB">
<td><h3 id="NonPrintableKey.TAB" class="add-link hide-from-toc">TAB</h3></td>
<td><code>50</code></td>
<td><p>The Horizontal Tabulation Tab key.</p>
</td>
</tr>
<tr id="NonPrintableKey.BACKSPACE">
<td><h3 id="NonPrintableKey.BACKSPACE" class="add-link hide-from-toc">BACKSPACE</h3></td>
<td><code>65</code></td>
<td><p>Delete the character immediately preceding the cursor (i.e. the
character to the left for LTR languages).</p>
</td>
</tr>
<tr id="NonPrintableKey.DOWN">
<td><h3 id="NonPrintableKey.DOWN" class="add-link hide-from-toc">DOWN</h3></td>
<td><code>97</code></td>
<td><p>The down arrow navigation key.</p>
</td>
</tr>
<tr id="NonPrintableKey.LEFT">
<td><h3 id="NonPrintableKey.LEFT" class="add-link hide-from-toc">LEFT</h3></td>
<td><code>98</code></td>
<td><p>The left arrow navigation key.</p>
</td>
</tr>
<tr id="NonPrintableKey.RIGHT">
<td><h3 id="NonPrintableKey.RIGHT" class="add-link hide-from-toc">RIGHT</h3></td>
<td><code>99</code></td>
<td><p>The right arrow navigation key.</p>
</td>
</tr>
<tr id="NonPrintableKey.UP">
<td><h3 id="NonPrintableKey.UP" class="add-link hide-from-toc">UP</h3></td>
<td><code>100</code></td>
<td><p>The up arrow navigation key.</p>
</td>
</tr>
<tr id="NonPrintableKey.END">
<td><h3 id="NonPrintableKey.END" class="add-link hide-from-toc">END</h3></td>
<td><code>101</code></td>
<td><p>The &quot;End&quot; key.</p>
</td>
</tr>
<tr id="NonPrintableKey.HOME">
<td><h3 id="NonPrintableKey.HOME" class="add-link hide-from-toc">HOME</h3></td>
<td><code>102</code></td>
<td><p>The &quot;Home&quot; key.</p>
</td>
</tr>
<tr id="NonPrintableKey.PAGE_DOWN">
<td><h3 id="NonPrintableKey.PAGE_DOWN" class="add-link hide-from-toc">PAGE_DOWN</h3></td>
<td><code>103</code></td>
<td><p>The &quot;Page Down&quot; key.</p>
</td>
</tr>
<tr id="NonPrintableKey.PAGE_UP">
<td><h3 id="NonPrintableKey.PAGE_UP" class="add-link hide-from-toc">PAGE_UP</h3></td>
<td><code>104</code></td>
<td><p>The &quot;Page Up&quot; key.</p>
</td>
</tr>
<tr id="NonPrintableKey.ESCAPE">
<td><h3 id="NonPrintableKey.ESCAPE" class="add-link hide-from-toc">ESCAPE</h3></td>
<td><code>24581</code></td>
<td><p>The <code>Escape</code> or <code>Esc</code> key.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.SELECT">
<td><h3 id="NonPrintableKey.SELECT" class="add-link hide-from-toc">SELECT</h3></td>
<td><code>24588</code></td>
<td><p>The Select key. Used to select the window of a task to focus on.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.BRIGHTNESS_DOWN">
<td><h3 id="NonPrintableKey.BRIGHTNESS_DOWN" class="add-link hide-from-toc">BRIGHTNESS_DOWN</h3></td>
<td><code>28672</code></td>
<td><p>The Brightness Down key. Typically controls the display brightness.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.BRIGHTNESS_UP">
<td><h3 id="NonPrintableKey.BRIGHTNESS_UP" class="add-link hide-from-toc">BRIGHTNESS_UP</h3></td>
<td><code>28673</code></td>
<td><p>The Brightness Up key. Typically controls the display brightness.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.F1">
<td><h3 id="NonPrintableKey.F1" class="add-link hide-from-toc">F1</h3></td>
<td><code>36865</code></td>
<td><p>The F1 key, a general purpose function key, as index 1.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.F2">
<td><h3 id="NonPrintableKey.F2" class="add-link hide-from-toc">F2</h3></td>
<td><code>36866</code></td>
<td><p>The F2 key, a general purpose function key, as index 2.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.F3">
<td><h3 id="NonPrintableKey.F3" class="add-link hide-from-toc">F3</h3></td>
<td><code>36867</code></td>
<td><p>The F3 key, a general purpose function key, as index 3.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.F4">
<td><h3 id="NonPrintableKey.F4" class="add-link hide-from-toc">F4</h3></td>
<td><code>36868</code></td>
<td><p>The F4 key, a general purpose function key, as index 4.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.F5">
<td><h3 id="NonPrintableKey.F5" class="add-link hide-from-toc">F5</h3></td>
<td><code>36869</code></td>
<td><p>The F5 key, a general purpose function key, as index 5.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.F6">
<td><h3 id="NonPrintableKey.F6" class="add-link hide-from-toc">F6</h3></td>
<td><code>36870</code></td>
<td><p>The F6 key, a general purpose function key, as index 6.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.F7">
<td><h3 id="NonPrintableKey.F7" class="add-link hide-from-toc">F7</h3></td>
<td><code>36871</code></td>
<td><p>The F7 key, a general purpose function key, as index 7.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.F8">
<td><h3 id="NonPrintableKey.F8" class="add-link hide-from-toc">F8</h3></td>
<td><code>36872</code></td>
<td><p>The F8 key, a general purpose function key, as index 8.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.F9">
<td><h3 id="NonPrintableKey.F9" class="add-link hide-from-toc">F9</h3></td>
<td><code>36873</code></td>
<td><p>The F9 key, a general purpose function key, as index 9.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.F10">
<td><h3 id="NonPrintableKey.F10" class="add-link hide-from-toc">F10</h3></td>
<td><code>36874</code></td>
<td><p>The F10 key, a general purpose function key, as index 10.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.F11">
<td><h3 id="NonPrintableKey.F11" class="add-link hide-from-toc">F11</h3></td>
<td><code>36875</code></td>
<td><p>The F11 key, a general purpose function key, as index 11.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.F12">
<td><h3 id="NonPrintableKey.F12" class="add-link hide-from-toc">F12</h3></td>
<td><code>36876</code></td>
<td><p>The F1 key, a general purpose function key, as index 12.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.SOFT_1">
<td><h3 id="NonPrintableKey.SOFT_1" class="add-link hide-from-toc">SOFT_1</h3></td>
<td><code>36881</code></td>
<td><p>General purpose virtual function key, as index 1.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.SOFT_2">
<td><h3 id="NonPrintableKey.SOFT_2" class="add-link hide-from-toc">SOFT_2</h3></td>
<td><code>36882</code></td>
<td><p>General purpose virtual function key, as index 2.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.SOFT_3">
<td><h3 id="NonPrintableKey.SOFT_3" class="add-link hide-from-toc">SOFT_3</h3></td>
<td><code>36883</code></td>
<td><p>General purpose virtual function key, as index 3.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.SOFT_4">
<td><h3 id="NonPrintableKey.SOFT_4" class="add-link hide-from-toc">SOFT_4</h3></td>
<td><code>36884</code></td>
<td><p>General purpose virtual function key, as index 4.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 9</span></div>
</td>
</tr>
<tr id="NonPrintableKey.MEDIA_PLAY_PAUSE">
<td><h3 id="NonPrintableKey.MEDIA_PLAY_PAUSE" class="add-link hide-from-toc">MEDIA_PLAY_PAUSE</h3></td>
<td><code>40968</code></td>
<td><p>Pause the currently playing media.</p>
<p>NOTE: Media controller devices should use this value rather than
<code>PAUSE</code> for their pause keys.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.AUDIO_VOLUME_DOWN">
<td><h3 id="NonPrintableKey.AUDIO_VOLUME_DOWN" class="add-link hide-from-toc">AUDIO_VOLUME_DOWN</h3></td>
<td><code>49162</code></td>
<td><p>Decrease audio volume.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.AUDIO_VOLUME_UP">
<td><h3 id="NonPrintableKey.AUDIO_VOLUME_UP" class="add-link hide-from-toc">AUDIO_VOLUME_UP</h3></td>
<td><code>49163</code></td>
<td><p>Increase audio volume.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.AUDIO_VOLUME_MUTE">
<td><h3 id="NonPrintableKey.AUDIO_VOLUME_MUTE" class="add-link hide-from-toc">AUDIO_VOLUME_MUTE</h3></td>
<td><code>49164</code></td>
<td><p>Toggle between muted state and prior volume level.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.BROWSER_BACK">
<td><h3 id="NonPrintableKey.BROWSER_BACK" class="add-link hide-from-toc">BROWSER_BACK</h3></td>
<td><code>61440</code></td>
<td><p>Navigate to previous content or page in current history.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.BROWSER_FAVORITES">
<td><h3 id="NonPrintableKey.BROWSER_FAVORITES" class="add-link hide-from-toc">BROWSER_FAVORITES</h3></td>
<td><code>61441</code></td>
<td><p>Open the list of browser favorites.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.BROWSER_FORWARD">
<td><h3 id="NonPrintableKey.BROWSER_FORWARD" class="add-link hide-from-toc">BROWSER_FORWARD</h3></td>
<td><code>61442</code></td>
<td><p>Navigate to next content or page in current history.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.BROWSER_HOME">
<td><h3 id="NonPrintableKey.BROWSER_HOME" class="add-link hide-from-toc">BROWSER_HOME</h3></td>
<td><code>61443</code></td>
<td><p>Go to the user’s preferred home page.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.BROWSER_REFRESH">
<td><h3 id="NonPrintableKey.BROWSER_REFRESH" class="add-link hide-from-toc">BROWSER_REFRESH</h3></td>
<td><code>61444</code></td>
<td><p>Refresh the current page or content.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.BROWSER_SEARCH">
<td><h3 id="NonPrintableKey.BROWSER_SEARCH" class="add-link hide-from-toc">BROWSER_SEARCH</h3></td>
<td><code>61445</code></td>
<td><p>Call up the user’s preferred search page.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.BROWSER_STOP">
<td><h3 id="NonPrintableKey.BROWSER_STOP" class="add-link hide-from-toc">BROWSER_STOP</h3></td>
<td><code>61446</code></td>
<td><div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
<tr id="NonPrintableKey.ZOOM_TOGGLE">
<td><h3 id="NonPrintableKey.ZOOM_TOGGLE" class="add-link hide-from-toc">ZOOM_TOGGLE</h3></td>
<td><code>73799</code></td>
<td><p>Toggle between full-screen and scaled content, or alter magnification level.</p>
<div class="fidl-version-div"><span class="fidl-attribute fidl-version">Added: 10</span></div>
</td>
</tr>
</table>
## **TABLES**
### KeyEvent {#KeyEvent data-text="KeyEvent"}
*Defined in [fuchsia.ui.input3/events.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.ui.input3/events.fidl;l=443)*
<p>A Keyboard event generated to reflect key input. <code>timestamp</code> and <code>type</code> are required.
At least one of <code>key</code> and <code>key_meaning</code> must be set for a valid event.</p>
<table>
<tr><th>Ordinal</th><th>Field</th><th>Type</th><th>Description</th></tr>
<tr id="KeyEvent.timestamp">
<td><h3 id="KeyEvent.timestamp" class="add-link hide-from-toc">1</h3></td>
<td><code>timestamp</code></td>
<td>
<code><a class='link' href='../zx/'>zx</a>/<a class='link' href='../zx/#time'>time</a></code>
</td>
<td><p>Time in nanoseconds when the event was recorded, in the <code>CLOCK_MONOTONIC</code> time base.
The timestamp is <strong>required</strong> on every key event, and users can expect that it
will always be present.</p>
</td>
</tr>
<tr id="KeyEvent.type">
<td><h3 id="KeyEvent.type" class="add-link hide-from-toc">2</h3></td>
<td><code>type</code></td>
<td>
<code><a class='link' href='#KeyEventType'>KeyEventType</a></code>
</td>
<td><p>Type of event.</p>
</td>
</tr>
<tr id="KeyEvent.key">
<td><h3 id="KeyEvent.key" class="add-link hide-from-toc">3</h3></td>
<td><code>key</code></td>
<td>
<code><a class='link' href='../fuchsia.input/'>fuchsia.input</a>/<a class='link' href='../fuchsia.input/#Key'>Key</a></code>
</td>
<td><p>Identifies the key ignoring modifiers, layout, prior key events, etc. This is called
the &quot;physical key&quot; on some platforms. In cases where the key event did not originate
from a physical keyboard (e.g. onscreen keyboard) this field may be empty.</p>
</td>
</tr>
<tr id="KeyEvent.modifiers">
<td><h3 id="KeyEvent.modifiers" class="add-link hide-from-toc">4</h3></td>
<td><code>modifiers</code></td>
<td>
<code><a class='link' href='#Modifiers'>Modifiers</a></code>
</td>
<td><p>Modifiers in effect at the time of the event.
Example:
CapsLock is off, user presses CapsLock, then A, then releases both.
Event sequence is as follows:</p>
<ol>
<li>type: Pressed, key: CapsLock, modifiers: None</li>
<li>type: Pressed, key: A, modifiers: CapsLock</li>
<li>type: Released, key: CapsLock, modifiers: CapsLock</li>
<li>type: Released, key: A, modifiers: CapsLock</li>
</ol>
<p>CapsLock is on, user presses CapsLock, then A, then releases both.</p>
<ol>
<li>type: Pressed, key: CapsLock, modifiers: CapsLock</li>
<li>type: Pressed, key: A, modifiers: None</li>
<li>type: Released, key: CapsLock, modifiers: None</li>
<li>type: Released, key: A, modifiers: None</li>
</ol>
</td>
</tr>
<tr id="KeyEvent.key_meaning">
<td><h3 id="KeyEvent.key_meaning" class="add-link hide-from-toc">5</h3></td>
<td><code>key_meaning</code></td>
<td>
<code><a class='link' href='#KeyMeaning'>KeyMeaning</a></code>
</td>
<td><p>Meaning of the key.</p>
</td>
</tr>
<tr id="KeyEvent.repeat_sequence">
<td><h3 id="KeyEvent.repeat_sequence" class="add-link hide-from-toc">6</h3></td>
<td><code>repeat_sequence</code></td>
<td>
<code>uint32</code>
</td>
<td><p>The sequence number of this <code>KeyEvent</code> in the sequence of autorepeated
keys.</p>
<p>Unset if this event has been generated in the immediate response to an
input from the keyboard driver. If the <code>KeyEvent</code> has been generated
through the autorepeat mechanism, this property is set and is
incremented by one for each successive generated key event.</p>
</td>
</tr>
<tr id="KeyEvent.lock_state">
<td><h3 id="KeyEvent.lock_state" class="add-link hide-from-toc">7</h3></td>
<td><code>lock_state</code></td>
<td>
<code><a class='link' href='#LockState'>LockState</a></code>
</td>
<td><p>The lock state in effect at the time of the event.</p>
<p>For example, if CapsLock effect is turned on (pressing 'a' results in
the effect 'A'), the corresponding bit in the lock state is set.</p>
<p>NOTE: <code>LockState</code> is different from whether the CapsLock modifier key
is actuated or not. <code>LockState.CAPS_LOCK</code> can be active even if the
Caps Lock key is not currently actuated.</p>
</td>
</tr>
</table>
## **UNIONS**
### KeyMeaning [strict](/fuchsia-src/reference/fidl/language/language.md#strict-vs-flexible){:.fidl-attribute} {#KeyMeaning data-text="KeyMeaning"}
*Defined in [fuchsia.ui.input3/events.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.ui.input3/events.fidl;l=430)*
<p>The meaning of the key press. This is typically the Unicode codepoint inserted
by this event, or an enum representing a key that corresponds to whitespace or
is otherwise unprintable.</p>
<table>
<tr><th>Ordinal</th><th>Variant</th><th>Type</th><th>Description</th></tr>
<tr id="KeyMeaning.codepoint">
<td><h3 id="KeyMeaning.codepoint" class="add-link hide-from-toc">1</h3></td>
<td><code>codepoint</code></td>
<td>
<code>uint32</code>
</td>
<td><p>The Unicode codepoint representing character typed, if any.</p>
<ul>
<li>In Dart and Go, this corresponds to a <code>rune</code>.</li>
<li>In Rust, this corresponds to a <code>char</code>.</li>
<li>In C and C++, this corresponds to ICU's UChar32.</li>
</ul>
</td>
</tr>
<tr id="KeyMeaning.non_printable_key">
<td><h3 id="KeyMeaning.non_printable_key" class="add-link hide-from-toc">2</h3></td>
<td><code>non_printable_key</code></td>
<td>
<code><a class='link' href='#NonPrintableKey'>NonPrintableKey</a></code>
</td>
<td><p>The meaning of the key for key events with no corresponding symbol.</p>
</td>
</tr>
</table>
## **BITS**
### LockState [flexible](/fuchsia-src/reference/fidl/language/language.md#strict-vs-flexible){:.fidl-attribute} {#LockState}
Type: <code>uint64</code>
*Defined in [fuchsia.ui.input3/modifiers.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.ui.input3/modifiers.fidl;l=74)*
<p>A bit field of lock states which are currently active.</p>
<p>Lock state reports whether the lock is active for the keys which have a lock
state (need to be pressed once to activate, and one more time to deactivate).
A set bit denotes active lock state.</p>
<p>For example, when Caps Lock is active, i.e. pressing 'a' produces the effect
of 'A' appearing on the screen, the <code>CAPS_LOCK</code> bit will be active.</p>
<p>The bit values in <code>LockState</code> are chosen to correspond to the values in
<code>Modifiers</code>, to the extent that this is doable in the long run.</p>
<table>
<tr><th>Name</th><th>Value</th><th>Description</th></tr>
<tr id="LockState.CAPS_LOCK">
<td><h3 id="LockState.CAPS_LOCK" class="add-link hide-from-toc">CAPS_LOCK</h3></td>
<td>1</td>
<td><p>Applies when the <code>CAPS_LOCK</code> modifier is locked.</p>
<p>Users should bear in mind that the effect of <code>CAPS_LOCK</code> is limited to
alphabetic keys (not even <em>alphanumerics</em>) mainly.</p>
<p>For example, pressing <code>a</code> on a US QWERTY keyboard while <code>CAPS_LOCK</code>
state is locked results in the key meaning <code>A</code>, just as if the Shift modifier
was used. However, pressing <code>[</code> when <code>CAPS_LOCK</code> is locked gives <code>[</code>,
even though Shift+<code>[</code> gives <code>{</code>.</p>
<p>The position of alphabetic keys may vary depending on the keymap in
current use too.</p>
</td>
</tr>
<tr id="LockState.NUM_LOCK">
<td><h3 id="LockState.NUM_LOCK" class="add-link hide-from-toc">NUM_LOCK</h3></td>
<td>2</td>
<td><p>Applies when the <code>NUM_LOCK</code> modifier is locked.</p>
</td>
</tr>
<tr id="LockState.SCROLL_LOCK">
<td><h3 id="LockState.SCROLL_LOCK" class="add-link hide-from-toc">SCROLL_LOCK</h3></td>
<td>4</td>
<td><p>Applies when the <code>SCROLL_LOCK</code> modifier is locked.</p>
</td>
</tr>
<tr id="LockState.FUNCTION_LOCK">
<td><h3 id="LockState.FUNCTION_LOCK" class="add-link hide-from-toc">FUNCTION_LOCK</h3></td>
<td>8</td>
<td><p>Applies when the <code>FUNCTION</code> modifier is locked.</p>
</td>
</tr>
<tr id="LockState.SYMBOL_LOCK">
<td><h3 id="LockState.SYMBOL_LOCK" class="add-link hide-from-toc">SYMBOL_LOCK</h3></td>
<td>16</td>
<td><p>Applies when the <code>SYMBOL</code> modifier is locked.</p>
</td>
</tr>
</table>
### Modifiers [flexible](/fuchsia-src/reference/fidl/language/language.md#strict-vs-flexible){:.fidl-attribute} {#Modifiers}
Type: <code>uint64</code>
*Defined in [fuchsia.ui.input3/modifiers.fidl](https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.ui.input3/modifiers.fidl;l=20)*
<p>Declares all the modifiers supported by Fuchsia's input subsystem.</p>
<p>Modifiers are special keys that modify the purpose or the function
of other keys when used in combination with them. In the Modifiers type,
a bit is set if the specific modifier key is actuated (held down),
irrespective of whether the modifier has an associated lock state or not.</p>
<p><strong>NOTE:</strong> If you want to examine the lock state (such as whether Caps
Lock needs to turn all letters into uppercase),you want [LockState]
instead.</p>
<p>Somewhat specially, and as a convenience for the users, the modifiers that
have &quot;left&quot; and &quot;right&quot; flavors have special bit values which can be used
if the distinction between sides does not matter.</p>
<table>
<tr><th>Name</th><th>Value</th><th>Description</th></tr>
<tr id="Modifiers.CAPS_LOCK">
<td><h3 id="Modifiers.CAPS_LOCK" class="add-link hide-from-toc">CAPS_LOCK</h3></td>
<td>1</td>
<td><p>Applies when the <code>CAPS_LOCK</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.NUM_LOCK">
<td><h3 id="Modifiers.NUM_LOCK" class="add-link hide-from-toc">NUM_LOCK</h3></td>
<td>2</td>
<td><p>Applies when the <code>NUM_LOCK</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.SCROLL_LOCK">
<td><h3 id="Modifiers.SCROLL_LOCK" class="add-link hide-from-toc">SCROLL_LOCK</h3></td>
<td>4</td>
<td><p>Applies when the <code>SCROLL_LOCK</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.FUNCTION">
<td><h3 id="Modifiers.FUNCTION" class="add-link hide-from-toc">FUNCTION</h3></td>
<td>8</td>
<td><p>Applies when the <code>FUNCTION</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.SYMBOL">
<td><h3 id="Modifiers.SYMBOL" class="add-link hide-from-toc">SYMBOL</h3></td>
<td>16</td>
<td><p>Applies when the <code>SYMBOL</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.LEFT_SHIFT">
<td><h3 id="Modifiers.LEFT_SHIFT" class="add-link hide-from-toc">LEFT_SHIFT</h3></td>
<td>32</td>
<td><p>Applies when the left SHIFT modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.RIGHT_SHIFT">
<td><h3 id="Modifiers.RIGHT_SHIFT" class="add-link hide-from-toc">RIGHT_SHIFT</h3></td>
<td>64</td>
<td><p>Applies when the right SHIFT modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.SHIFT">
<td><h3 id="Modifiers.SHIFT" class="add-link hide-from-toc">SHIFT</h3></td>
<td>128</td>
<td><p>Applies when either <code>LEFT_SHIFT</code> or <code>RIGHT_SHIFT</code> modifier is actuated.</p>
<p>This bit mask a convenience to test for either <code>LEFT_SHIFT</code>
or <code>RIGHT_SHIFT</code>.</p>
</td>
</tr>
<tr id="Modifiers.LEFT_ALT">
<td><h3 id="Modifiers.LEFT_ALT" class="add-link hide-from-toc">LEFT_ALT</h3></td>
<td>256</td>
<td><p>Applies when the left <code>ALT</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.RIGHT_ALT">
<td><h3 id="Modifiers.RIGHT_ALT" class="add-link hide-from-toc">RIGHT_ALT</h3></td>
<td>512</td>
<td><p>Applies when the right <code>ALT</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.ALT">
<td><h3 id="Modifiers.ALT" class="add-link hide-from-toc">ALT</h3></td>
<td>1024</td>
<td><p>Applies when either the left <code>ALT</code> or the right <code>ALT</code> modifier
is actuated.</p>
</td>
</tr>
<tr id="Modifiers.ALT_GRAPH">
<td><h3 id="Modifiers.ALT_GRAPH" class="add-link hide-from-toc">ALT_GRAPH</h3></td>
<td>2048</td>
<td><p>Applies when the <code>ALT_GRAPH</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.LEFT_META">
<td><h3 id="Modifiers.LEFT_META" class="add-link hide-from-toc">LEFT_META</h3></td>
<td>4096</td>
<td><p>Applies when the <code>LEFT_META</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.RIGHT_META">
<td><h3 id="Modifiers.RIGHT_META" class="add-link hide-from-toc">RIGHT_META</h3></td>
<td>8192</td>
<td><p>Applies when the <code>RIGHT_META</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.META">
<td><h3 id="Modifiers.META" class="add-link hide-from-toc">META</h3></td>
<td>16384</td>
<td><p>Applies when either <code>LEFT_META</code> or <code>RIGHT_META</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.LEFT_CTRL">
<td><h3 id="Modifiers.LEFT_CTRL" class="add-link hide-from-toc">LEFT_CTRL</h3></td>
<td>32768</td>
<td><p>Applies when the <code>LEFT_CTRL</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.RIGHT_CTRL">
<td><h3 id="Modifiers.RIGHT_CTRL" class="add-link hide-from-toc">RIGHT_CTRL</h3></td>
<td>65536</td>
<td><p>Applies when the <code>RIGHT_CTRL</code> modifier is actuated.</p>
</td>
</tr>
<tr id="Modifiers.CTRL">
<td><h3 id="Modifiers.CTRL" class="add-link hide-from-toc">CTRL</h3></td>
<td>131072</td>
<td><p>Applies when either <code>LEFT_CTRL</code> or <code>RIGHT_CTRL</code> modifier is actuated.</p>
</td>
</tr>
</table>