Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Easy Switcher - переключатель раскладки клавиатуры  (Прочитано 1160104 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн freemind

  • Автор темы
  • Участник
  • *
  • Сообщений: 200
    • Просмотр профиля
selarion, благодарю за отзыв.

Паскаль был выбран просто потому что я его знаю довольно глубоко. Программистом был очень давно, в те времена, когда в моде была Delphi, работал по найму, мы писали коммерческие проекты на ней. Переключатель писать начинал, как полагается, на С, но быстро понял что мне сильно долго разбираться придется, а хотелось написать что-то быстро и просто для себя, чтоб работало. Попробовал паскаль, оказалось что все что нужно для этой задачи в нем есть, и писать под линукс тоже можно. Публиковать изначально не планировал, но когда понял, что работает неплохо, решил присоединиться к движению open source).

По поводу пожеланий и описанных багов.
В принципе, добавить вторую клавиатуру можно, подумаю над этим, уже на форуме спрашивали.
По поводу Backspace. Вероятно речь идет о ситуации "нажал и держу пока не сотру много букв". Действительно, при этом буфер портится, связано это с тем, что по какой-то причине прилетают не все сообщения о том что клавиша сработала. От паскаля это не зависит, простой тестовый слушатель, написанный на С тоже не слышит. Соответственно, корректно обработать такую ситуацию не получается. Природу такого поведения до конца выяснить не смог, поковырялся в исходниках ядра, бросил. При этом, если не зажимать, а стирать по одной букве, то все хорошо работает.
С шифтом тоже самое, если долго держать, в момент отпускания сообщение KEY_UP может не прилететь, шифт останется "нажатым", клавиатура будет фигачить капсом.
Как бы проблема присутствует, путей решения в общем-то не вижу пока, она не зависит от easy-switcher. Возникает она довольно редко, поэтому решил оставить как есть.

По поводу Ctrl. По нажатию Ctrl, Alt, PgUP, PgDown, Tab и клавиш-стрелок буфер чистится, потому что вот. Нажатия этих клавиш, или шорткатов с ними (например Ctrl+C Ctrl+V, или Ctrl-T как у автора багрепорта) приводит к тому, что положение курсора перестает соответствовать ранее напечатанному на клавиатуре тексту. Конвертация в этом случае бессмысленна, чистим буфер. Shift таким поведением не обладает, поэтому переделывать shift на ctrl пока не планирую.
« Последнее редактирование: 31 Марта 2025, 23:01:29 от freemind »

Оффлайн ivan-iv

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
в логах появляется что-нибудь когда зависает?
Неа, пустота. Так и зависает раз в 2-3 дня, не напрягает. Так же сталкивался с залипанием клавиши, описанное выше, тоже лечится перезагрузкой скрипта и происходит редко.

А вообще реально сделать переключение раскладки по двойному шифту, как в caramba switcher? Пока из всех сочетаний, это оказалось самым удобным.
« Последнее редактирование: 11 Апреля 2025, 14:08:13 от ivan-iv »

Оффлайн selarion

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Ребята, я нашел способ как использовать easy-switcher с 2 клавиатур (проверено на ubuntu 24.10). В моем случае это клавиатура ноутбука + bt-клавиатура.

Основной концепт: использовать evsieve
https://github.com/KarsMulder/evsieve
Мы хотим перенаправить ввод с 2 устройств на 1 виртуальное, которое будет слушать easy-swithcer.

Нужно
1. Установить Rust/Cargo
2. Скачать/собрать/установить evsiev
3. Запустить evsieve через systemctl
4. Настроить easy-switcher на новое устройство.

1. Тут, я думаю, вы сами справитесь. https://www.rust-lang.org/tools/install
Проверка: rustc --verion
2. Установка описана на гитхабе.
Проверка:
sudo evsieve --input /dev/input/event* --printПонажимайте клавиши - в терминале должны отображаться. Заодно зафиксируйте конкретно ваши номера input**, В моем случае это input3 и input14.

