The Window Server provides advanced pointer features, such as support for multiple pointers and proximity and pressure coordinates. This topic provides a summary of advanced pointer states and the events that communicate changes of their state.
Variant: ScreenPlay. Target audience: Application developers.
This topic builds on the Advanced Pointer Overview.
The following diagram
shows how an input driver communicates changes in pointer state to the Window
Server. The diagram shows the logical pointer states and how TRawEvent
types
change those states. From the driver's perspective, the pointer can be in
one of three basic logical states: Up, Down or OutOfRange.
The
driver sends a number of types of event to move the pointer between these
states. For example, EButton1Up is an Up event that
changes the pointer from the Down to the Up state. EButton1Down is
a Down event. EButton1Down
changes the pointer from
the Up to the Down state, and from OutOfRange to the Down state.
There can be any number of pointers, and each pointer has a maximum of three buttons. A platform UI is free to implement buttons in any way. However, the Window Server interprets only Button1 as an action and does not interpret the other buttons.
Figure: Driver communicates pointer state changes to the Window Server
For a complete list of pointer states, the events that can be sent by the driver, and the associated events that the Window Server sends to the client, see the Pointer states and event communication table below.
Pointing devices can be in one of the following basic states:
State | Description |
---|---|
Out of range |
Not detected by the device's sensors. |
Up |
Detected by sensors, coordinates available, not performing an action. |
Down |
Detected by sensors, coordinates available, performing an action (as defined above). |
The following diagram shows the extension of the Up and Down states with additional substates. Up is extended with substates describing the closeness of the pointer to the screen. Down is extended with substates describing pressing.
Figure: Extension of Up and Down states with substates
The Window Server generates the following events for changes of closeness and pressing:
These are all types of TPointerEvent
. Because
these state changes depend on the pressure and proximity of the pointer, both
of these values are checked each time a new TRawEvent
concerning
the pointer arrives from the driver. TRawEvent::EPointer3DOutOfRange
means
that the proximity is infinite and pressure is zero.
These events are based on four thresholds:
The EExitHighPressure
threshold
(EPointer3DExitHighPressureThreshold
in HAL)
This
is a threshold on the pointer's Z coordinate. In general, if the pointer crosses
this threshold by decreasing pressure (thus decreasing its Z coordinate),
the Window Server generates TPointerEvent::EExitHighPressure
and
sends it to the client.
The EEnterHighPressure
threshold
(EPointer3DEnterHighPressureThreshold
in HAL)
This
is a threshold on the pointer's Z coordinate. In general, if the pointer crosses
this threshold by increasing pressure (thus increasing its Z coordinate),
the Window Server generates TPointerEvent::EEnterHighPressure
and
sends it to the client.
The EEnterCloseProximity
threshold
( EPointer3DEnterCloseProximityThreshold
in
HAL)
This is a threshold on the pointer's Z coordinate. In general,
if the pointer crosses this threshold by decreasing its proximity from the
device (thus increasing its Z coordinate), the Window Server generates TPointerEvent::EEnterCloseProximity
and
sends it to the client.
The EExitCloseProximity
threshold
(EPointer3DExitCloseProximityThreshold
in HAL)
This
is a threshold on the pointer's Z coordinate. In general, if the pointer crosses
this threshold by increasing its proximity from the device (thus decreasing
its Z coordinate), the Window Server generates TPointerEvent::EExitCloseProximity
and
sends it to the client.
Applications can configure these thresholds at runtime by using Window
Server APIs in RWsSession
. All applications can read these
thresholds. However, only code with WriteDeviceData
capability
can change them because these changes should be made only by the device's
configuration application.
The table below shows all possible pointer states. For each state it shows all of the events that can be sent by the driver and all of the events that are sent by the Window Server to the client. The end state of the pointer is also shown. There are five pointer zones (states) and four thresholds. An event is generated when the pointer's z position crosses a threshold.
Pointer state | TRawEvent received from driver |
TPointerEvent sent by Window Server |
Resulting pointer state |
---|---|---|---|
OutOfRange |
|
— |
|
OutOfRange |
|
|
Up/OutOfCloseProximity |
OutOfRange |
|
|
Up/InCloseProximity |
OutOfRange |
|
|
Down/NotPressing |
OutOfRange |
|
|
Down/Pressing |
Up/OutOfCloseProximity |
|
|
OutOfRange |
Up/OutOfCloseProximity |
|
|
Up/OutOfCloseProximity |
Up/OutOfCloseProximity |
|
|
Up/InCloseProximity |
Up/OutOfCloseProximity |
|
|
Down/OutOfHighPressure |
Up/OutOfCloseProximity |
|
|
Down/InHighPressure |
Up/InCloseProximity |
|
|
OutOfRange |
Up/InCloseProximity |
|
|
Up/OutOfCloseProximity |
Up/InCloseProximity |
|
|
Up/InCloseProximity |
Up/InCloseProximity |
|
|
Down/OutOfHighPressure |
Up/InCloseProximity |
|
|
Down/InHighPressure |
Down/OutOfHighPressure |
|
|
Up/OutOfCloseProximity |
Down/OutOfHighPressure |
|
|
Up/InCloseProximity |
Down/OutOfHighPressure |
|
|
Down/OutOfHighPressure |
Down/OutOfHighPressure |
|
|
Down/InHighPressure |
Down/InHighPressure |
|
|
Up/OutOfCloseProximity |
Down/InHighPressure |
|
|
Up/InCloseProximity |
Down/InHighPressure |
|
|
Down/OutOfHighPressure |
Down/InHighPressure |
|
|
Down/InHighPressure |
The driver is prohibited from sending EPointer3DOutOfRange
when
the pointer is in the Down state. Therefore this is not included in this table.
Because TRawEvent
's EPointer3DOutOfRange
events
do not have coordinates, the Window Server makes sure the event is delivered
to the place where the previous event for the same pointer occurred. It does
this by maintaining the last state of the pointer.
The following diagram shows the events sent from the Window Server to the client while the pointer traverses the full cycle of events—from OutOfRange, through Down/InHighPressure and back to OutOfRange. This diagram does not show all of the possible state transitions that are described in the table above.
Figure: Events sent from Window Server to client while the pointer traverses the full cycle of states.