কী টিপতে কী কীবোর্ড ব্যবহার করা হত তা কীভাবে বলা যায়?


16

আমি প্রায়শই জোড় স্টেশনে কাজ করি যেখানে একাধিক কীবোর্ড ইনস্টল রয়েছে। আমি ব্যবহার করতে পারেন setxkbmapসঙ্গে -device <ID>একটি নির্দিষ্ট কীবোর্ড (একটি ব্যবহার করার জন্য বিন্যাস সেট করতে থেকে IDxinput ), কিন্তু প্রায়ই এটা সুস্পষ্ট নয় যা কীবোর্ড আমি আছি। উভয় কীবোর্ড চেষ্টা করে পিছনে এড়ানো ভাল হবে, সুতরাং আমি এই তথ্যটি পেতে একটি দ্রুত সরঞ্জাম লিখতে চাই setxkbmap। আমি নিম্নলিখিতগুলির মতো একটি সাধারণ ব্যবহারের ক্ষেত্রে আশা করব:

$ setxkbmap -device "$(get-keyboard-id)" -layout gb
Press Enter to detect keyboard ID

লিনাক্সে কোন ইন্টারফেস এই তথ্য সরবরাহ করে? আদর্শভাবে এটি এক্স ছাড়া কাজ করা উচিত, তবে এটি কোনও প্রয়োজন নয় (এমন অনেক সরঞ্জাম রয়েছে যা এক্স ছাড়াই এটি সমর্থন করে বলে মনে হয় না)।


এখনও পর্যন্ত অনুসন্ধানগুলি:

  • লিনাক্সকে অবশ্যই জানতে হবে যে আমি এক সাথে একাধিক কীবোর্ডের জন্য বিভিন্ন লেআউট সমর্থন করতে কোন কীবোর্ড টাইপ করছি।
  • xinput→ list.c → list_xi2XIQueryDeviceডিভাইস আইডি দ্বারা ব্যবহারযোগ্য উপলব্ধ setxkbmap
  • showkeyএবং xevকীবোর্ড আইডি মুদ্রণ করবেন না।
  • xinput list-props $IDকীবোর্ড ইভেন্টগুলি কোথায় পাঠানো হয়েছে তা দেখায় । তবে, অন্য একটি উত্তর থেকে কোড ব্যবহার করে মনে হচ্ছে এই ডিভাইসটি কীবোর্ড সনাক্ত করতে কোনও কিছু মুদ্রণ করে না।
  • একটি প্রায় সম্ভাব্য সমাধান হ'ল xinput --test <ID> &প্রতিটি কীবোর্ড আইডি চালানো এবং কোনটি প্রথমে কিছু দেয় তা দেখুন। সমস্যাটি হ'ল কোন "কীবোর্ডগুলি" আসলে কী- বোর্ডগুলি হ'ল :

    $ xinput | grep keyboard
    ⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
        ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
        ↳ Power Button                              id=6    [slave  keyboard (3)]
        ↳ Video Bus                                 id=7    [slave  keyboard (3)]
        ↳ Power Button                              id=8    [slave  keyboard (3)]
        ↳ Sleep Button                              id=9    [slave  keyboard (3)]
        ↳ WebCam SC-13HDL10931N                     id=10   [slave  keyboard (3)]
        ↳ AT Translated Set 2 keyboard              id=11   [slave  keyboard (3)]
    

1
সম্ভবত আপনি এমপিএক্স খুঁজছেন।
ইগনাসিও ওয়াজকেজ-আব্রামস

@ IgnacioVazquez- আব্রামগুলি কি এটি ব্যাপক জটিল সমাধান নয়?
l0b0

সমস্যাটি কী তা নির্ভর করে।
Ignacio Vazquez-Abram

"দেখে মনে হচ্ছে এই ডিভাইসটি কীবোর্ড শনাক্ত করার জন্য কোনও কিছু মুদ্রণ করে না": আপনার অর্থ কী? যদি আপনি less -f /dev/input/eventXএবং সংশ্লিষ্ট কীবোর্ডের কোনও কী চাপান তবে আপনার "আবর্জনা" দেখানো উচিত, সুতরাং আপনার কীপ্রেসগুলি অন্যদের মধ্যে নয় বরং একটি ডিভ ফাইলে পরিচালিত হবে।
এল। লেভরেল

আপনি কি এটি চেষ্টা করেছেন ( আপনি যে অন্য প্রশ্নের উত্তর দিয়েছিলেন তার অন্য একটি উত্তরে উল্লেখ করা হয়েছে)?
এল। লেভরেল

উত্তর:


4

ডিভাইস অক্ষম করুন

কোন কী-বোর্ডটি সনাক্ত করার দিকে এখানে একটি ধারণা। আপনি কমান্ড এক্সপুট ব্যবহার করতে পারেনডিভাইস সক্ষম ও অক্ষম ।

উদাহরণ

