Xmodmap के लिए कीकोड कैसे प्राप्त करें?


76

मैं डेल L100 कीबोर्ड पर xmodmapरीमैप Alt/ Superकुंजियों का उपयोग करने की कोशिश कर रहा हूं , और कीकोड प्राप्त करने में परेशानी हो रही है।

उदाहरण के लिए, का उपयोग करने के xevलिए मुझे कीकोड नहीं देता हैAlt

FocusOut event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 36, synthetic NO, window 0x0,
    keys:  122 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

के लिए Right Superकुंजी, xevऔर showkey- अलग keycodes देना 134और 126क्रमशः।

इन कीकोड के साथ क्या हो रहा है?

मैंने नीचे से showkey -kऔर xmodmapफ़ाइल का उपयोग करके कीकोड प्राप्त करने की कोशिश की , लेकिन इसने एक अजीब नक्शा दिया, जिसने bकुंजी को हटा दिया :

clear Mod1
clear Control
keycode 125 = Meta_L
keycode 126 = Meta_R
keycode 58 = Control_L
keycode 56 = Control_L
keycode 100 = Control_R
add Control = Control_L Control_R
add Mod1 = Meta_L Meta_R

मुझे Alt_L के फायरिंग न करने (लेकिन Alt_R ठीक है) के साथ एक ही समस्या है, XUbuntu 14.04 पर। आप किस सिस्टम का उपयोग कर रहे हैं?
पॉल प्राइस

जवाबों:


54

आपके कीबोर्ड और प्रक्रिया के बीच बहुत सारे खिलाड़ी हैं जो अंत में कीबोर्ड इवेंट को संभालते हैं। परिदृश्य के प्रमुख टुकड़ों में से तथ्य यह है कि एक्स सिस्टम की अपनी कीबोर्ड-हैंडलिंग परत है, और एक्स आपके लिनक्स बेस सिस्टम की तुलना में कुंजी के साथ अलग "कीकोड" को जोड़ता है। showkeyआदेश आप लिनक्स आधार प्रणाली शब्दावली में keycodes दिखा रहा है। के लिए xmodmapआप एक्स keycodes है, जो क्या कर रहे हैं की जरूरत है xevप्रदर्शित कर रहा है। जब तक आप एक्स में काम करने और अपनी कुंजी के साथ विद्रोह करने की योजना बना रहे हैं xmodmap, तब तक अनदेखा करें showkeysऔर जो xevकहते हैं उसे सुनें ।

आप अपने xevआउटपुट में क्या देखना चाहते हैं, इस तरह से ब्लॉक हैं:

KeyPress event, serial 27, synthetic NO, window 0x1200001,
    root 0x101, subw 0x0, time 6417361, (340,373), root:(342,393),
    state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 27, synthetic NO, window 0x1200001,
    root 0x101, subw 0x0, time 6417474, (340,373), root:(342,393),
    state 0x8, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

xevबहुत अधिक आउटपुट उत्पन्न करने के लिए जाता है, खासकर जब आप अपना माउस घुमाते हैं। आपके द्वारा खोजा जा रहा आउटपुट खोजने के लिए आपको थोड़ी देर स्क्रॉल करना पड़ सकता है। पिछले आउटपुट में, हम देखते हैं कि keysym Alt_Lएक्स कीकोड के साथ जुड़ा हुआ है 64


3
यह समस्या है कि मुझे विंडोज की पर KeyPress इवेंट नहीं मिलता है। मैंने 3 अलग-अलग कीबोर्ड और उसी परिणाम की कोशिश की। Xev से मुझे केवल FocusOut, FocusIn और KeymapNotify मिलता है जैसा कि ऊपर देखा गया है। हालाँकि, मैं Gnome प्रबंधक के माध्यम से शॉर्टकट सेट और जा सकता हूं, और यह विंडोज मोड को "Mod4" के रूप में देखता है
यारोस्लाव

