¿Cómo habilitar/deshabilitar el modo de escala de grises en Accesibilidad a través de Terminal/Aplicación?

Me pregunto cuál sería el proceso de habilitar/deshabilitar el modo de escala de grises en el panel de Accesibilidad en las Preferencias del Sistema.

Me gustaría ejecutar un script simple, ya sea haciendo clic en una aplicación en el Dock o mediante un comando de Terminal, y hacer que cambie de escala de grises a modo normal.

¿Algunas ideas?

Respuestas (6)

Nota: El código AppleScript de ejemplo se actualizó para manejar la versión más reciente de macOS (Mojave) y agregar mejoras de código adicionales. En versiones anteriores de OS X/macOS, es posible que deba eliminar of group 1de las dos líneas del código AppleScript de ejemplo que lo tienen, para que el código funcione.


Si desea crear una aplicación AppleScript para colocarla en el Dock, puede usar el siguiente código en OS X Yosemite (y más tarde, creo).

if running of application "System Preferences" then
    try
        tell application "System Preferences" to quit
    on error
        do shell script "killall 'System Preferences'"
    end try
end if

repeat while running of application "System Preferences" is true
    delay 0.01
end repeat

tell application "System Preferences" to reveal anchor "Seeing_Display" of ¬
    pane id "com.apple.preference.universalaccess"

tell application "System Events" to tell process "System Preferences"
    repeat until exists checkbox "Use grayscale" of group 1 of ¬
        window "Accessibility"
        delay 0.01
    end repeat
    click the checkbox "Use grayscale" of group 1 of window "Accessibility"
end tell

tell application "System Preferences" to quit

En el Editor de secuencias de comandos, guárdelo como Alternar escala de grises cambiando el Formato de archivo: a: Aplicación

Puede darle a la aplicación un ícono diferente copiando y pegando en el ícono de la hoja Obtener información de la aplicación y luego arrastrando y soltando el paquete de la aplicación en el Dock.

Deberá otorgar permiso en Accesibilidad en la pestaña Privacidad de Seguridad y privacidad en Preferencias del sistema para ejecutarlo correctamente.


Si desea utilizar un script bash utilizando el código proporcionado por IconDaemon, el siguiente código alternará entre el uso de color y escala de grises según la configuración actual.

#!/bin/bash

setGrayscale () {

    defaults write com.apple.universalaccess grayscale -bool $1
    defaults write com.apple.CoreGraphics DisplayUseForcedGray -bool $1
    launchctl unload /System/Library/LaunchAgents/com.apple.universalaccessd.plist
    launchctl load /System/Library/LaunchAgents/com.apple.universalaccessd.plist

    case "$1" in
        "NO")
            echo "  Changing Display to use color. This will take a moment..."
        ;;
        "YES")
            echo "  Changing Display to use grayscale. This will take a moment..."
        ;;
    esac

}

_bool="$(defaults read com.apple.universalaccess grayscale 2>/dev/null)"

case "$_bool" in
    "0")
        setGrayscale "YES"
    ;;
    "1")
        setGrayscale "NO"
    ;;
    *)
        setGrayscale "YES"
    ;;
esac

ingrese la descripción de la imagen aquí

Funcionó después de que agregué delay 1antes de hacer clic en la casilla de verificación. ¡Gracias!
user3439894 Recibo este error: Los eventos del sistema obtuvieron un error: no se puede obtener la ventana "Accesibilidad" del proceso "Preferencias del sistema". (-1728) Tratando de solucionar el problema en el que me equivoqué... ¡gracias!
@Cory Snider, actualicé el código AppleScript de ejemplo para manejar el último macOS (Mojave) actual y agregar mejoras de código adicionales. En versiones anteriores de OS X/macOS, es posible que deba eliminar el grupo 1 de las dos líneas de código AppleScript de ejemplo que lo tienen, para que el código funcione.

Esto requiere herramientas de desarrollador para compilar un programa C objetivo. El programa se basa en esta respuesta de Stackoverflow .

