#include #include #include #include #include #include #include #include #include #define KEY_PRESS 1 #define KEY_RELEASE 0 #define KEY_REPEAT 2 //evdev definitions #define EV_FILE "/dev/input/event0" void close_files(void); int count_toggle = 0; int toggle = 0; int dev_event_init(void); void get_keys(char multi_keys); void four_2_multi_keys(struct input_event ev,char multi_keys); void check_combo(char multi_keys); void ucheck_combo(void); void check_key(char multi_keys); void cleanup_combo(void); struct input_event ev; char buffer_up = 'N'; char buffer_left = 'N'; char buffer_down = 'N'; char buffer_right = 'N'; char combo = 'N'; char key =0; int fp_event = 0; void key_2_key(struct input_event ev); void check_toggle(struct input_event ev); // thumbscript definations void thumb_2_key(void); char key_code[1]; int count = 0; int special_ctrl = 0; int special_shift = 0; void number2key(char key_1, char key_2); void fill_key(char c); void check_special_keys(); //uinput functions int fp_uinput = 0; int dev_uinput_init(void); int dev_uinput_key(unsigned short code, int pressed); int dev_uinput_init(void) { struct uinput_user_dev dev; int aux; fp_uinput = open("/dev/uinput", O_RDWR); if (fp_uinput <= 0) fp_uinput = open("/dev/misc/uinput", O_RDWR); if (fp_uinput <= 0) fp_uinput = open("/dev/devfs/misc/uinput", O_RDWR); if (fp_uinput <= 0) fp_uinput = open("/dev/input/uinput", O_RDWR); if (fp_uinput <= 0) { perror("failed to open the uinput device"); return -1; } memset(&dev, 0, sizeof(dev)); strncpy(dev.name, "Thumbscript", UINPUT_MAX_NAME_SIZE); if (write(fp_uinput, &dev, sizeof(dev)) < 0) { fprintf(stderr,"failed to write uinputdev"); close(fp_uinput); return -1; } if (ioctl(fp_uinput, UI_SET_EVBIT, EV_KEY) != 0) { close(fp_uinput); return -1; } if (ioctl(fp_uinput, UI_SET_EVBIT, EV_REP) != 0) { close(fp_uinput); return -1; } for (aux = KEY_RESERVED; aux <= KEY_UNKNOWN; aux++) if (ioctl(fp_uinput, UI_SET_KEYBIT, aux) != 0) { close(fp_uinput); return -1; } if (ioctl(fp_uinput, UI_DEV_CREATE) != 0) { close(fp_uinput); return -1; } } void key_press(int code){ struct input_event event; gettimeofday(&event.time, NULL); event.type = EV_KEY; event.code = code; event.value = KEY_PRESS; write(fp_uinput, &event, sizeof(event)); } void key_release(int code){ struct input_event event; gettimeofday(&event.time, NULL); event.type = EV_KEY; event.code = code; event.value = KEY_RELEASE; write(fp_uinput, &event, sizeof(event)); } void key_autorepeat(int code){ struct input_event event; gettimeofday(&event.time, NULL); event.type = EV_KEY; event.code = code; event.value = KEY_REPEAT; write(fp_uinput, &event, sizeof(event)); } //evdev functions int dev_event_init(void){ if (!(fp_event = open(EV_FILE, O_RDONLY))) { perror("failed to open event device"); return -1; } if ((ioctl(fp_event, EVIOCGRAB,1)) == -1) { perror("failed to grab the device"); return -1; } } void get_keys(char multi_keys){ while (read (fp_event,&ev, sizeof (struct input_event))) { if (ev.type == EV_KEY){ if (toggle == 0){ four_2_multi_keys(ev,multi_keys); if (key !=0) thumb_2_key(); } if (toggle == 1) { check_toggle(ev); key_2_key(ev); } } } } void check_toggle(struct input_event ev){ if ((ev.value == 0) && (ev.code == KEY_ENTER)){ if (count_toggle++ >=5){ toggle = 0; printf("toggled to 0"); count_toggle = 0; } } if ((ev.value == 0) && (ev.code != KEY_ENTER)) count_toggle = 0; } void key_2_key(struct input_event ev){ if (ev.value == 1) key_press(ev.code); if (ev.value == 0) key_release(ev.code); if (ev.value == 2) key_autorepeat(ev.code); } void four_2_multi_keys(struct input_event ev,char multi_keys){ key = 0 ; if (ev.value == 1) switch (ev.code) { case KEY_UP: buffer_up = 'J'; check_combo(multi_keys); break; case KEY_LEFT: buffer_left = 'J'; check_combo(multi_keys); break; case KEY_DOWN: buffer_down = 'J'; check_combo(multi_keys); break; case KEY_RIGHT: buffer_right = 'J'; check_combo(multi_keys); break; } if (ev.value == 0) switch (ev.code) { case KEY_UP: check_key(multi_keys); cleanup_combo(); break; case KEY_LEFT: check_key(multi_keys); cleanup_combo(); break; case KEY_DOWN: check_key(multi_keys); cleanup_combo(); break; case KEY_RIGHT: check_key(multi_keys); cleanup_combo(); break; case KEY_ENTER: if (multi_keys == '5'){ if (ev.code == KEY_ENTER) key = '5'; } break; } } void check_combo(char multi_keys){ //2er combos if ((buffer_up=='J') && (buffer_left=='J') && (buffer_down=='N') && (buffer_right=='N')&& (combo=='N')) combo = '1'; else if ((buffer_up=='J') && (buffer_left=='N') && (buffer_down=='N') && (buffer_right=='J')&& (combo=='N')) combo = '1'; else if ((buffer_up=='N') && (buffer_left=='J') && (buffer_down=='J') && (buffer_right=='N')&& (combo=='N')) combo = '1'; else if ((buffer_up=='N') && (buffer_left=='N') && (buffer_down=='J') && (buffer_right=='J')&& (combo=='N')) combo = '1'; else if ((buffer_up=='J') && (buffer_left=='N') && (buffer_down=='J') && (buffer_right=='N')&& (combo=='N')) combo = '1'; else if ((buffer_up=='N') && (buffer_left=='J') && (buffer_down=='N') && (buffer_right=='J')&& (combo=='N')) combo = '1'; else if ((combo == '1') && (multi_keys == '4')) combo = 'S'; } void check_key(char multi_keys){ //nomal if ((buffer_up=='J') && (buffer_left=='N') && (buffer_down=='N') && (buffer_right=='N')&& (combo=='N')) key = '2'; else if ((buffer_up=='N') && (buffer_left=='J') && (buffer_down=='N') && (buffer_right=='N')&& (combo=='N')) key = '4'; else if ((buffer_up=='N') && (buffer_left=='N') && (buffer_down=='J') && (buffer_right=='N')&& (combo=='N')) key = '8'; else if ((buffer_up=='N') && (buffer_left=='N') && (buffer_down=='N') && (buffer_right=='J')&& (combo=='N')) key = '6'; //2er else if ((buffer_up=='J') && (buffer_left=='J') && (buffer_down=='N') && (buffer_right=='N')&& (combo=='1')) key = '1'; else if ((buffer_up=='J') && (buffer_left=='N') && (buffer_down=='N') && (buffer_right=='J')&& (combo=='1')) key = '3'; else if ((buffer_up=='N') && (buffer_left=='J') && (buffer_down=='J') && (buffer_right=='N')&& (combo=='1')) key = '7'; else if ((buffer_up=='N') && (buffer_left=='N') && (buffer_down=='J') && (buffer_right=='J')&& (combo=='1')) key = '9'; //super combo else if ((buffer_up=='J') && (buffer_left=='J') && (buffer_down=='J') && (buffer_right=='J')&& (combo == 'S') && (multi_keys == '4')) // else if ((combo == 'S') && (multi_keys == '4')) key = '5'; } void cleanup_combo(void){ combo = 'N'; buffer_up ='N'; buffer_down ='N'; buffer_left ='N'; buffer_right ='N'; } //thumbscript functions void thumb_2_key(void){ key_code[count]=key; if(count++ == 1){ number2key(key_code[0],key_code[1]); count = 0; } } void number2key(char key_1,char key_2){ if ((key_1 == '7') && (key_2 == '9')) { key_press(KEY_A); key_release(KEY_A); check_special_keys(); } else if ((key_1 == '9') && (key_2 == '7')) { //generate _ key_press(KEY_LEFTSHIFT); key_press(KEY_MINUS); key_release(KEY_MINUS); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '2') && (key_2 == '9')) { key_press(KEY_B); key_release(KEY_B); check_special_keys(); } else if ((key_1 == '9') && (key_2 == '2')) check_special_keys(); else if ((key_1 == '3') && (key_2 == '9')) { key_press(KEY_C); key_release(KEY_C); check_special_keys(); } else if ((key_1 == '9') && (key_2 == '3')) { //generate ( key_press(KEY_LEFTSHIFT); key_press(KEY_9); key_release(KEY_9); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '2') && (key_2 == '7')) { key_press(KEY_D); key_release(KEY_D); check_special_keys(); } else if ((key_1 == '7') && (key_2 == '2')) { //generate ? key_press(KEY_LEFTSHIFT); key_press(KEY_SLASH); key_release(KEY_SLASH); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '3') && (key_2 == '7')) { key_press(KEY_E); key_release(KEY_E); check_special_keys(); } else if ((key_1 == '7') && (key_2 == '3')) { key_press(KEY_SLASH); key_release(KEY_SLASH); check_special_keys(); } else if ((key_1 == '3') && (key_2 == '8')) { key_press(KEY_F); key_release(KEY_F); check_special_keys(); } else if ((key_1 == '8') && (key_2 == '3')) { key_press(KEY_LEFTBRACE); key_release(KEY_LEFTBRACE); check_special_keys(); } else if ((key_1 == '3') && (key_2 == '6')) { key_press(KEY_G); key_release(KEY_G); check_special_keys(); } else if ((key_1 == '6') && (key_2 == '3')) { //generate < key_press(KEY_LEFTSHIFT); key_press(KEY_COMMA); key_release(KEY_COMMA); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '4') && (key_2 == '9')) { key_press(KEY_H); key_release(KEY_H); check_special_keys(); } else if ((key_1 == '9') && (key_2 == '4')) { //switch to normal keys toggle = 1; check_special_keys(); } else if ((key_1 == '2') && (key_2 == '8')) { key_press(KEY_I); key_release(KEY_I); check_special_keys(); } else if ((key_1 == '8') && (key_2 == '2')) { //gernerate | key_press(KEY_LEFTSHIFT); key_press(KEY_BACKSLASH); key_release(KEY_BACKSLASH); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '2') && (key_2 == '4')) { key_press(KEY_J); key_release(KEY_J); check_special_keys(); } else if ((key_1 == '4') && (key_2 == '2')) { key_press(KEY_EQUAL); key_release(KEY_EQUAL); check_special_keys(); } else if ((key_1 == '2') && (key_2 == '3')) { key_press(KEY_K); key_release(KEY_K); check_special_keys(); } else if ((key_1 == '3') && (key_2 == '2')) { key_press(KEY_APOSTROPHE); key_release(KEY_APOSTROPHE); check_special_keys(); } else if ((key_1 == '2') && (key_2 == '6')) { key_press(KEY_L); key_release(KEY_L); check_special_keys(); } else if ((key_1 == '6') && (key_2 == '2')) { //generate + key_press(KEY_LEFTSHIFT); key_press(KEY_EQUAL); key_release(KEY_EQUAL); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '7') && (key_2 == '8')) { key_press(KEY_M); key_release(KEY_M); check_special_keys(); } else if ((key_1 == '8') && (key_2 == '7')) { //generate ~ key_press(KEY_LEFTSHIFT); key_press(KEY_GRAVE); key_release(KEY_GRAVE); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '4') && (key_2 == '8')) { key_press(KEY_N); key_release(KEY_N); check_special_keys(); } else if ((key_1 == '8') && (key_2 == '4')) { //generate ] key_press(KEY_LEFTSHIFT); key_press(KEY_RIGHTBRACE); key_release(KEY_RIGHTBRACE); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '4') && (key_2 == '6')) { key_press(KEY_O); key_release(KEY_O); check_special_keys(); } else if ((key_1 == '6') && (key_2 == '4')) { key_press(KEY_0); key_release(KEY_0); check_special_keys(); } else if ((key_1 == '1') && (key_2 == '4')) { key_press(KEY_P); key_release(KEY_P); check_special_keys(); } else if ((key_1 == '4') && (key_2 == '1')) { //generate > key_press(KEY_LEFTSHIFT); key_press(KEY_DOT); key_release(KEY_DOT); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '1') && (key_2 == '6')) { key_press(KEY_Q); key_release(KEY_Q); check_special_keys(); } else if ((key_1 == '6') && (key_2 == '1')) { key_press(KEY_ESC); key_release(KEY_ESC); check_special_keys(); } else if ((key_1 == '8') && (key_2 == '9')) { key_press(KEY_R); key_release(KEY_R); check_special_keys(); } else if ((key_1 == '9') && (key_2 == '8')) { key_press(KEY_MINUS); key_release(KEY_MINUS); check_special_keys(); } else if ((key_1 == '6') && (key_2 == '9')) { key_press(KEY_S); key_release(KEY_S); check_special_keys(); } else if ((key_1 == '9') && (key_2 == '6')) { //gernerate : key_press(KEY_LEFTSHIFT); key_press(KEY_SEMICOLON); key_release(KEY_SEMICOLON); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '6') && (key_2 == '8')) { key_press(KEY_T); key_release(KEY_T); check_special_keys(); } else if ((key_1 == '8') && (key_2 == '6')) { //generate [ key_press(KEY_LEFTSHIFT); key_press(KEY_LEFTBRACE); key_release(KEY_LEFTBRACE); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '1') && (key_2 == '9')) { key_press(KEY_U); key_release(KEY_U); check_special_keys(); } else if ((key_1 == '9') && (key_2 == '1')) { key_press(KEY_BACKSLASH); key_release(KEY_BACKSLASH); check_special_keys(); } else if ((key_1 == '1') && (key_2 == '2')) { key_press(KEY_V); key_release(KEY_V); check_special_keys(); } else if ((key_1 == '2') && (key_2 == '1')) // I really have no clue what the sign could be check_special_keys(); else if ((key_1 == '1') && (key_2 == '3')) { key_press(KEY_W); key_release(KEY_W); check_special_keys(); } else if ((key_1 == '3') && (key_2 == '1')) { //generate " key_press(KEY_LEFTSHIFT); key_press(KEY_APOSTROPHE); key_release(KEY_APOSTROPHE); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '1') && (key_2 == '7')) { key_press(KEY_X); key_release(KEY_X); check_special_keys(); } else if ((key_1 == '7') && (key_2 == '1')) { //generate ) key_press(KEY_LEFTSHIFT); key_press(KEY_0); key_release(KEY_0); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '1') && (key_2 == '8')) { key_press(KEY_Y); key_release(KEY_Y); check_special_keys(); } else if ((key_1 == '8') && (key_2 == '1')) { key_press(KEY_RIGHTBRACE); key_release(KEY_RIGHTBRACE); check_special_keys(); } else if ((key_1 == '4') && (key_2 == '7')) {; key_press(KEY_Z); key_release(KEY_Z); check_special_keys(); } else if ((key_1 == '7') && (key_2 == '4')) { key_press(KEY_SEMICOLON); key_release(KEY_SEMICOLON); check_special_keys(); } else if ((key_1 == '1') && (key_2 == '5')) {; key_press(KEY_1); key_release(KEY_1); check_special_keys(); } else if ((key_1 == '5') && (key_2 == '1')) { //generate shuld be ^ but to keep logic i will do ! key_press(KEY_LEFTSHIFT); key_press(KEY_1); key_release(KEY_1); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '2') && (key_2 == '5')) { key_press(KEY_2); key_release(KEY_2); check_special_keys(); } else if ((key_1 == '5') && (key_2 == '2')) { //generate @ key_press(KEY_LEFTSHIFT); key_press(KEY_2); key_release(KEY_2); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '3') && (key_2 == '5')) { key_press(KEY_3); key_release(KEY_3); check_special_keys(); } else if ((key_1 == '5') && (key_2 == '3')) { //generate # key_press(KEY_LEFTSHIFT); key_press(KEY_3); key_release(KEY_3); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '4') && (key_2 == '5')) { key_press(KEY_4); key_release(KEY_4); check_special_keys(); } else if ((key_1 == '5') && (key_2 == '4')) { //generate $ key_press(KEY_LEFTSHIFT); key_press(KEY_4); key_release(KEY_4); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '5') && (key_2 == '5')) { key_press(KEY_5); key_release(KEY_5); check_special_keys(); } else if ((key_1 == '6') && (key_2 == '5')) { key_press(KEY_6); key_release(KEY_6); check_special_keys(); } else if ((key_1 == '5') && (key_2 == '6')) { //generate ^ key_press(KEY_LEFTSHIFT); key_press(KEY_6); key_release(KEY_6); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '7') && (key_2 == '5')) { key_press(KEY_7); key_release(KEY_7); check_special_keys(); } else if ((key_1 == '5') && (key_2 == '7')) { //generate & key_press(KEY_LEFTSHIFT); key_press(KEY_7); key_release(KEY_7); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '8') && (key_2 == '5')) { key_press(KEY_8); key_release(KEY_8); check_special_keys(); } else if ((key_1 == '5') && (key_2 == '8')) { //generate * key_press(KEY_LEFTSHIFT); key_press(KEY_8); key_release(KEY_8); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '9') && (key_2 == '5')) { key_press(KEY_9); key_release(KEY_9); check_special_keys(); } else if ((key_1 == '5') && (key_2 == '9')) { //generate % key_press(KEY_LEFTSHIFT); key_press(KEY_5); key_release(KEY_5); key_release(KEY_LEFTSHIFT); check_special_keys(); } else if ((key_1 == '1') && (key_2 == '1')) { key_press(KEY_LEFTCTRL); special_ctrl = 1; } else if ((key_1 == '2') && (key_2 == '2')) { key_press(KEY_LEFTSHIFT); special_shift = 1; } else if ((key_1 == '3') && (key_2 == '3')) { key_press(KEY_BACKSPACE); key_release(KEY_BACKSPACE); check_special_keys(); } else if ((key_1 == '4') && (key_2 == '4')) { key_press(KEY_TAB); key_release(KEY_TAB); check_special_keys(); } else if ((key_1 == '6') && (key_2 == '6')) { key_press(KEY_ENTER); key_release(KEY_ENTER); check_special_keys(); } else if ((key_1 == '7') && (key_2 == '7')) { key_press(KEY_COMMA); key_release(KEY_COMMA); check_special_keys(); } else if ((key_1 == '8') && (key_2 == '8')) { key_press(KEY_SPACE); key_release(KEY_SPACE); check_special_keys(); } else if ((key_1 == '9') && (key_2 == '9')) { key_press(KEY_DOT); key_release(KEY_DOT); check_special_keys(); } } void check_special_keys(){ if (special_ctrl == 1){ key_release(KEY_LEFTCTRL); special_ctrl = 0; } if (special_shift == 1){ key_release(KEY_LEFTSHIFT); special_shift = 0; } } //clean void close_files(void){ close (fp_uinput); close (fp_event); } //main function main(){ dev_uinput_init(); dev_event_init(); get_keys('5'); close_files(); }