कीबोर्ड हार्ड रीमैप कुंजी?


19

मैं कीबोर्ड कीज को जबरदस्ती रीमैप करने का तरीका खोजने की कोशिश कर रहा हूं।
मैंने xmodmap और setxkbmap का उपयोग करने की कोशिश की, लेकिन वे एक विशिष्ट एप्लिकेशन के लिए काम नहीं करते हैं। इस तरह के कमांड एक्स थो पर अन्य सामान्य विंडो / एप्लिकेशन के लिए काम करते हैं।

मुझे लगता है कि एप्लिकेशन कीबोर्ड कच्चे डेटा को पढ़ रहा है और एक्स इनपुट की अनदेखी कर सकता है?

तो, xmodmap और setxkbmap का उपयोग किए बिना कुंजियों को रीमैप कैसे करें? यदि कुछ सॉफ्टवेयर का उपयोग करना संभव है।

मैंने xkeycaps, xkbcomp की भी कोशिश की, लेकिन लोडकीक्स की कोशिश नहीं की, क्योंकि यह एक्स पर चल रहा है।

मैंने यहाँ पाया कि मैं कोशिश कर सकता था setkeycodes, "क्योंकि कर्नेल कीकोड असाइन करने के बाद बटन को xorg में काम करना चाहिए" , लेकिन मैंने यह भी पाया कि "आप USB कीबोर्ड पर 'setkeycodes' का उपयोग नहीं कर सकते हैं" , यह मेरा मामला है (मुझे मामले में दिलचस्पी है किसी को यह ps2 पर काम करने के रूप में मुझे लगता है कि मैं एक अनुकूलक का उपयोग कर सकता है)।

