По некоторым причинам мой ноутбук застревает в Caps Lock. Мне отобразили клавишу Caps Lock xmodmap
кому: hyper_l
, таким образом, у меня нет a caps_lock
ключ для выключения его. Существует ли способ, которым я могу выключить его командной строкой? Было бы хорошо, если я мог бы сбросить состояние блокировки, не сбрасывая мой компьютер, специально для будущей ссылки. Это произошло прежде, но я хотел бы знать теперь, как сделать это правильно на этот раз.
Я не знаю ни о каком инструменте командной строки для этого в 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 для вызова функций 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
.
X средств автоматизации могли использоваться для отправки необходимых ключевых событий.
Примечание:
Для первого использования для Этого решения нужны Вы для записи на ленту правильного пароли для установки нового инструмента, если ЗАГЛАВНЫЕ БУКВЫ в настоящее время активны:
- Используйте клавишу SHIFT для ввода строчных букв.
- Включите доступность, наложите виртуальную клавиатуру.
- Повторно включите внешнюю клавиатуру. (Благодаря chris455)
- Открытое офисное устройство записи, запишите пароль там, измените регистр, скопируйте его, затем вставьте его к диалоговому окну пароля.
Если все предыдущие варианты не возможны или не работают, Пойдите с ответом Жабр / сценарий Python. Это не должно устанавливать дополнительный инструмент, это использует только
python
&libX11
общий lib, которые предварительно установлены.
Используя xdotool
Установите его
sudo apt-get install xdotool
Отправьте ЗАГЛАВНЫМ БУКВАМ вниз / событие
xdotool key Caps_Lock
Другой инструмент xte
Установите его
sudo apt-get install xautomation
Отправьте Caps Lock вниз / событие
xte "key Caps_Lock"
Ссылки:
Если Вы не можете получить доступ к ЗАГЛАВНЫМ БУКВАМ, потому что Вы повторно отобразили его в .bashrc, как я сделал, то просто переключение на виртуальный терминал (alt+ctl+fN) и затем переключение назад работали на меня.
Что касается версии 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)
Я имел эту проблему и смог зафиксировать ее при помощи клавиатуры OnBoard (в Помощнике Ubuntu под Универсальным Доступом).
После того, как включенный необходимо видеть, что клавиша Caps Lock является красной, или так или иначе указала, что соединена. Затем можно нажать для выключения.