Řešení problému se přepínáním pomocí alt+shift v Linuxu, v aplikacích na Electron

Dobrý den, kolegové!

Chtěl bych se podělit o své řešení problému, který je uveden v nadpisu. Napsání článku mě inspiroval kolega brnovk, který si dal tu práci a navrhl částečné (pro mě) řešení. Udělal jsem svůj „hack“, který mi pomohl. Dělím se s vámi.

Popis problému

Používal jsem Ubuntu 18.04 k práci a v poslední době jsem si všiml, že při přepínání rozložení pomocí alt+shift v takových aplikacích, jako jsou Visual Studio Code, Skype, Slack a dalších, které byly vytvořeny pomocí Electron, se objevil následující problém: fokus se přesune z pole pro vstup k hornímu panelu okna (menu). Z jiných důvodů jsem přešel na Fedora + KDE a zjistil jsem, že problém nikam nezmizel. V hledání řešení jsem našel skvělý článek Oprava Skype vlastníma rukama. Obrovské díky kolegovi brnovk, že podrobně popsal problém a podělil se o svůj způsob jeho řešení. Avšak uvedený v článku způsob řešil problém pouze s jednou aplikací, konkrétně se Skypem. Pro mě bylo také kritické vyřešit problém s Visual Studio Code, protože psaní zpráv s poskakujícím menu, i když je to nepříjemné, není tak silné, pokud se věnujete vývoji. Navíc kolega navrhl řešení, při kterém menu aplikace úplně zmizí, a já bych nechtěl ztratit menu ve VS Code.

Snažil jsem se pochopit, v čem je problém.

Takže jsem se rozhodl věnovat čas a zjistit, v čem je problém. Nyní stručně popíšu, jakou cestou jsem šel, možná někdo, kdo má více znalostí v této záležitosti, pomůže objasnit ty obtíže, se kterými jsem se setkal.

Otevřel jsem Visual Studio Code a začal jsem stisknout různá kombinace Alt+, sledujíc reakci aplikace. Prakticky ve všech případech fungovaly všechny kombinace kromě Alt+Shift bez ztráty fokusu. Mělo to za následek, že jsem měl dojem, že někdo „sežral“ stisknutý Shift, který následoval po stisku a držení Alt, a aplikace si myslela, že jsem stiskl Alt, pak nic nestiskl, pustil Alt a ona radostně přehazovala můj fokus do svého menu, což jí připadalo zcela logické.

Otevřel jsem nastavení přepínání rozložení klávesnice (víte, ten dlouhý seznam zaškrtávacích políček a různých nastavení pro klávesy) a nastavil jsem přepínání rozložení na klávesu Alt, bez jakýchkoli dalších stisknutí.

Řešení problému se přepínáním pomocí alt+shift v Linuxu, v aplikacích na Electron

Po této změně přestala fungovat klávesová zkratka Alt+Tab pro přepínání oken. Fungoval pouze Tab, což znamená, že mi někdo znovu „ukradl“ Alt. Kdo je ten „někdo“ už nebylo žádných otázek, ale nevěděl jsem, co s ním lze udělat.

Ale protože bylo potřeba problém nějak řešit, napadlo mě řešení:

  1. V nastavení deaktivovat klávesovou zkratku pro přepínání rozložení klávesnice (zrušit všechna zaškrtávací políčka v sekci Přepnout na jiné rozložení);
  2. Vytvořit si vlastní klávesovou zkratku, která by mi přepínala rozložení.

Popis řešení

Nejdříve nainstalujeme program, který umožňuje přiřazovat příkazy klávesám, Xbindkeys. Bohužel, vestavěné nástroje mi nedovolily vytvořit klávesovou zkratku pro kombinaci jako Alt+Shift přes krásné rozhraní. Lze ji vytvořit pro Alt+S, Alt+1, Alt+Shift+Y atd., ale to není pro náš účel vhodné.

sudo dnf install xbindkeysrc

Podrobněji o tom najdete na ArchWiki
Dále vytvoříme vzor konfiguračního souboru pro program. Vzor je poměrně krátký, s několika příkazy, což je právě to, co potřebuji, abych se naučil, jak s ním pracovat:

xbindkeys -d > ~/.xbindkeysrc

Jak je vidět z příkladu, který je v souboru, musíme uvést klávesovou zkratku, kterou chceme použít, a příkaz, který má být vykonán. Vypadá to jednoduše.


# Examples of commands:
"xbindkeys_show"
  control+shift + q
# set directly keycode (here control + f with my keyboard)
"xterm"
  c:41 + m:0x4

Jako klávesovou zkratku lze použít srozumitelné psaní nebo použít kódy kláves. U mě fungoval pouze s kódy, ale nikdo vám nezakazuje trochu experimentovat.

Abych získal kódy, je třeba použít příkaz:

xbindkeys -k

Otevře se malé „Xové“ okno. Klávesy stiskněte pouze, pokud je toto okno aktivní! Pouze v tomto případě uvidíte v terminálu něco takového:


[podkmax@localhost ~]$ xbindkeys -k
Stiskněte kombinaci kláves nebo/ a klikněte pod oknem.
Můžete použít jeden z dvou řádků po 'NoCommand'
v $HOME/.xbindkeysrc pro přiřazení klávesy.
"(Funkce schématu)"
    m:0x4 + c:39
    Control + s

V mém případě kombinace kláves Alt+Shift vypadá takto:

m:0x8 + c:50

Nyní je třeba zajistit, aby při stisknutí této kombinace skutečně došlo k přepínání rozložení. Našel jsem pouze jeden funkční příkaz pro určení rozložení:


setxkbmap ru
setxkbmap us

Jak je vidět z příkladu, umí pouze přepínat určitou klávesovou rozložení, takže mě nic jiného než napsání skriptu nenapadlo.


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

Pokud tedy soubory .xbindkeysrc a layout.sh leží ve stejné složce, konečná podoba souboru .xbindkeysrc vypadá takto:


# 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

Po této změně aplikujeme změny:


xbindkeys -p

A můžeme kontrolovat. Nezapomeňte vypnout všechny možnosti přepínání rozložení v základních nastaveních.

Výsledek

Kolegové, doufám, že tento článek pomůže rychle někomu zbavit se otravného problému. Osobně jsem strávil celý víkend tím, že jsem se snažil problém pochopit a vyřešit, abych se na to už během pracovního času nemusel soustředit. Napsal jsem tento článek s cílem ušetřit někomu čas a nervy. Mnoho z vás používá alternativní způsob přepínání rozložení a nechápe, v čem je problém. Osobně se mi líbí přepínání pomocí Alt+Shift. A chci, aby to fungovalo právě tak. Pokud se s mým názorem ztotožňujete a setkali jste se s tímto problémem, měl by vám tento článek pomoci.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster