Reviewed-by: Mikhail Gusarov <[email protected]>
Signed-off-by: Julien Cristau <[email protected]>
---
 hw/kdrive/ephyr/hostx.c |   51 +++++++++++++++++++++++++++++++---------------
 1 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
index f0ca6f0..44a9df4 100644
--- a/hw/kdrive/ephyr/hostx.c
+++ b/hw/kdrive/ephyr/hostx.c
@@ -1067,8 +1067,8 @@ hostx_get_event(EphyrHostXEvent *ev)
 
              if (grabbed_screen != -1)
                {
-                 XUngrabKeyboard (HostX.dpy, CurrentTime);
-                 XUngrabPointer (HostX.dpy, CurrentTime);
+                 xcb_ungrab_keyboard(HostX.conn, XCB_TIME_CURRENT_TIME);
+                 xcb_ungrab_pointer(HostX.conn, XCB_TIME_CURRENT_TIME);
                  grabbed_screen = -1;
                  hostx_set_win_title (host_screen->info,
                                        "(ctrl+shift grabs mouse and 
keyboard)");
@@ -1076,25 +1076,42 @@ hostx_get_event(EphyrHostXEvent *ev)
              else
                {
                  /* Attempt grab */
-                 if (XGrabKeyboard (HostX.dpy, host_screen->win, True, 
-                                    GrabModeAsync, 
-                                    GrabModeAsync, 
-                                    CurrentTime) == 0)
-                   {
-                     if (XGrabPointer (HostX.dpy, host_screen->win, True, 
-                                       NoEventMask, 
-                                       GrabModeAsync, 
-                                       GrabModeAsync, 
-                                       host_screen->win, None, CurrentTime) == 
0)
-                       {
+                  xcb_grab_keyboard_cookie_t kbgrabc =
+                      xcb_grab_keyboard(HostX.conn,
+                                        True,
+                                        host_screen->win,
+                                        XCB_TIME_CURRENT_TIME,
+                                        XCB_GRAB_MODE_ASYNC,
+                                        XCB_GRAB_MODE_ASYNC);
+                  xcb_grab_keyboard_reply_t *kbgrabr;
+                  xcb_grab_pointer_cookie_t pgrabc =
+                      xcb_grab_pointer(HostX.conn,
+                                       True,
+                                       host_screen->win,
+                                       0,
+                                       XCB_GRAB_MODE_ASYNC,
+                                       XCB_GRAB_MODE_ASYNC,
+                                       host_screen->win,
+                                       XCB_NONE,
+                                       XCB_TIME_CURRENT_TIME);
+                  xcb_grab_pointer_reply_t *pgrabr;
+                  kbgrabr = xcb_grab_keyboard_reply(HostX.conn, kbgrabc, NULL);
+                  if (!kbgrabr || kbgrabr->status != XCB_GRAB_STATUS_SUCCESS) {
+                      xcb_discard_reply(HostX.conn, pgrabc.sequence);
+                      xcb_ungrab_pointer(HostX.conn, XCB_TIME_CURRENT_TIME);
+                  } else {
+                      pgrabr = xcb_grab_pointer_reply(HostX.conn, pgrabc, 
NULL);
+                      if (!pgrabr || pgrabr->status != XCB_GRAB_STATUS_SUCCESS)
+                      {
+                          xcb_ungrab_keyboard(HostX.conn,
+                                              XCB_TIME_CURRENT_TIME);
+                      } else {
                          grabbed_screen = host_screen->mynum;
                          hostx_set_win_title
                                   (host_screen->info,
                                    "(ctrl+shift releases mouse and keyboard)");
-                       }
-                     else      /* Failed pointer grabm  ungrab keyboard */
-                       XUngrabKeyboard (HostX.dpy, CurrentTime);
-                   }
+                      }
+                  }
                }
            }
 
-- 
1.7.1

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to