Как отключить Caps Lock (блокировка, а не ключ) по командной строке?

69

По какой-то причине мой ноутбук застрял в Caps Lock. У меня есть ключ Caps Lock , отображаемый xmodmap на hyper_l , поэтому у меня нет ключа caps_lock , чтобы отключить его. Есть ли способ отключить его командой? Было бы неплохо, если бы я мог сбросить состояние блокировки без перезагрузки моего компьютера, особенно для будущих ссылок. Это произошло раньше, но я хотел бы знать, как это сделать на этот раз.

    
задан Echogene 17.11.2011 в 18:51
источник

4 ответа

107

Я не знаю ни одного инструмента командной строки для Ubuntu. (Для Num Lock существует numlockx .) Вот один слой, который вы можете скопировать-вставить в окно терминала:

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)'

Здесь он снова в более расширенной форме. Мы используем Python ctypes library для прямого вызова функций C из библиотеки X . Функция XkbLockModifiers изменяет состояние блокировок клавиатуры , на основной клавиатуре ( XkbUseCoreKbd = 0x0100), влияя на Caps Lock (2), установив ее на 0 (выкл.).

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

Если у вас есть застрявший модификатор, измените 2 на маску модификаторов, которые вы хотите отключить. Модификаторы: 1 = Shift, 2 = Lock (Caps Lock), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Запустите xmodmap -pm , чтобы увидеть, что соответствует Mod1 по Mod5. Например, чтобы отключить все модификаторы, вызовите X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)) . Чтобы включить Num Lock, который находится на Mod2, и в то же время отключите Caps Lock, вызовите X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)) .

Вот версия C, если вы хотите сделать небольшой двоичный код вместо вызова Python. Скомпилируйте с gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11 , с установленными пакетами build-essentials и libx11-dev .

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

Также интересен способ временно игнорировать Caps Lock:

xkbset nullify lock

После этого Caps Lock будет эффективно отключен, пока вы не переустановите его с помощью xkbset nullify -lock .

    
ответ дан Gilles 17.11.2011 в 23:26
35

Инструменты автоматизации X могут быть использованы для отправки необходимых ключевых событий.

  

Примечание:
  Это решение требует, чтобы вы наклеили правильный пароль, если   В настоящее время CAPS активен: открывать офисную запись, писать там пароль,   измените регистр букв, скопируйте его, а затем вставьте его в диалог пароля.

     

Если этот предыдущий шаг невозможен или не работает, перейдите с скриптом ответа / сценария Gilles . Нет необходимости устанавливать какой-либо дополнительный инструмент, он использует только python & amp; libX11 shared lib, которые предварительно установлены.

Использование xdotool

  1. Установите его

    sudo apt-get install xdotool
    
  2. Отправить событие CAPS down / up

    xdotool key Caps_Lock
    

Другим инструментом является xte

  1. Установите его

    sudo apt-get install xautomation
    
  2. Отправьте событие CAPS lock down / up

    xte "key Caps_Lock"
    

Литература:

ответ дан user.dz 11.04.2015 в 10:41
2

Если вы не можете получить доступ к CAPS, потому что вы переназначили его в .bashrc, как и я, просто перейдя на виртуальный терминал (alt + ctl + fN), а затем переключитесь обратно на меня.

    
ответ дан Benjamin 27.06.2017 в 08:01
2

Что касается версии Gilles python, не работающей в новой версии ubuntus, установка правильного возврата для открытого дисплея, похоже, делает трюк:

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

(закодировано из Ссылка )     

ответ дан diegogs 30.07.2017 в 17:37