انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: صدا موقع تایپ  (دفعات بازدید: 1285 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین irancplusplus

  • Jr. Member
  • *
  • ارسال: 64
صدا موقع تایپ
« : 10 آبان 1392، 07:54 ب‌ظ »
در محیط KDE میشه کاری کرد که موقع تایپ صدایی از اسپیکر پخش بشه و این صدا برای زبان‌های فارسی و انگلیسی فرق کنه؟
این طوری بعد از دو خط فارسی تایپ کردن نمیبینیم کیبورد انگلیسیه!


آفلاین سوزه

  • Sr. Member
  • *
  • ارسال: 487
پاسخ : صدا موقع تایپ
« پاسخ #1 : 10 آبان 1392، 09:50 ب‌ظ »
به نظرم صدا برای تایپ آزاردهندهست! معمولا وقتی کیبورد روی انگلیسی نباشه چراغ Scroll Lock کیبورد روشن میشه و نشون میده زبان روی حالت پیش فرض نیست قبل از تایپهای طولانی یه نگاه بهش بنداز :)
دیگه در این انجمن Log in و فعالیتی نخواهم داشت.

آفلاین سالار مقدم

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 2074
  • جنسیت : پسر
  • هر چقدر بدونی بازم کمه.
    • سالار مقدم
پاسخ : صدا موقع تایپ
« پاسخ #2 : 11 آبان 1392، 03:36 ب‌ظ »
بجای پاک کردن صورت مسئله تایپ ده انگشتیت رو قوی کن که دیگه نیاز نباشه به کیبردت نگاه کنی

آفلاین irancplusplus

  • Jr. Member
  • *
  • ارسال: 64
پاسخ : صدا موقع تایپ
« پاسخ #3 : 13 فروردین 1393، 08:51 ق‌ظ »
آخر سر مجبور شدم برنامه شو بنویسم. شاید به درد کسی بخوره (با شرایط GNU General Public License  (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, &current_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, &current_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 نصب باشد تا برنامه درست کار کنه. هنوز در حد آلفا ست.
« آخرین ویرایش: 14 فروردین 1393، 08:04 ق‌ظ توسط irancplusplus »