बिना रूट एक्सेस के, X सत्र के भीतर से कीबोर्ड लीड्स की स्थिति बदलें


10

मैं नेतृत्व करने के लिए कैपलॉक को मजबूर करने की कोशिश कर रहा हूं। xsetमेरे लिए काम नहीं करता है, इसलिए मैं उपयोग करने की कोशिश कर रहा हूं setleds

एक ग्राफिकल कंसोल में, यह कमांड देता है:

> LANG=C setleds -L +caps
KDGKBLED: Inappropriate ioctl for device
Error reading current flags setting. Maybe you are not on the console?

वर्चुअल टर्मिनल में, यह काम करता है, हालांकि यह प्रभाव उस वर्चुअल टर्मिनल के लिए स्थानीय है। जो मैं समझता हूं, उससे

> setleds -L +caps < /dev/tty1

वर्चुअल टर्मिनल से (मेरा X सर्वर tty1 पर बैठा है) को काम करना चाहिए। हालाँकि, इसके लिए रूट एक्सेस की आवश्यकता होती है।

क्या X सर्वर पर अंतर्निहित कंसोल पर कमांड भेजने का कोई तरीका है, क्या यह उक्त xserver से है या किसी अन्य VT से, बिना रूट के?

संपादित करें: मार्क प्लॉटनिक के एक सुझाव से, और यहां मिले कोड के आधार पर , मैंने निम्नलिखित लिखा और संकलित किया:

#include <X11/Xlib.h>
#include <X11/XKBlib.h>

#define SCROLLLOCK 1
#define CAPSLOCK 2
#define NUMLOCK 16

void setLeds(int leds) {
   Display *dpy = XOpenDisplay(0);
   XKeyboardControl values;
   values.led_mode = leds & SCROLLLOCK ? LedModeOn : LedModeOff;
   values.led = 3;
   XChangeKeyboardControl(dpy, KBLedMode, &values);
   XkbLockModifiers(dpy, XkbUseCoreKbd, CAPSLOCK | NUMLOCK,
                    leds & (CAPSLOCK | NUMLOCK) );
   XFlush(dpy);
   XCloseDisplay(dpy);
}

int main() {
   setLeds(CAPSLOCK);
   return 0;
}

गिल्स ने जिस बारे में लिखा xsetथा, उससे मुझे काम करने की उम्मीद नहीं थी, लेकिन यह कुछ मायने में ... यह सेट का नेतृत्व करता है, लेकिन यह कैप्सलॉक की स्थिति भी निर्धारित करता है। मुझे उपरोक्त सभी कोड पूरी तरह से समझ नहीं आ रहे हैं, इसलिए मैंने एक मूर्खतापूर्ण गलती की हो सकती है। जाहिरा तौर पर, लाइन XChangeKeyboardControl...कार्यक्रम के व्यवहार को नहीं बदलता है, और XkbLockModifiersवह है जो नेतृत्व और कैपलॉक स्थिति को निर्धारित करता है।


आप xdotool key Caps_Lockअधिकृत एक्स क्लाइंट से कुछ कर सकते हैं , हालांकि यह वास्तव में कैप्स लॉक को चालू करेगा।
मार्क प्लॉटनिक

@MarkPlotnick बिंदु वास्तव में CapsLock चालू करने के लिए नहीं है। क्या कोई रास्ता है कि कैप्सलॉक को बंद करें, बिना एलईडी को छूने के?
टी। वेरॉन

मैंने xtermस्रोत को देखा , और यह कैप्स लॉक आदि की स्थिति को प्रभावित किए बिना एलईडी को सेट या अनसेट करने के लिए XChangeKeyboardControl () को कॉल का उपयोग करता है, इसलिए यदि आप सी कोड को संकलित कर सकते हैं, तो यह एक दृष्टिकोण है।
मार्क प्लॉटनिक

@MarkPlotnick क्या xtermएलईडी को प्रभावित करता है ? यह एक अच्छा विचार लगता है, मैं अपने परिणामों के साथ प्रश्न को संपादित करूंगा।
टी। वेरॉन

