xneur のサポート終了により、この 6 か月間、私はかなりの苦痛を感じてきました。 (デスクトップに OpenSUSE 15.1 が導入されて以来、xneur を有効にすると、ウィンドウがフォーカスを失い、キーボード入力に合わせてコミカルにちらつきます).
「ああ、しまった、また間違ったレイアウトで入力し始めた」 – 私の仕事ではこれが頻繁に起こります。そして、それは何のプラスにもなりません。

同時に、私(設計エンジニアとして)は自分が何を望んでいるのかをかなり明確に表現できます。そして、私が望んでいたのは(最初は Punto Switcher から、そして、 Windows ビスタはついに Linux(xneur から)正確に 1 つ。画面上の意味不明な文字が間違ったレイアウトになっていることに気づいたら(これは通常、新しい単語を入力し終えたときに起こります)、「一時停止/中断」をタップします。すると、入力していた内容が表示されます。
現時点では、この製品は(私の観点から)最適な機能性と複雑さの比率を備えています。共有する時間です。
TL;DR
技術的な詳細は後ほど説明しますので、まずは せっかちな人向け。
現在、次の動作はハードコードされています。
- 「一時停止/中断」: 最後の単語をバックスペースし、アクティブ ウィンドウのレイアウトを切り替えて (0 と 1 の間)、再度入力します。
- 「何も押さずに左 Ctrl」: アクティブ ウィンドウのレイアウトを切り替えます (0 から 1 の間)。
- 「何もせずに左シフト」: アクティブ ウィンドウでレイアウト #0 をオンにします。
- 「何もせずに右シフト」: アクティブ ウィンドウでレイアウト #1 をオンにします。
これから動作をカスタマイズしていく予定です。フィードバックがなければ面白くない(私はそれで満足です)。 Habr には同様の問題を抱える視聴者が十分な割合で存在すると私は信じています。
N.B. 現在のバージョンではキーロガーが「/dev/input/」に接続されているため、xswitcher はルート権限で起動する必要があります。
chown root:root xswitcher
chmod +xs xswitcherご注意ください: suid を持つファイルの所有者は root である必要があります。これは、所有者が誰であっても、起動時に suid に変換されるためです。
パラノイア(私も例外ではない)はクローンできる 現地で組み立てます。次のようなものです:
go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"
### X11 headers for OpenSUSE/deb-based
zypper install libX11-devel libXmu-devel
apt-get install libx11-dev libxmu-dev
cd "x switcher/src/"
go build -o xswitcher -ldflags "-s -w" --tags static_all src/*.go
好みに応じて自動起動を追加します(DE によって異なります)。
問題なく動作します (30 日あたり ≈12 CPU 秒、RSS で ≈XNUMX MB)。
細部
それでは詳細を説明します。
リポジトリ全体はもともと私のお気に入りのプロジェクト専用だったため、別のプロジェクトを始めるのは面倒です。つまり、すべてが(フォルダーに)まとめられ、AGPL(「逆特許」)によって保護されることになります。
xswitcher コードは、C が最小限含まれた golang で書かれています。このアプローチは、労力を最小限に抑えられると期待されています (そして、これまでのところその通りです)。欠けているものを cgo 経由で接続する機能を維持しながら。
本文には、何をどこから借りたのか、その理由についてのコメントが添えられています。 xneurのコードは私に「インスピレーションを与えなかった」ので、私はそれを出発点として採用しました .
「/dev/input/」を使用すると、利点(自動繰り返しで押されたキーを含むすべてが表示される)と欠点の両方があります。欠点は次のとおりです。
- 自動繰り返し (コード「2」のイベント) は、X による繰り返しとは相関しません。
- X11 インターフェイス経由の入力は表示されません (たとえば、これが VNC の動作方法です)。
- ルートが必要です。
一方、「XSelectExtensionEvent()」を介して X イベントをサブスクライブすることもできます。ちょっと覗いてみましょう 。 Go では同様のものは見つからず、大まかな実装ですぐに 100 行の C コードが生成されました。とりあえず置いておきます。
「戻る」出力は現在、仮想キーボードを接続することによって行われます。 keybd_event の作者に感謝しますが、そこでの抽象化はあまりにも高レベルなので、さらにやり直す必要があります。たとえば、私の場合、右の Win キーを押すと 3 行目が選択されます。そして、左のWinのみが返送されます。
既知の問題
- 「複合」入力 (例: ½) については何もわかりません。 今は必要ありません。
- 正しい Win キーを正しく再現していません。私の場合、アクセントの配置が崩れてしまいます。
- 入力の明確な解析はありません。代わりに、Compare()、CtrlSequence()、RepeatSequence()、SpaceSequence() などの関数がいくつかあります。 感謝 ご注意ください: コードとここで修正しました。 交換時にバグが発生する可能性が一定数あります。
現時点では「どうあるべきか」は分かりませんが、何かご提案があればいただければ幸いです。 - (ああ、恐ろしい) チャネルの同時使用 (keyboardEvents、miceEvents)。
まとめ
コードは最も単純な手続き型です。 そして私と同じくらい愚かです。 だから私は、技術者なら誰でも、自分が書きたいものを書き終えることができるだろうという希望で自分を慰めているのです。そして、このおかげで、この製品は、ほとんどの娯楽目的の製品のようにサポートなしで消滅することはありません。
頑張ってください!
出所: habr.com
