Klavye oturumlarının durumunu, bir X oturumu içinden kök erişimi olmadan değiştirme


10

Capslock led'i zorlamaya çalışıyorum. xsetbenim için çalışmıyor, bu yüzden kullanmaya çalışıyorum setleds.

Grafiksel bir konsolda bu komut döndürür:

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

Sanal bir terminalde çalışır, ancak etki o sanal terminal için yereldir. Anladığım kadarıyla, koşuyorum

> setleds -L +caps < /dev/tty1

sanal bir terminalden (X sunucum tty1 üzerinde oturuyor) çalışmalıdır. Ancak, bu root erişimi gerektirir.

Söz konusu xserver'den veya başka bir VT'den root olmadan bir X sunucusunun altında yatan konsola bir komut göndermenin bir yolu var mı?

Düzenleme: Mark Plotnik bir öneri ve burada bulunan koda dayanarak , ben yazdı ve derledi:

#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;
}

Gilles'in yazdıklarından xset, çalışmasını beklemiyordum, ama bir anlamda ... led'i ayarlıyor, ama aynı zamanda capslock durumunu da belirliyor. Ben tamamen yukarıdaki tüm kodu anlamıyorum, bu yüzden aptalca bir hata yapmış olabilir. Görünüşe göre, çizgi XChangeKeyboardControl...programın davranışını değiştirmez XkbLockModifiersve led ve capslock durumunu ayarlayan şeydir.


xdotool key Caps_LockYetkili bir X istemcisinden benzer bir şey yapabilirsiniz , ancak bu aslında büyük harf kilidini açar.
Mark Plotnick

@MarkPlotnick Asıl nokta CapsLock'u açmamaktır. LED'e dokunmadan CapsLock'u kapatmanın bir yolu var mı?
T. Verron

xtermKaynağa baktım ve XChangeKeyboardControl () ' e bir çağrı kullanır ve LED'leri büyük harf kilidini vb. Durumunu etkilemeden ayarlar veya ayarlar. Yani C kodunu derleyebiliyorsanız, bu bir yaklaşımdır.
Mark Plotnick

@MarkPlotnick Ledleri xtermetkiler mi? Kulağa iyi bir fikir gibi geliyor, soruyu sonuçlarımla birlikte düzenleyeceğim.
T. Verron

Bende xtermdosya başına olarak çıkış sırası ESC [3 q, göndererek ScrollLock LED kadar ışık için ctlseqs.txtkaynağı ile gelir, ama parametreleri 1 ve 2 ile ışık up Num veya CapsLock LED'leri alamadım Belki gerek cevapta belirtilen XKB yapılandırmasını yapın. xtermçağrılar XChangeKeyboardControliçinde xtermShowLEDve xtermClearLEDsfakat çağırmaz XkbLockModifiersyerde hiç.
Mark Plotnick

Yanıtlar:


7

Prensip olarak, bunu saygılı xsetkomutla yapabilmelisiniz .

xset led named 'Caps Lock'

veya xset led 4sisteminiz LED'leri ada göre tanımıyorsa, 4 numaralı LED'i ayarlamak için.

Ancak, bu güvenilir bir şekilde çalışmıyor gibi görünüyor. Makinemde Scroll Lock'u yalnızca bu şekilde ayarlayabilirim ve tek kişi ben değilim . Bu bir XKB yapılandırması meselesi gibi görünüyor .

Aşağıdaki kullanıcı düzeyinde geçici çözüm çalışmalıdır (çoğunlukla):

  1. Mevcut xkb yapılandırmanızı çıkarın:

    xkbcomp $DISPLAY myconf.xkb
    
  2. İlgili bloklar ile myconf.xkbdeğiştirerek dosyayı düzenleyin:!allowExplicitallowExplicit

    indicator "Caps Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= Lock;
    };
    indicator "Num Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= NumLock;
    };
    
  3. Yeni dosyayı yükle

    xkbcomp myconf.xkb $DISPLAY
    