मुझे स्रोत के साथ आने वाली xtermफ़ाइल के अनुसार एस्केप सीक्वेंस ESC [3 q भेजकर स्क्रॉललॉक एलईडी को लाइट अप करने के लिए मिला ctlseqs.txt, लेकिन मापदंडों 1 और 2 के साथ प्रकाश करने के लिए Num या CapsLock एलईडी प्राप्त नहीं कर सका। उत्तर में उल्लिखित XKB विन्यास करते हैं। xtermकॉल XChangeKeyboardControlमें xtermShowLEDऔर xtermClearLEDsहै, लेकिन फोन नहीं करता है XkbLockModifiersसब पर कहीं भी।
मार्क प्लॉटनिक

जवाबों:


7

सिद्धांत रूप में, आपको इसे आदरणीय xsetआदेश के साथ करने में सक्षम होना चाहिए ।

xset led named 'Caps Lock'

या xset led 4एलईडी नंबर 4 सेट करने के लिए, अगर आपका सिस्टम नाम से एलईडी को नहीं पहचानता है।

हालाँकि, यह मज़बूती से काम नहीं करता है। अपनी मशीन पर, मैं केवल स्क्रॉल लॉक को इस तरह सेट कर सकता हूं, और मैं केवल एक ही नहीं हूं । यह XKB कॉन्फ़िगरेशन का मामला लगता है

निम्नलिखित उपयोगकर्ता-स्तरीय कार्य-के आसपास काम करना चाहिए (अधिकांश भाग के लिए):

  1. अपना वर्तमान xkb कॉन्फ़िगरेशन निकालें:

    xkbcomp $DISPLAY myconf.xkb
    
  2. फ़ाइल को संपादित करें myconf.xkb, की जगह !allowExplicitके साथ allowExplicitप्रासंगिक ब्लॉकों में:

    indicator "Caps Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= Lock;
    };
    indicator "Num Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= NumLock;
    };
    
  3. नई फ़ाइल लोड करें

    xkbcomp myconf.xkb $DISPLAY
    

अब xsetकाम बंद कर देना चाहिए। बग रिपोर्ट के अनुसार, आप लीड्स को तब स्विच नहीं कर पाएंगे जब वे होने वाले हों (उदाहरण के लिए यदि कैप्सलॉक सक्षम है)।


धन्यवाद! मैंने पहले भी कोशिश की xsetथी, और वास्तव में यह काम नहीं करता है। मैंने हालांकि इस बग रिपोर्ट को नहीं देखा था। वैसे भी, "स्थिति: हल किए गए Wontfix" वास्तव में उत्साहजनक नहीं है ... allowExplicitकाम-आस-पास शायद मेरे लिए काम करेगा (मुझे एलईडी बंद करने की आवश्यकता नहीं है), लेकिन इसे बदलने के लिए अभी भी रूट की आवश्यकता है।
टी। वेरॉन

@ T.Verron XKB कॉन्फ़िगरेशन को बदलने के लिए आपको रूट होने की आवश्यकता नहीं है। आप xkbcompकिसी भी समय कॉल कर सकते हैं । मैं एक्सकेबी के साथ पर्याप्त रूप से परिचित नहीं हूं, आपको यह बताने के लिए कि आपको क्या बदलने की ज़रूरत है (एक्सकेबी के साथ पूर्ण पूर्वनिर्धारित नक्शे के बजाय एक विशिष्ट पहलू स्थापित करना थोड़ा दर्द है), लेकिन unix.stackexchange.com/questions/166844/mapping -की-बाइंडिंग / ... में कुछ पॉइंटर्स होने चाहिए।
गिल्स एसओ- बुराई पर रोक '

ओह, अच्छी बात है। ठीक है, पहले प्रयास के रूप में, मैंने कोशिश की: xkbcomp $DISPLAY output.xkbफिर अनुभाग में प्रतिस्थापित !allowExplicitकरके , फिर फ़ाइल को पुनः लोड कर रहा हूं । बहुत सारी चेतावनियाँ हैं, और xset बाद में कोई बेहतर काम नहीं करता है। मैं xkb के बारे में कुछ और पढ़ूंगा। allowExplicitindicator "Caps Lock"xkbcomp output.xkb
टी। वेरॉन

