انجمنهای فارسی اوبونتو
کمک و پشتیبانی => انجمن عمومی => نویسنده: irancplusplus در 10 آبان 1392، 07:54 بظ
-
در محیط KDE میشه کاری کرد که موقع تایپ صدایی از اسپیکر پخش بشه و این صدا برای زبانهای فارسی و انگلیسی فرق کنه؟
این طوری بعد از دو خط فارسی تایپ کردن نمیبینیم کیبورد انگلیسیه!
-
به نظرم صدا برای تایپ آزاردهندهست! معمولا وقتی کیبورد روی انگلیسی نباشه چراغ Scroll Lock کیبورد روشن میشه و نشون میده زبان روی حالت پیش فرض نیست قبل از تایپهای طولانی یه نگاه بهش بنداز :)
-
بجای پاک کردن صورت مسئله تایپ ده انگشتیت رو قوی کن که دیگه نیاز نباشه به کیبردت نگاه کنی
-
آخر سر مجبور شدم برنامه شو بنویسم. شاید به درد کسی بخوره (با شرایط GNU General Public License (https://www.gnu.org/licenses/gpl.txt (https://www.gnu.org/licenses/gpl.txt))):
#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 64
void 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 1000
pthread_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";
}
باید espeak نصب باشد تا برنامه درست کار کنه. هنوز در حد آلفا ست.