Mod4 के रूप में सही विंडोज कुंजी रिपोर्ट, Alt के रूप में विंडोज कुंजी रिपोर्ट को छोड़ दिया ... जो भ्रामक है क्योंकि मेरे xmodmap में "Alt" श्रेणी भी नहीं है।
यारोस्लाव बुलटोव

Alt के लिए Mod1 का प्रयास करें।
डबियसजिम

2
@YaroslavBulatov लगता है कि आपका डेस्कटॉप वातावरण कुंजी खा रहा है (संभवतः इसका मुख्य मेनू लाने के लिए?)
derobert

3
आप उन घटनाओं को फ़िल्टर कर सकते हैं जो xev आपको देता है। इस मामले में xev -event keyboardअधिकांश शोर से छुटकारा पाने के लिए पर्याप्त होगा।
फ्रेड्रिक वेंडेट

24

xev को काम करना चाहिए

अजीब है, मेरा xev Alt के लिए एक KeyPress और KeyRelease ईवेंट देता है (और विंडोज कुंजी के लिए, यहां "सुपर" कहा जाता है):

KeyPress event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595467354, (98,77), root:(102,443),
    state 0x10, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595467453, (98,77), root:(102,443),
    state 0x18, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

और दाहिना हाथ:

KeyPress event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595572876, (75,33), root:(79,399),
    state 0x10, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595572972, (75,33), root:(79,399),
    state 0x18, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

मैं दो संभावनाएं देख सकता हूं:

  1. कुछ और पूरी तरह से कीपर खा रहा है, या आप पर विंडो को दबाकर पूरी तरह दबा रहा है। अन्यथा खाली एक्स सर्वर में एक्सईवी चलाने की कोशिश करें (जैसे, बस चलाएं xinit -- :1, जो आपको एक्स सर्वर के साथ केवल एक्स सर्वर मिलना चाहिए - यहां तक ​​कि एक विंडो प्रबंधक भी नहीं होगा। एक्सटरम से बाहर निकलने से सत्र बंद हो जाएगा)।
  2. आप सिर्फ दो घटनाओं को याद करते हैं थोक में जो कि बाहर निकलता है।

एक आसान तरीका है, यदि आप प्रमुख नाम जानते हैं

एक और संभावना: बस xmodmap से कीकोड प्राप्त करें:

anthony@Zia:~$ xmodmap -pk | grep -i alt
     64         0xffe9 (Alt_L)  0xffe7 (Meta_L) 0xffe9 (Alt_L)  0xffe7 (Meta_L)
    108         0xffea (Alt_R)  0xffe8 (Meta_R) 0xffea (Alt_R)  0xffe8 (Meta_R)
    204         0x0000 (NoSymbol)       0xffe9 (Alt_L)  0x0000 (NoSymbol)       0xffe9 (Alt_L)
anthony@Zia:~$ xmodmap -pk | grep -i super
    133         0xffeb (Super_L)        0x0000 (NoSymbol)       0xffeb (Super_L)
    134         0xffec (Super_R)        0x0000 (NoSymbol)       0xffec (Super_R)
    206         0x0000 (NoSymbol)       0xffeb (Super_L)        0x0000 (NoSymbol)       0xffeb (Super_L)

64 और 108 फिर से है। xmodmap -pmआपको सिर्फ मॉडिफ़ायर मैप दिखाएगा, जो आपको नंबर भी देता है (हालाँकि, इस बार, हेक्स में)।


15

मैं आपके प्रश्न में तीन मुद्दों का "पता लगाता हूँ":

  1. कुंजी के लिए अलग-अलग कीकोड की रिपोर्ट क्यों xevऔर showkeyकैसे करें?
  2. क्यों ठीक से दबाया xevनहीं दिखाया Altजाता है?
  3. कैसे स्वैप करें Altऔर Win?

पहले सवाल के बारे में : इन दिनों, जहां एक्स में कीबोर्ड "ड्राइवर" वास्तव में हार्डवेयर को ड्राइव नहीं करता है, यह कर्नेल से एक्स कोर में बस के माध्यम से पास कर सकता है, लेकिन यह नहीं करता है। इसे पास करने से पहले कीकोड में 8 जोड़ देता है।

