Beispiel #1
0
static int evdev_handle(int fd) {
  for (int i=0;i<numDevices;i++) {
    if (devices[i].fd = fd) {
      int rc;
      struct input_event ev;
      while ((rc = libevdev_next_event(devices[i].dev, LIBEVDEV_READ_FLAG_NORMAL, &ev)) >= 0) {
        if (rc == LIBEVDEV_READ_STATUS_SYNC)
          fprintf(stderr, "Error: cannot keep up\n");
        else if (rc == LIBEVDEV_READ_STATUS_SUCCESS) {
          if (!handler(&ev, &devices[i]))
            return LOOP_RETURN;
        }
      }
      if (rc == -ENODEV) {
        evdev_remove(i);
      } else if (rc != -EAGAIN && rc < 0) {
        fprintf(stderr, "Error: %s\n", strerror(-rc));
        exit(EXIT_FAILURE);
      }
    }
  }
  return LOOP_OK;
}
Beispiel #2
0
static void evdev_read(evdev_t *dev)
{
    struct input_event ev[MAX_EVENTS];
    ssize_t bytes;
    size_t i, count;
    unsigned button, time;

    bytes = read(dev->fd, ev, EVENT_SIZE * MAX_EVENTS);
    if (bytes == -1) {
        if (errno == EAGAIN) {
            return;
        }
        Com_EPrintf("Couldn't read %s: %s\n", dev->path, strerror(errno));
        evdev_remove(dev);
        return;
    }

    if (bytes < EVENT_SIZE) {
        return; // should not happen
    }

    count = bytes / EVENT_SIZE;
    for (i = 0; i < count; i++) {
        time = ev[i].time.tv_sec * 1000 + ev[i].time.tv_usec / 1000;
        switch (ev[i].type) {
        case EV_KEY:
            if (ev[i].code >= BTN_MOUSE && ev[i].code < BTN_MOUSE + 8) {
                button = K_MOUSE1 + ev[i].code - BTN_MOUSE;
                Key_Event(button, !!ev[i].value, time);
            }
            break;
        case EV_REL:
            switch (ev[i].code) {
            case REL_X:
                evdev.dx += (int)ev[i].value;
                break;
            case REL_Y:
                evdev.dy += (int)ev[i].value;
                break;
            case REL_WHEEL:
                if ((int)ev[i].value == 1) {
                    Key_Event(K_MWHEELUP, qtrue, time);
                    Key_Event(K_MWHEELUP, qfalse, time);
                } else if ((int)ev[i].value == -1) {
                    Key_Event(K_MWHEELDOWN, qtrue, time);
                    Key_Event(K_MWHEELDOWN, qfalse, time);
                }
                break;
            case REL_HWHEEL:
                if ((int)ev[i].value == 1) {
                    Key_Event(K_MWHEELRIGHT, qtrue, time);
                    Key_Event(K_MWHEELRIGHT, qfalse, time);
                } else if ((int)ev[i].value == -1) {
                    Key_Event(K_MWHEELLEFT, qtrue, time);
                    Key_Event(K_MWHEELLEFT, qfalse, time);
                }
                break;
            default:
                break;
            }
            break;
        default:
            break;
        }
    }
}