| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/relabsd_device.c')
| -rw-r--r-- | src/relabsd_device.c | 106 | 
1 files changed, 106 insertions, 0 deletions
| diff --git a/src/relabsd_device.c b/src/relabsd_device.c index b093203..4af52c8 100644 --- a/src/relabsd_device.c +++ b/src/relabsd_device.c @@ -205,6 +205,8 @@ int relabsd_device_create     close(fd); +   dev->fd = fd; +     return 0;  } @@ -246,3 +248,107 @@ int relabsd_device_write_evdev_event     return -1;  } + + +void relabsd_device_set_axes_to_zero +( +   const struct relabsd_device * const dev, +   const struct relabsd_config * const config +) +{ +   int i; + +   for (i = 0; i < RELABSD_VALID_AXES_COUNT; ++i) +   { +      if (config->axis[i].enabled) +      { +         relabsd_device_write_evdev_event +         ( +            dev, +            relabsd_axis_to_abs((enum relabsd_axis) i), +            EV_ABS, +            0 +         ); +      } +   } + +   /* +    * Also send a SYN event when the axes have been modified. +    */ +   libevdev_uinput_write_event(dev->uidev, EV_SYN, SYN_REPORT, 0); +} + +int relabsd_device_wait_next_event +( +   const struct relabsd_device * const dev, +   const struct relabsd_config * const config +) +{ +   int ready_fds; +   const int old_errno = errno; +   fd_set ready_to_read; +   struct timeval curr_timeout; + +   FD_ZERO(&ready_to_read); +   FD_SET(dev->fd, &ready_to_read); + +   /* call to select may alter timeout */ +   memcpy +   ( +      (void *) &(curr_timeout), +      (const void *) &(config->timeout), +      sizeof(struct timeval) +   ); + +   errno = 0; + +   ready_fds = select +   ( +      (dev->fd + 1), +      &ready_to_read, +      (fd_set *) NULL, +      (fd_set *) NULL, +      &(curr_timeout) +   ); + +   if (errno != 0) +   { +      RELABSD_ERROR +      ( +         "Unable to wait for timeout: %s (errno: %d).", +         strerror(errno), +         errno +      ); + +      if (errno == EINTR) +      { +         /* Signal interruption? */ +      } +      else +      { +         /* TODO: error message */ +      } + +      errno = old_errno; + +      return -1; +   } + +   if (ready_fds == -1) +   { +      /* TODO: error message */ + +      RELABSD_S_ERROR +      ( +         "Unable to wait for timeout, yet errno was not set to anything." +      ); + +      errno = old_errno; + +      return -1; +   } + +   errno = old_errno; + +   return ready_fds; +} | 


