int touchpad_handle_event(struct touchpad *tp, void *userdata, const struct input_event *ev) { int rc = 0; #if 0 printf("%s %s: %d\n", libevdev_event_type_get_name(ev->type), libevdev_event_code_get_name(ev->type, ev->code), ev->value); #endif switch(ev->type) { case EV_ABS: touchpad_update_abs_state(tp, ev); break; case EV_KEY: touchpad_update_button_state(tp, ev); break; /* we never get a SYN_DROPPED, it's filtered higer up */ case EV_SYN: touchpad_pre_process_touches(tp); touchpad_post_events(tp, userdata); touchpad_post_process_touches(tp); break; } return rc; }
int next_event_wrapper(struct adhoc *adhoc, struct input_event *event) { int r = libevdev_next_event(adhoc->dev, LIBEVDEV_READ_FLAG_NORMAL | LIBEVDEV_READ_FLAG_BLOCKING, event); if (r < 0) { error(0, -r, "libevdev_next_event failed"); return r; } if (r == LIBEVDEV_READ_STATUS_SYNC) { fprintf(stderr, "libevdev_next_event returned LIBEVDEV_READ_STATUS_SYNC, handling not implemented!\n"); return 0; } #ifdef DEBUG fprintf(stderr, "event [type: %s, code: %s, value: %d]\n", libevdev_event_type_get_name(event->type), libevdev_event_code_get_name(event->type, event->code), event->value); #endif return 0; }
int main(int argc, char const *argv[]) { if (argc < 5) { printf("Usage: evmpd HOSTNAME PORT DEVICE HALT_COMMAND\n"); return EXIT_FAILURE; } struct mpd_connection *client = connect(argv[1], strtol(argv[2], NULL, 10)); struct libevdev *dev = NULL; int fd; int rc = 1; fd = open(argv[3], O_RDONLY | O_NONBLOCK); rc = libevdev_new_from_fd(fd, &dev); if (rc < 0) { fprintf(stderr, "Failed to init libevdev (%d)\n", strerror(-rc)); return EXIT_FAILURE; } printf("Input device name: \"%s\"\n", libevdev_get_name(dev)); printf("Input device ID: bus %#x vendor %#x product %#x\n", libevdev_get_id_bustype(dev), libevdev_get_id_vendor(dev), libevdev_get_id_product(dev)); do { struct input_event ev; rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev); if (rc == 0 && ev.value == 0) { if (libevdev_event_is_code(&ev, EV_KEY, KEY_F4)) { system(argv[4]); printf("shutdown\n"); } else if (libevdev_event_is_code(&ev, EV_KEY, KEY_PLAYPAUSE)) { struct mpd_status *status = mpd_run_status(client); enum mpd_state state = mpd_status_get_state(status); if (state != MPD_STATE_PLAY && state != MPD_STATE_PAUSE) { mpd_run_play(client); printf("play\n"); } else { mpd_run_toggle_pause(client); printf("toggle-pause\n"); } } else if (libevdev_event_is_code(&ev, EV_KEY, KEY_STOPCD)) { mpd_run_stop(client); printf("stop\n"); } else if (libevdev_event_is_code(&ev, EV_KEY, KEY_PREVIOUSSONG)) { mpd_run_previous(client); printf("previous\n"); } else if (libevdev_event_is_code(&ev, EV_KEY, KEY_NEXTSONG)) { mpd_run_next(client); printf("next\n"); } else if (libevdev_event_is_code(&ev, EV_KEY, KEY_VOLUMEUP)) { struct mpd_status *status = mpd_run_status(client); int volume = mpd_status_get_volume(status); volume += 5; if (volume > 100) { volume = 100; } mpd_run_set_volume(client, volume); printf("set-volume %d\n", volume); } else if (libevdev_event_is_code(&ev, EV_KEY, KEY_VOLUMEDOWN)) { struct mpd_status *status = mpd_run_status(client); int volume = mpd_status_get_volume(status); volume -= 5; if (volume < 0) { volume = 0; } mpd_run_set_volume(client, volume); printf("set-volume %d\n", volume); } else { printf("Event: %s %s %d\n", libevdev_event_type_get_name(ev.type), libevdev_event_code_get_name(ev.type, ev.code), ev.value); } } } while (rc == LIBEVDEV_READ_STATUS_SUCCESS || rc == LIBEVDEV_READ_STATUS_SYNC || rc == -EAGAIN); printf("rc: %d\n", rc); if (client != NULL) { mpd_connection_free(client); } return EXIT_SUCCESS; }
END_TEST START_TEST(test_type_name) { ck_assert_str_eq(libevdev_event_type_get_name(EV_SYN), "EV_SYN"); ck_assert_str_eq(libevdev_event_type_get_name(EV_REL), "EV_REL"); ck_assert_str_eq(libevdev_event_type_get_name(EV_ABS), "EV_ABS"); ck_assert_str_eq(libevdev_event_type_get_name(EV_MSC), "EV_MSC"); ck_assert_str_eq(libevdev_event_type_get_name(EV_SW), "EV_SW"); ck_assert_str_eq(libevdev_event_type_get_name(EV_LED), "EV_LED"); ck_assert_str_eq(libevdev_event_type_get_name(EV_SND), "EV_SND"); ck_assert_str_eq(libevdev_event_type_get_name(EV_REP), "EV_REP"); ck_assert_str_eq(libevdev_event_type_get_name(EV_FF), "EV_FF"); ck_assert_str_eq(libevdev_event_type_get_name(EV_PWR), "EV_PWR"); ck_assert_str_eq(libevdev_event_type_get_name(EV_FF_STATUS), "EV_FF_STATUS"); ck_assert_str_eq(libevdev_event_type_get_name(EV_MAX), "EV_MAX"); }