Вирішення проблеми з перемиканням по alt+shift на Linux, у додатках на Electron

Вітаю колеги!

Хочу поділитися поділитися своїм вирішенням проблеми, яка вказана у заголовку. Написанням статті надихнувся від колеги 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+shift на Linux, у додатках на Electron

Після цього перестав працювати 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. І я хочу, щоб працювало саме так. Якщо Ви поділяєте мою думку і зіткнулися з цією проблемою, ця стаття має допомогти Вам.

Джерело: habr.com

Додати коментар або відгук