<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
                   "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
<!-- lifted from troff+man by doclifter -->
<refentry id='xgrbuttonman'>
<!--  Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium -->

<!--  Permission is hereby granted, free of charge, to any person obtaining -->
<!--  a copy of this software and associated documentation files (the -->
<!--  "Software"), to deal in the Software without restriction, including -->
<!--  without limitation the rights to use, copy, modify, merge, publish, -->
<!--  distribute, sublicense, and/or sell copies of the Software, and to -->
<!--  permit persons to whom the Software is furnished to do so, subject to -->
<!--  the following conditions: -->

<!--  The above copyright notice and this permission notice shall be included -->
<!--  in all copies or substantial portions of the Software. -->

<!--  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -->
<!--  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -->
<!--  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -->
<!--  IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR -->
<!--  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -->
<!--  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -->
<!--  OTHER DEALINGS IN THE SOFTWARE. -->

<!--  Except as contained in this notice, the name of the X Consortium shall -->
<!--  not be used in advertising or otherwise to promote the sale, use or -->
<!--  other dealings in this Software without prior written authorization -->
<!--  from the X Consortium. -->

<!--  Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by -->
<!--  Digital Equipment Corporation -->

<!--  Portions Copyright \(co 1990, 1991 by -->
<!--  Tektronix, Inc. -->

<!--  Permission to use, copy, modify and distribute this documentation for -->
<!--  any purpose and without fee is hereby granted, provided that the above -->
<!--  copyright notice appears in all copies and that both that copyright notice -->
<!--  and this permission notice appear in all copies, and that the names of -->
<!--  Digital and Tektronix not be used in in advertising or publicity pertaining -->
<!--  to this documentation without specific, written prior permission. -->
<!--  Digital and Tektronix makes no representations about the suitability -->
<!--  of this documentation for any purpose. -->
<!--  It is provided ``as is'' without express or implied warranty. -->
<!--   -->
<!--  $XFree86: xc/doc/man/X11/XGrButton.man,v 1.3 2003/04/28 22:17:55 herrb Exp $ -->

<!-- .na -->
<!-- Ds listing suppressed (not used) -->
<!-- De listing suppressed (not used) -->
<!-- FD listing suppressed (not used) -->
<!-- FN listing suppressed (not used) -->
<!-- IN listing suppressed (not used) -->
<!-- C{ listing suppressed (not used) -->
<!-- C} listing suppressed (not used) -->
<!-- Pn listing suppressed (not used) -->
<!-- hN listing suppressed (not used) -->
<!-- NT listing suppressed (not used) -->
<!-- .		\" Note End \-\- doug kraft 3/85 -->
<!-- NE listing suppressed (not used) -->
<!-- .ny0 -->
<refmeta>
<refentrytitle>XGrabButton</refentrytitle>
<manvolnum>3X11</manvolnum>
<refmiscinfo class='date'>__xorgversion__</refmiscinfo>
<refmiscinfo class='source'>XLIB FUNCTIONS</refmiscinfo>
</refmeta>
<refnamediv id='name'>
<refname>XGrabButton</refname>
<refname>XUngrabButton</refname>
<refpurpose>grab pointer buttons</refpurpose>
</refnamediv>
<!-- body begins here -->

<refsect1 id='syntax'><title>SYNTAX</title>

<para>int XGrabButton&hairsp;(&hairsp;Display *<emphasis remap='I'>display</emphasis>&hairsp;, unsigned int <emphasis remap='I'>button</emphasis>&hairsp;,
unsigned int <emphasis remap='I'>modifiers</emphasis>&hairsp;, Window <emphasis remap='I'>grab_window</emphasis>&hairsp;, Bool
<emphasis remap='I'>owner_events</emphasis>&hairsp;, unsigned int <emphasis remap='I'>event_mask</emphasis>&hairsp;, int
<emphasis remap='I'>pointer_mode</emphasis>&hairsp;, <emphasis remap='I'>keyboard_mode</emphasis>&hairsp;, Window <emphasis remap='I'>confine_to</emphasis>&hairsp;, Cursor
<emphasis remap='I'>cursor</emphasis>&hairsp;);</para> 

<para>int XUngrabButton&hairsp;(&hairsp;Display *<emphasis remap='I'>display</emphasis>&hairsp;, unsigned int <emphasis remap='I'>button</emphasis>&hairsp;,
unsigned int <emphasis remap='I'>modifiers</emphasis>&hairsp;, Window <emphasis remap='I'>grab_window</emphasis>&hairsp;);</para> 
</refsect1>

<refsect1 id='arguments'><title>ARGUMENTS</title>
<variablelist remap='IP'>
  <varlistentry>
  <term><emphasis remap='I'>button</emphasis></term>
  <listitem>
<para>Specifies the pointer button that is to be grabbed or released or
<emphasis remap='I'>&hairsp;AnyButton&hairsp;</emphasis>.</para>
  </listitem>
  </varlistentry>
  <varlistentry>
  <term><emphasis remap='I'>confine_to</emphasis></term>
  <listitem>
<para>Specifies the window to confine the pointer in or
<emphasis remap='I'>&hairsp;None&hairsp;</emphasis>.</para>
  </listitem>
  </varlistentry>
  <varlistentry>
  <term><emphasis remap='I'>cursor</emphasis></term>
  <listitem>
<para>Specifies the cursor that is to be displayed or
<emphasis remap='I'>&hairsp;None&hairsp;</emphasis>.</para>
  </listitem>
  </varlistentry>
  <varlistentry>
  <term><emphasis remap='I'>display</emphasis></term>
  <listitem>
<para>Specifies the connection to the X server.</para>
  </listitem>
  </varlistentry>
  <varlistentry>
  <term><emphasis remap='I'>event_mask</emphasis></term>
  <listitem>
<para>Specifies which pointer events are reported to the client.
The mask is the bitwise inclusive OR of the valid pointer event mask bits.</para>
  </listitem>
  </varlistentry>
  <varlistentry>
  <term><emphasis remap='I'>grab_window</emphasis></term>
  <listitem>
<para>Specifies the grab window.</para>
  </listitem>
  </varlistentry>
  <varlistentry>
  <term><emphasis remap='I'>keyboard_mode</emphasis></term>
  <listitem>
<para>Specifies further processing of keyboard events.
You can pass 
<emphasis remap='I'>&hairsp;GrabModeSync&hairsp;</emphasis>
or
<emphasis remap='I'>&hairsp;GrabModeAsync&hairsp;</emphasis>.</para>
  </listitem>
  </varlistentry>
  <varlistentry>
  <term><emphasis remap='I'>modifiers</emphasis></term>
  <listitem>
<para>Specifies the set of keymasks or
<emphasis remap='I'>&hairsp;AnyModifier&hairsp;</emphasis>.
The mask is the bitwise inclusive OR of the valid keymask bits.</para>
  </listitem>
  </varlistentry>
  <varlistentry>
  <term><emphasis remap='I'>owner_events</emphasis></term>
  <listitem>
<para>Specifies a Boolean value that indicates whether the pointer 
events are to be reported as usual or reported with respect to the grab window 
if selected by the event mask.</para>
  </listitem>
  </varlistentry>
  <varlistentry>
  <term><emphasis remap='I'>pointer_mode</emphasis></term>
  <listitem>
<para>Specifies further processing of pointer events.
You can pass 
<emphasis remap='I'>&hairsp;GrabModeSync&hairsp;</emphasis>
or
<emphasis remap='I'>&hairsp;GrabModeAsync&hairsp;</emphasis>.</para>
  </listitem>
  </varlistentry>
</variablelist>
</refsect1>

<refsect1 id='description'><title>DESCRIPTION</title>
<para>The
<emphasis remap='I'>&hairsp;XGrabButton&hairsp;</emphasis>
function establishes a passive grab.
In the future,
the pointer is actively grabbed (as for
<emphasis remap='I'>&hairsp;XGrabPointer&hairsp;</emphasis>),
the last-pointer-grab time is set to the time at which the button was pressed
(as transmitted in the
<emphasis remap='I'>&hairsp;ButtonPress&hairsp;</emphasis>
event), and the
<emphasis remap='I'>&hairsp;ButtonPress&hairsp;</emphasis>
event is reported if all of the following conditions are true:</para>
<itemizedlist remap='IP+bullet'>
  <listitem override='bullet'>
<para>The pointer is not grabbed, and the specified button is logically pressed
when the specified modifier keys are logically down,
and no other buttons or modifier keys are logically down.</para>
  </listitem>
</itemizedlist>
<itemizedlist remap='IP+bullet'>
  <listitem override='bullet'>
<para>The grab_window contains the pointer.</para>
  </listitem>
</itemizedlist>
<itemizedlist remap='IP+bullet'>
  <listitem override='bullet'>
<para>The confine_to window (if any) is viewable.</para>
  </listitem>
</itemizedlist>
<itemizedlist remap='IP+bullet'>
  <listitem override='bullet'>
<para>A passive grab on the same button/key combination does not exist
on any ancestor of grab_window.</para>
  </listitem>
</itemizedlist>

<para>The interpretation of the remaining arguments is as for
<emphasis remap='I'>&hairsp;XGrabPointer&hairsp;</emphasis>.
The active grab is terminated automatically when the logical state of the
pointer has all buttons released
(independent of the state of the logical modifier keys).</para>

<para>Note that the logical state of a device (as seen by client applications)
may lag the physical state if device event processing is frozen.</para>

<para>This request overrides all previous grabs by the same client on the same
button/key combinations on the same window.
A modifiers of 
<emphasis remap='I'>&hairsp;AnyModifier&hairsp;</emphasis>
is equivalent to issuing the grab request for all
possible modifier combinations (including the combination of no modifiers).  
It is not required that all modifiers specified have currently assigned 
KeyCodes.
A button of 
<emphasis remap='I'>&hairsp;AnyButton&hairsp;</emphasis>
is equivalent to
issuing the request for all possible buttons.
Otherwise, it is not required that the specified button currently be assigned
to a physical button.</para>

<para>If some other client has already issued a 
<emphasis remap='I'>&hairsp;XGrabButton&hairsp;</emphasis>
with the same button/key combination on the same window, a
<emphasis remap='I'>&hairsp;BadAccess&hairsp;</emphasis>
error results.
When using 
<emphasis remap='I'>&hairsp;AnyModifier&hairsp;</emphasis>
or 
<emphasis remap='I'>&hairsp;AnyButton&hairsp;</emphasis>,
the request fails completely,
and a
<emphasis remap='I'>&hairsp;BadAccess&hairsp;</emphasis>
error results (no grabs are
established) if there is a conflicting grab for any combination.
<emphasis remap='I'>&hairsp;XGrabButton&hairsp;</emphasis>
has no effect on an active grab.</para>

<para><emphasis remap='I'>&hairsp;XGrabButton&hairsp;</emphasis>
can generate
<emphasis remap='I'>&hairsp;BadCursor&hairsp;</emphasis>,
<emphasis remap='I'>&hairsp;BadValue&hairsp;</emphasis>,
and
<emphasis remap='I'>&hairsp;BadWindow&hairsp;</emphasis>
errors.</para>

<para>The
<emphasis remap='I'>&hairsp;XUngrabButton&hairsp;</emphasis>
function releases the passive button/key combination on the specified window if
it was grabbed by this client.
A modifiers of 
<emphasis remap='I'>&hairsp;AnyModifier&hairsp;</emphasis>
is
equivalent to issuing 
the ungrab request for all possible modifier combinations, including 
the combination of no modifiers.
A button of 
<emphasis remap='I'>&hairsp;AnyButton&hairsp;</emphasis>
is equivalent to issuing the
request for all possible buttons.
<emphasis remap='I'>&hairsp;XUngrabButton&hairsp;</emphasis>
has no effect on an active grab.</para>

<para><emphasis remap='I'>&hairsp;XUngrabButton&hairsp;</emphasis>
can generate
<emphasis remap='I'>&hairsp;BadValue&hairsp;</emphasis>
and
<emphasis remap='I'>&hairsp;BadWindow&hairsp;</emphasis>
errors.</para>
</refsect1>

<refsect1 id='diagnostics'><title>DIAGNOSTICS</title>
<variablelist remap='TP'>
  <varlistentry>
  <term><emphasis remap='I'>&hairsp;BadCursor&hairsp;</emphasis></term>
  <listitem>
<para>A value for a Cursor argument does not name a defined Cursor.</para>
  </listitem>
  </varlistentry>
  <varlistentry>
  <term><emphasis remap='I'>&hairsp;BadValue&hairsp;</emphasis></term>
  <listitem>
<para>Some numeric value falls outside the range of values accepted by the request.
Unless a specific range is specified for an argument, the full range defined
by the argument's type is accepted.  Any argument defined as a set of
alternatives can generate this error.</para>
  </listitem>
  </varlistentry>
  <varlistentry>
  <term><emphasis remap='I'>&hairsp;BadWindow&hairsp;</emphasis></term>
  <listitem>
<para>A value for a Window argument does not name a defined Window.</para>
  </listitem>
  </varlistentry>
</variablelist>
</refsect1>

<refsect1 id='see_also'><title>SEE ALSO</title>
<para>XAllowEvents(3X11),
XGrabPointer(3X11),
XGrabKey(3X11),
XGrabKeyboard(3X11),
<!-- .br -->
<userinput>Xlib - C Language X Interface</userinput></para>
</refsect1>
</refentry>

