2013-03-19 8 views
9

私はX.orgプログラミングの新人です。私はXキーボードレイアウトスイッチに反応する小さなアプリケーションを構築したいと思います。私は検索しましたが、kbのレイアウトが切り替わったときに、どのイベントが発生するのか見つけられませんでした。私に正しいイベントを教えてください。ありがとうX.orgでkbのレイアウトを切り替えるときに起きるイベント

+0

キーボードのレイアウトを切り替えるために何をしていますか? GUIクライアントを使用していますか?または設定ファイルを編集しますか?変更はいつまで有効ですか?これらは、私たちがどこを見なければならないかを知るのに役立つかもしれない手がかりです。 –

+0

言語レイアウト(en、cs、...)を切り替える。 kbスイッチをリッスンするGUIクライアント(たとえば、キーボードレイアウトを切り替えるために両方のシフトを設定しています。このスイッチは、捕捉して何らかの操作を行うイベントを生成します)。 C/C++コードでなければなりません。 – Pat

+0

いくつかのコードを投稿できますか? – JoRouss

答えて

8

X Keyboard Extensionの一部であるXkbStateNotifyイベントタイプがあります。 (XKBlib.hで宣言された)XkbQueryExtension()関数を呼び出し、xkbEventTypeを取得するには

void x11Events(XEvent* evt) 
{ 
    if(evt->type == xkbEventType) { 
     XkbEvent* xkbevt = (XkbEvent*)evt; 
     if (xkbevt->any.xkb_type == XkbStateNotify) { 
      int lang = xkbevt->state.group; 
      // Some code using lang here. 
     } 
    } 
} 

:あなたはこのようにそれからレイアウト言語をつかむことができます。

ただし、レイアウト変更だけでなく、XkbStateNotifyが発生します。これは、上記で参照仕様からのものである:

報告の変更がキーボード 状態のいずれかの態様の変更が挙げられる:修飾子が設定または解除され、現在のグループ 変更、またはポインタボタンが押され又はリリースされました。このため

は、あなたがどこかlangの値を保存する必要がありますし、その後、新しいイベントが到着したときに、以前に保存したものにlangの新しい値を比較します。

NB。 XkbMapNotifyEventイベントもあり、レイアウトの切り替え自体ではなく、キーボードマッピングの変更について通知します。あなたもそれを調べたいかもしれません。

+0

プログラマーへの注意点は、GTKなどの最新のツールキットを使用してこのイベントを取得する方法のヒントかもしれません。 – user4815162342

+1

GTKでは、[gdk events](https://developer.gnome.org/pygtk/stable/class-html)があるので、通常は生の 'XEvents'を処理する必要はありません(少なくともレイアウト変更を検出するためではありません) gdkevent.html)を使用して、現在のキーボードグループを取得することもできます。さらに、GTKアプリケーションのXイベント処理に干渉すると、独自のイベント処理ループが存在するため、ツールキットを弱体化させる可能性があります。私はQtについてはあまりよくありませんが、私は事がそこに似ていると思っています。 – shakurov

+0

これはまさに私が参照していたものです。上のコードと同じコードですが、GDKイベントを使用しています。少なくともキーボードインジケータアプレットはスイッチを検出する必要があるため、GTK/GDKからXkbレイアウトスイッチイベントにアクセスできる必要があります。 – user4815162342

関連する問題