1
मेरे लिए इस तरह का काम किया। जब मैं संशोधित फ़ाइल आयात करने के बाद मुझे कुछ त्रुटि संदेश मिले और मैं एल ई डी को प्रकाश में ला सकता था लेकिन अन्य चीजें गड़बड़ हो गईं, साथ ही यह एक पुनः आरंभ नहीं हुआ। इसलिए मैं एक संपादित /usr/share/X11/xkb/compat/ledcapsऔर ... / लीडनम आगे बढ़ा और इसने इसे स्थायी बना दिया।
jtgd

0

का उपयोग करते हुए sed

$ sudo sed -i 's|\!allowExplicit|allowExplicit|g' /usr/share/X11/xkb/compat/ledcaps

लॉग आउट करने के बाद और फिर से, Caps Lockअब rootकमांड का उपयोग करके किसी भी विशेषाधिकार के बिना एलईडी को नियंत्रित किया जा सकता है:

$ xset led named 'Caps Lock'
$ xset -led named 'Caps Lock'

लेकिन इसके लिए जड़ की आवश्यकता होती है।
टी। वेरॉन

@ T.Verron केवल एक बार कॉन्फ़िगरेशन फ़ाइल को बदलने के लिए sudoऔर फिर कभी नहीं। यह समझने के लिए कि कुछ उपयोगकर्ताओं के लिए यह इतना महत्वपूर्ण क्यों हो सकता है, इस vimएप्लिकेशन को देखें ।
सर्ज स्ट्रोबंड्ट

3 साल पहले प्रश्न पूछने वाले के रूप में, मैं निश्चित रूप से समझता हूं कि यह कुछ उपयोगकर्ताओं के लिए महत्वपूर्ण क्यों हो सकता है (मेरे मामले में, यह बेवकूफ देरी के आसपास काम करने के लिए था, जब ऐप्पल को नियंत्रित करने के बाद ऐप्पल कीबोर्ड को नियंत्रित करने के बाद कैप्सलॉक को नियंत्रित किया जाता है)। लेकिन फिर, मुझे विशेष रूप से बिना किसी रूट एक्सेस के समाधान की आवश्यकता थी, क्योंकि यह एक कार्य कंप्यूटर के लिए था। स्वीकृत उत्तर में कुछ और चरण शामिल हैं, लेकिन यह सुडो के बिना काम करता है।
टी। वेरॉन

@ T.Verron मुझे समझ में आया। साझा सिस्टम एक और मामला है जहां यह काम नहीं करेगा। इसके बावजूद, मुझे स्वीकार किए गए उत्तर पर अंतिम टिप्पणी करने वाले की सीधी सादी पसंद आई और sedउसमें से एक-लाइनर बना दिया ।
सर्ज स्ट्रोबंड्ट

0

@Serge_Stroobandt द्वारा पूर्ण स्वचालन के विचार के साथ @Gilles द्वारा रूट-कम दृष्टिकोण का एक संयोजन।

कैप्स लॉक , न्यूम लॉक और शिफ्ट लॉक एल ई डी के नियंत्रण को सक्षम करने के लिए :

#!/bin/bash
# Enables to control keyboard LEDs that are not available for control by default
xkbcomp $DISPLAY /tmp/my_conf.xkb
cat /tmp/my_conf.xkb | awk -e '
    BEGIN {
        change = 0
    }

    {
        if (change == 1) {
            if ($1 == "!allowExplicit;") {
                gsub("!", "", $0)
            }
            change = 0
        }
        print $0

    }

    /indicator "Caps Lock"/ {
        change = 1
    }
    /indicator "Num Lock"/ {
        change = 1
    }
    /indicator "Shift Lock"/ {
        change = 1
    }
    ' > /tmp/my_conf_modified.xkb
xkbcomp /tmp/my_conf_modified.xkb $DISPLAY

एक एलईडी चालू और बंद करने के लिए:

# Turns the LED on
xset led named 'Caps Lock'

# wait 1s
sleep 1

# Resets the LED to the actual state,
# so it might still be on, if Caps Lock is activated.
xset -led named 'Caps Lock'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.