Warning: session_start(): open(/var/lib/php/sessions/sess_9amnbnjaa87gm23glbpe00qu89, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
// TODO (rare case): send pending mouse up on disable
srecord MouseEvt(bool mouseDown, int button, DoublePt p) {
long time = sysNow();
}
module MiniVNC > DynImageSurface {
bool enabled, usePossiblyBrokenVersion = true;
S computerID;
int width = 256;
double videoInterval = /*2*/10, mouseInterval = 0.1;
transient int discardEventsAfter = 10000;
transient int dummyWidth = 100000;
transient DoublePt mousePosition;
transient Set sentMouseButtons = syncSet();
transient L events = syncList();
transient DoublePt sentMousePosition;
transient Q sendQ;
S switchableFields() { ret "usePossiblyBrokenVersion videoInterval"; }
start {
sendQ = dm_startQ();
doEvery(videoInterval, r grab);
doEvery(mouseInterval, r moveMouse);
}
visualize {
JComponent c = super.visualize();
enableDoubleBuffering();
imageSurfaceOnMouseMoveOrDrag_double(imageSurface, voidfunc(DoublePt p) { mousePosition = p });
disableImageSurfaceSelector(imageSurface);
setFocusable(imageSurface, true);
// show popup menu only when disabled
swing {
final componentPopupMenu_Adapter adapter = firstInstanceOf(imageSurface.getMouseListeners(), componentPopupMenu_Adapter);
imageSurface.removeMouseListener(adapter);
imageSurface.addMouseListener(new MouseAdapter {
public void mousePressed(MouseEvent e) {
if (!enabled) adapter.mousePressed(e);
}
public void mouseReleased(MouseEvent e) {
if (!enabled) adapter.mouseReleased(e);
}
});
}
addKeyListener(imageSurface, new KeyAdapter {
public void keyPressed(final KeyEvent evt) {
print("key down: " + evt);
if (actuallyEnabled()) sendQ.add(r {
dm_evalOnOtherMachine(computerID, "robot_keyPress(" + evt.getKeyCode() + ")")
});
}
public void keyReleased(final KeyEvent evt) {
print("key up: " + evt);
if (actuallyEnabled()) sendQ.add(r {
dm_evalOnOtherMachine(computerID, "robot_keyRelease(" + evt.getKeyCode() + ")")
});
}
});
addMouseListener(imageSurface, new MouseAdapter {
public void mousePressed(MouseEvent evt) {
imageSurface.grabFocus();
impl(evt, true);
}
void impl(MouseEvent evt, bool down) {
if (!actuallyEnabled()) return;
int mask = mouseButtonMaskForRobot(evt.getButton());
print("mask: " + mask);
events.add(MouseEvt(down, mask, imageSurface_doublePtFromEvent(imageSurface, evt)));
}
public void mouseReleased(MouseEvent evt) {
impl(evt, false);
}
});
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));
}
}
void moveMouse enter {
if (!actuallyEnabled()) {
sentMousePosition = null; sentMouseButtons.clear(); ret;
}
LinkedList events = cloneAndClearAsLinkedList(this.events);
final double scale = doubleRatio(dummyWidth, width);
// drop old events (if network was down)
new Set sendMouseUp;
while (nempty(events) && elapsedMS(first(events).time) >= discardEventsAfter) {
if (!first(events).mouseDown) sendMouseUp.add(first(events).button); // don't drop that
popFirst(events);
}
for (int button : sendMouseUp)
dm_evalOnOtherMachine(computerID, "robot_mouseUp(" + button + ")");
// send mouse click/release events
for (MouseEvt e : events) {
dm_evalOnOtherMachine(computerID,
"robot_mouseButtonPressOrRelease_scaled(" + e.mouseDown + ", " + e.button + ", " + scaleInt(e.p.x, scale) + ", " + scaleInt(e.p.y, scale) + ", " + dummyWidth + ")");
sentMousePosition = e.p;
addOrRemove(sentMouseButtons, e.button, e.mouseDown);
}
// send mouse position
DoublePt p = mousePosition;
if (neq(p, sentMousePosition)) {
sentMousePosition = p;
if (p != null) {
time "Move Mouse On Other Machine" {
dm_evalOnOtherMachine(computerID, "dm_moveMouseImmediate_direct_scaled(" + scaleInt(p.x, scale) + ", " + scaleInt(p.y, scale) + ", " + dummyWidth + ")");
}
}
}
}
}