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

Peter Hutterer peter.hutterer at who-t.net
Thu Jun 2 20:56:28 PDT 2011


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