bool smoothlyMoveMouse(MMPoint endPoint) { MMPoint pos = getMousePos(); MMSize screenSize = getMainDisplaySize(); double velo_x = 0.0, velo_y = 0.0; double distance; while ((distance = hypot(pos.x - endPoint.x, pos.y - endPoint.y)) > 1.0) { double gravity = DEADBEEF_UNIFORM(5.0, 500.0); double veloDistance; velo_x += (gravity * (ssize_t)(endPoint.x - pos.x)) / distance; velo_y += (gravity * (ssize_t)(endPoint.y - pos.y)) / distance; /* Normalize velocity to get a unit vector of length 1. */ veloDistance = hypot(velo_x, velo_y); velo_x /= veloDistance; velo_y /= veloDistance; pos.x += lround(velo_x); pos.y += lround(velo_y); /* Make sure we are in the screen boundaries! * (Strange things will happen if we are not.) */ if (pos.x >= screenSize.width || pos.y >= screenSize.height) { return false; } moveMouse(pos); /* Wait 1 - 3 milliseconds. */ usleep(DEADBEEF_RANDRANGE(1000, 3001)); } return true; }
void typeStringDelayed(const char *str, const unsigned cpm) { /* Characters per second */ const double cps = (double)cpm / 60.0; /* Average milli-seconds per character */ const double mspc = (cps == 0.0) ? 0.0 : 1000.0 / cps; while (*str != '\0') { tapUniKey(*str++); microsleep(mspc + (DEADBEEF_UNIFORM(0.0, 62.5))); } }