summaryrefslogtreecommitdiffstats
path: root/VisualNaCro/recorder.pl
diff options
context:
space:
mode:
Diffstat (limited to 'VisualNaCro/recorder.pl')
-rw-r--r--VisualNaCro/recorder.pl126
1 files changed, 112 insertions, 14 deletions
diff --git a/VisualNaCro/recorder.pl b/VisualNaCro/recorder.pl
index 023ae26..f84b3f6 100644
--- a/VisualNaCro/recorder.pl
+++ b/VisualNaCro/recorder.pl
@@ -2,26 +2,124 @@
use nacro;
-$vnc=nacro::initvnc("localhost",5900,5923);
+# TODO: take options
-print $vnc;
+$output="my_script";
+$server="localhost";
+$port=5900;
+$listen_port=5923;
-# give it a chance to get a first screen update
+# start connection
+$vnc=nacro::initvnc($server,$port,$listen_port);
-print nacro::waitforupdate($vnc,.4);
+if($vnc<0) {
+ print STDERR "Could not initialize $server:$port\n";
+ exit 1;
+}
-print STDERR "Now\n";
+# TODO: timing
-print nacro::sendmouse($vnc,90,250,0);
+open OUT, ">$output.pl";
+print OUT "#!/usr/bin/perl\n";
+print OUT "\n";
+print OUT "use nacro;\n";
+print OUT "\n";
+print OUT "\$x_origin=0; \$y_origin=0;\n";
+print OUT "\$vnc=nacro::initvnc(\"$server\",$port,$listen_port);\n";
-print nacro::sendkey($vnc,ord('a'),-1);
-print nacro::sendkey($vnc,ord('a'),0);
+$mode="passthru";
+$image_counter=1;
+$magickey=0;
+$x_origin=0; $y_origin=0;
-print nacro::sendmouse($vnc,100,10,0);
+while(1) {
+ $result=nacro::waitforinput($vnc,999999);
+ if($result==0) {
+ # server went away
+ close OUT;
+ exit 0;
+ }
-print nacro::savepnm($vnc,"hallo.pnm",50,50,300,200);
-
-nacro::process($vnc,3);
-
-print"\n";
+ if($mode eq "passthru") {
+ if($result&$nacro::RESULT_KEY) {
+ $keysym=nacro::getkeysym($vnc);
+ $keydown=nacro::getkeydown($vnc);
+ if(nacro::sendkey($vnc,$keysym,$keydown)) {
+ print OUT "nacro::sendkey(\$vnc,$keysym,$keydown);\n";
+ }
+ if($keysym==0xffe3 || $keysym==0xffe4) {
+ # Control pressed
+ $magickey++;
+ if($magickey>3 && !$keydown) {
+ $magickey=0;
+ $mode="menu";
+ $dragging=0;
+ nacro::alert($vnc,"VisualNaCro: press 'q' to quit\nor mark reference rectangle by dragging",10);
+ }
+ } else {
+ $magickey=0;
+ }
+ }
+ if($result&$nacro::RESULT_MOUSE) {
+ $x=nacro::getx($vnc);
+ $y=nacro::gety($vnc);
+ $buttons=nacro::getbuttons($vnc);
+ if(nacro::sendmouse($vnc,$x,$y,$buttons)) {
+ $x-=$x_origin; $y-=$y_origin;
+ print OUT "nacro::sendmouse(\$vnc,\$x_origin"
+ . ($x>=0?"+":"")."$x,\$y_origin"
+ . ($y>=0?"+":"")."$y,$buttons);\n";
+ }
+ }
+ } else {
+ if($result&$nacro::RESULT_KEY) {
+ $keysym=nacro::getkeysym($vnc);
+ $keydown=nacro::getkeydown($vnc);
+ if($keysym==ord('q')) {
+ # shutdown
+ close OUT;
+ nacro::closevnc($vnc);
+ exit 0;
+ }
+ nacro::alert($vnc,"Unknown key",10);
+ $mode="passthru";
+ }
+ if($result&$nacro::RESULT_MOUSE) {
+ $x=nacro::getx($vnc);
+ $y=nacro::gety($vnc);
+ $buttons=nacro::getbuttons($vnc);
+ if(!$dragging && (($buttons&1)==1)) {
+ print STDERR "start draggin: $x $y\n";
+ $start_x=$x;
+ $start_y=$y;
+ $dragging=1;
+ } elsif($dragging && (($buttons&1)==0)) {
+ print STDERR "stop draggin: $x $y\n";
+ if($start_x==$x && $start_y==$y) {
+ print OUT "\$x_origin=0; \$y_origin=0;\n";
+ } else {
+ if($start_x>$x) {
+ $dummy=$x; $x=$start_x; $start_x=$dummy;
+ }
+ if($start_y>$y) {
+ $dummy=$y; $y=$start_y; $start_y=$dummy;
+ }
+ $pnm=$output.$image_counter.".pnm";
+ $image_counter++;
+ if(!nacro::savepnm($vnc,$pnm,$start_x,$start_y,$x,$y)) {
+ nacro::alert($vnc,"Saving $pnm failed!",10);
+ } else {
+ $x_origin=$start_x;
+ $y_origin=$start_y;
+ nacro::alert($vnc,"Got new origin: $x_origin $y_origin",10);
+ print OUT "if(nacro::visualgrep(\$vnc,\"$pnm\",999999)) {\n"
+ . "\t\$x_origin=nacro::getxorigin(\$vnc);\n"
+ . "\t\$y_origin=nacro::getyorigin(\$vnc);\n}\n";
+ }
+ }
+ $mode="passthru";
+ }
+ }
+ }
+}