दूसरा: आपके एक्स सत्र में कुछ इस Altघटना को पकड़ रहा है । अन्य उत्तर इसे पहले से ही कवर करते हैं। (यानी xevवह ईवेंट नहीं मिलता जिसे आप देखना चाहते हैं)। अपराधी आपके विंडो मैनेजर से संबंधित हो सकता है। अधिक नग्न X सत्र का प्रयास करें।

तीसरा: उपयोग न करें xmodmap। यह एक दशक से पुराना हो चुका है। नए लोग एक्सकेबी और उसके उपकरण हैं setxkbmap

$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl
options:    caps:backspace

स्वैपिंग के लिए Altऔर WinXKB में पहले से ही एक विकल्प तैयार है। बस इसे जोड़ें:

$ setxkbmap -option altwin:swap_alt_win
$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl
options:    altwin:swap_alt_win,caps:backspace

आप setxkbmapपरिवर्तन को स्थायी कैसे बनाते हैं?
स्टीव केहल

में परिवर्तन जोड़ें ~/.xinitrc
मथायस ब्रौन

11

रूट के रूप में, चलाएं:

showkey -s

... यह देखने के लिए कि आपकी रहस्य कुंजी के लिए स्कैकोड क्या है। मुझे कुछ इस तरह मिला:

# showkey -s
kb mode was RAW
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]

press any key (program terminates 10s after last keypress)...

0xc6 
0x46 0xc6 
0xc6 
0x46 0xc6 
0x46 

निश्चित नहीं है कि ऐसा क्यों लगता है कि एक कुंजी दो स्कैन्कोड बनाती है। जैसा कि मैं पैटर्न से बता सकता हूं, यह एक कीडाउन / कीप बात नहीं है। चेतावनी पर ध्यान दें, ताकि आप इसे एकल उपयोगकर्ता मोड में चलाना चाहें।

मैंने अनुमान लगाया कि 0x46 मेरा स्कैंडोड था।

इसके बाद, अप्रयुक्त कीकोड के साथ खोजें:

xmodmap -pke | less

यहाँ आप देख सकते हैं कीकोड 97 मेरे सिस्टम पर अप्रयुक्त है:

keycode  94 = less greater less greater bar brokenbar
keycode  95 = F11 XF86Switch_VT_11 F11 XF86Switch_VT_11
keycode  96 = F12 XF86Switch_VT_12 F12 XF86Switch_VT_12
keycode  97 =
keycode  98 = Katakana NoSymbol Katakana
keycode  99 = Hiragana NoSymbol Hiragana

कीकोड X का उपयोग करता है और कर्नेल का उपयोग "ऐतिहासिक कारणों" के लिए OFF 8 से होता है। तो 97 - 8 = 89 लें और सेटकीकोड्स कमांड के साथ 89 का उपयोग करें (फिर रूट के रूप में):

# setkeycodes 46 89

और आपको सेट किया जाना चाहिए। Xev के साथ पुष्टि करें कि आपको 97 के कीकोड के साथ एक Keypress Event मिल रही है। (हालांकि एक बार मैंने Fluxbox कीज़ फाइल को उस कीकोड का उपयोग करने के लिए कहा था जो मुझे अब KeyPress इवेंट्स नहीं मिली - शायद इसलिए कि फ़्लक्सबॉक्स उन्हें इस्तेमाल करते समय निगल लेता है?)

ध्यान दें कि 'सेटकीकोड्स' एक रिबूट से बचेगा नहीं, इसलिए आपको इसे अपनी init स्क्रिप्ट्स में जोड़ना होगा (जैसे /etc/rc.local में)


1
क्या आपके पास "ऐतिहासिक कारणों से 8 से दूर" के बारे में एक संकेतक है?
रॉबर्ट सीमर

