mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
make Application#getIdleTime thread-safe, finer-grained and more concise
needed for delaying auto-make when user is active (IDEA-141128)
This commit is contained in:
@@ -88,8 +88,6 @@ public class IdeEventQueue extends EventQueue {
|
||||
private final List<Runnable> myIdleListeners = ContainerUtil.createLockFreeCopyOnWriteList();
|
||||
private final List<Runnable> myActivityListeners = ContainerUtil.createLockFreeCopyOnWriteList();
|
||||
private final Alarm myIdleRequestsAlarm = new Alarm();
|
||||
private final Alarm myIdleTimeCounterAlarm = new Alarm();
|
||||
private long myIdleTime;
|
||||
private final Map<Runnable, MyFireIdleRequest> myListener2Request = new HashMap<>();
|
||||
// IdleListener -> MyFireIdleRequest
|
||||
private final IdeKeyEventDispatcher myKeyEventDispatcher = new IdeKeyEventDispatcher(this);
|
||||
@@ -115,7 +113,7 @@ public class IdeEventQueue extends EventQueue {
|
||||
private boolean myIsInInputEvent;
|
||||
@NotNull
|
||||
private AWTEvent myCurrentEvent = new InvocationEvent(this, EmptyRunnable.getInstance());
|
||||
private long myLastActiveTime;
|
||||
private volatile long myLastActiveTime = System.nanoTime();
|
||||
private long myLastEventTime = System.currentTimeMillis();
|
||||
private WindowManagerEx myWindowManager;
|
||||
private final List<EventDispatcher> myDispatchers = ContainerUtil.createLockFreeCopyOnWriteList();
|
||||
@@ -197,7 +195,6 @@ public class IdeEventQueue extends EventQueue {
|
||||
EventQueue systemEventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
|
||||
assert !(systemEventQueue instanceof IdeEventQueue) : systemEventQueue;
|
||||
systemEventQueue.push(this);
|
||||
addIdleTimeCounterRequest();
|
||||
|
||||
KeyboardFocusManager keyboardFocusManager = IdeKeyboardFocusManager.replaceDefault();
|
||||
keyboardFocusManager.addPropertyChangeListener("permanentFocusOwner", e -> {
|
||||
@@ -248,28 +245,6 @@ public class IdeEventQueue extends EventQueue {
|
||||
myWindowManager = windowManager;
|
||||
}
|
||||
|
||||
|
||||
private void addIdleTimeCounterRequest() {
|
||||
if (isTestMode()) return;
|
||||
|
||||
myIdleTimeCounterAlarm.cancelAllRequests();
|
||||
myLastActiveTime = System.currentTimeMillis();
|
||||
myIdleTimeCounterAlarm.addRequest(() -> {
|
||||
myIdleTime += System.currentTimeMillis() - myLastActiveTime;
|
||||
addIdleTimeCounterRequest();
|
||||
}, 20000, ModalityState.NON_MODAL);
|
||||
}
|
||||
|
||||
/**
|
||||
* This class performs special processing in order to have {@link #getIdleTime()} return more or less up-to-date data.
|
||||
* <p/>
|
||||
* This method allows to stop that processing (convenient in non-intellij environment like upsource).
|
||||
*/
|
||||
@SuppressWarnings("unused") // Used in upsource.
|
||||
public void stopIdleTimeCalculation() {
|
||||
myIdleTimeCounterAlarm.cancelAllRequests();
|
||||
}
|
||||
|
||||
public void addIdleListener(@NotNull final Runnable runnable, final int timeoutMillis) {
|
||||
if(timeoutMillis <= 0 || TimeUnit.MILLISECONDS.toHours(timeoutMillis) >= 24) {
|
||||
throw new IllegalArgumentException("This timeout value is unsupported: " + timeoutMillis);
|
||||
@@ -677,7 +652,7 @@ public class IdeEventQueue extends EventQueue {
|
||||
MouseEvent.MOUSE_PRESSED == e.getID() ||
|
||||
MouseEvent.MOUSE_RELEASED == e.getID() ||
|
||||
MouseEvent.MOUSE_CLICKED == e.getID()) {
|
||||
addIdleTimeCounterRequest();
|
||||
myLastActiveTime = System.nanoTime();
|
||||
for (Runnable activityListener : myActivityListeners) {
|
||||
activityListener.run();
|
||||
}
|
||||
@@ -932,10 +907,9 @@ public class IdeEventQueue extends EventQueue {
|
||||
}
|
||||
|
||||
public long getIdleTime() {
|
||||
return myIdleTime;
|
||||
return TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - myLastActiveTime);
|
||||
}
|
||||
|
||||
|
||||
@NotNull
|
||||
public IdePopupManager getPopupManager() {
|
||||
return myPopupManager;
|
||||
|
||||
@@ -706,7 +706,6 @@ public class ApplicationImpl extends PlatformComponentManagerImpl implements App
|
||||
|
||||
@Override
|
||||
public long getIdleTime() {
|
||||
assertIsDispatchThread();
|
||||
return IdeEventQueue.getInstance().getIdleTime();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user