!7 module MiniVNC > DynImageSurface { bool enabled, usePossiblyBrokenVersion = true; S computerID; int width = 256; double videoInterval = 2.0, mouseInterval = 0.5; transient Pt mousePosition; S switchableFields() { ret "usePossiblyBrokenVersion videoInterval"; } start { doEvery(videoInterval, r grab); doEvery(mouseInterval, r moveMouse); } visualize { JComponent c = super.visualize(); imageSurfaceOnMouseMove(imageSurface, voidfunc(Pt p) { mousePosition = p }); enableDoubleBuffering(); ret northAndCenterWithMargins(vstackWithSpacing( centerAndEastWithMargins( withLabel("Computer to control:", dm_onlineComputerSelectorComboBox(dm_fieldLiveValue('computerID))), dm_fieldCheckBox('enabled)), jRightAlignedLine(jLabel("Resize to width (pixels):"), jMinWidth(100, jLiveValueIntTextField(dm_fieldLiveValue('width))))), c); } bool actuallyEnabled() { ret enabled && possibleComputerID(computerID) && dm_isVisible(); } void grab enter { if (!actuallyEnabled()) ret; time "Get Screenshot" { setImage(dm_scaledDownScreenshotFromOtherMachine(computerID, width, +usePossiblyBrokenVersion)); } } transient Pt sentMousePosition; void moveMouse enter { if (!actuallyEnabled()) ret with sentMousePosition = null; Pt p = mousePosition; if (neq(p, sentMousePosition)) { sentMousePosition = p; if (p != null) time "Move Mouse On Other Machine" { dm_evalOnOtherMachine(computerID, "dm_moveMouseImmediate_direct(" + p.x + ", " + p.y + ")"); } } } }