यह "की -कोड में मैप स्कैन्कोड" का वादा करता था , लेकिन कुछ परीक्षणों के बाद भी कुछ नहीं बदला, यहां वे हैं:
मुझे vt1 में "36" ("j" कुंजी) showkey
मिला, जिसमें मुझे स्कैकोड "7e" (कीपैड ") मिला। vt1 साथshowkey --scancodes

$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
 KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..

अवलोकन: साथ काम नहीं किया: KEYBOARD_KEY_7e=j

चाबियाँ खोजने के लिए कुछ और वैकल्पिक तरीके (@ vinc17 द्वारा):
evtest /dev/input/by-id/... या
input-kbd 3( ls -l /dev/input/by-id/*पूर्व से प्राप्त आईडी इंडेक्स डालें।)

: पी एस .: * आप अपने आप को परीक्षण पर रुचि रहे हैं, तो आवेदन के लिए संबंधित धागा यह है http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ मुद्दों मैं समान हैं: कुछ कुंजियाँ (KP_Decimal, DownArrow, UpArrow, RightArrow) को अनदेखा किया जाता है और सभी को समान मान के साथ "0x00" माना जाता है


अद्यतन की गई फ़ाइल होनी चाहिए /etc/udev/hwdb.bin, नहीं /lib/udev/hwdb.bin। हालाँकि यह फ़ाइल सही ढंग से अपडेट की गई है, यह मेरे लिए भी काम नहीं करता है, यहां तक ​​कि रिबूट के बाद भी। शायद प्रलेखन में कुछ गायब है। इसके बारे में: bugs.freedesktop.org/show_bug.cgi?id=82311
vinc17

@ vinc17 जो वास्तव में दिलचस्प है, जैसे ही मैं फिर से कोशिश करूँगा, मुझे लगता है कि हमें उस सेटिंग फ़ाइल को ढूंढना होगा और उसकी नकल करने की कोशिश करनी होगी, thx!
कुंभ राशि

1
मेरी समस्या इस तथ्य के कारण थी कि KEYBOARD_KEY_ लाइनें एक ही के बजाय 2 स्थानों से शुरू हुईं (यह दस्तावेज नहीं था और मुझे कोई त्रुटि संदेश नहीं मिला!)। मैं आपके लिए नहीं जानता, लेकिन मेरे USB कीबोर्ड के साथ, showkey --scancodesस्केनोड्स udv को उम्मीदें नहीं देता (मान भिन्न हैं); input-kbdउपयोगिता सही scancodes देता है।
vinc17

1
evtestउपयोगिता भी आप सही scancodes देना चाहिए: एक महत्वपूर्ण टाइप करने के बाद, आप 2 लाइनों मिलना चाहिए और पहले एक फार्म के कुछ के साथ समाप्त होना चाहिए code 4 (MSC_SCAN), value xxx, जहां xxxscancode है। लेकिन मेरे कीबोर्ड के लिए ड्राइवर छोटी गाड़ी है, और मुझे MSC_SCANकुछ कुंजियों के लिए यह लाइन नहीं मिली, जिन्हें मैं रीमैप करना चाहता था। इसलिए मैंने उपयोग किया input-kbd, जो चयनित डिवाइस के सभी स्कैन्कोड को सूचीबद्ध करता है।
vinc17

1
मैंने एक उत्तर में विस्तृत जानकारी पोस्ट की है। अब, मुझे यकीन नहीं है कि 36 या 7002 सी एक मूल्य के रूप में काम करता है। मुझे लगता है कि आपको कुंजी कोड पहचानकर्ता की आवश्यकता है। मेरा जवाब देखिए।
vinc17

जवाबों:


17

पहले उस कुंजी के स्कैकोड को ढूंढें, जिसे evtestउपयोगिता के साथ रीमैप करने की आवश्यकता है, जैसे । निम्न एक की तरह एक लाइन (इसके साथ MSC_SCAN) आउटपुट होना चाहिए:

Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068

वर्तमान कुंजी कोड देने वाले एक दूसरे के बाद। यदि कोई MSC_SCANरेखा आउटपुट नहीं है, तो यह कर्नेल ड्राइवर बग के कारण है, लेकिन स्कैकोड को input-kbdउपयोगिता के साथ अभी भी पाया जा सकता है ; evtestमुख्य कोड दिया जाना चाहिए, ताकि input-kbdआउटपुट में संबंधित लाइन (जैसे उपयोग करके grep) को ढूंढना आसान हो ।

एक बार रीमेक की जाने वाली चाबियों के स्कैन्डोड निर्धारित हो गए हैं, एक फाइल बनाएं जैसे /etc/udev/hwdb.d/98-custom-keyboard.hwdbकि रिमैपिंग। फ़ाइल की शुरुआत /lib/udev/hwdb.d/60-keyboard.hwdbकुछ जानकारी देती है। मेरे मामले में (जो काम करता है), मेरे पास है:

evdev:input:b0003v05ACp0221*
 KEYBOARD_KEY_70035=102nd       # Left to z: backslash bar
 KEYBOARD_KEY_70064=grave       # Left to 1: grave notsign
 KEYBOARD_KEY_70068=insert      # F13: Insert

(220 वी से पहले, मुझे keyboard:usb:v05ACp0221*पहली पंक्ति के लिए उपयोग करना था।)

evdev:स्ट्रिंग पंक्ति के आरंभ में किया जाना चाहिए। ध्यान दें कि विक्रेता और उत्पाद आईडी में अक्षर बड़े अक्षर होने चाहिए। प्रत्येक KEYBOARD_KEY_सेटिंग्स में ठीक एक स्थान पहले होना चाहिए (ध्यान दें: बिना रिक्त स्थान वाली एक पंक्ति त्रुटि संदेश देगी, और दो स्थानों वाली एक पंक्ति को चुपचाप पुराने udv संस्करणों के साथ अनदेखा किया गया था)। KEYBOARD_KEY_हेक्साडेसिमल में स्केनकोड के बाद (जैसे दोनों evtestऔर क्या input-kbdदेते हैं)। वैध मान या तो से प्राप्त किया जा सकता है evtestउत्पादन या input-kbdउत्पादन, या यहाँ तक से /usr/include/linux/input.hफ़ाइल: उदाहरण के लिए, KEY_102NDदेना होगा 102nd(हटाने के द्वारा KEY_, जो मैं ऊपर का इस्तेमाल किया और लोअर केस में परिवर्तित)।

फ़ाइल सहेजे जाने के बाद, टाइप करें:

udevadm hwdb --update

(पुनः) डेटाबेस का निर्माण /etc/udev/hwdb.bin(आप इसकी टाइमस्टैम्प की जांच कर सकते हैं)। फिर,

udevadm trigger --sysname-match="event*"

नई सेटिंग्स को ध्यान में रखेगा। आप के साथ जाँच कर सकते हैं evtest

2014 में, जारी किए गए udev में अधूरी / छोटी-छोटी जानकारी थी /lib/udev/hwdb.d/60-keyboard.hwdb, लेकिन आप फ़ाइल और / या मेरी बग रिपोर्ट और प्रलेखन और रिक्ति संबंधी मुद्दों पर चर्चा के नवीनतम विकास संस्करण को देख सकते हैं।

यह काम करता है, तो समस्या अस्थायी रूप से लॉग स्तर में वृद्धि के बाद पाया जा सकता है udevdके साथ udevadm control(udevadm देखना (8) जानकारी के लिए आदमी पृष्ठ)।

पुराने udevसंस्करणों जैसे 204 के लिए, इस विधि को अभी भी काम करना चाहिए।


जब मैं udvadm कमांड चलाता हूं, तो जो फाइल अपडेट होती है /lib/udev/hwdb.bin, मैं उसके साथ दिखता है और उसके अंत blessमें KEYBOARD_KEY_70085दिखाई देता है। मुझे लगता है कि ubuntu 14.04 इस तरह से संरक्षित (संरक्षित?) है। मैंने कोशिश की udevadm control --log-priority=debug। पर आधारित lsusb(045e: 0750) मेरा कीबोर्ड पसंद आता है keyboard:usb:v045ep0750*, लेकिन मैंने keyboard:usb:v*p*भी इसके साथ प्रयास किया । मेरा अनुमान है कि यह /etc/udev/hwdb.binअद्यतन किया जाना चाहिए, लेकिन मौजूद भी नहीं है।
कुंभ राशि

जैसा कि मैंने यहां पढ़ा कि ऐसा हो सकता है कि मैं इस कमांड का उपयोग कर रहा था udevadm hwdb --usr --update, इसके बावजूद मैं नहीं था।
कुंभ राशि

के बाद udevadm hwdb --updateमैं /lib/udev/hwdb.binकरने के लिए नकल की /etc/udev/hwdb.binऔर भाग गया strace udevadm trigger --sysname-match="event*"और hwdb.binलगता है फ़ाइल इसके द्वारा पढ़ा नहीं गया है (यदि यह इस तरह काम करता है)।
कुंभ राशि शक्ति

1
@AquariusPower हाँ, एक उबंटू विशिष्ट बग हो सकता है (मैं डेबियन / अस्थिर का उपयोग कर रहा हूं)। यह देखने के लिए कि क्या करते समय डेटाबेस पढ़ा जाता है udevadm trigger ..., मेरा परीक्षण यहां देखें । ध्यान दें कि चलने से पहले udevadm trigger ..., आपको यह सुनिश्चित करने की आवश्यकता है कि फ़ाइल का संशोधन समय अपडेट किया गया है, अन्यथा फ़ाइल पढ़ने पर एक्सेस समय अपडेट नहीं किया जाएगा।
vinc17

1
@AquariusPower udevadm --version: 215 (और udev पैकेज संस्करण: 215-7)। इसके लिए धन्यवाद udevadm trigger ..., आपको रीबूट करने की आवश्यकता नहीं होनी चाहिए (जब तक कि आप सेटिंग्स को हटाना नहीं चाहते हैं, AFAIK)। लेकिन आप यह देखने के लिए रिबूट की कोशिश कर सकते हैं कि क्या कोई प्रभाव है या नहीं।
vinc17
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.