Rozwiązanie problemu z przełączaniem za pomocą alt+shift w Linuxie, w aplikacjach na Electron

Witajcie, koledzy!

Chcę podzielić się swoim rozwiązaniem problemu opisanego w tytule. Inspiracją do napisania tego artykułu była praca kolegi. brnovk, który nie zawahał się i zaproponował częściowe (dla mnie) rozwiązanie problemu. Stworzyłem swój „hack”, który mi pomógł. Dzielę się tym z wami.

Opis problemu

Używałem Ubuntu 18.04 do pracy i ostatnio zauważyłem, że przy przełączaniu układu klawiatury za pomocą alt+shift w takich aplikacjach jak Visual Studio Code, Skype, Slack i innych, stworzonych przy użyciu Electron, występuje następujący problem: fokus z pola wejściowego przechodzi na górny pasek okna (menu). Z innych powodów przeszedłem na Fedore + KDE i zrozumiałem, że problem wcale nie zniknął. W poszukiwaniu rozwiązania znalazłem wspaniały artykuł Naprawiamy Skype własnoręcznie. Ogromne dzięki koledze brnovk, który szczegółowo opisał problem i podzielił się swoim sposobem jego rozwiązania. Jednak sposób opisany w artykule rozwiązywał problem tylko w jednej aplikacji, mianowicie Skype. Dla mnie równie ważne było rozwiązanie problemu w Visual Studio Code, ponieważ pisanie wiadomości z skaczącym menu jest irytujące, ale nie tak bardzo, gdy zajmujesz się programowaniem. Co więcej, kolega zaproponował rozwiązanie, które całkowicie ukrywa menu aplikacji, a ja nie chciałem tracić menu w VS Code.

Próbowałem zrozumieć, w czym tkwi problem.

Postanowiłem, więc poświęcić trochę czasu i zgłębić temat. Teraz krótko opiszę, jakimi ścieżkami szedłem, może ktoś bardziej obeznany w tym temacie pomoże wyjaśnić trudności, z którymi się zmierzyłem.

Otworzyłem Visual Studio Code i zacząłem naciskać różne kombinacje Alt+, obserwując reakcję aplikacji. W praktycznie wszystkich przypadkach wszystkie kombinacje, oprócz Alt+Shift, działały bez utraty fokusu. Odniosłem wrażenie, że ktoś 'zjada' naciśnięty Shift, który pojawiał się po naciśnięciu i przytrzymaniu Alt, a aplikacja myśli, że nacisnąłem Alt, potem nie nacisnąłem nic, puściłem Alt i ona radośnie przenosiła mój fokus do swojego menu, co wydawało jej się całkiem logiczne.

Otworzyłem ustawienia przełączania układu klawiatury (wiecie, ten długi list z checkboxami i różnymi ustawieniami dla klawiszy) i ustawiłem przełączanie układu przyciskiem Alt, bez żadnych dodatkowych naciśnięć.

Rozwiązanie problemu z przełączaniem za pomocą alt+shift w Linuxie, w aplikacjach na Electron

Po tym przestało działać Alt+Tab do przełączania okien. Działał tylko Tab, czyli ktoś znowu "zjadał" mój Alt. Kto ten "ktoś" nie budziło już pytań, ale co z tym zrobić, nie mam pojęcia.

Jednak ponieważ trzeba było jakoś rozwiązać problem, wpadłem na rozwiązanie:

  1. W ustawieniach wyłączyć skrót do przełączania układu klawiatury (odznaczyć wszystkie pola w sekcji Przełącz na inny układ);
  2. Utworzyć swój skrót, który by przełączał mi układ

Opis rozwiązania

Na początek zainstalujemy program, który pozwoli przypisywać komendy do klawiszy Xbindkeys. Niestety, standardowe narzędzia nie umożliwiły mi przez ładny interfejs stworzenia skrótu dla kombinacji typu Alt+Shift. Można to zrobić dla Alt+S, Alt+1, Alt+shift+Y itd., ale dla naszego zadania to nie pasuje.

sudo dnf install xbindkeysrc

Szczegółowe informacje na ten temat można znaleźć na ArchWiki
Następnie utworzymy próbkę pliku konfiguracyjnego dla programu. Próbka jest dość krótka, ma kilka komend i wystarczy, aby zrozumieć, jak się nim posługiwać:

xbindkeys -d > ~/.xbindkeysrc

Jak widać w przykładzie umieszczonym w pliku, musimy wskazać skrót, którego chcemy używać, oraz komendę, która ma być wykonana. Wygląda to prosto.


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

Jako skrótu można użyć zrozumiałego zapisu lub wykorzystać kody klawiszy. U mnie działało tylko z kodami, ale nikt nie zabrania Ci trochę poeksperymentować.

Aby uzyskać kody, należy użyć komendy:

xbindkeys -k

Otworzy się małe okno „Xowe”. Klawisze należy naciskać tylko w momencie, gdy to okno ma fokus! Tylko wtedy zobaczysz w terminalu coś takiego:


[podkmax@localhost ~]$ xbindkeys -k
Naciśnij kombinację klawiszy lub kliknij pod oknem.
Możesz użyć jednej z dwóch linii po "NoCommand"
w $HOME/.xbindkeysrc, aby przypisać klawisz.
"(Funkcja schematu)"
    m:0x4 + c:39
    Control + s

W moim przypadku kombinacja dla klawiszy Alt+Shift wygląda tak:

m:0x8 + c:50

Teraz musimy zrobić tak, aby po naciśnięciu tej kombinacji nastąpiło właśnie przełączenie układu. Znalazłem tylko jedną działającą komendę do ustawienia układu:


setxkbmap ru
setxkbmap us

Jak widać z przykładu, ona potrafi tylko włączać dany układ, więc nic poza napisaniem skryptu nie przyszło mi do głowy.


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

Teraz jeśli pliki .xbindkeysrc i layout.sh znajdują się w tym samym katalogu, to ostateczna wersja pliku .xbindkeysrc wygląda następująco:


# 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 tym zastosuj zmiany:


xbindkeys -p

Możesz to przetestować. Nie zapomnij wyłączyć wszelkich opcji przełączania układów klawiatury w domyślnych ustawieniach.

Podsumowanie

Koleżanki i koledzy, mam nadzieję, że ten artykuł pomoże szybko komuś pozbyć się uciążliwego problemu. Osobiście spędziłem cały weekend, aby zrozumieć i rozwiązać problem, by nie odciągał mnie więcej podczas pracy. Napisałem ten artykuł, aby zaoszczędzić komuś czas i nerwy. Wiele osób korzysta z alternatywnego sposobu przełączania układów i nie rozumie, na czym polega problem. Osobiście wolę przełączać się za pomocą Alt+Shift. I chcę, aby to działało dokładnie w ten sposób. Jeśli podzielasz moje zdanie i napotkałeś ten problem, ten artykuł powinien Ci pomóc.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster