This is VisualNaCro.

DISCLAIMER: recorder.pl is not yet functional.

What does it?

	It is a Perl module meant to remote control a VNC server.
	
	It includes a recorder (written in Perl) to make it easy to
	record a macro, which is just a Perl script, and which you can
	modify to your heart's content.
	
	The most important feature, however, is that you can mark a
	rectangle which the Perl script will try to find again when you
	run it. Thus when you play a game and want to hit a certain button,
	you just hit the Ctrl key twice, mark the button, and from then on,
	all mouse movements will be repeated relative to that button, even
	if the button is somewhere else when you run the script the next
	time.

	If you know Tcl Expect, you will recognize this approach. Only this
	time, it is not text, but an image which is expected.
	
How does it work?

	It acts as a VNC proxy: your Perl script starts its own VNC server.
	The script now can intercept inputs and outputs, and act upon them.
	In order to write a macro, start
	
		recorder.pl --script my-macro.pl --timing host:port
	
	connect with a vncviewer of your choice to <host2>:23, where <host2>
	is the computer	on which recorder.pl was started (not necessarily the
	same as the VNC server!). Now your actions are recorded into
	my_macro.pl, and the images you want to grep for will be saved as
	my_macro-1.pnm,	my_macro-2.pnm, ...

	In order to finish the script, hit Ctrl twice and say "q".

Why did I do it?

	Because I could ;-)

	No really, I needed a way to write automated tests. While there
	exist a lot of OpenSource programs for web testing, I found none
	of them easy to use, and for GUI testing I found xautomation.

	Xautomation has this "visual grep" (or "graphical expect") feature:
	given an image it tries to find it on the desktop and returns the
	coordinates. Unfortunately, there is no easy way to record macros
	with it, and it only works on X11.

	As I know VNC pretty well, and there are VNC servers for every OS
	and gadget, I thought it might be cool to have this feature to
	control a VNC server.

	Actually, it makes it even easier: with plain X11, for example, you
	can not know where on the screen the action is if you don't check
	the whole screen. This complex problem is beautifully addressed
	in Karl Runge's x11vnc.

	My main purpose is to run regression tests on different browsers,
	which I can easily do by starting Xvnc and using VisualNaCro.

How did I do it?

	I wondered long about how to do it. I couldn't take the same approach
	as xautomation: I cannot connect to the VNC server thousand times
	per second. So I decided to create an interface of LibVNCServer/
	LibVNCClient for use in a script language.

	Fortunately, this task is made very, very easy by SWIG. As Perl
	is one of my favorite script languages, I decided to use this.
	But SWIG makes it easy to use the very same interface for other
	popular languages, so you are welcome to port VisualNaCro to
	the language of your choice!
	
Isn't it pronounced "Visual Macro"?

	Yes. But I liked the Visual Na Cro play of acronyms. I'm sorry if
	you don't find it funny.

What's the license?

	GPL. It is based on LibVNCServer/LibVNCClient, so it has to be.
	If you want to port this package to use vncreflector, which has a
	BSD license, go ahead.

