diff --git a/src/main/java/com/github/gilday/darkmode/DarkModeSync.java b/src/main/java/com/github/gilday/darkmode/DarkModeSync.java index 64a0386..7d9419f 100644 --- a/src/main/java/com/github/gilday/darkmode/DarkModeSync.java +++ b/src/main/java/com/github/gilday/darkmode/DarkModeSync.java @@ -4,11 +4,14 @@ import static com.github.gilday.darkmode.DarkModeDetector.isWindowsDarkMode; import com.intellij.concurrency.JobScheduler; +import com.intellij.ide.AppLifecycleListener; import com.intellij.ide.actions.QuickChangeLookAndFeel; import com.intellij.ide.ui.LafManager; import com.intellij.openapi.Disposable; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.startup.StartupActivity; import com.intellij.openapi.util.SystemInfo; import com.intellij.util.Alarm; import com.intellij.util.Alarm.ThreadToUse; @@ -16,6 +19,8 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import javax.swing.UIManager.LookAndFeelInfo; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * Application component which sets IDEA's theme to Darcula when it detects that macOS is in Dark @@ -24,18 +29,38 @@ *

Schedules a background job for polling macOS Dark Mode configuration and updating IDEA * configuration accordingly. */ -public final class DarkModeSync implements Disposable { +public final class DarkModeSync { - private final ScheduledFuture scheduledFuture; + private static DarkModeSync myInstance; + private ScheduledFuture scheduledFuture; - private final LafManager lafManager; - private final DarkModeSyncThemes themes; - private final Alarm updateOnUIThreadAlarm; + private LafManager lafManager; + private DarkModeSyncThemes themes; + private Alarm updateOnUIThreadAlarm; - /** @param lafManager IDEA look-and-feel manager for getting and setting the current theme */ - public DarkModeSync(final LafManager lafManager) { + public static final class MyLifecycleListener implements AppLifecycleListener { + @Override + public void appStarting (@Nullable Project project) { + getInstance().onStartup(); + } + + @Override + public void appWillBeClosed(boolean isRestart) { + getInstance().onClose(); + } + } + + public static DarkModeSync getInstance() { + if (myInstance != null) { + myInstance = new DarkModeSync(); + } + return myInstance; + } + + public void onStartup(){ themes = ServiceManager.getService(DarkModeSyncThemes.class); - this.lafManager = lafManager; + // lafManager IDEA look-and-feel manager for getting and setting the current theme + this.lafManager = LafManager.getInstance(); // Checks if OS is Windows or MacOS if (!(SystemInfo.isMacOSMojave || SystemInfo.isWin10OrNewer)) { logger.error("Plugin only supports macOS Mojave and greater or Windows 10 and greater"); @@ -47,18 +72,18 @@ public DarkModeSync(final LafManager lafManager) { scheduledFuture = executor.scheduleWithFixedDelay(this::updateLafIfNecessary, 0, 3, TimeUnit.SECONDS); // initialize this last because it publishes "this" - updateOnUIThreadAlarm = new Alarm(ThreadToUse.SWING_THREAD, this); + updateOnUIThreadAlarm = new Alarm(ThreadToUse.SWING_THREAD); } /** cancels the scheduled task if one exists */ - @Override - public void dispose() { + public void onClose() { if (scheduledFuture != null) { scheduledFuture.cancel(true); } if (updateOnUIThreadAlarm != null) { updateOnUIThreadAlarm.cancelAllRequests(); } + myInstance = null; } private void updateLafIfNecessary() { diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index ee4fa85..cc68259 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -30,12 +30,15 @@ com.intellij.modules.platform - - com.github.gilday.darkmode.DarkModeSync - + + + +