Caps Lock'u (kilit, değil anahtar) komut satırına nasıl kapatabilirim?

75

Bazı nedenlerden dolayı dizüstü bilgisayarım Caps Lock'ta sıkışmış. % Co_de% - xmodmap ile eşlenen Caps Lock anahtarını kullanıyorum, bu yüzden kapatmak için hyper_l anahtarına sahip değilim. Komut satırı ile kapatmamın bir yolu var mı? Kilit durumunu, bilgisayarımı sıfırlamadan, özellikle gelecekteki başvurular için sıfırlayabilmem güzel olurdu. Bu daha önce oldu, ama şimdi bu sefer nasıl doğru bir şekilde yapılacağını bilmek istiyorum.

    
sordu Echogene 17.11.2011 18:51

4 cevap

117

Ubuntu’da bunun için herhangi bir komut satırı aracı bilmiyorum. (Num Lock için numlockx var. . Burada bir terminal penceresine kopyalayıp yapıştırabileceğiniz bir tek satır var:

python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)'

Burada yine daha genişletilmiş bir formda. Python ’u kullanıyoruz. X kitaplığından C işlevlerini çağırmak için doğrudan ctypes kitaplığı . XkbLockModifiers işlevi, klavye kilitlerinin durumunu değiştirir çekirdek klavyede ( XkbUseCoreKbd = 0x0100), Caps Lock'u (2) etkileyerek 0 (kapalı) olarak ayarlayın.

#!/usr/bin/env python
from ctypes import *
X11 = cdll.LoadLibrary("libX11.so.6")
display = X11.XOpenDisplay(None)
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0))
X11.XCloseDisplay(display)

Takılı bir değiştiriciniz varsa, kapatmak istediğiniz değiştiricilerin maskesini 2 değiştirin. Değiştiriciler 1 = Shift, 2 = Lock (Caps Lock), 4 = Kontrol, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5'dir. Mod1'den Mod5'e ne ile karşılık geldiğini görmek için xmodmap -pm çalıştırın. Örneğin, tüm değiştiricileri kapatmak için X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)) ’i arayın. Mod2'deki Num Lock'u açmak ve aynı zamanda Caps Lock'u kapatmak için X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)) 'i arayın.

Python'u çağırmak yerine küçük bir ikili oluşturmak istiyorsanız, C versiyonu. % Co_de% ile, gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11 ve build-essentials paketlerinin kurulu olduğu paketlerle derleyin.

#include <stdio.h>
#include <X11/X.h>
#include <X11/XKBlib.h>
int main()
{
    Display *display = XOpenDisplay(NULL);
    if (display == NULL) {
        fprintf(stderr, "Couldn't open display\n");
        return 2;
    }
    Bool sent = XkbLockModifiers(display, XkbUseCoreKbd, LockMask, 0);
    if (!sent) {
        fprintf(stderr, "Couldn't send LatchLockState\n");
        return 1;
    }
#ifdef REPORT_STATE
    XkbStateRec xkb_state;
    Status status = XkbGetState(display, XkbUseCoreKbd, &xkb_state);
    if (status) {
        fprintf(stderr, "XkbGetState returned %d\n", status);
        return 1;
    }
    printf("state.group=%02x\n", xkb_state.group);
    printf("state.locked_group=%02x\n", xkb_state.locked_group);
    printf("state.base_group=%02x\n", xkb_state.base_group);
    printf("state.latched_group=%02x\n", xkb_state.latched_group);
    printf("state.mods=%02x\n", xkb_state.mods);
    printf("state.base_mods=%02x\n", xkb_state.base_mods);
    printf("state.latched_mods=%02x\n", xkb_state.latched_mods);
    printf("state.locked_mods=%02x\n", xkb_state.locked_mods);
    printf("state.compat_state=%02x\n", xkb_state.compat_state);
    printf("state.grab_mods=%02x\n", xkb_state.grab_mods);
    printf("state.compat_grab_mods=%02x\n", xkb_state.compat_grab_mods);
    printf("state.lookup_mods=%02x\n", xkb_state.lookup_mods);
    printf("state.compat_lookup_mods=%02x\n", xkb_state.compat_lookup_mods);
    printf("state.ptr_buttons=%02x\n", xkb_state.ptr_buttons);
#endif
    int err = XCloseDisplay(display);
    if (err) {
        fprintf(stderr, "XCloseDisplay returned %d\n", err);
        return 1;
    }
    return 0;
}

Ayrıca, ilgi alanı muhtemelen Caps Lock'u geçici olarak yok saymanın bir yoludur:

xkbset nullify lock

Bundan sonra, Caps Lock etkin olarak libx11-dev ile yeniden etkinleştirilinceye kadar kapalı olacaktır.

    
verilen cevap Gilles 17.11.2011 23:26
42
Gerekli anahtar olayları göndermek için

X otomasyon araçları kullanılabilir.

  

Not:
  Bu çözüm doğru şifreyi teyit etmenizi gerektirir.   CAPS şu anda aktif: açık ofis yazarı, orada parola yaz,   Mektup vakasını değiştirin, kopyalayın, ardından şifre iletişim kutusuna yapıştırın.

     

Önceki adımın mümkün olmaması veya çalışmaması durumunda, Gilles 'answer / python script ile devam edin. Herhangi bir ek araç yüklemeye gerek yoktur, sadece python & amp; Önceden yüklenmiş libX11 paylaşılan lib.

xdotool

kullanma
  1. Yükle

    sudo apt-get install xdotool
    
  2. Bir CAPS aşağı / yukarı etkinliği gönder

    xdotool key Caps_Lock
    

Başka bir araç xte

  1. Yükle

    sudo apt-get install xautomation
    
  2. CAPS kilitleme aşağı / yukarı etkinliği gönder

    xte "key Caps_Lock"
    

Kaynaklar:

verilen cevap user.dz 11.04.2015 10:41
6

Gilles python sürümü yeni ubuntus'ta çalışmadığı gibi, açık ekran için doğru dönüşün ayarlanması da hileyi yapıyor gibi görünüyor:

#! /usr/bin/env python

from ctypes import *
import subprocess

class Display(Structure):
    """ opaque struct """

X11 = cdll.LoadLibrary("libX11.so.6")
X11.XOpenDisplay.restype = POINTER(Display)

display = X11.XOpenDisplay(c_int(0))
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0))
X11.XCloseDisplay(display)

(Kod, İşte )

    
verilen cevap diegogs 30.07.2017 17:37
3

CAPS'e erişemiyorsanız, çünkü .bashrc'de yeniden yaptığınız gibi, sonra sanal bir terminale (alt + ctl + fN) geçiş yapmak ve sonra tekrar açmak benim için çalıştı.

    
verilen cevap Benjamin 27.06.2017 08:01

Etiketlerdeki diğer soruları oku