আপনি কীটি কতক্ষণ ধরে রেখেছেন তার উপর ভিত্তি করে কী-বোর্ড কী পুনরায় তৈরি করবেন


9

আমি আমার নম্বর প্যাডের কীগুলি পুনরায় তৈরি করতে চাই যাতে তারা কীটি টিপতে থাকে তার উপর নির্ভর করে তারা আলাদাভাবে আচরণ করে। এখানে একটি উদাহরণ:

যদি আমি কম 300 মিঃসে জন্য নামপ্যাড 9 কী চেপে ধরে রাখুন এটা পাঠান হবে "পূর্বের ট্যাবে" কী কমান্ড Ctrl+ +Tab

যদি আমি 300-599ms জন্য নামপ্যাড 9 কী চেপে ধরে রাখুন পাঠাবে "নতুন ট্যাব" কী কমান্ড Ctrl+ +T

যদি আমি 600-899 মিমি জন্য নম্প্যাড 9 কীটি ধরে রাখি তবে এটি "ট্যাব / উইন্ডোটি বন্ধ করুন" কী কমান্ডটি প্রেরণ করবে Ctrl+W

যদি আমি 899 মিমি এরও বেশি সময় ধরে নম্প্যাড 9 কীটি ধরে রাখি তবে আমি যে সময় উইন্ডোটি চেয়েছিলাম তা মিস না করলে তা কিছুই করে না।

উইন্ডোজে আমি অটোহটকি দিয়ে এটি করতে পারি এবং ওএস একাদশে কন্ট্রোলারমেট দিয়ে এটি করতে পারতাম, তবে ইউএনআইএক্স / লিনাক্সের এমন একটি সরঞ্জাম আমি পাই না যা কতক্ষণ ধরে রাখা হয় তার উপর ভিত্তি করে কী রিম্যাপিংয়ের অনুমতি দেয়।

যদি আপনি এমন কোনও সরঞ্জাম সম্পর্কে সচেতন হন যা আমার সমস্যার সমাধান করতে পারে তবে দয়া করে একটি স্ক্রিপ্ট বা কোডের নমুনা সরবরাহ করবেন তা নিশ্চিত করুন যা আমি উপরে বর্ণিত শর্তাধীন কী হোল্ড সময়কাল আচরণ দেখায়। আমার উদাহরণটি সমাধান করার জন্য এটি সম্পূর্ণ কোড হওয়ার দরকার নেই, তবে আমার উদাহরণটির জন্য এটি পুনর্বিবেচিত করা আমার পক্ষে যথেষ্ট।


এটি করা যেমন একটি বিদেশী কাজ। আপনি আপনার 600 মিলিসেকেন্ড প্রেস টি কিভাবে যাচ্ছেন? : পাগল ধারণা জন্য ডি +1।
ওয়াইল্ডকার্ড

আপনার জীবনে কেবল কিছু মশলা যোগ করতে আপনার 347 থেকে 350 এমএস সময় টাইম উইন্ডো যুক্ত করা উচিত যা আপনার কম্পিউটারকে জোর করে শাটডাউন করবে। ;)
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড আমি আসলে এর জন্য আমার রেজার নাগায় নম্বর প্যাড ব্যবহার করি এবং যখন আমি উইন্ডোজে অটোহটকি দিয়ে প্রথম ধারণাটি প্রয়োগ করি তখন আমি 300-400 মিমি সময় উইন্ডোজ ব্যবহার করি, তবে এখন আমি এই সিস্টেমটি কিছুক্ষণ ব্যবহার করছি, আমি ব্যবহারটি ব্যবহার করি সময় উইন্ডোজ প্রায় 200 মিটার দূরে, এবং আমি প্রায় 99% সময় কাঙ্ক্ষিত সময় উইন্ডো পেতে পারি। আপনি মোর্স কোডের সাথে যেভাবে যোগাযোগ করবেন তার সাথে এটি খুব মিল।
কানোকো

উত্তর:


7

আমি কেবল সি তে এটি লিখেছি :

#include <stdio.h>
#include <curses.h>
#include <time.h> //time(0)
#include <sys/time.h>                // gettimeofday()
#include <stdlib.h>

void waitFor (unsigned int secs) {
    //credit: http://stackoverflow.com/a/3930477/1074998
    unsigned int retTime = time(0) + secs;   // Get finishing time.
    while (time(0) < retTime);               // Loop until it arrives.
}

