=== modified file 'sikuli-script/src/main/java/edu/mit/csail/uid/Region.java' --- sikuli-script/src/main/java/edu/mit/csail/uid/Region.java 2010-05-20 19:13:28 +0000 +++ sikuli-script/src/main/java/edu/mit/csail/uid/Region.java 2010-08-18 14:37:48 +0000 @@ -11,6 +11,7 @@ public class Region { private Robot _robot; private Screen _scr; + private static Point robotMousePosition=null; public int x, y, w, h; @@ -314,7 +315,7 @@ Location loc = getLocationFromPSRML(target); if( loc != null){ _scr.showMove(loc); - _robot.mouseMove(loc.x, loc.y); + if(!_mouseMove(loc.x, loc.y)) return 0; _robot.waitForIdle(); return 1; } @@ -337,7 +338,7 @@ Location loc = getLocationFromPSRML(target); if(loc != null){ _scr.showTarget(loc); - _robot.mouseMove(loc.x, loc.y); + if(!_mouseMove(loc.x, loc.y)) return 0; _robot.mousePress(InputEvent.BUTTON1_MASK); _robot.waitForIdle(); return 1; @@ -349,7 +350,7 @@ Location loc = getLocationFromPSRML(target); if(loc != null){ _scr.showDropTarget(loc); - _robot.mouseMove(loc.x, loc.y); + if(!_mouseMove(loc.x, loc.y)) return 0; _robot.delay((int)(delay*1000)); _robot.mouseRelease(InputEvent.BUTTON1_MASK); _robot.waitForIdle(); @@ -534,6 +535,7 @@ if(f.hasNext()){ return f; } + f.destroy(); return null; } @@ -588,13 +590,55 @@ return msg; } + private void waitUntilMouseIdle() { + Point prevP=null; + Debug.log("Wait until the mouse is idle"); + long waitUntil=0; + while(true) { + long now=System.currentTimeMillis(); + + PointerInfo pointerInfo=MouseInfo.getPointerInfo(); + Point p=pointerInfo.getLocation(); + if(prevP==null || !p.equals(prevP)) { + waitUntil=now+Settings.WaitUntilMouseIdle; + prevP=p; + } + + if(now>=waitUntil) { break; } + try { + Thread.sleep(1000); + } catch(InterruptedException e) { + break; + } + } + } + + private boolean _mouseMove(int x,int y) { + if(Settings.WaitUntilMouseIdle>0) { + PointerInfo pointerInfo=MouseInfo.getPointerInfo(); + if(robotMousePosition!=null) { + if(!robotMousePosition.equals(pointerInfo.getLocation())) { + Debug.log("mouse moved: human:"+pointerInfo.getLocation().toString()+", robot:"+robotMousePosition.toString()); + // someone moved the mouse! let's pause + waitUntilMouseIdle(); + robotMousePosition=null; + return false; + } + } + } + robotMousePosition=new Point(x,y); + _robot.mouseMove(x,y); + _robot.waitForIdle(); + return true; + } + private int _click(Location loc, int buttons, int modifiers, boolean dblClick) { if(loc == null) return 0; Debug.info( getClickMsg(loc, buttons, modifiers, dblClick) ); pressModifiers(modifiers); - _robot.mouseMove(loc.x, loc.y); + if(!_mouseMove(loc.x, loc.y)) return 0; _scr.showClick(loc); _robot.mousePress(buttons); _robot.mouseRelease(buttons); === modified file 'sikuli-script/src/main/java/edu/mit/csail/uid/Settings.java' --- sikuli-script/src/main/java/edu/mit/csail/uid/Settings.java 2010-03-27 00:01:38 +0000 +++ sikuli-script/src/main/java/edu/mit/csail/uid/Settings.java 2010-08-18 14:11:57 +0000 @@ -10,4 +10,5 @@ public static String BundlePath = null; public static boolean ShowActions = false; public static double ShowActionDelay = 2.0; // in seconds + public static long WaitUntilMouseIdle = 15000; }