next up previous
Next: 3.3 マウス操作イベントをとる例 Up: 3 例題:Xwindow操作機能の追加 Previous: 3.1 ヘッダファイルへの登録

3.2 引数をとる関数の定義

graph-moveto, graph-linetoは2引数をとる関数である.以下のように, 引数をとって,LVALというデータタイプの変数にいれ,さらに実引数が与えら れていないかどうかをチェックする(xllastarg). そして,getnumintというマクロでLispの数値データをC言語の数値データへ変 換し,変換された値をC言語の表示ルーチンへ与える.
#define getnumint(x) \
 (fixp(x)?(int)getfixnum(x):\
          (floatp(x)?(int)getflonum(x):\
                     xlbadtype(x)))

LVAL xmoveto()
{
  LVAL arg1, arg2;
  arg1 = xlgetarg(); arg2 = xlgetarg();
  xllastarg();
  curx = (int)getnumint(arg1);
  cury = (int)getnumint(arg2);
  return( true );
}
LVAL xlineto()
{
  LVAL arg1, arg2;
  int cur2x, cur2y;
  
  arg1 = xlgetarg(); arg2 = xlgetarg();
  xllastarg();
  cur2x = (int)getnumint(arg1);
  cur2y = (int)getnumint(arg2); 
  XDrawLine(display, win, grac, curx, cury, cur2x , cur2y);
  curx = cur2x; cury = cur2y;
  XFlush(display);
  return( true );
}
Cの関数で計算した数値をLispの数値として返す場合には, データ変換用関数cvfixnumなどを用います(xldmem.c).

LVAL xgetpixel()
{
  LVAL arg1, arg2;
  int v=0;
  arg1 = xlgetarg(); arg2 = xlgetarg();
  xllastarg();
  ximage = XGetImage(display,
                     win,
                     0,0, 640, 400,
                     AllPlanes, XYPixmap);
  v = XGetPixel(ximage,
                (int)getnumint(arg1),
                (int)getnumint(arg2));
  return( cvfixnum(v));
}


generated through LaTeX2HTML. M.Inaba 平成18年5月7日