| # Input client library | 
 |  | 
 | ## Overview | 
 |  | 
 | The input library tracks available input devices, manages device state, and allows session to | 
 | register handlers for events. | 
 |  | 
 | The session creates an input pipeline that is configured for the specific product. First the session | 
 | decides which types of input devices the input pipeline should support. Then the session registers | 
 | input handlers for input events. The input library provides implementations for common input | 
 | handlers, such as Scenic and input method editors (IME). After the session instantiates components that | 
 | consume input, the input pipeline directly sends input events to those components through the registered | 
 | input handlers. | 
 |  | 
 | ## Input pipeline | 
 |  | 
 | An input pipeline manages `InputDeviceBindings` and `InputHandlers`. | 
 |  | 
 | * An `InputDeviceBinding` represents a connection to a physical input device (e.g. mouse, keyboard). | 
 | * An `InputHandler` represents a client of `InputEvents`. | 
 |  | 
 |  | 
 |  | 
 | An input pipeline routes input from physical devices to various clients. An input pipeline does the following: | 
 |  | 
 | 1. Detects and binds to new input devices as they appear in `/dev/class/input-report`. | 
 | 2. Propagates `InputEvents` through `InputHandlers`. | 
 |  | 
 | Session authors are responsible for setting up input pipelines. More details on how can be found in | 
 | [input_pipeline.rs](/src/session/lib/input/src/input_pipeline.rs). | 
 |  | 
 | ### InputDeviceBinding | 
 |  | 
 | An `InputDeviceBinding` does the following: | 
 |  | 
 | 1. Connects to an `InputReport` file located at `/dev/class/input-report/XXX`. | 
 | 2. Generates `InputEvents` from the `DeviceDescriptor` and incoming `InputReports`. | 
 |  | 
 | The input pipeline creates and owns `InputDeviceBindings` as new input peripherals are connected to | 
 | a device. | 
 |  | 
 | ### InputHandler | 
 |  | 
 | When an `InputHandler` receives an `InputEvent`, it does at least one of the following: | 
 |  | 
 | * Forwards the `InputEvent` to the relevant client component. | 
 | * Outputs a vector of `InputEvents` for the next `InputHandler` to process. | 
 |  | 
 | `InputHandlers` must satisfy at least one of these conditions, but otherwise their implementation | 
 | details can vary. | 
 |  | 
 | In the following example, if the `MouseHandler` detects a mouse-typed input event, the handler sends | 
 | the event to Scenic and returns an empty vector. On all other types of input events, the | 
 | `MouseHandler` returns a vector containing the `InputEvent` for the next `InputHandler` to process. | 
 |  | 
 | ```rust | 
 | #[async_trait] | 
 | impl InputHandler for MouseHandler { | 
 |    async fn handle_input_event( | 
 |        &mut self, | 
 |        input_event: InputEvent, | 
 |    ) -> Vec<InputEvent> { | 
 |        match input_event { | 
 |            InputEvent { | 
 |                device_event: InputDeviceEvent::Mouse(mouse_event), | 
 |                device_descriptor: InputDeviceDescriptor::Mouse(mouse_descriptor), | 
 |            } => { | 
 |                // ... Handler specific details | 
 |                self.send_events_to_scenic(...)).await; | 
 |                vec![] // InputEvent is consumed because it was sent to Scenic | 
 |            } | 
 |            _ => vec![input_event], // InputEvent is returned for the next InputHanlder | 
 |        } | 
 |    } | 
 | } | 
 | ``` | 
 |  | 
 | ## Vocabulary | 
 |  | 
 | <table> | 
 |   <tr> | 
 |    <th>Term</th> | 
 |    <th>Definition</th> | 
 |   </tr> | 
 |   <tr> | 
 |    <td><a href="https://fuchsia.dev/reference/fidl/fuchsia.input.report#InputReport">InputReport</a> | 
 |    </td> | 
 |    <td>A stateless representation of an event from an input device. Zircon generates InputReports | 
 |    from HID Reports. | 
 |    </td> | 
 |   </tr> | 
 |   <tr> | 
 |    <td><a href="https://fuchsia.dev/reference/fidl/fuchsia.input.report#DeviceDescriptor">DeviceDescriptor</a> | 
 |    </td> | 
 |    <td>A struct containing information specific to an input device, e.g. the number of buttons on a | 
 |    mouse. Zircon generates DeviceDescriptors. | 
 |    </td> | 
 |   </tr> | 
 |   <tr> | 
 |    <td><a href="https://fuchsia.googlesource.com/fuchsia/+/HEAD/src/session/lib/input/src/input_device.rs#27">InputEvent</a> | 
 |    </td> | 
 |    <td>An event from an input device containing context (a DeviceDescriptor) and state (e.g. phase | 
 |    and location of a button press). The input pipeline generates InputEvents from InputReports and | 
 |    DeviceDescriptors. | 
 |    </td> | 
 |   </tr> | 
 | </table> |