int
main(void) {

    struct timeval t0, t1, t2, t3;
    double elapsedTime;

    clock_t elapsed_t = 0;
    int c = 0x35;

    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    halfdelay(5); //increae the number if not working //adjust below `if (elapsedTime <= 0.n)` if this changed
    printf("\nSTART again\n");

    elapsed_t = 0;
    gettimeofday(&t0, NULL);

    float diff;

    int first = 1;
    int atleast_one = 0;

      while( getch() == c) { //while repeating same char, else(ffff ffff in my system) break

            int atleast_one = 1;

            if (first == 1) {
                gettimeofday(&t1, NULL);
                first = 0;
            }

            //printf("DEBUG 1 %x!\n", c);
            gettimeofday(&t2, NULL);
            elapsedTime = (t2.tv_sec - t1.tv_sec) + ((t2.tv_usec - t1.tv_usec)/1000000.0); 

            if (elapsedTime > 1) { //hit max time

                printf("Hit Max, quit now. %f\n", elapsedTime);
                system("gnome-terminal");
                //waitFor(4);

                int cdd;
                while ((cdd = getch()) != '\n' && cdd != EOF);
                endwin();

                exit(0);
            }

            if(halfdelay(1) == ERR) { //increae the number if not working
                //printf("DEBUG 2\n");
                //waitFor(4);
                break; 
                }
            else {
                //printf("DEBUG 3\n");
                }
        }

    if (atleast_one == 0) {
            //gettimeofday(&t1, NULL);
            t1 = t0;
    }

    gettimeofday(&t3, NULL);
    elapsedTime = (t3.tv_sec - t1.tv_sec) + ((t3.tv_usec - t1.tv_usec)/1000000.0); 
    printf("Normal quit %f\n", elapsedTime);
    if (elapsedTime > 0.6) { //this number based on halfdelay above
        system("gedit &");
        //system("xdotool key shift+left &");
        //system("mplayer -vo caca -quiet 'video.mp4' &");
        //waitFor(4);
    }
    else if (elapsedTime <= 0.6) {
        system("xdotool key ctrl+shift+t &");
        //waitFor(4);
    }

    int cdd;
    while ( (cdd = getch() ) != '\n' && cdd != EOF);
    endwin();
    return 0; 

}

showkey -aবাইন্ড কীকোড পেতে ব্যবহার করুন :

xb@dnxb:/tmp$ sudo showkey -a

Press any keys - Ctrl-D will terminate this program