Cree un archivo llamado grayscale.c con el siguiente contenido:

// clang -g -O2 -std=c11 -Wall -framework ApplicationServices
// 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();
    printf("isGrayscale = %d\n", isGrayscale);
    CGDisplayForceToGray(!isGrayscale);
    printf("Grayscale is now: %d\n", CGDisplayUsesForceToGray());

    return 0;
}

Luego ejecute el siguiente comando para compilarlo:

clang -g -O2 -std=c11 -Wall -framework ApplicationServices ./grayscale.c -o toggle-grayscale

Ahora ejecute ./toggle-grayscaleEsto instantáneamente convierte la pantalla en escala de grises o no en todas las aplicaciones, pero no actualiza la configuración en Preferencias del sistema.

Probado en MacOS High Sierra 10.13.6, versión clang Apple LLVM version 10.0.0 (clang-1000.10.44.4).

Estoy de acuerdo, no es lo ideal. No pude hacer que la solución de secuencias de comandos de Apple funcionara al 100% de manera confiable y genera una ventana emergente molesta cuando se ejecuta la secuencia de comandos. El uso de launchctl requeriría deshabilitar las protecciones de seguridad (una práctica mucho peor en mi opinión) y es lento. Por supuesto, no hace falta decir que el uso de una API C objetiva no documentada puede no ser la forma ideal de hacerlo, pero esta solución tiene ventajas de las que carecen las demás y es más fácil de programar para las personas familiarizadas con las interfaces de línea de comandos de UNIX.
Esto es increíble. Tomé su ejecutable y lo convertí en un servicio a través de Automator, y luego asigné un atajo de teclado a ese servicio, esencialmente mapeando Cmd+Opción+Ctrl+9 para alternar la escala de grises
Esto es interesante. Cuando se usa con inversión de color, este enfoque simple de la escala de grises proporciona un mejor resultado que uno de los filtros de color nativos de escala de grises de Accesibilidad de macOS (que creo que últimamente no funciona en absoluto con la inversión de color). Sin embargo, encontré un inconveniente: cuando uso varias pantallas, el comportamiento de la escala de grises se desactiva una vez que cambio a una ventana en otra pantalla (todavía estoy investigando ese problema).
Gran opción. Haga eco de lo que dice Anton: esto funciona mejor que la funcionalidad de habilitar el filtro de color de escala de grises.
Desafortunadamente, no funciona en M1/Big Sur. No estoy seguro de por qué. printf informará que el indicador alterna entre 0 y 1, pero no se produce ningún cambio visual.

Los archivos .plist que son modificados por el panel de Accesibilidad se encuentran en ~/Library/Preferencesy son com.apple.CoreGraphicsy com.apple.universalaccess.

No se realizan cambios en ningún archivo en~/Library/Preferences/ByHost

Ejecuta los comandos:

defaults write com.apple.universalaccess grayscale -bool yes

defaults write com.apple.CoreGraphics DisplayUseForcedGray -bool yes

Luego fuerce el cambio de color a escala de grises descargando y volviendo a cargar el universalaccessdproceso:

launchctl unload /System/Library/LaunchAgents/com.apple.universalaccessd.plist

launchctl load /System/Library/LaunchAgents/com.apple.universalaccessd.plist

Para volver al color, ejecute los mismos comandos con los defaultsparámetros establecidos en no.

A diferencia del panel de Accesibilidad, que cambia el color instantáneamente, este método puede tardar unos segundos en realizar la transición.

