お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2017-01-20 19:09:09

iinews
メンバ
登録日: 2014-06-02

gccで特殊キーコードを取得したいです。

環境はwattos-r10-lxde(16.04ベース)です。
参考サイトからgccサンプルを作りました。(ほぼまんまですが・・・)
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <unistd.h>

int getkey();
struct termio tty_backup;
struct termio tty_change;

void main()
{
  int code ;

  while( 1 )
  {
    code = getkey() ;
    if( code > 1 )
      printf( "key = ( %c )0x%x\n", code, code ) ;
  }
}
int getkey()
{
  char in_char     = 0 ;
  char in_char_ret = 0 ;
  char read_byte   = 0 ;

  ioctl( 0, TCGETA, &tty_backup ) ;
  tty_change = tty_backup ;
  tty_change.c_lflag &= ~( ECHO | ICANON ) ;
  tty_change.c_cc[ VMIN ] = 0 ;
  tty_change.c_cc[ VTIME ] = 1 ;
  ioctl( 0, TCSETAF, &tty_change ) ;
  read_byte = read( 0, &in_char, 1 ) ;
  if ( read_byte == -1 )
  {
    ioctl( 0, TCSETAF, &tty_backup ) ;
    return 1 ;
  }
  else
    in_char_ret = in_char ;
  in_char = 0x00 ;
  ioctl( 0, TCSETAF, &tty_backup ) ;
  return in_char_ret ;
}
実行すると(Rキーのみで)
key = ( r )0x72 - r
key = ( R )0x52 - shift+r
key = (  )0x12 - ctrl+r
key = (  )0x1b - alt+r
更にいろいろ押してみましたが、alt+、ファンクションキーは全て0x1bです。どうにかして個別のコードを取得する方法はないでしょうか?
必ずそれぞれのコードがあると思うんですが・・・
windowsだとgetch()だけで済むようですがlinuxのリアルタイムキー入力は難しそうな感じですね・・・


dell-Inspiron580、OS-WattOS R10(ubuntu16.04ベース)
やっとこさ作ったページ
http://www.geocities.jp/iinews_waruinews/

オフライン

 

#2 2017-01-20 20:03:51

iinews
メンバ
登録日: 2014-06-02

Re: gccで特殊キーコードを取得したいです。

linuxでgetch()を使う方法がわかりました。
libncurses5.dev、libncursesw5.devをインストールすればいいようです。
また特殊キーで0x1bと返ってくるのが多いのは実はそれだけでなくて続けてコードを取得する必要があるようですね。
参考サイトの方法だと、sの先頭しか返ってこない為みんな同じコードになってしまうということなんでしょう。
少し頑張ってみます。
どういうわけか質問した直後によさげな情報に当たります・・・


dell-Inspiron580、OS-WattOS R10(ubuntu16.04ベース)
やっとこさ作ったページ
http://www.geocities.jp/iinews_waruinews/

オフライン

 

#3 2017-01-21 17:35:06

iinews
メンバ
登録日: 2014-06-02

Re: gccで特殊キーコードを取得したいです。

どうもlinuxのgetch()は入力待ちになるようです。
確かに入力されれば特殊キーコードもかなり取得できるんですが、残念です。
入力待ちのない方法はないでしょうか?(たとえば入力なしだと0が返ってくるとか・・・)
プログラミングなので、ここで質問するのがいいのかどうかもわかりませんが、アドバイスいただけると助かります。


dell-Inspiron580、OS-WattOS R10(ubuntu16.04ベース)
やっとこさ作ったページ
http://www.geocities.jp/iinews_waruinews/

オフライン

 

#4 2017-01-21 18:28:35

iinews
メンバ
登録日: 2014-06-02

Re: gccで特殊キーコードを取得したいです。

char getkey( char *codelist ) /* パラメータはコード用配列 */
{
  char codelength ;

  ioctl( 0, TCGETA, &tty_backup ) ;
  tty_change = tty_backup ;
  tty_change.c_lflag &= ~( ECHO | ICANON ) ;
  tty_change.c_cc[ VMIN ] = 0 ;
  tty_change.c_cc[ VTIME ] = 1 ;
  ioctl( 0, TCSETAF, &tty_change ) ;
  codelength = read( 0, codelist, 10 ) ;
  printf( "%d\n", codelength ) ;
  ioctl( 0, TCSETAF, &tty_backup ) ;
  if ( codelength != -1 )
    codelist[ codelength ] = 0 ;
  return codelength ; /* 取得した文字コード数 */
}
わかりました。とりあえずこれでコードを取得できるようになりました。
read()に10でも設定しておけばいいようです。(今のところ最高で7までなので・・・)
簡単なところに気づきませんでした。ただ難点が遅いところですね。
実用性があるか試してみます。