मैंने एक फ़ंक्शन कुंजी (विशेष रूप से F9) पर कैप्स-लॉक को मैप करने के लिए आपके उत्तर का उपयोग किया है। यह मुझे tmux में उपसर्ग कुंजी के रूप में F9 का उपयोग करने देता है। धन्यवाद।
रेमंड क्रॉकर

@RobertSiemer tldp.org/HOWTO/Keyboard-and-Console-HOWTO-15.html "अक्सर X संख्या लिनक्स संख्या से 8 अधिक होगी।" "ऐतिहासिक" के साथ मेरा शब्दांकन किसी अन्य मैनपेज से हुआ होगा।
ग्रेग बेल

11

मैं अपने लिए इसे हल करने की कोशिश कर रहा था और मैंने इसे समझ लिया।

मुख्य समस्या यह है कि आपको कीपर के लिए ईवेंट नहीं मिल रहा है। आपके द्वारा पोस्ट किए गए लॉग को देखकर कारण स्पष्ट है।

FocusOut event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 36, synthetic NO, window 0x0,
    keys:  122 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

आप देख सकते हैं कि Focus{In,Out}घटनाओं में से एक modeहै Notify{Grab,Ungrab}। यह इंगित करता है कि एक कुंजी को दूसरी प्रक्रिया (शायद एक शॉर्टकट / कीबाइंडिंग एप्लिकेशन) द्वारा संभाला गया था।

मेरे मामले में यह xbindkeys था, लेकिन अगर आप एक डेस्कटॉप वातावरण का उपयोग कर रहे हैं, तो उनके पास संभवतः कीबाइंडिंग सिस्टम है। इन घटनाओं को देखने के लिए आपको अन्य प्रोग्राम को रोकने / अक्षम करने की आवश्यकता होगी।

यदि आप यह निर्धारित नहीं कर सकते हैं कि कौन-सा प्रोग्राम प्रमुख घटनाओं को चुरा रहा है तो सबसे अच्छा समाधान यह है कि बिना चल रहे एक और एक्स सत्र शुरू किया जाए। प्रदर्शन पर एक और एक्स सत्र शुरू करने के लिए निम्न कमांड चलाएँ :1, यदि पहले से ही लिया गया है तो बस संख्या बढ़ाएँ। आप निश्चित रूप से टर्मिनल को बदल सकते हैं जिसे आप पसंद करते हैं या आपके सिस्टम पर स्थापित किया है।

xinit /usr/bin/xterm -- :1

फिर चला xev। यह आपको अन्य कार्यक्रमों द्वारा कब्जा किए बिना परिणाम देना चाहिए। ध्यान दें कि आरंभ होने वाला विंडो प्रबंधक होवर-फ़ोकस है, इसलिए आपको अपने कर्सर को xev विंडो के ऊपर रखना होगा ताकि चाबी को पकड़ा जा सके।


जैसा कि इस उत्कृष्ट उत्तर में डबियसजिम द्वारा कहा गया था , कीकोड अलग है क्योंकि ज़ेव और कर्नेल के बीच बहुत सारी परतें हैं।


4

मुझे Alt_LXUbuntu 14.04 में गायब होने के साथ भी यही समस्या Alt_Rथी ( ठीक था)। बहुत खेलने के बाद, मैंने देखा कि showkeyकीस्ट्रोक रिकॉर्ड किया गया xevथा , लेकिन यह --- यह खिड़की प्रणाली में कुछ होना चाहिए था। मैंने सभी "विंडो मैनेजर" और "विंडो मैनेजर ट्विक्स" सेटिंग्स को स्कैन किया, और कुछ भी नहीं पाया। अंत में, मुझे "सेटिंग्स संपादक" में Alt_Lकीबोर्ड शॉर्टकट ( xfce4-keyboard-shortcuts) की सूची में एक भटका मिला । मैं "रीसेट" करता हूं, और मेरे पास मेरी Alt_Lपीठ है! Alt_L"सेटिंग संपादक" को छोड़कर आवारा शॉर्टकट कहीं और नहीं दिखा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.