CLX provides the grab-pointer and ungrab-pointer functions for grabbing and releasing pointer control.
|grab-pointer||window event-mask &key :owner-p :sync-pointer-p :sync-keyboard-p :confine-to :cursor :time||Function|
Actively grabs control of the pointer. Further pointer events are only reported to the grabbing client. The request overrides any active pointer grab by this client.
If :owner-p is nil, all generated pointer events are reported with respect to window, and are only reported if selected by event-mask. If :owner-p is true, and if a generated pointer event would normally be reported to this client, it is reported normally; otherwise the event is reported with respect to the window, and is only reported if selected by event-mask. For either value of :owner-p, unreported events are simply discarded.
If :sync-pointer-p is nil, pointer event processing continues normally (asynchronously); if the pointer is currently frozen by this client, then processing of pointer events is resumed. If :sync-pointer-p is true (indicating a synchronous action), the pointer (as seen via the protocol) appears to freeze, and no further pointer events are generated by the server until the grabbing client issues a releasing allow-events request. Actual pointer changes are not lost while the pointer is frozen; they are simply queued for later processing.
If :sync-keyboard-p is nil, keyboard event processing is unaffected by activation of the grab. If :sync-keyboard-p is true, the keyboard (as seen via the protocol) appears to freeze, and no further keyboard events are generated by the server until the grabbing client issues a releasing allow-events request. Actual keyboard changes are not lost while the keyboard is frozen; they are simply queued for later processing.
If :cursor is specified, it is displayed regardless of what window the pointer is in. Otherwise, the normal cursor for the window is displayed.
If a :confine-to window is specified, the pointer is restricted to stay within that window. The :confine-to window does not need to have any relationship to the window. If the pointer is not initially in the :confine-to window, it is warped automatically to the closest edge (with :enter/:leave-events generated normally) just before the grab activates. If the :confine-to window is subsequently reconfigured, the pointer is warped automatically as necessary to keep it contained in the window.
|ungrab-pointer||display &key :time||Function|
Releases the pointer if this client has it actively grabbed (from either grab-pointer, grab-button, or from a normal button press), and releases any queued events. The request has no effect if the specified :time is earlier than the last-pointer-grab time or is later than the current server time. An ungrabpointer is performed automatically if the event window or :confine-to window for an active pointer grab becomes not viewable.
|change-active-pointer-grab||display event-mask &optional cursor time||Function|
Changes the specified dynamic parameters if the pointer is actively grabbed by the client and the specified time is no earlier than the last-pointer-grab time and no later than the current server time. The interpretation of event-mask and cursor are as in grab-pointer. change-active-pointer-grab has no effect on the passive parameters of a grab-button.