<F2> revert<#1e>to <F3><#1f> Type (<F0>or window <F3>(<F0>member
:none :pointer<#1e>root :parent<F3>)).
<para>
Returns the <F2>focus<F0> window, <F6>:pointer<#1e>root<F0>, or <F6>:none
<F0>, depending on the current state of the focus window. <F2>revert<#1e>to
<F0> returns the current focus revert<#1e>to state.
<arg>
display <F3><#1f> A <F6>display<F3>.
<p1rule,
New Page = yes>
<|,"12<#1e>130"><Index, "grabbing", "pointer", To Named = p1rule><Index, "pointer", "grabbing", To Named = p1rule><Index, "event", "grabbing", "pointer", To Named = p1rule>
<Frame,
Name = p1rule,
Placement = At Anchor,
Width = 6.35 inches,
Height = 0.153 inches,
Vertical Alignment = 0.007 inches,
Shared Contents = yes>
<p1stacked,
Font = F3,
Left Tab = -1.70/0 inches>
<F8>Grabbing<Tab><F6>12.8<#04><F0>CLX provides the <F6>grab<#1e>pointer
<F0> and <F6>ungrab<#1e>pointer<F0> functions for<FJ>
<p1para,
Alignment = Both,
Font = F3,
Allow Page Break After = yes>
<F8>the Pointer<Tab><F0>grabbing and releasing pointer control.<F8>
Changes the specified dynamic parameters if the pointer is actively
grabbed by the client and the specified <F2>time<F0> is no earlier
than the last<#1e>pointer<#1e>grab time and no later than the current
server time. The interpretation of <F2>event<#1e>mask<F0> and <F2>cursor
<F0> are as in <F6>grab<#1e>pointer<F0>. <F6>change<#1e>active<#1e>pointer<#1e>
grab<F0> has no effect on the passive parameters of a <F6>grab<#1e>button
<F0>.
<arg>
display <F3><#1f> A <F6>display<F3>.
event<#1e>mask <F3><#1f> A <F6>pointer<#1e>event<#1e>mask<F3>.
cursor <F3><#1f> A <F6>cursor<F3> or <F6>nil<F3>.
time <F3><#1f> A <F6>timestamp<F3>.
<p1rule,
New Page = yes>
<|,"12<#1e>132"><Index, "grabbing", "button", To Named = p1rule><Index, "button", "grabbing", To Named = p1rule><Index, "event", "grabbing", "button", To Named = p1rule>
<Frame,
Name = p1rule,
Placement = At Anchor,
Width = 6.35 inches,
Height = 0.153 inches,
Vertical Alignment = 0.007 inches,
Shared Contents = yes>
<p1stacked,
Font = F3,
Left Tab = -1.70/0 inches>
<F8>Grabbing<Tab><F6>12.9<#04><F0>CLX provides the <F6>grab<#1e>button
<F0> and <F6>ungrab<#1e>button<F0> functions for<FJ>
<p1para,
Alignment = Both,
Font = F3,
Allow Page Break After = yes>
<F8>a Button<Tab><F0>passively grabbing and releasing pointer control.<#04>
Releases the passive button/key combination on the specified <F2>window<F0>
if it was grabbed by this client. A zero <F2>modifier<F0> mask is
equivalent to issuing the request for all possible modifier combinations
including the combination of no modifiers. A <F2>button<F0> of <F6>:any
<F0> is equivalent to issuing the request for all possible buttons.
This has no effect on an active grab.
<arg>
window <F3><#1f> A <F6>window<F3>.
button <F3><#1f> The button (type <F6>card8<F3>) that is released
or <F6>:any<F3>.
<keyword2>
:modifiers <F3><#1f> A <F0>modifier<#1e>mask<F3>.
<p1rule>
<Index, "grabbing", "keyboard", To Named = p1rule><Index, "keyboard", "grabbing", To Named = p1rule><Index, "event", "grabbing", "keyboard", To Named = p1rule>
Releases the <F2>key<F0> combination on the specified <F2>window<F0>
if it was grabbed by this client. A zero modifier mask of <F6>:any <F0>is
equivalent to issuing the request for all possible modifier combinations
(including the combination of no modifiers). A <F2>key<F0> of <F6>:any<F0>
is equivalent to issuing the request for all possible keycodes. <F6>ungrab<#1e>
key<F0> has no effect on an active grab.
<arg>
window <F3><#1f> A <F6>window<F3>.
key <F3><#1f> The key (type <F6>card8<F3>) to be released or <F6>:any<F3>.
<keyword2>
:modifiers <F3><#1f> A <F0>modifier<#1e>mask<F3>.
<p1rule>
<Index, "event", "types", To Named = p1rule>
<Frame,
Name = p1rule,
Placement = At Anchor,
Width = 6.35 inches,
Height = 0.153 inches,
Vertical Alignment = 0.007 inches,
Shared Contents = yes>
<p1para,
Bottom Margin = 0.12 inches,
Alignment = Both,
Font = F3,
Allow Page Break After = yes>
<F8>Event Types<Tab><F6>12.12<F0><#04>The following paragraphs
contain detailed descriptions of the contents of each event type.
In CLX, events are not actually represented by structures, but rather
by lists of keyword values passed to handler functions or by values
bound to symbols within the clauses of <F6>event<#1e>case<F0> and <F6>event<#1e>
cond<F0> forms. Nevertheless, it is convenient to describe event
contents in terms of slots and to identify the components of events
with slot name symbols. In fact, CLX uses the <F6>declare<#1e>event<F0>
macro to define event slot symbols and to map these symbols to specific
event data items returned by the X server (see paragraph 12.12.8,
Declaring Event Types).
<para,
Bottom Margin = 0.12 inches>
The following paragraphs describe each event type, listing its <F6>event<#1e>k
ey<F0> keyword symbol and its slot name symbols. An event keyword
symbol identifies a specific event type. An event keyword symbol can
be given as an argument to <F6>send<#1e>event<F0> or to an event
handler function; it can also appear in the <F2>event<#1e>match<F0>
form of an <F6>event<#1e>case<F0> clause. An event slot name symbol
identifies a specific event data item. Event slot names appear as
keywords with associated values among the arguments passed to <F6>send<#1e>eve
nt<F0> or to an event handler function; as non<#1e>keyword symbols,
they can also be in the <F2>event<#1e>slots<F0> form of an <F6>event<#1e>cas
e<F0> clause.
<para>
In certain cases, more than one name symbol is defined for the same
event slot. For example, in <F6>:key<#1e>press<F0> events, the symbols <F2>w
indow<F0> and <F2>event<#1e>window<F0> both refer to the same event
data item.
<p2rule>
<|,"12<#1e>136"><Index, "pointer", "events", To Named = p2rule><Index, "keyboard", "events", To Named = p2rule><Index, "event", "pointer", To Named = p2rule><Index, "event", "keyboard", To Named = p2rule>
<Frame,
Name = p2rule,
Placement = At Anchor,
Width = 4.75 inches,
Height = 0.15 inches,
Vertical Alignment = 0.007 inches,
Shared Contents = yes>
<p2stacked,
Font = F3>
<Tab><F6>Keyboard and<Tab>12.12.1<#04><F0>The keyboard and pointer
tual<F0> is generated on each window between A and C exclusive (in
that order)
<F9>w<Tab><F6>:focus<#1e>in<F0> with <F2>kind<F0> <F6>:nonlinear<#1e>virt
ual<F0> is generated on each window between C and B exclusive (in
that order)
<F9>w<Tab><F0>:focus<#1e>in with <F2>kind<F0> <F6>:nonlinear<F0>
is generated on B
<F9>w<Tab><F0>If P is an inferior of B, <F6>:focus<#1e>in<F0>
with <F2>kind<F0> <F6>:pointer<F0> is generated on each window
below B down to and including P (in order)
<indentB>
When the focus moves from window A to window B, on different screens,
with the pointer in window P:
<ssbullet>
<F9>w<Tab><F0>If P is an inferior of A, <F6>:focus<#1e>out<F0>
with <F2>kind<F0> <F6>:pointer<F0> is generated on each window
from P up to but not including A (in order)
<F9>w<Tab><F6>:focus<#1e>out<F0> with <F2>kind<F0> <F6>:nonlinear<F0>
is generated on A
<F9>w<Tab><F0>If A is not a root window, <F6>:focus<#1e>out<F0>
with <F2>kind<F0> <F6>:nonlinear<#1e>virtual <F0>is generated
on each window above A up to and including its root (in order)
<F9>w<Tab><F0>If B is not a root window, <F6>:focus<#1e>in <F0>with <F2>ki
nd<F0> <F6>:nonlinear<#1e>virtual<F0> is generated on each window
from B's root down to but not including B (in order)
<F9>w<Tab><F6>:focus<#1e>in<F0> with <F2>kind<F0> <F6>:nonlinear<F0>
is generated on B
<F9>w<Tab><F0>If P is an inferior of B, <F6>:focus<#1e>in<F0>
with <F2>kind<F0> <F6>:pointer<F0> is generated on each window
below B down to and including P (in order)
<indentB>
When the focus moves from window A to <F6>:pointer<#1e>root<F0>
(or <F6>:none<F0>), with the pointer in window P:
<ssbullet>
<F9>w<Tab><F0>If P is an inferior of A, <F6>:focus<#1e>out<F0>
with <F2>kind<F0> <F6>:pointer<F0> is generated on each window
from P up to but not including A (in order)
<F9>w<Tab><F6>:focus<#1e>out<F0> with <F2>kind<F0> <F6>:nonlinear<F0>
is generated on A
<F9>w<Tab><F0>If A is not a root window, <F6>:focus<#1e>out<F0>
with <F2>kind<F0> <F6>:nonlinear<#1e>virtual <F0>is generated
on each window above A up to and including its root (in order)
<F9>w<Tab><F6>:focus<#1e>in<F0> with <F2>kind<F0> <F6>:pointer<#1e>root
<F0>(or <F6>:none<F0>) is generated on all root windows
<F9>w<Tab><F0>If the new focus is <F6>:pointer<#1e>root<F0>, <F6>:focus<#1e>
in<F0> with <F2>kind<F0> <F6>:pointer<F0> is generated on each
window from P's root down to and including P (in order)
<indentB>
<|,"12<#1e>143">When the focus moves from <F6>:pointer<#1e>root <F0>(or <F6>:none
<F0>) to window A, with the pointer in window P:
<ssbullet>
<F9>w<Tab><F0>If the old focus is <F6>:pointer<#1e>root<F0>, <F6>:focus<#1e>
out<F0> with <F2>kind<F0> <F6>:pointer<F0> is generated on each
window from P up to and including P's root (in order)
<F9>w<Tab><F6>:focus<#1e>out<F0> with <F2>kind<F6> :pointer<#1e>root<F0>
(or <F6>:none<F0>) is generated on all root windows
<F9>w<Tab><F0>If A is not a root window, <F6>:focus<#1e>in<F0>
with <F2>kind<F0> <F6>:nonlinear<#1e>virtual<F0> is generated
on each window from A's root down to but not including A (in order)
<F9>w<Tab><F6>:focus<#1e>in<F0> with <F2>kind<F0> <F6>:nonlinear<F0>
is generated on A
<F9>w<Tab><F0>If P is an inferior of A, <F6>:focus<#1e>in<F0>
with <F2>kind<F0> <F6>:pointer<F0> is generated on each window
below A down to and including P (in order)
<indentB>
When the focus moves from <F6>:pointer<#1e>root <F0>to <F6>:none<F0>
(or vice versa), with the pointer in window P:
<ssbullet>
<F9>w<Tab><F0>If the old focus is <F6>:pointer<#1e>root<F0>, <F6>:focus<#1e>
out<F0> with <F2>kind<F0> <F6>:pointer<F0> is generated on each
window from P up to and including P's root (in order)
<F9>w<Tab><F6>:focus<#1e>out<F0> with <F2>kind<F0> <F6>:pointer<#1e>root
<F0> (or <F6>:none<F0>) is generated on all root windows
<F9>w<Tab><F6>:focus<#1e>in<F0> with <F2>kind<F0> <F6>:none<F0>
(or <F6>:pointer<#1e>root<F0>) is generated on all root windows
<F9>w<Tab><F0>If the new focus is <F6>:pointer<#1e>root<F0>, <F6>:focus<#1e>
in <F0>with <F2>kind<F0> <F6>:pointer<F0> is generated on each
window from P's root down to and including P (in order)
<indentB>
When a keyboard grab activates (but before generating any actual <F6>:key<#1e>
press<F0> event that activates the grab), with <F2>G<F0> the <F6>grab<#1e>w
indow<F0> for the grab and <F2>F<F0> the current focus, then <F6>:focus<#1e>
in<F0> and <F6>:focus<#1e>out <F0>events with mode <F6>:grab<F0>
are generated (as for <F6>:normal<F0> above) as if the focus were
to change from <F2>F<F0> to <F2>G<F0>.
When a keyboard grab deactivates (but after generating any actual <F6>:key<#1e>
release<F0> event that deactivates the grab), with <F2>G<F0> the <F6>grab<#1e>
window<F0> for the grab and <F2>F<F0> the current focus, then <F6>:focus<#1e>
in<F0> and <F6>:focus<#1e>out<F0> events with mode <F6>:ungrab<F0>
are generated (as for <F6>:normal <F0>above) as if the focus were
to change from <F2>G<F0> to <F2>F<F0>.
<p2rule,
New Page = yes>
<|,"12<#1e>144"><Index, "pointer", "state event", To Named = p2rule><Index, "keyboard", "state event", To Named = p2rule><Index, "event", "pointer", "state", To Named = p2rule><Index, "event", "keyboard", "state", To Named = p2rule>
<Frame,
Name = p2rule,
Placement = At Anchor,
Width = 4.75 inches,
Height = 0.15 inches,
Vertical Alignment = 0.007 inches,
Shared Contents = yes>
<p2stacked,
Font = F3>
<Tab><F6>Keyboard and<Tab>12.12.3<#04><F0>The keyboard and pointer
state events are <F6>:keymap<#1e>notify<F0> and<FJ>