Next: 3.3 マウス操作イベントをとる例
Up: 3 例題:Xwindow操作機能の追加
Previous: 3.1 ヘッダファイルへの登録
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日