static int forwardOneClick_windowSize = 11; // odd should look nice. Set to 1 for an invisible window static int forwardOneClick_clickDelay = 0; // Delay in ms between closing window and forwarding click. 0 seems to work fine. static int forwardOneClick_trackingSpeed = 10; // How often to move the window (ms) // onClick: voidfunc(Point, int) - 2nd parameter is button (1 to 3) // if you make it a func and return false, click is not forwarded static void forwardOneClick(final O onClick) { awtIfNecessary { final new JWindow window; final int windowSize = forwardOneClick_windowSize; window.setSize(windowSize, windowSize); window.setVisible(true); window.setAlwaysOnTop(true); JPanel panel = singleColorPanel(Color.red); window.setContentPane(panel); revalidate(window); final new Robot robot; panel.addMouseListener(new MouseAdapter { public void mouseReleased(final MouseEvent e) { window.setVisible(false); final int b = e.getButton(); final int mod = b == 1 ? InputEvent.BUTTON1_DOWN_MASK : b == 2 ? InputEvent.BUTTON2_DOWN_MASK : InputEvent.BUTTON3_DOWN_MASK; final Point point = getMouseLocation(); swingLater(forwardOneClick_clickDelay, r { if (isFalse(callF(onClick, point, b))) ret; robot.mousePress(mod); robot.mouseRelease(mod); }); } }); swingEvery(window, forwardOneClick_trackingSpeed, r { Point p = getMouseLocation(); window.setLocation(p.x-windowSize/2, p.y-windowSize/2); }); } }