3. Тут важное!
Я проверял работу через терминал командой
sudo evsieve --input /dev/input/event3 grab --input /dev/input/event14 grab --output create-link=/dev/input/by-path/virtual_kb
И она успешно вывела сигналы с устройства по адресу ../by-path/virtual_kb

Но когда я начал настраивать systemctl и создал
sudo nano /etc/systemd/system/evsieve.service
с содержимым
[Unit]
Description=Evsieve keyboard redirect

[Service]
ExecStart=/usr/local/bin/evsieve \
--input /dev/input/event3 grab \
--input /dev/input/event14 grab \
--output create-link=/dev/input/by-path/virtual_kb

[Install]
WantedBy=multi-user.target

то при прослушивание через п.2 вывелось, что сигнал идет от устройства event17. Не знаю почему - может мне кто объяснит. Может как-то связано с root-пользователем?

4. Настроил клавишу переключения языка стандартно. Затем заменил в /etc/easy-switcher/default.conf устройство ввода на event17.
Не забудьте после этого перезапустить
sudo systemctl restart easy-switcher.service
P.s. Еще раз спасибо автору. Пост потеряет актуальность, если он когда-нибудь добавит эту функциональность "из коробки". Evsieve (по словам автора) может вводить задержку до 0.15с. Так что геймеры (гейминг на убунте is real, спасибо steam-proton) немного нервничают.
« Последнее редактирование: 13 Апреля 2025, 08:06:19 от selarion »

Оффлайн freemind

  • Автор темы
  • Участник
  • *
  • Сообщений: 200
    • Просмотр профиля
номера устройств /dev/input/event* в системе могут меняться, при создании/добавлении новых устройств.
вы можете прописать /dev/input/by-path/virtual_kb в default.conf, тогда номер устройства будет не важен.
easy-switcher в таком случае должен стартовать после evsieve, в юнит-файле /usr/lib/systemd/system/easy-switcher.service можно прописать:

[Unit]
After=evsieve.service
Requires=evsieve.service

не проверял, но думаю это должно работать

Оффлайн selarion

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Да, спасибо большое. Как раз столкнулся с этой сложностью и немного затупил, не найдя easy-switcher.service в /etc/systemd/system/easy-switcher.service.

Соответственно к своему посту выше добавлю:
Чтоб обойти сложность с динамическим event* для подключаемых устройств можно сделать симлинк.

1. Опеределить имя подключаемого устройства:
cat /proc/bus/input/devicesВ моем случае "M71 5.0  Keyboard"

2. Созздать правило подключаемоего устройства
sudo nano /etc/udev/rules.d/99-bt-keyboard.rules
С содержимым
Цитировать
SUBSYSTEM=="input", ATTRS{name}=="M71 5.0  Keyboard", SYMLINK+="input/by-path/bt-keyboard"

3. Перезагружаем правила
```
sudo udevadm control --reload-rules
sudo udevadm trigger
```
Получаем сссылку /dev/input/by-path/bt-keyboard. Можно проверить с помощью
sudo evsieve --input /dev/input/by-path/bt-keyboard --print
4. Меняем конфигурации
sudo nano /etc/systemd/system/evsieve.service (делаем --input на новую ссылку, --output я сделал на event60 (с потолка)
sudo nano /usr/lib/systemd/system/easy-switcher.service)

Цитировать
[Unit]
Description=Easy Switcher - keyboard layout switcher
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/easy-switcher -r
Restart=always
RestartSec=3
StartLimitBurst=10
#User=easy-switcher

[Install]
WantedBy=multi-user.target

[Unit]
After=evsieve.service
Requires=evsieve.service

Пока работает, вроде не отвалилось.

P.s. Если автор хочет, я могу попробовать собрать это все в .md документ, чтобы добавить в репозиторий easy-switcher
« Последнее редактирование: 15 Апреля 2025, 22:10:12 от selarion »

 

Страница сгенерирована за 0.021 секунд. Запросов: 22.