[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