rendered paste body/* This program have no name at the moment. It uses the keypad
to let you write thumbscript.com key combinations.
Some parts of this program are taken from esekeyd, uinput_mouse.c
and kbdd which are all under gpl.
This program is also under gpl.
have fun! nice
*/
#include <linux/input.h>
#include <linux/uinput.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <math.h>
#define KEY_PRESS 1
#define KEY_RELEASE 0
#define KEY_REPEAT 2
//evdev definitions
#define EV_FILE "/dev/input/event0"
int dev_event_init(void);
void close_files(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 check_key(char multi_keys);
void cleanup_combo(void);
void key_2_key(struct input_event ev);
void check_toggle(struct input_event ev);
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 count_toggle = 0;
int toggle = 0;
int fp_event = 0;
// thumbscript definations
void thumb_2_key(void);
void number2key(char key_1, char key_2);
void fill_key(char c);
void check_special_keys();
char key_code[1];
int count = 0;
int special_ctrl = 0;
int special_shift = 0;
//uinput functions
int dev_uinput_init(void);
int dev_uinput_key(unsigned short code, int pressed);
int fp_uinput = 0;
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();
}