All pastes #84050 Raw Edit

Mine

public text v1 · immutable
#84050 ·published 2006-07-10 13:26 UTC
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();
}