2

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

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

ありがとう

4

5 に答える 5

4

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

通常、X のキーボード イベントは、現在フォーカスのあるウィンドウに配信され、処理されるまで階層を上っていきます。明らかに、これは私たちが望んでいるものではありません。他のウィンドウがイベントに到達する前に、イベントを処理する必要があります。これを行うには、ホットキーのキーコードと修飾子を使用してルート ウィンドウでXGrabKeyを呼び出す必要があります。

ここで良い例を見つけました。

于 2008-09-16T17:46:19.397 に答える
3

smoofraはここで正しい軌道に乗っていると思います。キーの押下をインターセプトして適切なアクションを実行できるように、グローバルホットキーを X に登録しようとしています。 Xlibはおそらくあなたが望むものであり、XGrabKeyは関数だと思います。

残念ながら、習得するのは簡単ではありません。役に立つと思われるこの例を見つけました: TinyWM。Java/JNI を使用したも見つけました(同じ基になる Xlib 関数にアクセスします)。

于 2008-09-16T18:08:11.183 に答える
2

xbindkeysのソース コードを確認する必要があります。

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

于 2008-09-16T18:31:14.110 に答える
1

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

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

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

于 2008-09-16T17:50:11.883 に答える
0

UNIX では、コマンドライン シェルへのアクセスは端末経由です。これは、大規模な共有コンピュータに、マシンに直接接続された端末 (シリアル ケーブルなど) を介して文字どおりアクセスしていた時代を思い起こさせます。

実際、UNIX ボックスで使用する「xterm」プログラムまたはその派生物は、ターミナル エミュレーターと呼ばれるのが適切です。これは (ユーザーの観点からも、オペレーティング システムの観点からも) 旧式のエミュレーターの 1 つと同じように動作します。ターミナルマシン。

さまざまな種類の端末がたくさんあり、UNIX システムはそれぞれの種類の機能を認識している必要があるため、興味深い方法で入力を処理するのは少し複雑になります。これらの機能は伝統的にtermcapファイルに保存されていましたが、最近のシステムでは代わりにterminfoを使用していると思います。試す

man 5 terminfo

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

さて、幸いなことに、入力機能やウィンドウ機能で興味深いことを行うコマンドライン アプリケーションを作成するために、端末機能などをあまりいじる必要はありません。役立つライブラリcursesがあります。調べる

man 3 ncurses

詳細については、Linux システムで curses の使用に関するまともなチュートリアルをオンラインで見つけることができるでしょう。

于 2008-09-16T17:46:23.530 に答える