[PATCH v2 4/4] Add XIGrabButtonWithConfine and XIGrabEnterWithConfine with XI 2.1

Jeremy Huddleston jeremyhu at gmail.com
Thu Jun 2 21:16:40 PDT 2011


for all 4 libXi patches

Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>

Sent from my iPhone...

On Jun 2, 2011, at 23:56, Peter Hutterer <peter.hutterer at who-t.net> wrote:

> Same as the XI 2.0 calls but they take a confine_to window.
> Both the old call and the new call send the confine_to down the wire now
> (None for XIGrabButton/XIGrabEnter).
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
> Changes to v1:
> - Unlock handles for the new requests
> 
> include/X11/extensions/XInput2.h |   28 +++++++++++++++++
> man/Makefile.am                  |    4 ++
> man/XIGrabButton.txt             |   25 ++++++++++++++-
> man/XIGrabEnter.txt              |   24 ++++++++++++++-
> src/XIPassiveGrab.c              |   62 ++++++++++++++++++++++++++++++++++----
> 5 files changed, 135 insertions(+), 8 deletions(-)
> 
> diff --git a/include/X11/extensions/XInput2.h b/include/X11/extensions/XInput2.h
> index 1ae818b..ca666f0 100644
> --- a/include/X11/extensions/XInput2.h
> +++ b/include/X11/extensions/XInput2.h
> @@ -442,6 +442,21 @@ extern int XIGrabButton(
>     XIGrabModifiers     *modifiers_inout
> );
> 
> +extern int XIGrabButtonWithConfine(
> +    Display*            display,
> +    int                 deviceid,
> +    int                 button,
> +    Window              grab_window,
> +    Window              confine_to,
> +    Cursor              cursor,
> +    int                 grab_mode,
> +    int                 paired_device_mode,
> +    int                 owner_events,
> +    XIEventMask         *mask,
> +    int                 num_modifiers,
> +    XIGrabModifiers     *modifiers_inout
> +);
> +
> extern int XIGrabKeycode(
>     Display*            display,
>     int                 deviceid,
> @@ -468,6 +483,19 @@ extern int XIGrabEnter(
>     XIGrabModifiers     *modifiers_inout
> );
> 
> +extern int XIGrabEnterWithConfine(
> +    Display*            display,
> +    int                 deviceid,
> +    Window              grab_window,
> +    Window              confine_to,
> +    Cursor              cursor,
> +    int                 grab_mode,
> +    int                 paired_device_mode,
> +    int                 owner_events,
> +    XIEventMask         *mask,
> +    int                 num_modifiers,
> +    XIGrabModifiers     *modifiers_inout
> +);
> extern int XIGrabFocusIn(
>     Display*            display,
>     int                 deviceid,
> diff --git a/man/Makefile.am b/man/Makefile.am
> index ab5b5af..3026771 100644
> --- a/man/Makefile.am
> +++ b/man/Makefile.am
> @@ -77,11 +77,13 @@ libman_xml = $(libman_txt:.txt=.xml)
> # The shadow man page contains a gtroff .so request to include the main man page
> XI2_shadows =                    \
>    XIUndefineCursor.man            \
> +    XIGrabButtonWithConfine.man        \
>    XIUngrabButton.man            \
>    XIGrabDeviceWithConfine.man        \
>    XIGrabKeycode.man            \
>    XIUngrabKeycode.man            \
>    XIUngrabDevice.man            \
> +    XIGrabEnterWithConfine.man        \
>    XIUngrabEnter.man            \
>    XIGrabFocusIn.man            \
>    XIUngrabFocusIn.man            \
> @@ -152,6 +154,8 @@ XIUngrabEnter.man XIGrabFocusIn.man XIUngrabFocusIn.man: XIGrabEnter.man
> XIGetSelectedEvents.man: XISelectEvents.man
> XIFreeDeviceInfo.man: XIQueryDevice.man
> XIGrabDeviceWithConfine.man: XIGrabDevice.man
> +XIGrabEnterWithConfine.man: XIGrabEnter.man
> +XIGrabButtonWithConfine.man: XIGrabButton.man
> 
> # String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure
> # Unable to use __libmansuffix__ as underscores are lost in txt --> xml conversion
> diff --git a/man/XIGrabButton.txt b/man/XIGrabButton.txt
> index fb806af..c6b7f90 100644
> --- a/man/XIGrabButton.txt
> +++ b/man/XIGrabButton.txt
> @@ -4,7 +4,7 @@ XIGRABBUTTON(libmansuffix)
> NAME
> ----
> 
> -   XIGrabButton, XIUngrabButton, XIGrabKeycode, XIUngrabKeycode -
> +   XIGrabButton, XIGrabButtonWithConfine, XIUngrabButton, XIGrabKeycode, XIUngrabKeycode -
>    grab/ungrab buttons or keys
> 
> SYNOPSIS
> @@ -24,6 +24,19 @@ SYNOPSIS
>                      int num_modifiers,
>                      XIGrabModifiers *modifiers_inout);
> 
> +   int XIGrabButtonWithConfine( Display *display,
> +                                int deviceid,
> +                                int button,
> +                                Window grab_window,
> +                                Window confine_to,
> +                                Cursor cursor,
> +                                int grab_mode,
> +                                int paired_device_mode,
> +                                Bool owner_events,
> +                                XIEventMask *mask,
> +                                int num_modifiers,
> +                                XIGrabModifiers *modifiers_inout);
> +
>    int XIUngrabButton( Display *display,
>                        int deviceid,
>                        int button,
> @@ -98,6 +111,10 @@ SYNOPSIS
>           GrabModeAsync. If deviceid specifies a floating slave
>           device, this parameter is ignored.
> 
> +   confine_to
> +          The window to confine this device to if it is a
> +          master pointer. Can be None.
> +
> DESCRIPTION
> -----------
> 
> @@ -156,6 +173,12 @@ DESCRIPTION
>    combination. XIGrabButton and XIGrabKeycode have no effect on an
>    active grab.
> 
> +   If the server supports XI 2.1 and the device is a master
> +   pointer and the confine_to is set to a window, the cursor will
> +   be confined to this window for the duration of the grab.
> +   XIGrabButtonWithConfine with confine_to of None is equivalent to
> +   XIGrabButton.
> +
>    On success, XIGrabButton and XIGrabKeycode return 0;
>    If one or more modifier combinations could not be grabbed,
>    XIGrabButton and XIGrabKeycode return the number of failed
> diff --git a/man/XIGrabEnter.txt b/man/XIGrabEnter.txt
> index f75a5ad..ac2be3f 100644
> --- a/man/XIGrabEnter.txt
> +++ b/man/XIGrabEnter.txt
> @@ -4,7 +4,7 @@ XIGRABENTER(libmansuffix)
> NAME
> ----
> 
> -   XIGrabEnter, XIUngrabEnter, XIGrabFocusIn, XIUngrabFocusIn -
> +   XIGrabEnter, XIGrabEnterWithConfine, XIUngrabEnter, XIGrabFocusIn, XIUngrabFocusIn -
>    grab/ungrab enter or focus in events.
> 
> SYNOPSIS
> @@ -23,6 +23,18 @@ SYNOPSIS
>                     int num_modifiers,
>                     XIGrabModifiers *modifiers_inout);
> 
> +   int XIGrabEnter( Display *display,
> +                    int deviceid,
> +                    Window grab_window,
> +                    Window confine_to,
> +                    Cursor cursor,
> +                    int grab_mode,
> +                    int paired_device_mode,
> +                    Bool owner_events,
> +                    XIEventMask *mask,
> +                    int num_modifiers,
> +                    XIGrabModifiers *modifiers_inout);
> +
>    int XIUngrabEnter( Display *display,
>                       int deviceid,
>                       Window grab_window
> @@ -85,6 +97,10 @@ SYNOPSIS
>           GrabModeAsync. If deviceid specifies a floating slave
>           device, this parameter is ignored.
> 
> +   confine_to
> +          The window to confine this device to if it is a
> +          master pointer. Can be None.
> +
> DESCRIPTION
> -----------
> 
> @@ -133,6 +149,12 @@ DESCRIPTION
>    is a conflicting grab for any combination. XIGrabEnter and
>    XIGrabFocusin have no effect on an active grab.
> 
> +   If the server supports XI 2.1 and the device is a master
> +   pointer and the confine_to is set to a window, the cursor will
> +   be confined to this window for the duration of the grab.
> +   XIGrabButtonWithConfine with confine_to of None is equivalent to
> +   XIGrabButton.
> +
>    On success, XIGrabEnter and XIGrabFocusIn return 0;
>    If one or more modifier combinations could not be grabbed,
>    XIGrabEnter and XIGrabFocusIn return the number of failed
> diff --git a/src/XIPassiveGrab.c b/src/XIPassiveGrab.c
> index 34f1bf3..274139b 100644
> --- a/src/XIPassiveGrab.c
> +++ b/src/XIPassiveGrab.c
> @@ -31,7 +31,7 @@
> 
> static int
> _XIPassiveGrabDevice(Display* dpy, int deviceid, int grabtype, int detail,
> -                     Window grab_window, Cursor cursor,
> +                     Window grab_window, Window confine_to, Cursor cursor,
>                      int grab_mode, int paired_device_mode,
>                      Bool owner_events, XIEventMask *mask,
>                      int num_modifiers, XIGrabModifiers *modifiers_inout)
> @@ -62,7 +62,7 @@ _XIPassiveGrabDevice(Display* dpy, int deviceid, int grabtype, int detail,
>     req->mask_len = (mask->mask_len + 3)/4;
>     req->grab_type = grabtype;
> 
> -    len = req->mask_len + num_modifiers;
> +    len = req->mask_len + num_modifiers + 1 /* confine_to */;
>     SetReqLen(req, len, len);
> 
>     buff = calloc(4, req->mask_len);
> @@ -70,6 +70,7 @@ _XIPassiveGrabDevice(Display* dpy, int deviceid, int grabtype, int detail,
>     Data(dpy, buff, req->mask_len * 4);
>     for (i = 0; i < num_modifiers; i++)
>         Data(dpy, (char*)&modifiers_inout[i].modifiers, 4);
> +    Data32(dpy, &confine_to, 4);
> 
>     free(buff);
> 
> @@ -105,19 +106,44 @@ XIGrabButton(Display* dpy, int deviceid, int button,
>              int num_modifiers, XIGrabModifiers *modifiers_inout)
> {
>     return _XIPassiveGrabDevice(dpy, deviceid, XIGrabtypeButton, button,
> -                                grab_window, cursor, grab_mode,
> +                                grab_window, None, cursor, grab_mode,
>                                 paired_device_mode, owner_events, mask,
>                                 num_modifiers, modifiers_inout);
> }
> 
> int
> +XIGrabButtonWithConfine(Display* dpy, int deviceid, int button,
> +                        Window grab_window, Window confine_to, Cursor cursor,
> +                        int grab_mode, int paired_device_mode,
> +                        Bool owner_events, XIEventMask *mask,
> +                        int num_modifiers, XIGrabModifiers *modifiers_inout)
> +{
> +    XExtDisplayInfo *extinfo = XInput_find_display(dpy);
> +    Status rc;
> +
> +    LockDisplay(dpy);
> +    if (_XiCheckExtInit(dpy, XInput_2_1, extinfo) == -1)
> +       return (NoSuchExtension);
> +
> +    rc = _XIPassiveGrabDevice(dpy, deviceid, XIGrabtypeButton, button,
> +                              grab_window, confine_to, cursor, grab_mode,
> +                              paired_device_mode, owner_events, mask,
> +                              num_modifiers, modifiers_inout);
> +
> +    UnlockDisplay(dpy);
> +    SyncHandle();
> +
> +    return rc;
> +}
> +
> +int
> XIGrabKeycode(Display* dpy, int deviceid, int keycode,
>              Window grab_window, int grab_mode, int paired_device_mode,
>              Bool owner_events, XIEventMask *mask,
>              int num_modifiers, XIGrabModifiers *modifiers_inout)
> {
>     return _XIPassiveGrabDevice(dpy, deviceid, XIGrabtypeKeycode, keycode,
> -                                grab_window, None, grab_mode, paired_device_mode,
> +                                grab_window, None, None, grab_mode, paired_device_mode,
>                                 owner_events, mask, num_modifiers,
>                                 modifiers_inout);
> }
> @@ -129,18 +155,42 @@ XIGrabEnter(Display *dpy, int deviceid, Window grab_window, Cursor cursor,
>             XIGrabModifiers *modifiers_inout)
> {
>     return _XIPassiveGrabDevice(dpy, deviceid, XIGrabtypeEnter, 0,
> -                                grab_window, cursor, grab_mode, paired_device_mode,
> +                                grab_window, None, cursor, grab_mode, paired_device_mode,
>                                 owner_events, mask, num_modifiers,
>                                 modifiers_inout);
> }
> 
> int
> +XIGrabEnterWithConfine(Display* dpy, int deviceid,
> +                       Window grab_window, Window confine_to, Cursor cursor,
> +                       int grab_mode, int paired_device_mode,
> +                       Bool owner_events, XIEventMask *mask,
> +                       int num_modifiers, XIGrabModifiers *modifiers_inout)
> +{
> +    XExtDisplayInfo *extinfo = XInput_find_display(dpy);
> +    Status rc;
> +
> +    LockDisplay(dpy);
> +    if (_XiCheckExtInit(dpy, XInput_2_1, extinfo) == -1)
> +       return (NoSuchExtension);
> +
> +    rc = _XIPassiveGrabDevice(dpy, deviceid, XIGrabtypeEnter, 0,
> +                              grab_window, confine_to, cursor, grab_mode,
> +                              paired_device_mode, owner_events, mask,
> +                              num_modifiers, modifiers_inout);
> +    UnlockDisplay(dpy);
> +    SyncHandle();
> +
> +    return rc;
> +}
> +
> +int
> XIGrabFocusIn(Display *dpy, int deviceid, Window grab_window, int grab_mode,
>             int paired_device_mode, Bool owner_events, XIEventMask *mask,
>             int num_modifiers, XIGrabModifiers *modifiers_inout)
> {
>     return _XIPassiveGrabDevice(dpy, deviceid, XIGrabtypeFocusIn, 0,
> -                                grab_window, None, grab_mode, paired_device_mode,
> +                                grab_window, None, None, grab_mode, paired_device_mode,
>                                 owner_events, mask, num_modifiers,
>                                 modifiers_inout);
> }
> -- 
> 1.7.5.1
> 


More information about the xorg-devel mailing list