Witajcie, koledzy!
Chcę podzielić się swoim rozwiązaniem problemu opisanego w tytule. Inspiracją do napisania tego artykułu była praca kolegi. , 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ł . Ogromne dzięki koledze , 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ęć.

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:
- W ustawieniach wyłączyć skrót do przełączania układu klawiatury (odznaczyć wszystkie pola w sekcji Przełącz na inny układ);
- 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
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 > ~/.xbindkeysrcJak 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 -kOtworzy 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:50Teraz 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
