Toggle :: invert colours

A macro which:

  1. toggles the inversion of screen colours (see System Preferences > Accessibility > Display)
  2. optionally toggles Dark Mode at the same time, either:
    • in tandem with any screen inversion, e.g. {"darkMode":true, "inverted":true}
    • or against the grain of any screen inversion e.g. {"darkMode":false, "inverted":true}

I personally use it with the settings:

toggleDark = true
inversionFollowsDark = false

To toggle in and out of the all-dark app colours and menu bar shading which I happen to prefer when reading Kindle. (Kindle white paper setting, toggled to macOS light mode and inverted colours)

Screenshot 2021-07-17 at 19.02

Toggle -- invert colours.kmmacros (8.8 KB)

Expand disclosure triangle to view preliminary JS Source
(sysPrefs => {
    "use strict";

    // Universal Access display panel opened.
    sysPrefs.activate();
    sysPrefs.panes
        .byId("com.apple.preference.universalaccess")
        .anchors.byName("Seeing_Display").reveal();
})(
    Application("System Preferences")
);
Expand disclosure triangle to view main JS Source
(sysEvents => {
    "use strict";

    // kmBool :: String -> Bool
    const kmBool = k =>
        Boolean(JSON.parse(
            Application("Keyboard Maestro Engine")
            .getvariable(k)
        ));

    const
        toggleDark = kmBool("toggleDark"),
        inversionFollowsDark = kmBool(
            "inversionFollowsDark"
        ),
        vizPrefs = sysEvents.appearancePreferences;

    // Assuming an active Universal Access display panel:
    return (
        inverted => (
            toggleDark && (
                vizPrefs.darkMode = (
                    inversionFollowsDark ? (
                        inverted
                    ) : !inverted
                )
            ),
            JSON.stringify({
                darkMode: vizPrefs.darkMode(),
                inverted: Boolean(inverted)
            })
        )
    )(
        (
            checkBox => (
                sysEvents.click(checkBox),
                checkBox.value()
            )
        )(
            sysEvents.applicationProcesses
            .byName("System Preferences")
            .windows.byName("Accessibility")
            .groups.at(0)
            .tabGroups.at(0)
            .checkboxes.at(0)
        )
    );
})(
    Application("System Events")
);