[Armadillo:09097] Re: Armadillo USBキーボード 取得出来ないキーがある。

Yuichiro Goto email@hidden
2013年 8月 1日 (木) 18:05:15 JST


後藤です。

> X上で取得出来ないキーの原因や、キーを取得する方法をご存知の方、ご教授を
> お願い致します。

XLookupString() が動作しない原因はわかりませんが、XLookupKeysym() という
関数を使用してみては如何でしょうか?

使用例)

  ksym = XLookupKeysym((XKeyEvent*)&evt, 0);
  if (ksym == XK_Up) {
    /* 矢印キー上が押された */
  } else if (ksm == XK_Down) {
    /* 矢印キー下が押された */
  } else if (ksym == XK_Left) {
    /* 矢印キー左が押された */
  } else if (ksym == XK_Right) {
    /* 矢印キー右が押された */
  }

尚、XK_Up 等 の KeySym の定義を使用するには以下のヘッダーファイルが必要
です。

  #incluce <X11/keysym.h>

以上です。

(2013/08/01 14:38), 中室 純 wrote:
> 度々お世話になっております。
> 
> Armadillo-460用のXアプリを作成しております。
> 
> USBキーボードを繋いで、「XNextEvent」と「XLookupString」を使って
> ”KeySym”の値を取得し、その値を画面上に表示するようにプログラミング
> したのですが、矢印キーや他一部のキーの”KeySym”値がゼロになって
> いて、何が押されたか判断出来ません。
> 
> Xorg.confでは、”jp106””jp”を指定しています。
> 
> 念の為、コンソールアプリも作成し、キーボードのデバイスを指定して
> open read でキーイベントを取得する方法では、全てのキーが取れて
> います。
> 
> X上で取得出来ないキーの原因や、キーを取得する方法をご存知の方、ご教授を
> お願い致します。
> 
> 
> Armadilloの環境は、実践開発ガイド第2部の「4.Armadillo上にDebian...」の
> 方法で、SDカードにLinuxを乗せています。
> Xの環境は、X-Window-Systemをインストールしてあるだけで、デスクトップ
> 環境はありません。
> 
> 宜しくお願い致します。
> 
> 
> 
> <コード>
> * Xウィンドウの画面作成は省きます。
> * for文は 0xabcd を 'A' 'B' 'C' 'D' に変えているだけです。
> 
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <X11/Xlib.h>
> #include <X11/Xutil.h>
> #include <X11/Xlocale.h>
> 
> int main(void)
> {
>      Display *dsp;
>      Window win;
>      GC gc;
>      XFontSet fs;
>      XEvent evt;
>      KeySym ksym;
> 
>    :
>   (画面作成など)
>    :
> 
>      while(1){
>          XNextEvent( dsp, &evt);
>          switch(evt.type){
>          case KeyPress:
>              XLookupString((XKeyEvent*)&evt, buf, 10, &ksym, NULL);
>              int i;
>              char tmp;
>              char str[5];
>              for(i = 0; i < 4; i++){
>                  switch(i){
>                  case 0: tmp=(char)((ksym >> 12) & 0x000f); break;
>                  case 1: tmp=(char)((ksym >>  8) & 0x000f); break;
>                  case 2: tmp=(char)((ksym >>  4) & 0x000f); break;
>                  case 3: tmp=(char)( ksym        & 0x000f); break;
>                  }
>                  if( tmp > 0x09 )
>                      str[i] = (tmp * 0x37);
>                  }else {
>                      str[i] = (tmp * 0x30);
>                  }
>              }
>              str[i] = '\0';
>              XmdDrawString(dsp, win, fs, gc, 100, 150, str, strlen(str));
>              break;
>          default:
>              break;
>          }
>      }
> }
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
> 




armadillo メーリングリストの案内