dell-Inspiron580、OS-WattOS R10(ubuntu16.04ベース)
やっとこさ作ったページ
http://www.geocities.jp/iinews_waruinews/

オフライン

 

#5 2017-01-22 23:17:24

iinews
メンバ
登録日: 2014-06-02

Re: gccで特殊キーコードを取得したいです。

プログラム(ウィンドウ透過及びリサイズツール)にキー処理を組んで端末から実行させると、その端末でしかキーコードを拾えません。
なので特定のキーを拾ったならリサイズさせるということが、その端末でしかできません。
ログイン時にツールを起動させるとまったくダメです。
透過状態の変更はウィンドウの状態により刻々と変わるんですが、キー入力となると別のようです。
状態に関わらずキーコードを拾う方法はあるのでしょうか?


dell-Inspiron580、OS-WattOS R10(ubuntu16.04ベース)
やっとこさ作ったページ
http://www.geocities.jp/iinews_waruinews/

オフライン

 

#6 2017-01-23 13:01:40

taka.zoo.n
メンバ
登録日: 2013-05-30

Re: gccで特殊キーコードを取得したいです。

この件って window system 下の話だったんですか?!
そうであれば話が違ってきます。

X11 ではキーが押されると(一般には)フォーカスを持っているウインドーにサーバーからイベントが送られます。ですが、ここで送られるのはキーコードであり文字コードではありません。(例えば BackSpace と Ctrl+h は異なるキーコードを持ちますが文字コードはどちらも 0x08 です。)どちらを必要とされているのでしょうか?

またあるアプリケーションが他のアプリケーションに向けられるはずのキーストロークを横取りしてしまうのは明示的に ICCCM に違反します。(Chap.6 の Grab の項参照)
そのようなプログラムを書くことは可能ですが、起こりえる副作用や予期せぬ副作用が起きた時にどう対処するかを予め良く考えておく必要が有ります。(お使いの window manager に依存します。)

おやりになりたいことを私は正確に理解できていないのですが、おおまかには

window manager が _NET_WM_STATE に対応していることを確かめる。
root window に検出したいキーコードの passive grab を設定する。
そのキーのイベントが送られてきたら所望のウインドーの _NET_WM_STATE property を変更するようにする。

という処理になるのだと思います。具体的にどの関数を使うのかはお使いの toolkit や library に依存します。

オフライン

 

#7 2017-01-23 19:14:20

iinews
メンバ
登録日: 2014-06-02

Re: gccで特殊キーコードを取得したいです。

わかりにくい質問に的確な回答です。
バックグラウンドでツールが常に動いていて、どの状態でも特定のキーを押すとツール内に組まれてるウィンドウリサイズ処理を動かす、というものです。
print-screenでスクリーンショットを撮るような感覚で考えてましたが、よく考えればおかしなことをやってましたね。
それ専用のツールを作って、パネル上のアイコンをクリックしたら動作させるようにします。
ありがとうございました。


dell-Inspiron580、OS-WattOS R10(ubuntu16.04ベース)
やっとこさ作ったページ
http://www.geocities.jp/iinews_waruinews/

オフライン

 

#8 2017-01-27 21:29:51

iinews
メンバ
登録日: 2014-06-02

Re: gccで特殊キーコードを取得したいです。

需要ないでしょうが、やっぱり納得いかず調べたところ、それらしいやり方がわかりました。
私の環境の場合、
~/.config/openbox/lxde-rc.xml
これを修正してF9、CTRL+F9、ALT+F9が押された時にアプリを実行させるようにしました。
(既に割り当てがないかファイル内を検索して確認しました)
再ログインで有効になります。
<keyboard></keyboard>の中に
<keybind key="F9">
   <action name="Execute">
      <command>実行させたいアプリ</command>
   </action>
</keybind>
便利なんですが、GUIツールはないでしょうかね?


dell-Inspiron580、OS-WattOS R10(ubuntu16.04ベース)
やっとこさ作ったページ
http://www.geocities.jp/iinews_waruinews/

オフライン

 

Board footer

Powered by FluxBB