implement vncgrab; include "sys.m"; sys: Sys; include "draw.m"; Context: import Draw; include "bufio.m"; bufio : Bufio; Iobuf: import bufio; include "arg.m"; arg : Arg; include "ppm.m"; images : Images; Image : import images; include "vnc.m"; vnc : Vnc; Server, Rect : import vnc; vncgrab : module { init: fn(nil: ref Context, nil: list of string); }; pixel_colour_trigger(s : ref Server, pixel_index, trigger_value, until : int, hotspot : ref Rect) : int { r : ref Rect; pick bm := s.image.bitmap { rgba8 => if(until) { do { s.send_framebuffer_request(1, hotspot); r = <- s.updates; } while(bm.pixels[pixel_index] != byte trigger_value); } else { do { s.send_framebuffer_request(1, hotspot); r = <- s.updates; } while(bm.pixels[pixel_index] == byte trigger_value); } return 1; } return 0; } init(nil: ref Context, args: list of string) { sys = load Sys Sys->PATH; bufio = load Bufio Bufio->PATH; vnc = load Vnc Vnc->PATH; vnc->init(nil, nil); images = load Images Images->PATH; images->init(nil, nil); arg = load Arg Arg->PATH; arg->init(args); arg->setusage("vncgrab: -f filename"); filename := ""; while((c := arg->opt()) != 0) case c { 'f' => filename = arg->earg(); } if(filename == "") arg->usage(); s := vnc->new_server("tcp!127.0.0.1!5903", "", 3, 1, 0); sys->print("Server : %s\n", s.to_string()); pick bm := s.image.bitmap { rgba8 => while(pixel_colour_trigger(s, 66024, 189, 1, ref Rect(120, 10, 20, 20))) { r : ref Rect; do { s.send_framebuffer_request(0, ref Rect(0, 0, 1024, 768)); r = <- s.updates; } while(r.x != 0 && r.y != 0 && r.w != 1024 && r.h != 768) ; images->create_ppm(s.image, filename); pixel_colour_trigger(s, 66024, 189, 0, ref Rect(120, 10, 20, 20)) ; } * => raise "how did you get this far!"; } s.io = nil; }