^[[24~   27 0033 0x1b #pressed F12
         91 0133 0x5b
         50 0062 0x32
         52 0064 0x34
        126 0176 0x7e
5        53 0065 0x35 #pressed Numpad 5, 5 is the keycode used in `bind`
^C        3 0003 0x03
^D        4 0004 0x04
xb@dnxb:/tmp$ 

বাইন্ড কীকোড 5 এবং এর কমান্ডটি (যেমন চালানো /tmp/.a.out) ~ / .bashrc এ দিন:

bind '"5":"/tmp/a.out\n"'

নোট করুন যে প্রাসঙ্গিক কীকোডের উত্স কোডেও পরিবর্তন হওয়া দরকার (হেক্স মানটি sudo showkey -aউপরের থেকেও পেতে পারে):

int c = 0x35;

সংকলন ( /tmp/a.outআমার উদাহরণে আউটপুট ):

cc filename.c -lcurses

প্রদর্শন:

নম্প্যাড 5, শর্ট প্রেস ওপেন নতুন ট্যাব, মিডিয়াম প্রেস ওপেন জিডিট, এবং দীর্ঘ প্রেস ওপেন জিনোম-টার্মিনাল।

এখানে চিত্র বর্ণনা লিখুন

এটি জিনোম ডেস্কটপ ম্যানেজারের কোনও উইন্ডোতে সরাসরি প্রযোজ্য নয়, তবে আমি মনে করি এটি কার্যকর করার জন্য আপনাকে কীভাবে (শক্ত) ধারণা দেওয়া উচিত। এটি ভার্চুয়াল কনসোল (Ctrl + Alt + N) এও কাজ করে এবং কিছু টার্মিনাল এমুলেটর (যেমন কনসোল, জিনোম-টার্মিনাল, এক্সটার্ম) এ কাজ করে।

পি / এস: আমি এসি প্রোগ্রামার নই, সুতরাং এই কোডটি অপ্টিমাইজড না হলে আমাকে ক্ষমা করুন।

[হালনাগাদ]

পূর্ববর্তী উত্তরটি কেবল শেল এবং প্রয়োজনীয় ফোকাসে কাজ করে, তাই আমি মনে করি / এক্স / ইনপুট / ইভেন্ট এক্স পার্স করা পুরো এক্স সেশনে কাজ করার সমাধান।

আমি চাকাটি পুনর্নবীকরণ করতে চাই না। আমি evtestইউটিলিটি নিয়ে ঘুরে দেখি এবং আমার নিজস্ব কোড দিয়ে ইয়েস্টেস্টের নীচের অংশটি সংশোধন করেছি:

int onHold = 0;
struct timeval t0;
double elapsedTime;
int hitMax = 0;

while (1) {
    rd = read(fd, ev, sizeof(struct input_event) * 64);

    if (rd < (int) sizeof(struct input_event)) {
        perror("\nevtest: error reading");
        return 1;
    }

    system("echo 'running' >/tmp/l_is_running 2>/tmp/l_isrunning_E &");
    for (i = 0; i < rd / sizeof(struct input_event); i++) {

        //system("date >/tmp/l_date 2>/tmp/l_dateE &");

        if (ev[i].type == EV_KEY) {
            if ( (ev[i].code == 76) ) {

                if (!onHold) {
                    onHold = 1;
                    t0 = ev[i].time;
                    hitMax = 0;
                }
                if (!hitMax) { //to avoid hitMax still do the time checking instruction, you can remove hitMax checking if you think it's overkill, but still hitMax itself is necessary to avoid every (max) 2 seconds will repeatly system();
                    elapsedTime = (ev[i].time.tv_sec - t0.tv_sec) + ((ev[i].time.tv_usec - t0.tv_usec)/1000000.0);
                    printf("elapsedTime: %f\n", elapsedTime);
                    if (elapsedTime > 2) {
                        hitMax = 1;
                        printf("perform max time action\n");
                        system("su - xiaobai -c 'export DISPLAY=:0; gedit &'");
                    }
                }

                if (ev[i].value == 0)  {
                    printf("reseted ...... %d\n", ev[i].value);
                    onHold = 0;
                    if (!hitMax) {
                        if (elapsedTime > 1) { //just ensure lower than max 2 seconds
                            system("su - xiaobai -c 'export DISPLAY=:0; gnome-terminal &'");
                        } else if (elapsedTime > 0.5) { 
                            system("su - xiaobai -c \"export DISPLAY=:0; vlc '/home/xiaobai/Downloads/videos/test/Pokémon Red_Blue_Yellow Gym Leader Battle Theme Remix-CbJTkx7QUJU.mp4' &\"");
                        } else if  (elapsedTime > 0.2) {
                            system("su - xiaobai -c 'export DISPLAY=:0; nautilus &'");
                        }
                    } else { //else's max system() already perform
                        hitMax = 0;
                    }
                }
            }
        }
    }
}

নোট করুন যে আপনার ব্যবহারকারীর নাম ( জিয়াওবাই আমার ব্যবহারকারী নাম) অংশটি পরিবর্তন করা উচিত । এবং এটি if ( (ev[i].code == 76) ) {হ'ল আমার ন্যামপ্যাড 5 কীকোড, আপনার ডাবল কনফার্ম করার জন্য ম্যানুয়ালি ev [i] .কড প্রিন্ট করতে হবে। এবং অবশ্যই আপনারও ভিডিওটির পথটি পরিবর্তন করা উচিত :)

এটি সরাসরি সংকলন এবং পরীক্ষা করুন (get get অংশটি সঠিক হওয়ার জন্য রয়েছে /dev/input/eventN):

$ gcc /home/put_your_path/my_long_press.c -o /home/put_your_path/my_long_press; sudo /home/put_your_path/my_long_press `ls -la /dev/input/by-path/* | grep kbd |  echo "/dev/input/""$(awk -F'/' '{print $NF}')" ` &

নোট করুন যে /by-id/ফেডোরা 24-তে কাজ করে না, তাই আমি এটিকে / বাই-ওয়ে / এ পরিবর্তন করি। কালী এ জাতীয় সমস্যা নেই।

আমার ডেস্কটপ পরিচালক gdm3:

$ cat /etc/X11/default-display-manager 
/usr/sbin/gdm3

সুতরাং, আমি /etc/gdm3/PostLogin/Defaultএই কমান্ডটি জিডিএম স্টার্টআপে রুট হিসাবে চালাতে এই লাইনটি রেখেছি ( /etc/X11/Xsession.d/*কাজ করে না):

/home/put_your_path/my_long_press `ls -la /dev/input/by-id/* | grep kbd |  echo "/dev/input/""$(awk -F'/' '{print $NF}')" 2>/tmp/l_gdm` 2>/tmp/l_gdmE &

অজানা কারণে / etc/gdm/PostLogin/DefaultFedora 24 'gdm এ কাজ করে না যা চেক লগ করার সময় আমাকে " অনুমতি অস্বীকার " দেয় /tmp/l_gdmE। ম্যানুয়ালি যদিও কোনও সমস্যা চালান।

প্রদর্শন:

নম্প্যাড 5, তাত্ক্ষণিক চাপ (<= 0.2 সেকেন্ড) উপেক্ষা করা হবে, শর্ট-প্রেস (0.2 থেকে 0.5 সেকেন্ড) ওপেন nautilus, মিডিয়াম প্রেস (0.5 থেকে 1 সেকেন্ড) vlcভিডিও খেলতে খোলা , দীর্ঘ-প্রেস (1 থেকে 2 সেকেন্ড) খুলতে gnome-terminal, এবং সময় সমাপ্ত সংবাদ (2 সেকেন্ড) খোলা gedit

এখানে চিত্র বর্ণনা লিখুন

আমি এখানে পূর্ণ কোড (কেবল একটি ফাইল) আপলোড করেছি

[আবার আপডেট করুন]

[1] একাধিক কী প্রবাহ যুক্ত হয়েছে এবং notify-sendসংজ্ঞায়িত করে ব্যর্থ হয়েছে DBUS_SESSION_BUS_ADDRESS। [২] যোগ করা হয়েছে XDG_CURRENT_DESKTOPএবং GNOME_DESKTOP_SESSION_IDকনসোলটি জিনোম থিম গুই ব্যবহার নিশ্চিত করতে (আপনি জিনোম ব্যবহার করছেন না তবে এটি পরিবর্তন করুন)।

আমি আমার কোড আপডেট এখানে

নোট করুন যে এই কোডটি সংযুক্ত কী প্রবাহের জন্য পরিচালনা করে না, যেমন Ctrl+ t

হালনাগাদ:

একাধিক ডিভাইস ইন্টারফেস রয়েছে যা / dev / ইনপুট / বাই-পাথ / XXX-ইভেন্টN এনট্রি ক্রম এলোমেলো। সুতরাং আমি কমান্ডটি /etc/gdm3/PostLogin/Defaultনীচে হিসাবে পরিবর্তন করি ( Chesenআপনার কীবোর্ডের নামটি আপনার ক্ষেত্রে, আপনার grep Razerপরিবর্তে এটি পরিবর্তন করা উচিত ):

/your_path/my_long_press "$(cat /proc/bus/input/devices | grep -i Chesen -A 4 | grep -P '^(?=.*sysrq)(?=.*leds)' |  tr ' ' '\n' | ls /dev/input/`grep event`)" 2>/tmp/l_gdmE &

আপনি ইভেন্টএন এক্সট্র্যাক্ট থেকে চেষ্টা করতে পারেন cat /proc/bus/input/devices | grep -i Razer -A 4:

$ cat /proc/bus/input/devices | grep -i Razer -A 4
N: Name="Razer Razer Naga Chroma"
P: Phys=usb-0000:00:14.0-1.3/input0
S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.3/3-1.3:1.0/0003:1532:0053.0003/input/input6
U: Uniq=
H: Handlers=mouse2 event5 
--
N: Name="Razer Razer Naga Chroma"
P: Phys=usb-0000:00:14.0-1.3/input1
S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.3/3-1.3:1.1/0003:1532:0053.0004/input/input7
U: Uniq=
H: Handlers=sysrq kbd event6 
--
N: Name="Razer Razer Naga Chroma"
P: Phys=usb-0000:00:14.0-1.3/input2
S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb3/3-1/3-1.3/3-1.3:1.2/0003:1532:0053.0005/input/input8
U: Uniq=
H: Handlers=sysrq kbd leds event7 
$ 

উপরের এই উদাহরণে, কেবল sudo cat /dev/input/event7রাজার মাউসে 12 ডিজিট ক্লিক করলে উদ্ভট আউটপুটটি প্রিন্ট করা হবে, যা উপরেরটিতে "sysrq কেবিডি নেতৃত্বে ইভেন্ট 7" grep -P '^(?=.*sysrq)(?=.*leds)'প্যাটার্নটি রয়েছে (আপনার প্যাটার্নটি ভিন্ন হতে পারে)। sudo cat /dev/input/event6মিডল আপ / ডাউন কীতে ক্লিক করলেই উদ্ভট আউটপুট প্রিন্ট হবে। যখন sudo cat /dev/input/event5আপনার মাউসটি সরানো হবে এবং চাকাটি স্ক্রোল করার সময় উদ্ভট আউটপুট প্রিন্ট হবে While

[আপডেট: প্রোগ্রাম পুনরায় লোড করতে পুনরায় প্লাগ কীবোর্ড কেবল সমর্থন করুন]

নিম্নলিখিতটি স্ব-ব্যাখ্যা করা উচিত:

$ lsusb #to know my keyboard is idVendor 0a81 and idProduct 0101
...
Bus 001 Device 003: ID 0a81:0101 Chesen Electronics Corp. Keyboard

$ cat /etc/udev/rules.d/52-hole-keyboard.rules #add this line with your idVendor and idProduct above in custom udev rules file
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0a81", ATTR{idProduct}=="0101", MODE="0666", GROUP="plugdev", RUN+="/bin/bash -c 'echo 1 > /tmp/chesen_plugged'"

$ cat /usr/local/bin/inotifyChesenPlugged #A long run listener script to listen for modification of /tmp/chesen_plugged #Ensures `inotifywait` has been installed first.
touch /tmp/chesen_plugged
while inotifywait -q -e modify /tmp/chesen_plugged >/dev/null; do
        killall -9 my_long_press
        /usr/local/bin/startLongPress &
done

$ cat /usr/local/bin/startLongPress #the executable script run the long press executable #Change with your pattern as explained above.
#!/bin/bash
<YOUR_DIR>/my_long_press "$(cat /proc/bus/input/devices | grep -i Chesen -A 4 | grep -P '^(?=.*sysrq)(?=.*leds)' |  tr ' ' '\n' | ls /dev/input/`grep event`)" 2>/tmp/l_gdmE) & disown

$ cat /etc/gdm3/PostLogin/Default #the executable startup script run listener and long press script
/usr/local/bin/inotifyChesenPlugged &
/usr/local/bin/startLongPress &

আমি ধরে নিই যে কী টিপসগুলি করার সময় এই পদ্ধতিটির একটি টার্মিনাল উইন্ডো ফোকাসে থাকা দরকার? এই সমস্যা এড়ানোর একটি উপায় আছে কি?
কানোকো

@ ক্যানোকো আমি সমাধানটি আপডেট করেছি।
ফল

THX, আপনি এটিতে যে প্রচেষ্টা করেছেন তাতে আমি সত্যিই প্রশংসা করি। আমি এই চেষ্টা হবে। আপনি কি মনে করেন যে আমি যদি 12 টি আলাদা হটকি দিয়ে সেট আপ করি তবে এই সমাধানটি সিপিইউ ব্যবহারে একটি লক্ষণীয় প্রভাব ফেলবে?
কানোকো

@ কনোকো আমি একাধিক কী নিয়ে চারপাশে খেলতে কোডটি আবার আপডেট করেছি। আইপিএইচও, আমি মনে করি না যে এটি সিপিইউতে এটির লক্ষণীয় প্রভাব রয়েছে কারণ 10+ যদি-খুব সূক্ষ্ম হয় তবে এটি কেবল পড়ার পরে চেকিং চালায় (এফডি, ইভি, সাইজফ (স্ট্রাক্ট ইনপুট_ভেনव्ह) * 64); বিবৃতি, অর্থাত্ এটি কেবল if-elseপ্রতিটি মূল প্রেসটি চালায় , যখন আমি আগেও if (currCode >= 59) && (currCode <= 81)সীমাটি সীমাবদ্ধ করেছিলাম if-else
ফল

1
তুমি চমৎকার!!! আপনাদের সাহায্যের জন্য সবাইকে অনেক অনেক ধন্যবাদ. আপনি যদি রাজার নাগার মতো এমএমও নামপ্যাড মাউস দিয়ে কখনও চেষ্টা করার সুযোগ পান তবে আমি কসম খেয়ে বলছি এটি আপনার জীবন বদলে দেবে। আপনি যদি আগ্রহী হন তবে আমি আপনাকে আমার কী ম্যাপিংগুলি প্রদর্শন করতে পারি।
কানোকো

1

আপনি এমন একটি সরঞ্জাম খুঁজে পেতে পারেন যা একটি নির্দিষ্ট প্রোগ্রামের সাথে কাজ করে তবে বিশ্বব্যাপী ব্যবহারযোগ্য কোনও সরঞ্জাম থাকবে না কারণ সময় সম্পর্কিত আচরণটি উইন্ডোটিং সিস্টেমের পরিবর্তে এক্সে অ্যাপ্লিকেশনগুলিতে করা হয়।


0

আপনি এক্সমোডম্যাপটি পরীক্ষা করেছেন?

xmodmap হ'ল Xorg এ কীম্যাপস এবং পয়েন্টার বোতাম ম্যাপিং সংশোধন করার জন্য একটি ইউটিলিটি

https://wiki.archlinux.org/index.php/Xmodmap


2
তবে সময় বিলম্ব সম্পর্কে এটি জানে না :-)
থমাস ডিকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.