diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c index 877abba..aba8627 100644 --- a/libevdev/libevdev.c +++ b/libevdev/libevdev.c @@ -847,9 +847,15 @@ libevdev_grab(struct libevdev *dev, int grab) { int rc = 0; - if (grab && !dev->grabbed) + if (grab != LIBEVDEV_GRAB && grab != LIBEVDEV_UNGRAB) + return -EINVAL; + + if (grab == dev->grabbed) + return 0; + + if (grab == LIBEVDEV_GRAB) rc = ioctl(dev->fd, EVIOCGRAB, (void *)1); - else if (!grab && dev->grabbed) + else if (grab == LIBEVDEV_UNGRAB) rc = ioctl(dev->fd, EVIOCGRAB, (void *)0); if (rc == 0) diff --git a/libevdev/libevdev.h b/libevdev/libevdev.h index 8feb542..d18bd1f 100644 --- a/libevdev/libevdev.h +++ b/libevdev/libevdev.h @@ -83,6 +83,12 @@ typedef void (*libevdev_log_func_t)(const char *format, va_list args); */ void libevdev_set_log_handler(struct libevdev *dev, libevdev_log_func_t logfunc); + +enum EvdevGrabModes { + LIBEVDEV_GRAB = 3, + LIBEVDEV_UNGRAB = 4, +}; + /** * Grab or ungrab the device through a kernel EVIOCGRAB. This prevents other * clients (including kernel-internal ones such as rfkill) from receiving