// Lock grabs the keyboard and pointer locking the X11 display func Lock(X *xgb.Conn) error { screen := xproto.Setup(X).DefaultScreen(X) passEventsToOwner := false kbCookie := xproto.GrabKeyboard(X, passEventsToOwner, screen.Root, xproto.TimeCurrentTime, xproto.GrabModeAsync, xproto.GrabModeAsync) kbReply, err := kbCookie.Reply() if err != nil { return err } if kbReply.Status != xproto.GrabStatusSuccess { return fmt.Errorf("GrabKeyboard status %v", grabStatus(kbReply.Status)) } ptrCookie := xproto.GrabPointer(X, passEventsToOwner, screen.Root, 0, xproto.GrabModeAsync, xproto.GrabModeAsync, xproto.AtomNone, xproto.AtomNone, xproto.TimeCurrentTime) ptrReply, err := ptrCookie.Reply() if err != nil { xproto.UngrabKeyboard(X, xproto.TimeCurrentTime) return err } if ptrReply.Status != xproto.GrabStatusSuccess { return fmt.Errorf("GrabPointer status %v", grabStatus(kbReply.Status)) } return nil }
// GrabPointer grabs the entire pointer. // Returns whether GrabStatus is successful and an error if one is reported by // XGB. It is possible to not get an error and the grab to be unsuccessful. // The purpose of 'win' is that after a grab is successful, ALL Button*Events // will be sent to that window. Make sure you have a callback attached :-) func GrabPointer(xu *xgbutil.XUtil, win xproto.Window, confine xproto.Window, cursor xproto.Cursor) (bool, error) { reply, err := xproto.GrabPointer(xu.Conn(), false, win, pointerMasks, xproto.GrabModeAsync, xproto.GrabModeAsync, confine, cursor, 0).Reply() if err != nil { return false, fmt.Errorf("GrabPointer: Error grabbing pointer on "+ "window '%x': %s", win, err) } return reply.Status == xproto.GrabStatusSuccess, nil }