Linux 用の Punto Switcher の新しい類似物: xswitcher

xneur のサポート終了により、この XNUMX か月間、少し痛みを感じました。 (デスクトップに OpenSUSE 15.1 が登場して以来: xneur を有効にすると、Windows がフォーカスを失い、キーボード入力に合わせておかしなちらつきが発生します).

「ああ、くそー、また間違ったレイアウトで入力し始めた」 - 私の仕事では、このようなことが卑猥に頻繁に起こります。 そしてプラスを追加しません。

Linux 用の Punto Switcher の新しい類似物: xswitcher
同時に、私は(設計エンジニアとして)自分が望むものを非常に明確に表現できます。 そして、私が欲しかったのは (最初は Punto Switcher から、次に Windows Vista のおかげで、最終的には xneur から Linux に切り替えました) まさに XNUMX つでした。 ゴミ箱画面のレイアウトが間違っていることに気づき (これは通常、新しい単語を入力した最後に起こります)、「一時停止/中断」を踏み込みます。 そして、入力した内容を取得します。

現時点では、この製品は (私の観点から見て) 機能と複雑さの比率が最適です。 共有する時が来ました。

TL.DR

あらゆる種類の技術的な詳細が続きますので、最初に - リンク「触れる」 せっかちな人のために。

現在、次の動作はハードコードされています。

  • 「一時停止/中断」: 最後の単語をパッド (バックスペース) し、アクティブなウィンドウのレイアウト (0 と 1 の間) を切り替えて、再度入力します。
  • 「何もせずに Ctrl キーを押したままにする」: アクティブなウィンドウのレイアウトを切り替えます (0 と 1 の間)。
  • 「何もせずに左シフト」: アクティブなウィンドウでレイアウト #0 をオンにします。
  • 「何もせずに右シフト」: アクティブなウィンドウでレイアウト #1 をオンにします。

今後は挙動をカスタマイズしていきたいと思います。 フィードバックがないと面白くない(とにかく私には合っている)。 ハブレには、同じような問題を抱えている視聴者が十分な割合でいると私は信じています。

N.B. なぜなら現在のバージョンでは、キーロガーは「/dev/input/」に接続されているため、xswitcher は root として実行する必要があります。

chown root:root xswitcher
chmod +xs xswitcher

ご注意ください: suid を持つファイルの所有者は root である必要があります。 所有者は誰ですか - そのsuidの中で、起動時に変わります。

パラノイア(私も例外ではありません)は、以下からクローンを作成できます。 GIT そして現場で回収します。 そのように:

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

好みに応じて autorun を追加します (DE に応じて)。

動作し、「お粥を要求しません」(30 日あたり CPU で約 12 秒、RSS で約 XNUMX MB)。

細部

さて、詳細です。

もともとリポジトリ全体が私の大好きなプロジェクト専用だったので、別のプロジェクトを始めるのが面倒です。 したがって、すべてが(フォルダーにのみ)積み重ねられ、AGPL(「逆の特許」)で覆われます。

xswitcher コードは golang で書かれており、最小限の C が含まれており、このアプローチは (今のところ) 最小限の労力で済むと考えられています。 cgo を通じて失われたものを繋ぐ能力を保持します。

コメントはテキスト内に配置され、どこから借用したのか、またその理由が記載されています。 なぜならxneur コードは私に「インスピレーションを与えなかった」が、それを出発点とした ロロスイッチャー.

「/dev/input/」の使用には、利点 (自動リピートで押されたキーを含むすべてが表示される) と欠点の両方があります。 短所は次のとおりです。

  • 自動繰り返し (コード「2」のイベント) は、xx による再試行とは相関しません。
  • X11 インターフェイスを介した入力を確認できません (これは、たとえば VNC の動作方法です)。
  • ルートが必要です。

一方、「XSelectExtensionEvent()」を介して X イベントをサブスクライブできます。 覗くことができます xinputコード。 go の場合、そのようなものは見つかりませんでした。ドラフト実装では、外出先で XNUMX 行の C コードが必要でした。 とりあえず、それは脇に置いておいてください。

「戻る」という結論は、仮想キーボードをねじ込むことによって行われます。 keybd_event の作者に感謝しますが、高度な抽象化が多すぎるため、さらにやり直す必要があります。 たとえば、右の Win キーを押すと 3 行目が選択されます。 そして、左側の Win のみが逆翻訳されます。

既知のバグ

  • 「複合」入力 (例: XNUMX/XNUMX) については何も知りません。 今は必要ありません。
  • 正しい Win を誤って再現します。 私の場合、アクセントの配置が崩れてしまいます。
  • わかりやすい入力解析はありません。 代わりに、Compare()、CtrlSequence()、RepeatSequence()、SpaceSequence() といういくつかの関数があります。 感謝 nsmcan 注意: コードとここで修正されました。 交換時に一定確率でバグを掴むことができます。
    この場所では「方法」がわかりませんが、何か提案があれば喜んでさせていただきます。
  • (ああ、神様) チャネル (keyboardEvents、miceEvents) の同時使用。

まとめ

コードは最も単純な手続き型です。 そして私と同じように愚かです。 したがって、私は、ほぼすべての技術者が望むものを完成させることができるという希望を持って自分を慰めています。 このため、この製品は、ほとんどのただの遊びのように、サポートなしで消滅することはありません。

頑張ってください!

出所: habr.com

コメントを追加します