私のバイナリが Linux のグローバル ホットキーに反応する方法はありますか?

StackOverflow https://stackoverflow.com/questions/74790

  •  09-06-2019
  •  | 
  •  

質問

特定のホットキーをリッスンすることは可能ですか (例:Ctrl-) してから特定のアクションを実行しますか?私のアプリケーションは C で書かれており、Linux 上でのみ実行でき、GUI はありません。この種のタスクに役立つライブラリはありますか?

編集:例として、amarok にはグローバル ショートカットがあるため、たとえばキーの組み合わせをアクションにマップするとします (たとえば、 Ctrl-+, Ctrl そして +) キーを押したときにそのアクションを実行できます。地図を作るとしたら Ctrl-+ を押すたびに音量増加アクションに切り替わります Ctrl-+ 音量は一定量増加するはずです。

ありがとう

役に立ちましたか?

解決

ホットキーはどの程度グローバルにする必要がありますか?X セッションに対してグローバルであるだけで十分ですか?その場合、Xlib 接続を開いて、必要なイベントをリッスンできるはずです。

通常、X のキーボード イベントは、現在フォーカスがあるウィンドウに配信され、処理されるまで階層を上に伝播します。これは明らかに私たちが望んでいることではありません。他のウィンドウがイベントにアクセスする前に、イベントを処理する必要があります。電話する必要があります XGrabKey これを達成するには、ルート ウィンドウでホットキーのキーコードと修飾子を使用します。

良い例を見つけました ここ.

他のヒント

私は思う スムーフラ ここでは正しい軌道に乗っています。キー入力をインターセプトして適切なアクションを実行できるように、X にグローバル ホットキーを登録しようとしています。 Xlib それはおそらくあなたが望んでいることです、そして XGrabKey 機能だと思います。

残念ながら、学ぶのは簡単ではありません。役に立つと思われる次の例を見つけました。 タイニーWM. 。私も見つけました Java/JNI を使用します (同じ基礎となる Xlib 関数にアクセスします)。

のソースコードを見るべきです xバインドキー.

Xlib プログラミングは非常に難解で、ドキュメントは見つけるのが難しく、移植性に微妙な問題があります。百戦錬磨のコードをコピーした方が良いでしょう。

これを行う 1 つの方法は、アプリケーションが特定のポートまたはソケット ファイルで受信リクエストをリッスンするようにすることです。

次に、そのポートまたはソケット ファイルに接続し、実行中のアプリケーションにコマンドを送信する小さなクライアント アプリケーションを作成できます。

次に、特定のキーの組み合わせをバインドして小規模なクライアント アプリを起動するようにウィンドウ マネージャーを構成できます。

UNIX では、コマンドライン シェルへのアクセスは ターミナル. 。これは、人々が文字通りマシンに直接接続された端末を介して大きな共有コンピューターにアクセスしていた時代を思い出させます (例:シリアルケーブル経由)。

実際、UNIX マシンで使用する「xterm」プログラムまたはその派生プログラムは、正しくは「xterm」プログラムと呼ばれます。 ターミナルエミュレータ - それは (ユーザーの観点とオペレーティング システムの観点の両方から) 旧式の端末マシンの 1 つとよく似た動作をします。

これにより、さまざまな種類の端末が多数存在し、UNIX システムは各種類の機能を認識する必要があるため、興味深い方法で入力を処理することが少し複雑になります。これらの機能は従来、 用語キャップ ファイル、そしてより現代のシステムでは使用されると思います 用語情報 その代わり。試す

man 5 terminfo

詳細については、Linux システムに関する情報を参照してください。

さて、良いニュースは、端末の機能などをあまりいじる必要がないことです。入力機能やウィンドウ機能を使って興味深いことを行うコマンドライン アプリケーションを作成します。図書館があって、 呪い, 、それは役に立ちます。見上げる

man 3 ncurses

詳細については、Linux システムで を参照してください。おそらく、curses の使用に関する適切なチュートリアルをオンラインで見つけることができるでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top