$LastChangedDate: 2009-12-12 11:43:48 -0500 (Sat, 12 Dec 2009) $

The low-level input module consists of Device classes for keyboard, joystick, and mouse.
The purpose is to abstract devices as a system-neutral input queue.
The input module defers final responses to higher-level modules.

- Gets input from the system (device driver).
- Creates a system-neutral Event struct (eg KeyboardEvent).
- Enqueues the Event struct into an InputQueue (eg KeyboardInputQueue).
- Broadcasts to registered listeners that an event was enqueued.
- Input queue might overflow older events (on slow systems)

Each Device is initially disabled to let the program become ready.

Once a Device is enabled, it will actually remain enabled even if Device::Enable(false) is called.
The device will be logically disabled by actually disabling the software input queue, not the device.

Each enabled Device must either have one "event listener" or one "poller" to drain its queue.
This design doesn't address the problem of chaining listeners/pollers.

The control module has joystick configuration.

+------------------------------------------------------------------+
| base template   -->  sys-neutral     -->  private sys-specific   |
| template class       singleton/factory    instance               |
+------------------------------------------------------------------+
| Device          -->  KeyboardDevice  -->  KeyboardDevice[System] |
|                      JoystickDevice  -->  JoystickDevice[System] |
|                      MouseDevice     -->  MouseDevice[System]    |
+------------------------------------------------------------------+

KeyboardDevice etc are a special kind of Singleton that acts like a Factory
by instantiating a system-specific derivative of itself.

OSG:
----
input module installs an OSG keyboard handler by calling
Window::SetKeyboardHandler() which has access to an OSG Viewer object.
This means that the view module (Window) must be started before the input module.
