2010-12-27 24 views
3

MacBook ProのLinuxディストリビューションでOS Xのキーボードバックライト機能を実装するためのプログラムをC++で作成しています。これまでのところ、起動時にバックライトをオンにし、20秒間キーボードとマウスのイベントが登録されていなければ、それはそれをオフに戻し、もちろんイベントが登録されたときに再びオンにします。次にプログラムを実行する必要があるのは、キーボードのバックライトの上下のキーでキーを押さえることですが、これにどう対処するかはわかりません。Linux上のX11で特定のキーを取得する

現在、XScreenSaverQueryInfoを使用してキーボードイベントとマウスイベントのアイドル時間を取得しているため、X11 APIを使用するメソッドは問題ありません。私はたくさんのグーグルをやったことがありますが、出かけることを確実に感じる方法を見つけることはできません。私が見つけた多くの方法で見ている問題は、キーコードを使用してキーコードを識別することですが、キーボードレイアウトが利用可能なので、実行可能なソリューションとは思われません。

メソッドとAPIのアイデアはどうすればいいですか?何が最善を尽くすだろうか?

よろしく、

答えて

2

これを行う通常の方法は、XGrabKey()で行います。それはキーコードを使用しますが、あなたはキーコードをハードコードしません。あなたはXKeysymToKeycode()でそれを取得します。もっと正確にするには、MappingNotify(XMappingEvent)を取得したときにグラブをやり直すことも必要です。 (注意、MappingNotify、 MapNotifyではありません)これらのキー用のkeysymがない場合、おそらく古いXバージョンにはありませんが、おそらくもっと新しいX.orgバージョンにはキーコードがあります。 。これはあまり堅牢ではなく、移植性はありませんが、おそらく同じハードウェアモデルを使用しているLinuxの全員にとって有効です。

キーグラブはグローバルなので、XGrabKey()にしようとすると既にそのキーを取得している場合は、Xエラーが発生します。デフォルトではプログラムが終了します。 XGrabKey()の別の特質は、正確な修飾子を使ってキーをつかむことです。たとえば、NumLockの有無にかかわらず、両方を処理するには、2回取得する必要があります。 Global Hotkey with X11/Xlib

通常のLinuxセットアップ(このような機能をアップストリームプロジェクトに導入したい場合)では、デスクトップ環境では、キーを掴んでエラーを取得するアプリがたくさんありません。そのため、ウィンドウマネージャや特別なデーモンなどの中心的な調整ポイントが必要に応じて、すべてのキーバインディングを実行し、他のプロセスにコマンドを転送する可能性があります。だから、デフォルトでディストリビューションにフィーチャーを統合しようとしていたなら、このような他の特別なキーを扱う同じ上流のコードにパッチを当ててみるのがよいでしょう。

もう1つ注意しなければならないのは、Xkb APIです。これははるかに複雑です。 Xkbでキーをつかむために脳を曲げる方法がいくつかありますが、そのルートに行くことの利点はわかりません。

+0

複数のキーボードが接続されていると、 'Xkb'ルートが重要になります。これは、キーコードとkeysymsが簡単に互いにマップされないためです。 –

2

これまでまだ行っていない場合は、xevに慣れてください。それを開始し、焦点を合わせ、キーを押して、何が起こっているかを確認します。

関連する問題