macOS escala de grises excepto algunas aplicaciones

¿Hay alguna forma en la que se pueda tener un sistema de escala de grises en todo el sistema, excepto algunas aplicaciones seleccionadas (por el usuario), en macOS?

Le gustaría probar la aplicación Grayscale Mode . Lo desarrollé en base a la respuesta de @RecursivelyIronic.

Respuestas (2)

Sí, esto es posible, aunque mi solución es un poco complicada. Tenga en cuenta que este método utiliza algunas API de Objective C no documentadas y no pasa por la configuración de accesibilidad ordinaria, así que tenga cuidado.

Primero, debe tener instaladas las herramientas de desarrollo para poder compilar el código de Objective C. Luego compile dos comandos enable-grayscaley disable-grayscaledesde la fuente (basado en esta respuesta de StackOverflow que proporciona algunas formas adicionales de hacerlo).

$  cat enable-grayscale.c 
// https://stackoverflow.com/questions/14163788/how-does-on-screen-color-inversion-work-in-os-x
#include <stdio.h>
#include <ApplicationServices/ApplicationServices.h>

CG_EXTERN bool CGDisplayUsesForceToGray(void);
CG_EXTERN void CGDisplayForceToGray(bool forceToGray);

int
main(int argc, char** argv)
{
    bool isGrayscale = CGDisplayUsesForceToGray();
        if (!isGrayscale) {
                CGDisplayForceToGray(TRUE);
        }

    return 0;
}

$ cat disable-grayscale.c 
// https://stackoverflow.com/questions/14163788/how-does-on-screen-color-inversion-work-in-os-x
#include <stdio.h>
#include <ApplicationServices/ApplicationServices.h>

CG_EXTERN bool CGDisplayUsesForceToGray(void);
CG_EXTERN void CGDisplayForceToGray(bool forceToGray);

int
main(int argc, char** argv)
{
    bool isGrayscale = CGDisplayUsesForceToGray();
        if (isGrayscale) {
        CGDisplayForceToGray(0);
        }

    return 0;
}

Luego compilarlos en comandos:

clang -g -O2 -std=c11 -Wall -framework ApplicationServices enable-grayscale.c -o enable-grayscale
clang -g -O2 -std=c11 -Wall -framework ApplicationServices disable-grayscale.c -o disable-grayscale

Coloque los archivos resultantes en algún lugar donde desee ejecutarlos, por ejemplo, su directorio de inicio.

Ahora instala Hammerspoon . Deberá otorgarle acceso de accesibilidad en Preferencias del Sistema. Dentro de Hammerspoon, selecciona "Abrir configuración" y modifica el código Lua para hacer lo que quieras. Mi configuración está a continuación, basada en este ejemplo de sus documentos :

function applicationWatcher(appName, eventType, appObject)
    if (eventType == hs.application.watcher.activated) then
        if (appName == "Firefox") then
            os.execute('/path/to/scripts/enable-grayscale')
        end
    end
    if (eventType == hs.application.watcher.deactivated) then
        if (appName == "Firefox") then
            os.execute('/path/to/scripts/disable-grayscale')
        end
    end
end
appWatcher = hs.application.watcher.new(applicationWatcher)
appWatcher:start()

Esa es la configuración que elegí (activar la escala de grises para Firefox, pero dejarla desactivada para todas las demás aplicaciones). Cada vez que Firefox está enfocado, toda la pantalla se vuelve en escala de grises. Cuando otras aplicaciones están enfocadas, es el color. Parece que desearía lo contrario: la escala de grises activada en las Preferencias del sistema, y ​​que se deshabilite cuando enfoca una aplicación de la lista que le interesa. Una vez que la haya configurado como desee, haga clic en "Recargar configuración" para activar los cambios.

bien, ¿funciona esto si la aplicación que desencadena este cambio se maximiza mientras se cambia a otra aplicación? ¿La aplicación de cambio activará la pantalla a escala de grises en ese caso? Estoy tratando de hacer que esto funcione en iTerm, quiero que la aplicación de terminal tenga color y todo lo demás sea gris, hasta ahora llegué al punto en que funciona el código c, pero Hammerspoon no responde a appName "iTerm".
Es posible que pueda agregar una declaración de registro que registre el appName, luego puede verificar qué appNameestá viendo en la consola de depuración de hammerspoon (como tal vez sea "iTerm 2" o algo así). Para ser honesto, dejé de usar esto hace un tiempo, así que no puedo ayudar más.

No, esta opción solo está disponible como una opción global en las opciones de accesibilidad.