Alt+Shift による切り替えの問題を解決する Linux電子アプリケーションにおいて

こんにちは同僚!

タイトルに示された問題に対する私の解決策を共有したいと思います。この記事を書くきっかけとなったのは同僚でした。 ブルノフクは怠け者ではなく、問題の部分的な(私にとっては)解決策を提案してくれました。私は自分なりの「松葉杖」を作り、それが私を助けてくれました。それを皆さんと共有したいと思います。

問題の説明

Использовал Ubuntu 18.04 для работы и в последнее время заметил, что при переключении раскладки по alt+shift в таких приложениях, как Visual Studio Code, Skype, Slack и прочих, которые созданы с помощью Electron возникает следующая проблема: фокус с поля ввода, переходит к верхней панели окна (меню). По иным причинам переехал в Fedora + KDE и понял, что проблема никуда не делась. В поисках решения нашёл замечательную статью Skypeを自分の手で修理する友人に感謝します。 ブルノフクは、問題を詳細に説明し、解決策を共有してくれました。しかし、記事で紹介されている方法で問題が解決したのは、たった一つのアプリケーション、つまりSkypeだけでした。Visual Studio Codeの使い方も非常に重要でした。というのも、ジャンプメニューを使ってメッセージを書くのは面倒ですが、開発に携わっているならそれほどでもなかったからです。さらに、同僚がアプリケーションメニューを完全に消す解決策を提案してくれたのですが、VS Codeのメニューを失くしたくはありませんでした。

何が起こっているのか理解しようとした

そこで、何が起こっているのかをじっくりと調べてみることにしました。私が辿った道のりを簡単に説明します。もしかしたら、この件に詳しい方がいれば、私が遭遇した困難を説明してくれるかもしれません。

Visual Studio Codeを開き、Alt+<%something%>の組み合わせをいろいろ押して、アプリケーションの反応を観察しました。ほぼすべてのケースで、Alt+Shiftキー以外の組み合わせはフォーカスを失わずに動作しました。どうやら、Altキーを押したままShiftキーを押したのに誰かがそれを食いつぶしたようで、アプリケーションは私がAltキーを押したと認識し、その後何も押さずにAltキーを離すと、勝手にメニューにフォーカスを移したようでした。これはアプリケーションにとって非常に理にかなっているように思えました。

キーボード レイアウト切り替え設定 (チェックボックスとキーのさまざまな設定を含む長いリスト) を開き、追加のクリックなしでレイアウト切り替えを Alt ボタンに設定しました。

Alt+Shift による切り替えの問題を解決する Linux電子アプリケーションにおいて

その後、Alt+Tabキーでウィンドウを切り替えられなくなりました。Tabキーだけが使えるようになったので、また誰かが私のAltキーを「食べている」ということになります。この「誰か」が誰なのかはもう分かりませんが、どうすればいいのか全く分かりません。

しかし、この問題は何とか解決しなければならなかったので、ある解決策が思い浮かびました。

  1. 設定で、キーボード レイアウトを切り替えるホットキーを無効にします ([別のレイアウトに切り替える] セクションのすべてのチェックボックスをオフにします)。
  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

小さな「X」ウィンドウが開きます。このウィンドウにフォーカスを当てている間だけキーを押す必要があります。この時のみ、ターミナルに次のような画面が表示されます。


[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

次に、この組み合わせをクリックするとレイアウトが切り替わるようにする必要があります。レイアウトを指定するのに使えるコマンドは1つしか見つかりませんでした。


setxkbmap ru
setxkbmap us

例からわかるように、1 つのレイアウトまたは別のレイアウトをオンにすることしかできないため、スクリプトを記述する以外に何も思いつきませんでした。


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

DDoS 保護機能を備えた信頼性の高いサイト用ホスティング、VPS VDS サーバーを購入する 🔥 DDoS攻撃対策付きの信頼性の高いウェブサイトホスティング、VPS/VDSサーバーを購入しましょう | ProHoster