Probando en un Intel Core i7 de 2.8 GHz y envuelto en un script bash, tomó 10 segundos después de que se ejecutó el script para que se mostrara la escala de grises. Así que tendría que decir que "unos segundos" es engañoso, pero de todos modos +1.
¿Quizás hay un comando launchctl diferente que hace que se ejecute más rápido? En mi Intel Core i7 de 3,4 GHz, no tardé más de 5-6 segundos, como máximo. Acabo de cronometrarlo.
Estaba proporcionando los comandos de terminal que OP y otros podrían usar para crear un script de Shell por su cuenta. Prefiero usar Perl para crear un script con estos comandos y envolverlo en Platypus . Dale un pescado a una persona: comerá por un día. Enséñales a pescar y nunca tendrán hambre.
En macOS 10.13.3 Beta, los launchctlcomandos generan este mensaje de error: Operation not permitted while System Integrity Protection is engaged. Puede deshabilitar la Protección de integridad del sistema (consulte aquí ), pero hacerlo lo vuelve más vulnerable al malware.

Para Catalina y Big Sur, use este código AppleScript abriendo la aplicación Script Editor. Abra un nuevo documento y copie el código. Para que se pueda hacer doble clic (como una aplicación desde el escritorio, por ejemplo), haga clic en Archivo > Exportar y luego elija como Formato de archivo > Aplicación.

tell application "System Preferences"
    set the current pane to pane id "com.apple.preference.universalaccess"
    delay 1 #needs time to open universal access
    tell application "System Events" to tell process "System Preferences" to tell window "Accessibility"
        select row 5 of table 1 of scroll area 1 #open display preferences
        click radio button "Color Filters" of tab group 1 of group 1
        click checkbox "Enable Color Filters" of tab group 1 of group 1
    end tell
end tell
tell application "System Preferences" to quit

Desde aquí: https://gist.github.com/silesky/2da3a6bef1703e38d901ec9c623eecbd

Sigo trabajando en Monterey, aunque solo funcionó cuando cambié "Color" a "Color" en mi sistema (no en inglés de EE. UU.) :)

Puede instalar la aplicación Modo de escala de grises de código abierto que le permite activar o desactivar la escala de grises con un acceso directo personalizado o con un solo clic con el botón derecho en el icono de la barra de menú.

Instalar scriptistopor

  • Instalación de cerveza casera
  • Instalación de carga conbrew install --cask cargo
  • Corrercargo install scriptisto

También necesita tener instaladas las herramientas Xcode CLI ( xcode-select --install).

Luego guarde lo siguiente como gray_darwin.c, y hágalo ejecutable ( chmod +x gray_darwin.c).

#!/usr/bin/env scriptisto

   // Self-contained, has no dependencies except Xcode CLI.

   // scriptisto-begin
   // script_src: main.c
   // build_cmd: clang -g -O2 -std=c11 -Wall -framework ApplicationServices main.c -o ./script
   // scriptisto-end

#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;
  if (argc > 1) {
    if (argv[1][0] == 'y') {
      isGrayscale = false; // will toggle this to true
    } else if (argv[1][0] == 's') {
      printf("Grayscale is now: %d\n", CGDisplayUsesForceToGray());
      return 0;
    }
    else {
      isGrayscale = true;
    }
  } else {
    isGrayscale = CGDisplayUsesForceToGray();
    printf("isGrayscale = %d\n", isGrayscale);
  }
  CGDisplayForceToGray(!isGrayscale);
  printf("Grayscale is now: %d\n", CGDisplayUsesForceToGray());

  return 0;
}

Ahora puedes usarlo así:

function display-gray-is() {
    [[ "$(gray_darwin.c s)" == "Grayscale is now: 1" ]]
}
function display-gray-toggle() {
    gray_darwin.c
}
function display-gray-off() {
    gray_darwin.c n
}
function display-gray-on() {
    gray_darwin.c y
}
desafortunadamente scriptisto no parece estar en cerveza o en barril de cerveza?
@esaruoho Instálalo a través de cargo.
modifique su solución/respuesta para que mencione el procedimiento de instalación. ¡Muy apreciado! @Cara feliz
@esaruohocargo install scriptisto
Ok, @HappyFace, edité su respuesta original para incluir instrucciones sobre chmod +x, xcode cli install y cargo install.
Por cierto, @HappyFace, Cargo no está disponible en homebrew a través brew install --cask cargode al menos no en el M1.