Здравствуйте, коллеги!
Хочу поделиться поделиться своим решением проблемы, которая указана в заголовке. Написанием статьи вдохновился от коллеги brnovk, который не поленился и предложил частичное (для меня) решение проблемы. Я сделал свой «костыль», который помог мне. Делюсь с вами.
Описание проблемы
Использовал Ubuntu 18.04 для работы и в последнее время заметил, что при переключении раскладки по alt+shift в таких приложениях, как Visual Studio Code, Skype, Slack и прочих, которые созданы с помощью Electron возникает следующая проблема: фокус с поля ввода, переходит к верхней панели окна (меню). По иным причинам переехал в Fedora + KDE и понял, что проблема никуда не делась. В поисках решения нашёл замечательную статью Чиним Skype своими руками. Огромное спасибо товарищу brnovk, что подробно рассказал о проблеме и поделился своим способом её решения. Но указанный в статье способ закрывал вопрос лишь с одним приложением, а именно Skype. Для меня ещё было критичным разобраться с Visual Studio Code, потому как писать сообщения с прыгающей менюшкой хоть и раздражает, но не так сильно если занимаешься разработкой. Плюс ко всему, коллега предложил решение, при котором меню приложения пропадает полностью, а мне бы не очень хотелось потерять меню в VS Code.
Пытался понять в чём дело
Итак, я решил выделить время и разобраться в чём дело. Сейчас кратко опишу каким путём я шёл, может быть кто-то более подкованный в данном вопросе поможет разъяснить те трудности, с которыми я столкнулся.
Я открыл Visual Studio Code и начал нажимать на разные сочетания Alt+<%что-нибудь%>, смотря на реакцию приложения. Практически во всех случаях все комбианции, кроме Alt+Shift отрабатывали без потери фокуса. Складывалось впечатление, что кто-то съедает нажатый Shift, который следовал после зажатия и удержания Alt и приложение думает что я нажал Alt, потом не нажал ничего, отпустил Alt и оно радостно бросало мой фокус в своё меню, что ему казалось вполне логичным.
Я открыл настройки переключения раскладки клавиатуры (ну знаете вот этот вот длинный список с чекбоксами и всевозможными настройками для клавиш) и установил переключение раскладки по кнопке Alt, без каких-либо дополнительных нажатий.
После этого перестал работать Alt+Tab для переключения окон. Работал только Tab, то есть кто-то снова «съедал» мой Alt. Кто этот «кто-то» вопросов уже не оставалось, а вот что с ним можно сделать я понятия не имею.
Но так как проблему решать было нужно хоть как-то, тогда в голову и пришло решение:
- В настройках отключить хоткей для переключения раскладки клавиатуры (снять все чекбоксы в разделе Switch to another layout);
- Создать свой хоткей, который бы переключал мне раскладку
Описание решения
Для начала установим программу, позволяющую назначать команды клавишам Xbindkeys. К сожалению, штатные средства не позволили мне через красивый интерфейс создать хоткей для сочетания типа Alt+Shift. Можно сделать для Alt+S, Alt+1, Alt+shift+Y и т.д. и т.п., но для нашей задачи это не подходит.
sudo dnf install xbindkeysrc
Более подробно про неё есть на ArchWiki
Далее создадим образец файла настроек для программы. Образец довольно короткий, с несколькими командами как раз то, что нужно чтобы разобраться как с ним работать:
xbindkeys -d > ~/.xbindkeysrc
Как видно из примера, который находится в файле, нам нужно указать хоткей, который мы хотим использовать и комманду, которая должна исполнится. Выглядит просто.
# Examples of commands:
"xbindkeys_show"
control+shift + q
# set directly keycode (here control + f with my keyboard)
"xterm"
c:41 + m:0x4
В качестве хоткея можно использовать человекопонятное написание или использовать коды клавиш. У меня сработало только с кодами, но никто не запрещает Вам немного поэксперементировать.
Чтобы получить коды нужно использовать команду:
xbindkeys -k
Откроется маленькое «Иксовое» окно. Нажимать клавишы нужно только при фокусе на это окно! Только в этом случае Вы увидите в терминале что-то такое:
[podkmax@localhost ~]$ xbindkeys -k
Press combination of keys or/and click under the window.
You can use one of the two lines after "NoCommand"
in $HOME/.xbindkeysrc to bind a key.
"(Scheme function)"
m:0x4 + c:39
Control + s
В моём случае комбинация для клавиш Alt+Shift выглядит вот так:
m:0x8 + c:50
Теперь нужно сделать так, чтобы при нажатии на эту комбаницию, происходило именно переключение раскладки. Я нашёл только одну рабочую комманду для указания раскладки:
setxkbmap ru
setxkbmap us
Как видно из примера она умеет только включать ту или иную раскладку, поэтому ничего кроме написания скрипта мне в голову не пришло.
vim ~/layout.sh
#!/bin/bash
LAYOUT=$(setxkbmap -print | awk -F + '/xkb_symbols/ {print $2}')
if [ "$LAYOUT" == "ru" ]
then `/usr/bin/setxkbmap us`
else `/usr/bin/setxkbmap ru`
fi
Теперь если файлы .xbindkeysrc и layout.sh лежат в одной директории, то конечный вид файла .xbindkeysrc выглядит так:
# Examples of commands:
"xbindkeys_show"
control+shift + q
# set directly keycode (here control + f with my keyboard)
"xterm"
c:41 + m:0x4
# specify a mouse button
"xterm"
control + b:2
#А вот то, что добавил я
"./layout.sh"
m:0x8 + c:50
После этого применяем изменения:
xbindkeys -p
И можно проверять. Не забудьте отключить любые опции по переключению раскладки в штатных настройках.
Итог
Коллеги, надеюсь что данная статья сможет помочь быстро кому-то избавиться от назойливой проблемы. Лично я потратил весь свой выходной на то, чтобы разобраться и решить проблему хоть как-то, чтобы больше не отвлекаться на это в рабочее время. Написал данную статью с целью сэкономить кому-то время и нервы. Многие из Вас используют альтернативный способ переключения раскладки и не понимают в чем же проблема. Мне лично нравится переключаться по Alt+Shift. И я хочу чтобы работало именно так. Если Вы разделяете моё мнение и столкнулись с данной проблемой, эта статья должна Вам помочь.
Автор: podkmax