static int input_callback(int fd, short revents, void *data) { struct input_event ev; int ret; int fake_key = 0; ret = ev_get_input(fd, revents, &ev); if (ret) return -1; #ifdef BOARD_TOUCH_RECOVERY if (touch_handle_input(fd, ev)) return 0; #endif if (ev.type == EV_SYN) { return 0; } else if (ev.type == EV_REL) { if (ev.code == REL_Y) { // accumulate the up or down motion reported by // the trackball. When it exceeds a threshold // (positive or negative), fake an up/down // key event. rel_sum += ev.value; if (rel_sum > 3) { fake_key = 1; ev.type = EV_KEY; ev.code = KEY_DOWN; ev.value = 1; rel_sum = 0; } else if (rel_sum < -3) { fake_key = 1; ev.type = EV_KEY; ev.code = KEY_UP; ev.value = 1; rel_sum = 0; } } } else { rel_sum = 0; } if (ev.type != EV_KEY || ev.code > KEY_MAX) return 0; if (ev.value == 2) { boardEnableKeyRepeat = 0; } pthread_mutex_lock(&key_queue_mutex); if (!fake_key) { // our "fake" keys only report a key-down event (no // key-up), so don't record them in the key_pressed // table. key_pressed[ev.code] = ev.value; } const int queue_max = sizeof(key_queue) / sizeof(key_queue[0]); if (ev.value > 0 && key_queue_len < queue_max) { key_queue[key_queue_len++] = ev.code; if (boardEnableKeyRepeat) { struct timeval now; gettimeofday(&now, NULL); key_press_time[ev.code] = (now.tv_sec * 1000) + (now.tv_usec / 1000); key_last_repeat[ev.code] = 0; } pthread_cond_signal(&key_queue_cond); } pthread_mutex_unlock(&key_queue_mutex); if (ev.value > 0 && device_toggle_display(key_pressed, ev.code)) { pthread_mutex_lock(&gUpdateMutex); show_text = !show_text; if (show_text) show_text_ever = 1; update_screen_locked(); pthread_mutex_unlock(&gUpdateMutex); } if (ev.value > 0 && device_reboot_now(key_pressed, ev.code)) { android_reboot(ANDROID_RB_RESTART, 0, 0); } return 0; }
static int input_callback(int fd, short revents, void *data) { struct input_event ev; int ret; int fake_key = 0; gr_surface surface = gVirtualKeys; ret = ev_get_input(fd, revents, &ev); if (ret) return -1; if (ev.type == EV_SYN) { return 0; } else if (ev.type == EV_REL) { if (ev.code == REL_Y) { // accumulate the up or down motion reported by // the trackball. When it exceeds a threshold // (positive or negative), fake an up/down // key event. rel_sum += ev.value; if (rel_sum > 3) { fake_key = 1; ev.type = EV_KEY; ev.code = KEY_DOWN; ev.value = 1; rel_sum = 0; } else if (rel_sum < -3) { fake_key = 1; ev.type = EV_KEY; ev.code = KEY_UP; ev.value = 1; rel_sum = 0; } } } else { rel_sum = 0; } if (ev.type == 3 && ev.code == 57 && ev.value != -1) { if (in_touch == 0) { in_touch = 1; //starting to track touch... reset_gestures(); } } else if (ev.type == 3 && ev.code == 57 && ev.value == -1) { //finger lifted! lets run with this ev.type = EV_KEY; //touch panel support!!! int keywidth = gr_get_width(surface) / 4; int keyoffset = (gr_fb_width() - gr_get_width(surface)) / 2; if (touch_y > (gr_fb_height() - gr_get_height(surface)) && touch_x > 0) { //they lifted in the touch panel region if (touch_x < (keywidth + keyoffset)) { //down button //ui_print("Pressed down key"); ev.code = KEY_VOLUMEDOWN; reset_gestures(); } else if (touch_x < ((keywidth * 2) + keyoffset)) { //up button //ui_print("Pressed up key"); ev.code = KEY_VOLUMEUP; reset_gestures(); } else if (touch_x < ((keywidth * 3) + keyoffset)) { //back button //ui_print("Pressed back key"); ev.code = KEY_BACK; reset_gestures(); } else { //enter key //ui_print("Pressed enter key"); ev.code = KEY_POWER; reset_gestures(); } vibrate(VIBRATOR_TIME_MS); } if (slide_right == 1) { ev.code = KEY_HOME; slide_right = 0; } else if (slide_left == 1) { ev.code = KEY_BACK; slide_left = 0; } ev.value = 1; in_touch = 0; reset_gestures(); } else if (ev.type == 3 && ev.code == 53) { old_x = touch_x; touch_x = ev.value; if (old_x != 0) diff_x += touch_x - old_x; if(touch_y < (gr_fb_height() - gr_get_height(surface))) { if(diff_x > (gr_fb_width() / 4)) { slide_right = 1; reset_gestures(); } else if(diff_x < ((gr_fb_width() / 4) * -1)) { slide_left = 1; reset_gestures(); } } else { input_buttons(); //reset_gestures(); } } else if (ev.type == 3 && ev.code == 54) { old_y = touch_y; touch_y = ev.value; if (old_y != 0) diff_y += touch_y - old_y; if(touch_y < (gr_fb_height() - gr_get_height(surface))) { if (diff_y > 25) { ev.code = KEY_DOWN; ev.type = EV_KEY; reset_gestures(); } else if (diff_y < -25) { ev.code = KEY_UP; ev.type = EV_KEY; reset_gestures(); } } else { input_buttons(); //reset_gestures(); } } if (ev.type != EV_KEY || ev.code > KEY_MAX) return 0; pthread_mutex_lock(&key_queue_mutex); if (!fake_key) { // our "fake" keys only report a key-down event (no // key-up), so don't record them in the key_pressed // table. key_pressed[ev.code] = ev.value; } const int queue_max = sizeof(key_queue) / sizeof(key_queue[0]); if (ev.value > 0 && key_queue_len < queue_max) { key_queue[key_queue_len++] = ev.code; pthread_cond_signal(&key_queue_cond); } pthread_mutex_unlock(&key_queue_mutex); if (ev.value > 0 && device_toggle_display(key_pressed, ev.code)) { pthread_mutex_lock(&gUpdateMutex); show_text = !show_text; if (show_text) show_text_ever = 1; update_screen_locked(); pthread_mutex_unlock(&gUpdateMutex); } if (ev.value > 0 && device_reboot_now(key_pressed, ev.code)) { android_reboot(ANDROID_RB_RESTART, 0, 0); } return 0; }
// Reads input events, handles special hot keys, and adds to the key queue. static void *input_thread(void *cookie) { int rel_sum = 0; int fake_key = 0; for (;;) { // wait for the next key event struct input_event ev; do { ev_get(&ev, 0); if (ev.type == EV_SYN) { continue; } else if (ev.type == EV_REL) { if (ev.code == REL_Y) { // accumulate the up or down motion reported by // the trackball. When it exceeds a threshold // (positive or negative), fake an up/down // key event. rel_sum += ev.value; if (rel_sum > 3) { fake_key = 1; ev.type = EV_KEY; ev.code = KEY_DOWN; ev.value = 1; rel_sum = 0; } else if (rel_sum < -3) { fake_key = 1; ev.type = EV_KEY; ev.code = KEY_UP; ev.value = 1; rel_sum = 0; } } } else { rel_sum = 0; } } while (ev.type != EV_KEY || ev.code > KEY_MAX); pthread_mutex_lock(&key_queue_mutex); if (!fake_key) { // our "fake" keys only report a key-down event (no // key-up), so don't record them in the key_pressed // table. key_pressed[ev.code] = ev.value; } fake_key = 0; const int queue_max = sizeof(key_queue) / sizeof(key_queue[0]); if (ev.value > 0 && key_queue_len < queue_max) { key_queue[key_queue_len++] = ev.code; pthread_cond_signal(&key_queue_cond); } pthread_mutex_unlock(&key_queue_mutex); if (ev.value > 0 && device_toggle_display(key_pressed, ev.code)) { pthread_mutex_lock(&gUpdateMutex); show_text = !show_text; update_screen_locked(); pthread_mutex_unlock(&gUpdateMutex); } if (ev.value > 0 && device_reboot_now(key_pressed, ev.code)) { reboot(RB_AUTOBOOT); } } return NULL; }
static int input_callback(int fd, short revents, void *data) { struct input_event ev; int ret; int fake_key = 0; ret = ev_get_input(fd, revents, &ev); if (ret) return -1; input_device dev; dev.fd = fd; if(!dev.touch_calibrated) dev.touch_calibrated = calibrate_touch(&dev); if (ev.type == EV_SYN) { if (ev.code == SYN_MT_REPORT) { dev.saw_mt_report = 1; if (!dev.saw_mt_tracking_id) { if (dev.saw_pos_x && dev.saw_pos_y) { dev.saw_pos_x = 0; dev.saw_pos_y = 0; } else handle_release(&dev, &ev); } } } else if (ev.type == EV_REL) { if (ev.code == REL_Y) { // accumulate the up or down motion reported by // the trackball. When it exceeds a threshold // (positive or negative), fake an up/down // key event. rel_sum += ev.value; if (rel_sum > 3) { fake_key = 1; ev.type = EV_KEY; ev.code = KEY_DOWN; ev.value = 1; rel_sum = 0; } else if (rel_sum < -3) { fake_key = 1; ev.type = EV_KEY; ev.code = KEY_UP; ev.value = 1; rel_sum = 0; } } } else if (ev.type == EV_ABS) { switch(ev.code){ case ABS_MT_SLOT: dev.slot_current = ev.value; break; case ABS_MT_TRACKING_ID: dev.saw_mt_tracking_id = 1; dev.tracking_id = ev.value; if (dev.tracking_id == -1 && dev.slot_current == 0) handle_release(&dev, &ev); break; case ABS_MT_POSITION_X: dev.saw_pos_x = 1; if (dev.slot_current != 0) break; if(dev.touch_start.x == 0) dev.touch_start.x = dev.touch_pos.x; float touch_rel = (float)ev.value / ((float)dev.touch_max.x - (float)dev.touch_min.x); dev.touch_pos.x = touch_rel * gr_fb_width(); if (dev.touch_start.x == 0) break; //first touch. diff_x += dev.touch_pos.x - dev.touch_start.x; if (abs(diff_x) > abs(diff_y) && dev.touch_pos.y < (gr_fb_height() - virtualkey_h)) { if(diff_x > min_x_swipe_px) { dev.slide_right = 1; } else if (diff_x < -min_x_swipe_px) { dev.slide_left = 1; } } break; case ABS_MT_POSITION_Y: dev.saw_pos_y = 1; if (dev.slot_current != 0) break; if(dev.touch_start.y == 0) dev.touch_start.y = dev.touch_pos.y; touch_rel = (float)ev.value / ((float)dev.touch_max.y - (float)dev.touch_min.y); dev.touch_pos.y = touch_rel * gr_fb_height(); #ifdef USE_VIRTUAL_KEY ui_get_virtualkey_pressed(&dev); #endif if (dev.touch_start.y == 0) break; //first touch. diff_y += dev.touch_pos.y - dev.touch_start.y; if (abs(diff_y) >= abs(diff_x) && dev.touch_pos.y < (gr_fb_height() - virtualkey_h)) { if (diff_y > min_y_swipe_px) { ev.type = EV_KEY; ev.code = KEY_VOLUMEDOWN; ev.value = 2; reset_touch(&dev); } else if (diff_y < -min_y_swipe_px) { ev.type = EV_KEY; ev.code = KEY_VOLUMEUP; ev.value = 2; reset_touch(&dev); } } break; default: break; } } else if (ev.type == EV_KEY) { if (dev.saw_mt_report && dev.saw_mt_tracking_id && ev.code == BTN_TOUCH && ev.value == 0) handle_release(&dev, &ev); } else { rel_sum = 0; } if (ev.type != EV_KEY || ev.code > KEY_MAX) return 0; if (ev.value == 2) { boardEnableKeyRepeat = 0; } pthread_mutex_lock(&key_queue_mutex); if (!fake_key) { // our "fake" keys only report a key-down event (no // key-up), so don't record them in the key_pressed // table. key_pressed[ev.code] = ev.value; } const int queue_max = sizeof(key_queue) / sizeof(key_queue[0]); if (ev.value > 0 && key_queue_len < queue_max) { key_queue[key_queue_len++] = ev.code; if (boardEnableKeyRepeat) { struct timeval now; gettimeofday(&now, NULL); key_press_time[ev.code] = (now.tv_sec * 1000) + (now.tv_usec / 1000); key_last_repeat[ev.code] = 0; } pthread_cond_signal(&key_queue_cond); } pthread_mutex_unlock(&key_queue_mutex); if (ev.value > 0 && device_reboot_now(key_pressed, ev.code)) { reboot_main_system(ANDROID_RB_RESTART, 0, 0); } return 0; }