2009年03月05日

スクリーンサイズとカーソル一の取得

ジョイマウスの移動範囲で現在のサイズで決め打ちでやっていたのだけれど
xlibに取得関数があることが分かった。XDisplayWidthとXDisplayHightだ。
また現位置取得関数としてXQueryPointerがあったがWindowのパラメータの扱いがごちゃついていて
なかなかわかりにくかったが
マウスの状態も取得できる様になった。
今回変数として

Display *dpy;
int x, y,rx,ry;
Window win,root,w;
unsigned int tmp;

を用意する。これを構造体にしておいてもいい。
事前準備として

dpy=XOpenDisplay(NULL);
if(dpy==NULL) {
printf("Cannot open display\n");
exit(1);
}
win = DefaultScreen(dpy);
root= DefaultRootWindow (dpy);

とDefaultScreenとDefaultRootWindowそれぞれの関数で値を得る。

Windowのサイズは

x=XDisplayWidth(dpy,win);
y=XDisplayHeight(dpy,win);

で得ることが出来

サイズの絶対値は

x=XDisplayWidthMM(dpy,win);
y=XDisplayHeightMM(dpy,win);

で取得できる。

同レベルの関数でマウスを別ディスプレイにも飛ばせるもので
XWarpPointerというのがあり同一ディスプレイ内の場合

XWarpPointer(dpy, None, win, 0, 0, 0, 0, x, y);

とすると相対的に移動できるのだが


XTestFakeMotionEvent(dpy, -1, x, y, CurrentTime);

の方が引数が少ないから効率は良さそう。
ただし加速マウスの場合はそのまま使える。
XTestFakeMotionEventの場合は「現在位置」を管理する必要がある。
そこで取得関数を探したところXQueryPointerという関数があり


XQueryPointer (dpy, root, &root, &w,
&rx, &ry, &x, &y, &tmp);

とw,rx,ryは捨て変数でxとyに値が入る。

最初このDefaultRootWindowというのが分からなくてエラーがでまくった。
tmpには他のパラメータが入っていて押しているマウスボタンが分かる様だった。
Button1Mask=0x0100
Button2Mask=0x0200
Button3Mask=0x0400
Button4Mask=0x0800
Button5Mask=0x1000
だった。
しかし随分とグローバル変数が宣言済みなものだ。


ラベル:xlib
posted by Xo_ox at 23:58| Comment(0) | FreeBSDアプリ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。