Вопрос или проблема
У меня есть ноутбук Dell (Inspiron 16 5645). Кроме клавиши Super, там есть еще одна клавиша, которая, как мне сказали, является клавишей Windows Co-Pilot. Она, похоже, ведет себя как клавиша левый Shift, и программа xev сообщает, что это тот же код клавиши, но, предположительно, Windows может отличить ее.
Могу ли я сделать что-нибудь полезное с этой клавишей? Я хочу сопоставить ее с отсутствующей клавишей правого Ctrl.
Редактировать: добавлен вывод терминала:-
Внешнее окно 0x800001, внутреннее окно 0x800002
Событие PropertyNotify, серийный номер 8, синтетический NO, окно 0x800001,
атом 0x27 (WM_NAME), время 74036986, состояние PropertyNewValue
Событие PropertyNotify, серийный номер 9, синтетический NO, окно 0x800001,
атом 0x22 (WM_COMMAND), время 74036986, состояние PropertyNewValue
Событие PropertyNotify, серийный номер 10, синтетический NO, окно 0x800001,
атом 0x28 (WM_NORMAL_HINTS), время 74036986, состояние PropertyNewValue
Событие CreateNotify, серийный номер 11, синтетический NO, окно 0x800001,
родитель 0x800001, окно 0x800002, (10,10), ширина 50, высота 50
ширина_рамки 4, подавление NO
Событие PropertyNotify, серийный номер 14, синтетический NO, окно 0x800001,
атом 0xf9 (WM_PROTOCOLS), время 74036986, состояние PropertyNewValue
Событие MapNotify, серийный номер 15, синтетический NO, окно 0x800001,
событие 0x800001, окно 0x800002, подавление NO
Событие ConfigureNotify, серийный номер 21, синтетический NO, окно 0x800001,
событие 0x800001, окно 0x800001, (0,0), ширина 178, высота 178,
ширина_рамки 0, выше 0x600109, подавление NO
Событие PropertyNotify, серийный номер 28, синтетический NO, окно 0x800001,
атом 0x16f (_NET_WM_ALLOWED_ACTIONS), время 74036986, состояние PropertyNewValue
Событие PropertyNotify, серийный номер 29, синтетический NO, окно 0x800001,
атом 0x153 (_MUTTER_NEEDS_FRAME), время 74036986, состояние PropertyNewValue
Событие PropertyNotify, серийный номер 29, синтетический NO, окно 0x800001,
атом 0x101 (_NET_WM_DESKTOP), время 74036986, состояние PropertyNewValue
Событие PropertyNotify, серийный номер 31, синтетический NO, окно 0x800001,
атом 0x13b (WM_STATE), время 74036987, состояние PropertyNewValue
Событие PropertyNotify, серийный номер 31, синтетический NO, окно 0x800001,
атом 0x107 (_NET_WM_STATE), время 74036987, состояние PropertyNewValue
Событие PropertyNotify, серийный номер 31, синтетический NO, окно 0x800001,
атом 0x131 (_GTK_EDGE_CONSTRAINTS), время 74036987, состояние PropertyNewValue
Событие ConfigureNotify, серийный номер 34, синтетический NO, окно 0x800001,
событие 0x800001, окно 0x800001, (50,32), ширина 178, высота 178,
ширина_рамки 0, выше 0x600109, подавление NO
Событие PropertyNotify, серийный номер 34, синтетический NO, окно 0x800001,
атом 0x131 (_GTK_EDGE_CONSTRAINTS), время 74036988, состояние PropertyNewValue
Событие ReparentNotify, серийный номер 34, синтетический NO, окно 0x800001,
событие 0x800001, окно 0x800001, родитель 0xa001a0,
(0,0), подавление NO
Событие PropertyNotify, серийный номер 34, синтетический NO, окно 0x800001,
атом 0xfe (_NET_FRAME_EXTENTS), время 74037001, состояние PropertyNewValue
Событие ConfigureNotify, серийный номер 34, синтетический NO, окно 0x800001,
событие 0x800001, окно 0x800001, (14,49), ширина 178, высота 178,
ширина_рамки 0, выше 0xa001a1, подавление NO
Событие MapNotify, серийный номер 35, синтетический NO, окно 0x800001,
событие 0x800001, окно 0x800001, подавление NO
Событие VisibilityNotify, серийный номер 35, синтетический NO, окно 0x800001,
состояние VisibilityUnobscured
Событие Expose, серийный номер 35, синтетический NO, окно 0x800001,
(0,0), ширина 178, высота 10, количество 3
Событие Expose, серийный номер 35, синтетический NO, окно 0x800001,
(0,10), ширина 10, высота 58, количество 2
Событие Expose, серийный номер 35, синтетический NO, окно 0x800001,
(68,10), ширина 110, высота 58, количество 1
Событие Expose, серийный номер 35, синтетический NO, окно 0x800001,
(0,68), ширина 178, высота 110, количество 0
Событие ConfigureNotify, серийный номер 35, синтетический YES, окно 0x800001,
событие 0x800001, окно 0x800001, (198,217), ширина 178, высота 178,
ширина_рамки 2, выше 0x0, подавление NO
Событие PropertyNotify, серийный номер 35, синтетический NO, окно 0x800001,
атом 0x107 (_NET_WM_STATE), время 74037002, состояние PropertyNewValue
Событие FocusIn, серийный номер 35, синтетический NO, окно 0x800001,
режим NotifyNormal, деталь NotifyNonlinear
Событие KeymapNotify, серийный номер 35, синтетический NO, окно 0x0,
клавиши: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Событие PropertyNotify, серийный номер 35, синтетический NO, окно 0x800001,
атом 0x107 (_NET_WM_STATE), время 74037005, состояние PropertyNewValue
Событие PropertyNotify, серийный номер 35, синтетический NO, окно 0x800001,
атом 0x107 (_NET_WM_STATE), время 74037005, состояние PropertyNewValue
Событие EnterNotify, серийный номер 35, синтетический NO, окно 0x800001,
корень 0x3d1, подокно 0x0, время 74037005, (155,114), корень:(355,333),
режим NotifyNormal, деталь NotifyNonlinear, тот же_экран YES,
фокус YES, состояние 0
Событие KeymapNotify, серийный номер 35, синтетический NO, окно 0x0,
клавиши: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Событие PropertyNotify, серийный номер 35, синтетический NO, окно 0x800001,
атом 0x107 (_NET_WM_STATE), время 74037016, состояние PropertyNewValue
Событие KeyRelease, серийный номер 35, синтетический NO, окно 0x800001,
корень 0x3d1, подокно 0x0, время 74037112, (155,114), корень:(355,333),
состояние 0x0, код клавиши 36 (keysym 0xff0d, Return), тот же_экран YES,
XLookupString дает 1 байт: (0d) "
"
XFilterEvent возвращает: False
Событие KeyPress, серийный номер 38, синтетический NO, окно 0x800001,
корень 0x3d1, подокно 0x0, время 74043466, (155,114), корень:(355,333),
состояние 0x40, код клавиши 50 (keysym 0xffe1, Shift_L), тот же_экран YES,
XLookupString дает 0 байт:
XmbLookupString дает 0 байт:
XFilterEvent возвращает: False
Событие KeyRelease, серийный номер 38, синтетический NO, окно 0x800001,
корень 0x3d1, подокно 0x0, время 74043594, (155,114), корень:(355,333),
состояние 0x41, код клавиши 50 (keysym 0xffe1, Shift_L), тот же_экран YES,
XLookupString дает 0 байт:
XFilterEvent возвращает: False
Событие LeaveNotify, серийный номер 38, синтетический NO, окно 0x800001,
корень 0x3d1, подокно 0x0, время 74047709, (-12,-47), корень:(188,172),
режим NotifyNormal, деталь NotifyAncestor, тот же_экран YES,
фокус YES, состояние 0
Событие ClientMessage, серийный номер 38, синтетический YES, окно 0x800001,
message_type 0xf9 (WM_PROTOCOLS), формат 32, сообщение 0xf7 (WM_DELETE_WINDOW)
Я столкнулся с похожей проблемой, будучи пользователем Arch и имея Lenovo с клавишей Co-Pilot. Что сработало для меня, так это следующий скрипт (после установки evsieve):
sudo setkeycodes 6e 193
sudo /usr/bin/evsieve\
--input "/dev/input/by-path/platform-i8042-serio-0-event-kbd" grab=auto persist=exit\
--hook key:leftmeta key:leftshift key:f23 sequential period=0.032 send-key=key:leftctrl --withhold key:leftmeta key:leftshift key:f23\
--output create-link="/dev/input/by-path/platform-i8042-serio-0-event-kbd-evsieve"
Ответ или решение
Для переназначения клавиши "Windows Copilot" на правый Ctrl в Ubuntu, можно воспользоваться утилитой evsieve
, которая позволяет перехватывать и перенаправлять события ввода с клавиатуры. Вот пошаговая инструкция, как это сделать:
Шаг 1: Установите необходимые пакеты
Убедитесь, что у вас установлены evsieve
и setkeycodes
. Вы можете установить их с помощью следующей команды:
sudo apt install evsieve
Шаг 2: Найдите код клавиши
Сначала необходимо получить код клавиши "Windows Copilot". Вы можете использовать xev
или showkey
для этого. Например:
xev
При нажатии на клавишу "Windows Copilot" вы увидите выходные данные, включая keycode
. Запишите этот код. Если xev
показывает, что код совпадает с Shift_L
, это может быть связано с особенностью клавиатуры, но для дальнейшей настройки это не помешает.
Шаг 3: Используйте setkeycodes
С помощью команды setkeycodes
вы можете настроить ключ, который будет соответствовать переназначению. Например, если код клавиши "Windows Copilot" равен 193
, выполните следующую команду:
sudo setkeycodes 6E 193
Здесь 6E
– это код, который будет соответствовать вашей клавише.
Шаг 4: Настройте evsieve
После этого запустите evsieve
, чтобы перенаправить нажатия с клавиши "Windows Copilot" (или любого другого идентификатора) на правый Ctrl:
sudo /usr/bin/evsieve \
--input "/dev/input/by-path/platform-i8042-serio-0-event-kbd" grab=auto persist=exit \
--hook key:leftmeta key:leftshift key:f23 sequential period=0.032 send-key=key:leftctrl \
--withhold key:leftmeta key:leftshift key:f23 \
--output create-link="/dev/input/by-path/platform-i8042-serio-0-event-kbd-evsieve"
Обратите внимание, что возможно, вам придется изменить путь к устройству ввода, если он отличается на вашей системе. Вы можете найти правильный путь, просматривая файлы в директории /dev/input/by-path/
.
Шаг 5: Перезапустите систему
После выполнения всех шагов, перезагрузите вашу систему, чтобы применить изменения.
Дополнительная информация
Если у вас возникают проблемы с загрузкой evsieve
при старте системы, вы можете добавить команду в автозагрузку или создать systemd-сервис, чтобы он запускался автоматически.
Заключение
Таким образом, у вас есть возможность переназначить клавишу "Windows Copilot" на правый Ctrl в Ubuntu, следуя вышеуказанным шагам. Если у вас возникнут дополнительные вопросы или трудности, не стесняйтесь обращаться за помощью на форумы Ubuntu или другие сообщества пользователей Linux.