Şimdi ledleri açıp kapatarak xsetçalışmalıdır. Hata raporuna göre, açık olmaları gerektiğinde ledleri kapatamayacaksınız (örneğin CapsLock etkinse).


Teşekkürler! Daha önce denemiştim xsetve gerçekten işe yaramıyor. Yine de bu hata raporunu görmemiştim. Her neyse, "Durum: Çözülmüş Wontfix" gerçekten cesaret verici değil ... Geçici çözüm allowExplicitmuhtemelen benim için işe yarayacaktı (led'i kapatmam gerekmiyor), ama değiştirmek hala kök gerektiriyor.
T. Verron

@ T.Verron XKB yapılandırmasını değiştirmek için root olmanıza gerek yoktur. İstediğiniz zaman arayabilirsiniz xkbcomp. Tam olarak neyi değiştirmeniz gerektiğini söylemek için XKB hakkında yeterince bilgim yok (XKB ile önceden tanımlanmış tam bir harita yerine belirli bir yönü ayarlamak biraz acı verici ), ancak unix.stackexchange.com/questions/166844/mapping -key-bindings /… işaretçileri olmalı.
Gilles 'SO- kötü olmayı bırak'

Oh, güzel nokta. Eh, bir ilk girişim olarak, denedim: xkbcomp $DISPLAY output.xkbsonra değiştirilmesi !allowExplicityoluyla allowExplicitiçinde indicator "Caps Lock"daha sonra dosyayı yeniden bölüm xkbcomp output.xkb. Çok fazla uyarı var ve xset daha sonra daha iyi çalışmıyor. Xkb hakkında biraz daha bilgi vereceğim.
T. Verron

1
Bu tür benim için çalıştı. Değiştirilen dosyayı içe aktardıktan sonra bazı hata mesajları aldım ve LED'leri yakabilirim, ancak diğer şeyler bozuldu, ayrıca yeniden başlatmadan sağ çıkmadı. Bu yüzden düzenlenmiş /usr/share/X11/xkb/compat/ledcapsve ... / lednum'a devam ettim ve bu onu kalıcı hale getirdi.
jtgd

0

kullanma sed

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

Oturumu kapatıp tekrar açtıktan sonra, Caps LockLED şu rootkomutları kullanarak herhangi bir ayrıcalık olmadan kontrol edilebilir :

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

Ancak bu kök gerektirir.
T. Verron

@ T.Verron Yapılandırma dosyasını değiştirmek için yalnızca bir kez sudove sonra bir daha asla. Bunun belirli kullanıcılar için neden bu kadar önemli olabileceğini anlamak için bu vimuygulamaya bakın .
Serge Stroobandt

3 yıl önce soruyu soran kişi olarak, bazı kullanıcılar için neden önemli olabileceğini kesinlikle anlıyorum (benim durumumda, kontrol etmek için kapak kilidini yeniden etkinleştirdikten sonra, kapak kilidini etkinleştirirken elma klavyelerinin sahip olduğu aptal gecikme etrafında çalışmaktı). Ama o zamanlar, özellikle herhangi bir kök erişimi olmayan bir çözüme ihtiyacım vardı, çünkü bu bir iş bilgisayarı içindi. Kabul edilen cevap birkaç adım daha içerir, ancak sudo olmadan çalışır.
T. Verron

@ T.Verron Anlıyorum. Paylaşılan sistemler bunun işe yaramayacağı başka bir durumdur. Buna rağmen, kabul edilen cevaptaki son yorumcunun açıklığını beğendim ve bundan bir sedsatırlık yaptım.
Serge Stroobandt

0

@Gilles tarafından köksüz yaklaşımın @Serge_Stroobandt tarafından tam otomasyon fikri ile birleşimi.

Caps Lock , Num Lock ve Shift Lock LED'lerinin kontrolünü etkinleştirmek için :

#!/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

Bir LED'i açmak ve kapatmak için:

# 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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.