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

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

92
задан 17 November 2011 в 11:43

5 ответов

Я не знаю ни о каком инструменте командной строки для этого в Ubuntu. (Для Num Lock существует numlockx Install 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 для вызова функций 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.

130
ответ дан 22 November 2019 в 23:08

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

Примечание:
Для первого использования для Этого решения нужны Вы для записи на ленту правильного пароли для установки нового инструмента, если ЗАГЛАВНЫЕ БУКВЫ в настоящее время активны:

  • Используйте клавишу SHIFT для ввода строчных букв.
  • Включите доступность, наложите виртуальную клавиатуру.
  • Повторно включите внешнюю клавиатуру. (Благодаря chris455)
  • Открытое офисное устройство записи, запишите пароль там, измените регистр, скопируйте его, затем вставьте его к диалоговому окну пароля.

Если все предыдущие варианты не возможны или не работают, Пойдите с ответом Жабр / сценарий Python. Это не должно устанавливать дополнительный инструмент, это использует только python & libX11 общий lib, которые предварительно установлены.

Используя xdotool

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

    sudo apt-get install xdotool
    
  2. Отправьте ЗАГЛАВНЫМ БУКВАМ вниз / событие

    xdotool key Caps_Lock
    

Другой инструмент xte

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

    sudo apt-get install xautomation
    
  2. Отправьте Caps Lock вниз / событие

    xte "key Caps_Lock"
    

Ссылки:

60
ответ дан 22 November 2019 в 23:08

Если Вы не можете получить доступ к ЗАГЛАВНЫМ БУКВАМ, потому что Вы повторно отобразили его в .bashrc, как я сделал, то просто переключение на виртуальный терминал (alt+ctl+fN) и затем переключение назад работали на меня.

8
ответ дан 22 November 2019 в 23:08

Что касается версии Python Gilles, не работающей в более новом 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)

(Код, адаптированный от https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress)

15
ответ дан 22 November 2019 в 23:08

Я имел эту проблему и смог зафиксировать ее при помощи клавиатуры OnBoard (в Помощнике Ubuntu под Универсальным Доступом).

После того, как включенный необходимо видеть, что клавиша Caps Lock является красной, или так или иначе указала, что соединена. Затем можно нажать для выключения.

2
ответ дан 22 November 2019 в 23:08

Другие вопросы по тегам:

Похожие вопросы: