कैसे एक कीबोर्ड संशोधक की रिहाई को मजबूर करने के लिए


18

कभी-कभी, जब मैं फुल-स्क्रीन वर्चुअलबॉक्स अतिथि का उपयोग कर रहा होता हूं, तो मैं अपनी मशीनों के बीच तालमेल का उपयोग करता हूं, मैं कुछ अजीब कुंजी संशोधक के साथ फंस जाता हूं। यदि वे मेरे कीबोर्ड पर मौजूद हैं (Shift_L की तरह) तो मैं इसे टैप कर सकता हूं और उनकी स्थिति रीसेट हो गई है और मैं छोटे अक्षरों में टाइप करना जारी रख सकता हूं। लेकिन उनमें से कुछ मेरे कीबोर्ड पर बिल्कुल भी मैप नहीं किए जाते हैं (जैसे ISO_Level3_Shift), इसलिए मेरे पास उन्हें बंद करने का कोई साधन नहीं है!

उन्हें कैसे रीसेट करें? अभी, मैं केवल इतना कर सकता हूं कि कंप्यूटर को रिबूट करना है, लेकिन यह बल्कि शर्मनाक समाधान है।

मैं चाहता हूं कि कुछ कार्यक्रम है जो सभी संभावित कीबोर्ड संशोधक को कृत्रिम रूप से "टैप" कर सकते हैं, इसलिए उनकी स्थिति रीसेट हो जाएगी। क्या यह किया जा सकता है?

मैं मिंट 14 (उबंटू 12.10 क्वांटल का क्लोन) का उपयोग करता हूं।

जवाबों:


22

यदि आपने xdotoolस्थापित किया है, तो आप बस इस्तेमाल कर सकते हैं

xdotool keyup ISO_Level3_Shift

जो X सर्वर के लिए एक महत्वपूर्ण रिलीज़ (ISO_Level3_Shift के लिए) को भेजता है।

लेकिन आप सभी संशोधक कुंजियों को जारी करने के लिए एक कार्यक्रम चाहते थे। कोई भी आसानी से प्राप्त करने के लिए xdotool का उपयोग कर सकता है, अगर इसके लिए मुझे कोई पता नहीं है कि संशोधक कुंजियाँ क्या परिभाषित हैं। उन्हें खोजने का एक संभावित तरीका पार्स करना है keysymdef.h:

grep '^#define' /usr/include/X11/keysymdef.h | sed -r 's/^#define XK_(\S*?).*$/\1/;' | grep -E '_(L|R|Level.*)$'

जो कुछ की-जिम देता है जो निश्चित रूप से संशोधक हैं। दुर्भाग्य से, मुझे अभी एक संशोधक कुंजी की कोई सटीक परिभाषा नहीं मिल सकती है, इसलिए मुझे नहीं पता कि यह पूरी सूची है या नहीं।

जोड़ | xargs xdotool keyupऊपर पाइप लाइन के लिए उन सभी चाबियाँ जारी करेंगे। मेरे सिस्टम पर, यह निम्नलिखित कमांड निष्पादित करता है:

xdotool keyup Shift_L Shift_R Control_L Control_R Meta_L Meta_R Alt_L Alt_R Super_L Super_R Hyper_L Hyper_R ISO_Level2_Latch ISO_Level3_Shift ISO_Level3_Latch ISO_Level3_Lock ISO_Level5_Shift ISO_Level5_Latch ISO_Level5_Lock

1
महान! मैंने यह भी पाया कि बिना चाबी के कीकोड के माध्यम से अनस्टक किया जा सकता है, जैसे xdotool keyup 204
एडम स्पियर्स

1
@ अदम स्पियर्स ने मुझे अंदर ले लिया। मेरे मामले के लिए कीप कोड एक xmodmap कोड था, उदाहरण के लिए 204, और keyymdef.h का उपयोग करने में मदद नहीं की। Xmodmap कुंजी कोड देखने के लिए, प्रयास करें DISAPLAY=:1 xmodmap -pk | grep -iP 'alt|meta|super|hyper':। आपको डिस्प्ले नंबर को अपने टूटे हुए VNC डिस्प्ले नंबर में बदलना होगा।
srking

