Здравствуйте, коллеги!

Хочу поделиться поделиться своим решением проблемы, которая указана в заголовке. Написанием статьи вдохновился от коллеги 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, без каких-либо дополнительных нажатий.

image

После этого перестал работать Alt+Tab для переключения окон. Работал только Tab, то есть кто-то снова «съедал» мой Alt. Кто этот «кто-то» вопросов уже не оставалось, а вот что с ним можно сделать я понятия не имею.

Но так как проблему решать было нужно хоть как-то, тогда в голову и пришло решение:

  1. В настройках отключить хоткей для переключения раскладки клавиатуры (снять все чекбоксы в разделе Switch to another layout);
  2. Создать свой хоткей, который бы переключал мне раскладку

Описание решения


Для начала установим программу, позволяющую назначать команды клавишам 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. И я хочу чтобы работало именно так. Если Вы разделяете моё мнение и столкнулись с данной проблемой, эта статья должна Вам помочь.

Комментарии (45)


  1. Shtucer
    22.11.2019 12:05

    Решение проблем с переключением по Alt+Shift — переключение по Caps.


    setxkbmap -query                                                                                                                       
    rules:      evdev
    model:      pc105
    layout:     us,ru
    options:    terminate:ctrl_alt_bksp,grp:caps_toggle,grp_led:caps,grp:caps_toggle
    


    1. censor2005
      22.11.2019 12:10

      В вышеприведенном скриншоте также есть возможность настроить переключение по Caps Lock. Чем, собственно, и пользуюсь


    1. deitry
      22.11.2019 12:42
      +2

      На правах анекдота. Не пользовался капсом по исходному назначению несколько лет. В последнее время возникла потребность в редактировании bash-скриптов, CMake-конфигов и прочих Dockerfile'ов. И тут я обнаружил как удобно нажать один раз капс и спокойно вводить имена env-переменных (ну, за исключением символа '_') одной рукой, а в то же время с помощью другой продолжать жрать булочку!!


      1. Shtucer
        22.11.2019 13:05

        Shift-Caps включает-выключает искомую функцию. Без отрыва от булочек.


      1. Metotron0
        22.11.2019 18:42

        По моему ощущению, меньше нервов уходит, когда доешь булочку, помоешь руки и с комфортной скоростью наберёшь всё, что требуется, двумя руками.


  1. bvn13
    22.11.2019 12:19

    Эта проблема наблюдается не только на Electron-based приложениях. Этим грешит сам X11. И проблемы кратковременной потери фокуса наблюдаются не только при Alt+Shift комбинациях. При любых настройках смена раскладки клавиатуры уводит на доли секунды фокус с поля ввода. Как же меня бомбануло, когда я начал пользоваться tabsbook плагином для хранения заметок в браузере… В нем нужно вписать теги в pop-up окошке, которое… закрывается при уводе фокуса! Т.е. теги на двух языках вписать попросту нельзя.


    Эта проблема иксов висит багом уже несколько лет… Сейчас лень гуглить. Емнип, с 2008 года. И эту проблему решает (неожиданно) Wayland!


    1. eumorozov
      22.11.2019 13:30

      Это не проблема X11. Это проблема Ubuntu и прочих дистрибутивов, которые перешли на переключение языка при помощи gtk-im (не помню как точно называется) — то есть на стороннее гномовское криворукоподелие. И баги соответствующие уже заведены в багтрекерах уже более 10 лет, но воз и ныне там.


      Как раз X переключает языки моментально (в gtk-im есть ощутимая задержка, при быстрой печати можно еще успеть один-два символа в старой раскладке напечатать, это тоже раздражает) и без потери фокуса.


      И решается все просто, без всяких макросов: выкидывается gtk-im и используется стандартное переключение раскладок X. Как именно это делается уже не подскажу, так как давно ушел со всяких гномообразных DE на dwm. А в X11 настройка выглядит так:


      Section "InputClass"
                      Identifier "system-keyboard"
                      MatchIsKeyboard "on"
                      Option "XkbLayout" "us,ru"
                      Option "XkbModel" "pc105"
                      Option "XkbVariant" "os_winkeys"
                      Option "XkbOptions" "grp:caps_toggle,compose:ralt"
      EndSection

      Переключение по CapsLock, Compose Key (для различных спецсимволов типа кавычек-ёлочек) на правом Alt.


      1. Andrusha
        22.11.2019 14:12
        +1

        1. eumorozov
          22.11.2019 14:16

          Значит я неверно понял проблему, так как каждый раз боролся с глюками и тормозами gtk-im в Ubuntu, и с каждым релизом ожидал, что они, наконец, исправят хотя бы пропажу фокуса.


        1. cryoz
          25.11.2019 11:27

          Если пролистать обсуждение по ссылке до конца, можно наткнуться на неофициальный патч (PPA), портированный под последние убунту-образные дистрибутивы. В частности, у меня на Mint 19.2 MATE сработал отлично, проблема, поднятая в статье, решилась без сторонних утилит.


  1. Revertis
    22.11.2019 13:05

    Это называется «придумываем себе проблему, потом героически её решаем». Просто для переключения языков надо пользоваться модификаторами, которые при одиночном нажатии не меняют состояние программ. Эта комбинация выглядит так — Ctrl+Shift. Не благодарите.


    1. dmitryredkin
      22.11.2019 14:13

      А вы как думаете, почему при переходе на Windows 95 Microsoft поменяла дефолтную комбинацию на Left Alt + Shift?
      Потому что Ctrl + Shift конфликтует с выделением по словам во всех текстовых редакторах.


    1. webhead
      22.11.2019 20:59

      Переключение по Ctrl+Shift в Firefox'е порождает аналогичные проблемы. Точнее — срабатывает во всплывающих окнах (Pocket, Lastpass) как Enter, очень напрягает.


      1. Revertis
        22.11.2019 21:07
        -2

        Нет, у меня не срабатывает, проверил.
        Вынь10 и Ctrl+Shift переключение языков.


        1. webhead
          22.11.2019 21:09

          Я под Ubuntu 19.10, а к такому сочетанию наглухо привык и не могу избавиться, т.к. с окошек полностью ушел только пару лет назад.


          1. Revertis
            22.11.2019 21:17
            -1

            Ну чините ваши линуксы, код открыт :)
            Детские болезни, я смотрю, никуда не деваются уже десятки лет. Как были проблемы с обработкой нажатий клавиш в далёком 2004-ом, например, так и продолжаются до сих пор.


            1. webhead
              22.11.2019 21:18
              +1

              Спасибо, и вам не скучать! ;)


  1. oam2oam
    22.11.2019 13:12

    Действительно, последние… 30 лет никогда не испытывал проблемы, описанной в статье — просто надо использовать CapsLock… и всё.


    1. petuhov_k
      24.11.2019 05:47

      Только его тоже надо настраивать. В старых убунтах это делалось через какой-то конфиг, сейчас уже не вспомнить и не взгуглить. В новых появилось возможность настраивать через гуй, и работает это очень плохо, либо не работает вообще в зависимости от дистрибутива.


  1. kolu4iy
    22.11.2019 13:28

    Спасибо. Я придерживаюсь вашей точки зрения — ОС для человека, а не наоборот. Мне тоже дешевле один раз перенастроить.


  1. prostofilya
    22.11.2019 14:47

    Не замечал этой проблемы, хотя и часто работаю в vscode. Проверил, баг есть, manjaro i3. Но, всё работает нормально если первым нажимать shift.


    1. Shtucer
      22.11.2019 15:01

      Потому что Alt активирует меню. Спасибо кэпу внтури меня.


      1. Revertis
        22.11.2019 15:11
        -1

        Альт активирует меню при нажатии? Ведь он должен делать это при отжатии.


        1. Punk_Joker
          22.11.2019 15:22

          Обычно пользователь ожидает событие при нажатии, а не отжатии. Приходилось писать ГУИ и учитывать именно подобное ожидние пользователя.


          1. Revertis
            22.11.2019 15:40
            -2

            А, так вот, кто пишет неправильные GUI!
            Клик ведь в нормальных GUI состоит из нажатия и отжатия.


          1. Danil1404
            23.11.2019 04:40

            Обычно пользователь ожидает событие при нажатии, а не отжатии
            Не знаю, где вы нашли пользователей, которые ожидают события по keydown.
            Я всегда ожидаю события только по keyup, и очень удивляюсь, когда вдруг в каких-то редких программах натыкаюсь на действия, вызванные событием зажатия клавиши. Неприятно удивляюсь.
            Исключение, конечно, составляю процессы, которые требуют удержания клавиши, начинающиеся в момент зажатия и заканчивающиеся в момент отжатия.

            Вы пишете какое-то специфическое программное обеспечение?


        1. Shtucer
          22.11.2019 16:55

          А вот перепроверил… и вправду по отжатию.


  1. sborisov
    22.11.2019 20:44

    У меня с последним обновление — в скайпе проблемы пропали, но появились в slack-е.


  1. sborisov
    22.11.2019 20:46

    Кстати если нажимать сначала shift и потом alt проблемы нет


  1. Shtucer
    22.11.2019 21:47

    Как видно из примера она умеет только включать ту или иную раскладку, поэтому ничего кроме написания скрипта мне в голову не пришло.

    А вы попробуйте kbdd оно прицепом умеет полезную вещь: запоминать раскладку для конкретного окна.


  1. rinnaatt
    23.11.2019 09:25

    Была такая проблема, перешёл на переключение раскладки по Win+Space.


    1. AlexanderRS
      23.11.2019 11:08
      +1

      Win+space дает похожие проблемы, например в Firefox: теряется фокус в некоторых формах ввода


      1. shaggyone
        24.11.2019 20:05

        Коллега в своё время подсказал 2 шрифта. Полтора года пользуюсь, удобно.


  1. krad213
    23.11.2019 14:45

    В какой-то момент понял, что проще переучиться на win+space, оно вроде как стандарт теперь, работает как в винде, так и во всех ubuntu-based дистрибутивах.


  1. kostia256
    23.11.2019 14:45
    +1

    Если ничего не напутал, то это связано с багой 865. Для Arch Linux есть пакет в aur исправляющий её.
    Раньше пользовался ctrl+shift комбинацией для переключения раскладки, но переучил себя на win+space


  1. ZillahGiovanni
    23.11.2019 14:45

    Не пробовали переключаюсь по Shift+Alt? (это не сарказм, просто Alt отпускается раньше Shift).
    Была у меня похожая проблема в Windows, некоторые приложения по Alt «подсвечивали меню» и переключали фокус…



  1. Jipok
    23.11.2019 14:45

    Попробуйте выполнить

    setxkbmap -layout us -option; setxkbmap -layout «us,ru» -option grp:alt_shift_toggle

    Как мне кажется проблема в вашем оконном менджере или ещё какой-то программе берущей на себя переключение раскладки. Сами иксы такой проблемой вроде не страдают.
    Проверил у себя с vscode, переключается без проблем.

    P.S. Сам переключаю раскладку по правой клавише win(она же meta)


  1. axilirator
    23.11.2019 22:44

    У данного подхода есть интересная особенность. Я привык после переключения языка (Alt + Shift) держать Shift зажатым, если мне, например, нужно начать предложение с заглавной буквы. Так вот, после смены языка Shift хоть и остается заглявным, но не влияет на регистр символов. Приходится отпускать и зажимать снова. Кто-нибудь сталкивался с подобным?


    1. Jipok
      23.11.2019 23:27

      Попробуйте переключать по Shift + Alt


  1. Shaz
    23.11.2019 23:06

    Я словив этот баг просто обновился до 19.10 убунты...


  1. mpakep
    24.11.2019 04:55

    Всегда рекомендовал пользоваться разными клавишами для переключения раскладок. Первое время не удобно, но когда привыкаешь дает отличный прирост в скорости. Не отвлекаешься каждый раз на проверку какая текущая раскладка включена. Жмешь нужное сочетание и знаешь что включена нужная раскладка.

    image


  1. AndrewAnswer00
    24.11.2019 19:24

    У меня уже много лет Ctrl+Shift, ещё с Windows 95. И вот на Ubuntu 18.04 я впервые обнаружил, что Ctrl+Shift И Shift+Ctrl — это теперь РАЗНЫЕ комбинации. Например, в PHPStorm Shift+Ctrl+F открывает окно поиска, а Ctrl+Shift+F… ну да, переключает раскладку. Пришлось некоторое время потренироваться, но в итоге привык, и теперь так и живу.


    1. mpakep
      25.11.2019 00:04

      Ctrl+Shift И Shift+Ctrl — это теперь РАЗНЫЕ комбинации
      Это же гениально. Десять лет сижу на линуксе и не знал что они разные. Возможно не было хорошего повода разобраться, а сам как то даже допустить не мог подобного. Было бы хорошим решением сделать Ctrl+Shift — первая раскладка а Shift+Ctrl — вторая. Кто нибудь так делал?


  1. Fragster
    25.11.2019 12:08

    Проблема всегда была в том, что в линуксах комбинация срабатывает по кейдаун, а в винде — по кейап.