$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=12   [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=13   [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                     id=9    [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                     id=10   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Sleep Button                              id=8    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=11   [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                    id=14   [slave  keyboard (3)]

উপরের আউটপুটটি আমার থিঙ্কপ্যাড ল্যাপটপে থাকা বিভিন্ন ডিভাইসগুলি দেখায়। আমার কেবল 1 টি কীবোর্ড সংযুক্ত আছে, এটি:

    ↳ AT Translated Set 2 keyboard              id=11   [slave  keyboard (3)]

এখন এই ডিভাইসের মাধ্যমে উপলব্ধ বৈশিষ্ট্যগুলি একবার দেখুন:

$ xinput list-props "AT Translated Set 2 keyboard"
Device 'AT Translated Set 2 keyboard':
    Device Enabled (124):   1
    Coordinate Transformation Matrix (126): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.

উপরের দিক থেকে আপনি দেখতে পাচ্ছেন এটি সক্ষম হয়েছে, সুতরাং আসুন এটি অক্ষম করুন:

$ xinput set-prop "AT Translated Set 2 keyboard" "Device Enabled" 0

এটি সক্ষম করতে:

$ xinput set-prop "AT Translated Set 2 keyboard" "Device Enabled" 1

বুদ্ধিটা?

আপনি কোনটিতে আছেন তা নির্ধারণ করতে এই কমান্ডটি ব্যবহার করে আপনি একটি কীবোর্ড অক্ষম করতে সক্ষম করতে পারেন।

তথ্যসূত্র


এটা কি আরও কাজ না? আমার পদ্ধতির সাথে কমপক্ষে একটি কমান্ড অন্তত তিনটি জড়িত। এই পদ্ধতির সর্বদা তিনটি কমান্ড জড়িত - অক্ষম করুন, সক্ষম করুন, তারপরে লেআউট সেট করুন (আরও সম্ভবত একটি কীবোর্ড স্যুইচ)।
l0b0

@ l0b0 - হ্যাঁ আমি এই পদ্ধতির দ্বারাও শিহরিত হই না। আমি সন্ধান অবিরত করছি কিন্তু এই পদ্ধতিটি এখানে "1 উপায়" হিসাবে রাখছি। যদিও আদর্শ এক নয়, আমি সম্মত।
slm

@ ল্যাবো - এই উত্তরটি অনুগ্রহ পাচ্ছে না তাই এটি নিয়ে চিন্তা করবেন না, আপনার অনুগ্রহ শুরু করার আগে এটির ভোট ছিল। stackoverflow.com/help/bounty । এছাড়াও আমার প্রতি আপনার ক্ষোভ কি এখানে আপনাকে সহায়তা করার চেষ্টা করছে? আমি আপনাকে একটি আদর্শ সমাধান হিসাবে দিয়েছি না, তবে আপনার কাজটি সম্পাদনের জন্য 1 টি উপায়। আমি এটি 2+ বছর পূর্বে সরবরাহ করেছি এবং এই প্রশ্নটি এখানে ডাব্লু / 0 বিকল্পে বসে আছে। আমি মনে করি আপনার নিজের নিজেকে জিজ্ঞাসা করা দরকার যদি এটিই সম্ভবত প্রশ্ন / দৃষ্টিভঙ্গি যা সমস্যা। অবশ্যই আমার আমার 0.02 ডলার তবে এটি ইতিমধ্যে যথেষ্ট।
slm

আমার খারাপ এক্স 2: "অনুগ্রহ শুরু হওয়ার পরে তৈরি করা" সম্পর্কে আমি কিছুটা লক্ষ্য করিনি, এবং আমি প্রশংসা করি যে আপনি একটি খুব সূচিত উত্তর লিখেছিলেন। তবে আমি এমন কোনও সমাধানকে উত্সাহিত করতে পারি না যা মূলটির চেয়ে জটিল।
l0b0

1
@ l0b0 আমার উত্সাহ দেওয়ার কারণ: এটি একটি একক কমান্ড যা আমি দ্রুত এবং সহজেই আমার সন্দেহটি নিশ্চিত করতে পারি যে এটি কোন কীবোর্ডটি ছিল, এটি আমার হার্ড ড্রাইভটি মোছার বিষয়টি নিশ্চিত করার জন্য একটি সম্পূর্ণ স্ক্রিপ্টটি পড়ার দরকার নেই, তারপরে সংরক্ষণ করুন এবং এটি কার্যকর। অথবা, এখন পর্যন্ত সর্বাধিক ভোট দেওয়া উত্তরের ক্ষেত্রে সি কোডটি সংকলন করুন। এছাড়াও, এইগুলির মতো সৃজনশীল ধারণাগুলি উন্নয়নের জন্য প্রাপ্য।
ফ্যাবিয়ান রোলিং

4

আপনি এক্স সরঞ্জামগুলি উদ্ধৃত করছেন বলে প্রশ্নটি খানিকটা বিপরীত মনে হচ্ছে তবে এমন একটি সমাধানের জন্য জিজ্ঞাসা করুন যা "আদর্শভাবে এক্স ছাড়াই কাজ করা উচিত"।

আপনার 4 সম্বন্ধে তম গবেষনার: xinputআপনি চিঠিপত্রের দেব

$ xinput list-props 11
Device 'AT Translated Set 2 keyboard':
    Device Enabled (145):   1
    Coordinate Transformation Matrix (147): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    Device Product ID (266):    1, 1
    Device Node (267):  "/dev/input/event0"

অন্তত নিম্নলিখিত সংস্করণ সহ

$ xinput --version
xinput version 1.6.1
XI version on server: 2.3


প্রথম পদক্ষেপ: সি-তে কীবোর্ড ইভেন্ট ডিভাইস সনাক্ত করা

#include <stdio.h>
//#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>

// typical use : sudo ./a.out /dev/input/event*
int main (int argc, char *argv[])
{
  struct input_event ev[64];
  int fd[argc],rd,idev,value, size = sizeof (struct input_event);
  char name[256] = "Unknown";

  if(argc==1) return -1;

  int ndev=1;
  while(ndev<argc && (fd[ndev] = open (argv[ndev], O_RDONLY|O_NONBLOCK)) != -1){
    ndev++;
  }
  fprintf (stderr,"Found %i devices.\n", ndev);
  if(ndev==1) return -1;

  while (1){
    for(idev=1; idev<argc; idev++){
      if( (rd=read (fd[idev], ev, size * 64)) >= size){
      value = ev[0].value;
      if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){
        ioctl (fd[idev], EVIOCGNAME (sizeof (name)), name);
        printf ("%s\n", name);
        return idev;
      }
      }
    }
//    sleep(1);
  }
  return -1;
}

এই পৃষ্ঠায় অনেক ধন্যবাদ । স্পষ্টতার জন্য, যে কোডটি আমি সেখানে নিয়েছি সেখান থেকে সর্বাধিক সুরক্ষা চেকগুলি ছিনিয়ে নিয়েছি, বাস্তব কোডে আপনি সম্ভবত সেগুলি চান।

নোট করুন যে কী টিপুনগুলি প্রতিধ্বনিত হয়েছে, তাই আপনি প্রকৃতপক্ষে দয়া করে কোনও চাবি না দিয়ে ব্যবহারকারীকে একটি পরিবর্তনকারী কী (শিফট, নিয়ন্ত্রণ ...) চাপতে চাইতে পারেন।

দ্বিতীয় পদক্ষেপ: ডিভাইসের নাম থেকে এক্স আইডি পেতে এক্সপুট ব্যবহার করুন

উপরের সি উত্সটি সঙ্কলন করুন এবং এইভাবে ব্যবহার করুন:

xinput list --id-only "keyboard:$(sudo ./a.out /dev/input/event*)"


এছাড়াও রয়েছে/dev/input/by-id
জেথিল

টিপ জন্য ধন্যবাদ. আমি এক্স সরঞ্জামগুলি কেবলমাত্র উদ্ধৃত করে রেখেছি কারণ বেশিরভাগ সরঞ্জামগুলিতে এক্স প্রয়োজন বলে মনে হয় with আমি কীভাবে কাজ করতে জানি না/dev/input/event* - আমি tailটিং চেষ্টা করেছিলাম তবে কোনও লাভ হয়নি।
l0b0

বাই-আইডি এক্স
সিমলিংকগুলি দেয়

@ জেথিল আমি বর্তমানে যে মেশিনে রয়েছি তাতে এই দিরের কেবল মাউসের লিঙ্ক রয়েছে।
এল। লেভরেল

Hunh। ঠিক আছে, লাইভ এবং শিখুন, আমার কীবোর্ডটি সমস্ত সুন্দর তালিকাভুক্ত করেছে।
jthill

1

আরও খনন করার ফলে প্লেইন বাশ এবং একটি সাধারণ ব্যবহারকারীর অ্যাকাউন্ট ব্যবহার করে অন্য সমাধান প্রকাশিত হয় । লিপি :

#!/usr/bin/env bash

set -o errexit -o nounset -o noclobber -o pipefail

# Remove leftover files and processes on exit
trap 'rm --recursive -- "$dir"; kill -- -$$' EXIT
dir="$(mktemp --directory)"
cd "$dir"

# Log key presses to file
xinput --list --id-only | while read id
do
    # Only check devices linked to an event source
    if xinput --list-props "$id" | grep --quiet --extended-regexp '^\s+Device Node.*/dev/input/event'
    then
        xinput test "$id" > "$id" &
    fi
done

# Check for key presses
while sleep 0.1
do
    for file in *
    do
        if [[ -s "$file" ]]
        then
            echo "$file"
            exit
        fi
    done
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.