मुझे लगता है कि आप DISPLAY=:1उपरोक्त टिप्पणी में थे।
एडम स्पीयर्स

1
xdotool/ / के --clearmodifiersलिए एक विकल्प का समर्थन करता है - शायद यह नहीं था जब यह जवाब लिखा गया था? मुझे उम्मीद है कि काम करेगा। ( निर्दिष्ट करने के लिए एक कुंजी की आवश्यकता है; "स्थान" मनमाना है।)keykeydownkeyupxdotool keyup --clearmodifiers spacexdotool keyup
रोरी ओ'केन

6

मुझे पता चला कि मेरे सिस्टम के लिए, पोस्ट किए गए समाधान में xdotoolअक्सर उस कुंजी को शामिल नहीं किया गया था जो अटक गई थी, और चल रहा setxkbmapथा जो मेरे सिस्टम पर कुछ भी पूरा नहीं करता था।

मैंने जो समाधान खोजा, जो अब तक बिना असफलता के काम कर रहा है, उपयोग करना है x11vnc। विशेष रूप से, मैं निम्नलिखित कमांड का उपयोग करता हूं:

x11vnc -deny_all -clear_keys -timeout 1

-clear_keysयहाँ प्रमुख हिस्सा है। यह x11vncबाहर निकलने पर सभी दबाए गए कुंजी को साफ़ करने का निर्देश देता है। कनेक्शन के बिना 1 सेकंड के बाद छोड़ने के लिए -timeout 1कहता x11vncहै, और -deny_allयह सुनिश्चित करता है कि कोई भी उस विंडो के दौरान कनेक्ट नहीं कर सकता है।

कभी-कभी जो कुंजी अटक जाती है वह डेस्कटॉप के साथ किसी भी सार्थक बातचीत को रोकती है, जिस स्थिति में मैं ssh के माध्यम से निम्नलिखित को निष्पादित करूंगा:

env DISPLAY=:0 XAUTHORITY=/home/[username]/.Xauthority x11vnc -deny_all -clear_keys -timeout 1

4

मैं "setxkbmap" का उपयोग बिना किसी तर्क के करता हूं। यह कीबोर्ड रीसेट करने के लिए लगता है। मेरे पास मेरे पैनल में एक "शॉर्टकट" है जिसका उपयोग मैं माउस के साथ कर सकता हूं जब कीबोर्ड पूरी तरह से निष्क्रिय हो जाता है।


0

इसका x11vncउत्तर सरल है, लेकिन यदि x11vncकेवल समाशोधन संशोधक के लिए स्थापित करना ओवरकिल की तरह लगता है, तो यहां एक बैश समाधान है जो xmodmap -pmसभी ज्ञात संशोधक को कीप जारी करने के लिए आउटपुट का उपयोग करता है । हेक्स से दशमलव कीकोड में रूपांतरण बैश के अंकगणितीय विस्तार पर निर्भर करता है।

for KEYCODE in $(xmodmap -pm | grep -Pio '(?<=\b0x)[0-9a-f]+\b'); do

    echo -e "xdotool keyup $((16#$KEYCODE))\n" >&2
    xdotool keyup $((16#$KEYCODE))

done

यदि आप इसे कीबोर्ड शॉर्टकट से चला रहे हैं, sleep 1तो शुरुआत में जोड़ना (भौतिक कुंजी जारी करने के लिए समय की अनुमति देना) अच्छी तरह से सलाह दी जाएगी। echoStderr करने के लिए निश्चित रूप से, आवश्यक नहीं है; मैं ~/.xsession-errorsइस तरह से आउटपुट के लिए अपनी फ़ाइल की जांच करने में सक्षम होना चाहता हूं ।

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