0 کاربر و 1 مهمان درحال مشاهده موضوع.
#include <X11/Xlib.h>#include <stdlib.h>#include <stdio.h>#include <pthread.h>#include <iostream>using namespace std;#define MOD_US 0#define MOD_IR 8192#define MOD_SHIFT 1#define MOD_CTRL 4#define MOD_ALT 8#define MOD_NUMLOCK 16#define MOD_WIN 64void Copy1To2(const char* c, char* p){ unsigned i = 0; unsigned j = 0; while(c[j]) { p[i++] = c[j++]; if(i > 50) break; } p[i] = 0;}void DealShared(unsigned keysym,char* p){ switch(keysym) { case 65470:// F1 Copy1To2("\"" "F1" "\"",p); break; case 65471:// F2 Copy1To2("\"" "F2" "\"",p); break; case 65472:// F3 Copy1To2("\"" "F3" "\"",p); break; case 65473:// F4 Copy1To2("\"" "F4" "\"",p); break; case 65474:// F5 Copy1To2("\"" "F5" "\"",p); break; case 65475:// F6 Copy1To2("\"" "F6" "\"",p); break; case 65476:// F7 Copy1To2("\"" "F6" "\"",p); break; case 65477:// F8 Copy1To2("\"" "F8" "\"",p); break; case 65478:// F9 Copy1To2("\"" "F9" "\"",p); break; case 65479:// F10 Copy1To2("\"" "F10" "\"",p); break; case 65480:// F11 Copy1To2("\"" "F11" "\"",p); break; case 65481:// F12 Copy1To2("\"" "F12" "\"",p); break; case 65438: // 0 keypad Copy1To2( "\"" "0" "\"",p); break; case 65436: // 1 keypad Copy1To2("\"" "" "\"",p); break; case 65433: // 2 keypad Copy1To2("\"" "2" "\"",p); break; case 65435: // 3 keypad Copy1To2("\"" "3" "\"",p); break; case 65430: // 4 keypad Copy1To2("\"" "4" "\"",p); break; case 65437: // 5 keypad Copy1To2("\"" "5" "\"",p); break; case 65432: // 6 keypad Copy1To2("\"" "6" "\"",p); break; case 65429: // 7 keypad Copy1To2("\"" "7" "\"",p); break; case 65431: // 8 keypad Copy1To2("\"" "8" "\"",p); break; case 65434: // 9 keypad Copy1To2("\"" "9" "\"",p); break; case 65293: // Enter case 65421: // Enter keypad Copy1To2("\"" "enter" "\"",p); break; case 65451: // plus keypad Copy1To2("\"" "+" "\"",p); break; case 65455: // slash keypad case 47: // slash Copy1To2("\"" "/" "\"",p); break; case 65453: // minus keypad case 45: // minus Copy1To2("\"" "hyphen" "\"",p); break; case 65450: // asterisk keypad Copy1To2("\"" "*" "\"",p); break; case 65407: // numlock Copy1To2("\"" "numlock" "\"",p); break; case 61: // = Copy1To2("\"" "=" "\"",p); break; case 92: // "\" Copy1To2("\"" "backslash" "\"",p); break; case 65439: // . keypad case 46: Copy1To2("\"" "dot" "\"",p); break; case 65508: // right ctrl case 65507: // left ctrl Copy1To2("\"" "control" "\"",p); break; case 65506: // right shift case 65505: // left shift Copy1To2("\"" "shift" "\"",p); break; case 65383: // menu Copy1To2("\"" "menu" "\"",p); break; case 65516: // right windows case 65515: // left windows break; case 65514: // right alt case 65513: // left alt Copy1To2("\"" "ault" "\"",p); break; case 44: // , Copy1To2("\"" "comma" "\"",p); break; case 96:// ` Copy1To2("\"" "backquote" "\"",p); break; case 65307: // escape Copy1To2("\"" "escape" "\"",p); break; case 65289: // tab Copy1To2("\"" "tab" "\"",p); break; case 65362: // up Copy1To2("\"" " " "\"",p); break; case 65364: // down Copy1To2("\"" " " "\"",p); break; case 65363: // right Copy1To2("\"" " " "\"",p); break; case 65361: // left Copy1To2("\"" " " "\"",p); break; case 65365: // page up Copy1To2("\"" "page up" "\"",p); break; case 65366: // page down Copy1To2("\"" "page down" "\"",p); break; case 65360: // home Copy1To2("\"" "home" "\"",p); break; case 65367: // end Copy1To2("\"" "end" "\"",p); break; case 65535: // delete Copy1To2("\"" "delete" "\"",p); break; case 32: // space Copy1To2("\"" "space" "\"",p); break; case 91: // [ Copy1To2("\"" "bracket opened" "\"",p); break; case 93: // ] Copy1To2("\"" "bracket closed" "\"",p); break; case 65288: // backspace Copy1To2("\"" "backspace" "\"",p); break; case 59: // semicolon Copy1To2("\"" "semicolon" "\"",p); break; case 39: // quotation mark Copy1To2("\"" "quote" "\"",p); break; default: Copy1To2("\"" "ee" "\"",p); break; }}void Us(unsigned long keysym, char* p){ if( ('a' <= keysym && keysym <= 'z') || ('0' <= keysym && keysym <= '9') ) { unsigned i = 0; p[i++] = '"'; p[i++] = keysym; p[i++] = '"'; p[i] = 0; } else DealShared(keysym,p);}void UsShift(unsigned long keysym, char* p){ switch(keysym) { case 91: // { Copy1To2("\"" "brace opened" "\"",p); break; case 93: // } Copy1To2("\"" "brace closed" "\"",p); break; case 49: // ! Copy1To2("\"" "!" "\"",p); break; case 50: // @ Copy1To2("\"" "@" "\"",p); break; case 51: // # Copy1To2("\"" "#" "\"",p); break; case 52: // $ Copy1To2("\"" "$" "\"",p); break; case 53: // % Copy1To2("\"" "%" "\"",p); break; case 54: // ^ Copy1To2("\"" "hat" "\"",p); break; case 55: // & Copy1To2("\"" "ampersand" "\"",p); break; case 56: // * Copy1To2("\"" "*" "\"",p); break; case 57: // ( Copy1To2("\"" "parenthesis opened" "\"",p); break; case 48: // ) Copy1To2("\"" "parenthesis closed" "\"",p); break; case 45: // _ Copy1To2("\"" "underline" "\"",p); break; case 61: // + Copy1To2("\"" "+" "\"",p); break; default: Us(keysym,p); return; }}void Ir(unsigned long keysym, char* p){ switch(keysym) { case 104: // ا Copy1To2("-v es " "\"" "o" "\"",p); break; case 102: // ب Copy1To2("-v fr " "\"" "ber" "\"",p); break; case 92: // پ Copy1To2("-v es " "\"" "pe" "\"",p); break; case 106: // ت Copy1To2("-v fr " "\"" "ter" "\"",p); break; case 101: // ث Copy1To2("-v fr " "\"" "ster" "\"",p); break; case 91: // ج Copy1To2("-v fr " "\"" "ger" "\"",p); break; case 93: // چ Copy1To2("\"" "chair" "\"",p); break; case 112: // ح Copy1To2("-v es " "\"" "ha" "\"",p); break; case 111: // خ Copy1To2("-v fa-pin " "\"" "khe" "\"",p); break; case 110: // د Copy1To2("-v fr " "\"" "de" "\"",p); break; case 98: // ذ Copy1To2("-v de " "\"" "zo" "\"",p); break; case 118: // ر Copy1To2("-v es ""\"" "re" "\"",p); break; case 99: // ز Copy1To2("-v de " "\"" "ze" "\"",p); break; case 115: // س Copy1To2("-v fr " "\"" "se" "\"",p); break; case 97: // ش Copy1To2("-v fa-pin " "\"" "she" "\"",p); break; case 119: // ص Copy1To2("-v pl " "\"" "tsa" "\"",p); break; case 113: // ض Copy1To2("-v fr " "\"" "zar" "\"",p); break; case 120: // ط Copy1To2("-v es " "\"" "ta" "\"",p); break; case 122: // ظ Copy1To2("-v fa-pin " "\"" "za" "\"",p); break; case 117: // ع Copy1To2("-v es " "\"" "a" "\"",p); break; case 121: // غ Copy1To2("-v fa-pin " "\"" "ghaa" "\"",p); break; case 116: // ف Copy1To2("-v es " "\"" "fe" "\"",p); break; case 114: // ق Copy1To2("-v fa-pin " "\"" "ghe" "\"",p); break; case 59: // ک Copy1To2("-v es " "\"" "ke" "\"",p); break; case 39: // گ Copy1To2("-v fa-pin " "\"" "ge" "\"",p); break; case 103: // ل Copy1To2("-v fa-pin " "\"" "le" "\"",p); break; case 108: // م Copy1To2("-v es " "\"" "me" "\"",p); break; case 107: // ن Copy1To2("-v fa-pin " "\"" "ne" "\"",p); break; case 44: // و Copy1To2("\"" "oo" "\"",p); break; case 105: // ه Copy1To2("-v de " "\"" "he" "\"",p); break; case 100: // ی Copy1To2("-v pl " "\"" "je" "\"",p); break; case 109: // ئ Copy1To2("-v es " "\"" "e" "\"",p); break; default: DealShared(keysym,p); return; }}void IrShift(unsigned long keysym, char* p){ switch(keysym) { case 116: // ، Copy1To2("\"" "veer gool" "\"",p); break; case 121: // ؛ Copy1To2("\"" "veergool nokhteh" "\"",p); break; case 98: // zero break Copy1To2("\"" "" "\"",p); break; case 103: // ـۀ Copy1To2("\"" "eryer" "\"",p); break; case 99: // ژ Copy1To2("-v fr " "\"" "je" "\"",p); break; default: UsShift(keysym,p); return; }}int SpeakKey(unsigned long keysym,unsigned state = 0){ //cout<< "\n\n" << (int)keysym << "\n\n"; char command[30] = "espeak -p 10 "; unsigned index = 13; switch(state & (MOD_US | MOD_IR | MOD_SHIFT) ) // just monitor us, ir and shift { default: case MOD_US: command[10] = '1'; Us(keysym,&command[index]); break; case MOD_US | MOD_SHIFT: command[10] = '1'; UsShift(keysym,&command[index]); break; case MOD_IR: command[10] = '9'; Ir(keysym,&command[index]); break; case MOD_IR | MOD_SHIFT: command[10] = '9'; IrShift(keysym,&command[index]); break; } return system(command);}#define MAX_THREADS 20#define THREAD_STACK 1000pthread_t pid[MAX_THREADS];volatile unsigned long thread_args[MAX_THREADS][2];volatile unsigned thread_number = 0;pthread_mutex_t mutex;void* TaskCode(void* parg){ unsigned long keysym = ((unsigned long*)parg)[0]; unsigned state = ((unsigned long*)parg)[1]; SpeakKey(keysym,state); pthread_mutex_lock(&mutex); thread_number--; pthread_mutex_unlock(&mutex); return 0;}void Action(unsigned long keysym,unsigned state = 0){ if(thread_number >= MAX_THREADS) return; pthread_attr_t attrs; pthread_attr_init(&attrs); pthread_attr_setdetachstate(&attrs,PTHREAD_CREATE_DETACHED); pthread_attr_setstacksize(&attrs, THREAD_STACK); thread_args[thread_number][0] = keysym; thread_args[thread_number][1] = state; pthread_mutex_lock(&mutex); if(pthread_create(&pid[thread_number],&attrs, TaskCode, (void*) thread_args[thread_number]) != 0) if(system("espeak \"threading failed for speaking keys\"") != 0) cout<< "\n\n" "command line error." "\n\n"; thread_number++; pthread_mutex_unlock(&mutex);}int MyX11ErrorHandler(Display *, XErrorEvent *error_event){ cout << "\n\n" "An X11-Functions error occured. Probably the focused window was closed.""\n" "This error will be ignored." "\n"; cout<< "error_code: " << (unsigned)error_event -> error_code << "\n"; cout<< "minor_code: " << (unsigned)error_event -> minor_code << "\n"; cout<< "request_code: " << (unsigned)error_event -> request_code << "\n"; cout<< "resourceid: " << error_event -> resourceid << "\n"; cout<< "serial; " << error_event -> serial << "\n"; cout<< "type: " << error_event -> type << "\n\n"; return 0;}int main(){ pthread_mutex_init(&mutex,0);START: Display* display = XOpenDisplay(0); Window root = DefaultRootWindow(display); Window current_focus_window; int revert; XSetErrorHandler(MyX11ErrorHandler); XGetInputFocus(display, ¤t_focus_window, &revert); XSelectInput(display,current_focus_window,KeyPressMask | KeyReleaseMask | FocusChangeMask); XEvent event; try { while(true) { XNextEvent(display, &event); switch (event.type) { case FocusOut: if(current_focus_window != root) XSelectInput(display,current_focus_window,0); XGetInputFocus(display, ¤t_focus_window, &revert); if(current_focus_window == PointerRoot) current_focus_window = root; XSelectInput(display, current_focus_window, KeyPressMask | KeyReleaseMask | FocusChangeMask); break; case KeyPress: Action(XLookupKeysym(&event.xkey,0),event.xkey.state); //cout<< "\n\n" << event.xkey.state << "\n\n"; break; } } } catch(...) { goto START; } XCloseDisplay(display); pthread_mutex_destroy(&mutex); cout<< "\n\n" "unexpected end" "\n\n";}