X Window Systemでマウスの場所を記録し続けるプログラム
タグ: programming / 初版公開: 2013-10-02

私はPCを触っている時間がかなり長い。 家のマシンは常に起動しているので、家に居る間はほとんどと言っても過言ではない。 ここまでPCに張り付いているなら、いっそPCの操作を記録しておけば、何か得られるものもあるのでは、と思っていた。

手始めにマウスの移動を記録してみようと考え、以下のプログラムを書いた。 mouselogger.cである。

Gist/mouselogger.c

#include<X11/Xlib.h>
#include<stdio.h>
#include<time.h>

typedef struct{
	int x, y;
} Pos;

Pos get_pos(Display *dpy, Window root){
		Window w;
		Window root_return, child_return;
		Pos root_pos;
		int win_x, win_y;
		unsigned int mask;

		XQueryPointer(dpy, root, &root_return, &child_return, &root_pos.x, &root_pos.y, &win_x, &win_y, &mask);

		return root_pos;
}

int main(){
		Display* dpy;
		Window root;
		Pos pos;
		time_t t;

		dpy = XOpenDisplay(NULL);
		root = DefaultRootWindow(dpy);

		while(1){	
			time(&t);
			pos = get_pos(dpy, root);
			printf("%d,%d,%s", pos.x, pos.y, ctime(&t));
			fflush(stdout);
			sleep(1);
		}
}

Xのプログラミングはウィンドウを出して喜んだところ止まりだ。 手探りではあるが、どうにか30行ほどで実装できた。

プログラムの流れだが、XOpenDisplay()でXのディスプレイを、その後DefaultRootWindow()でルートウィンドウを取得する。それらを使って1秒おきにXQueryPointer()を使ってマウスの座標を得ている。本当は、取得したディスプレイを開放してやりたいが、それは割愛。

このプログラムを実行すると、標準出力に以下の形式でマウスのX座標、Y座標、時刻が出力される。 これをリダイレクトして、裏で動かしておけば、寝起きの時間くらいならわかりそうだ。

1230,899,Wed Oct  2 21:01:45 2013

今後の方向性だが、フォーカスしているウィンドウのタイトル等も保存してやって、「何をしていたのか」もわかるようにできたら良いと思っている。