9 votos

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

Me pregunto cuál sería el proceso para habilitar/deshabilitar el modo de escala de grises en el panel de Accesibilidad en 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 modo de escala de grises a modo regular.

¿Alguna idea?

9voto

Armaan Puntos 101

Esto requiere herramientas de desarrollo para compilar un programa objetivo C. 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 
#include 

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("Ahora la escala de grises es: %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-grayscale. Esto hace que la pantalla se ponga en escala de grises o no instantáneamente en todas las aplicaciones, pero no actualiza la configuración en Preferencias del Sistema.

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

0 votos

Estoy de acuerdo en que no es ideal. No pude hacer que la solución de script de Apple funcionara de manera 100% confiable y conduce a una molesta ventana emergente cuando se ejecuta el script. Usar launchctl requeriría deshabilitar las protecciones de seguridad (una práctica mucho peor en mi opinión), y es lento. Por supuesto, cabe mencionar que usar una API de Objective C no documentada puede que no sea la forma ideal de hacer esto, pero esta solución tiene ventajas que otras carecen y es más fácil de scriptar para personas familiarizadas con interfaces de línea de comandos de UNIX.

4 votos

Esto es asombroso. Tomé tu ejecutable y lo convertí en un servicio a través de Automator, y luego asigné un atajo de teclado a ese servicio, mapeando efectivamente Cmd+Option+Ctrl+9 para alternar la escala de grises.

2 votos

Esto es interesante. Cuando se usa con la inversión de color, este enfoque simple a escala de grises proporciona una salida más agradable que uno de los filtros de color de escala de grises de Accesibilidad nativa de macOS (que creo que recientemente no funciona con la inversión de color en absoluto). ¡Encontré un inconveniente, sin embargo: when usando múltiples pantallas, el comportamiento en escala de grises se apaga una vez que cambio a una ventana en otra pantalla (todavía estoy investigando ese problema).

5voto

user3439894 Puntos 5883

Nota: El código de ejemplo de AppleScript se actualizó para manejar la última versión actual de macOS (Mojave) y agregar mejoras adicionales al código. En versiones anteriores de OS X/macOS es posible que tengas que quitar de group 1 de las dos líneas de código de ejemplo de AppleScript que lo contienen, para que el código funcione.


Si deseas crear una aplicación de AppleScript para colocar en el Dock, puedes utilizar el siguiente código en OS X Yosemite (y posteriores, 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 Editor de Script, guárdalo como Alternar Escala de Grises cambiando el Formato de Archivo: a: Aplicación

Puedes darle a la app un icono diferente mediante copiar y pegar en el icono de la hoja Obtener Información de la App y luego arrastrar y soltar el paquete de la App al Dock.

Tendrás que dar permiso en Accesibilidad en la pestaña de Privacidad de Seguridad y Privacidad en Preferencias del Sistema para ejecutarlo con éxito.


Si deseas 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 basado en cómo está actualmente configurado.

#!/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 "  Cambiando la pantalla para usar color. Esto tomará un momento..."
        ;;
        "YES")
            echo "  Cambiando la pantalla para usar escala de grises. Esto tomará un momento..."
        ;;
    esac

}

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

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

ingresar descripción de la imagen aquí

2 votos

Funcionó después de que añadí delay 1 antes de hacer clic en la casilla de verificación. ¡Gracias!

0 votos

User3439894 Recibo este error: System Events recibió un error: No se puede obtener la ventana "Accesibilidad" del proceso "Preferencias del Sistema". (-1728) Intentando solucionar dónde me equivoqué... ¡gracias!

0 votos

@Cory Snider, he actualizado el código de ejemplo de AppleScript para manejar la última versión actual de macOS (Mojave) y agregar mejoras adicionales al código. En versiones anteriores de OS X/macOS es posible que tengas que eliminar el grupo 1 de las dos líneas de código de ejemplo de AppleScript que lo contienen, para que el código funcione.

4voto

Los archivos .plist que son modificados por el panel de Accesibilidad se encuentran en ~/Library/Preferences y son com.apple.CoreGraphics y 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 fuerza el cambio de color a escala de grises descargando y volviendo a cargar el proceso universalaccessd:

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

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

Para volver al color, ejecuta los mismos comandos con los parámetros de defaults establecidos en no.

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

0 votos

Probando en un Intel Core i7 de 2.8 GHz y envuelto en un script de bash, tardó 10 segundos después de que se ejecutara el script para que se mostrara en escala de grises. Así que tendría que decir que "unos segundos" es engañoso, pero igualmente +1.

0 votos

Quizás haya un comando launchctl diferente que lo haga ejecutar más rápido? En mi Intel Core i7 de 3.4GHz no tomó más de 5-6 segundos, como máximo. Acabo de cronometrarlo.

0 votos

Estaba proporcionando los comandos de terminal para que el OP y otros pudieran usarlos 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 pez a una persona, comerá un día. Enséñales cómo pescar y nunca tendrán hambre.

2voto

Brandon W Puntos 48

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 hacerlo de 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 # necesita tiempo para abrir el acceso universal
    tell application "System Events" to tell process "System Preferences" to tell window "Accessibility"
        select row 5 of table 1 of scroll area 1 # abrir las preferencias de visualización
        click radio button "Filtros de color" of tab group 1 of group 1
        click checkbox "Activar filtros de color" 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

0voto

HappyFace Puntos 38

Instalar scriptisto mediante

  • Instalar Homebrew
  • Instalar Cargo con brew install --cask cargo
  • Ejecutar cargo install scriptisto

También necesitas tener instaladas las herramientas de línea de comandos de Xcode (xcode-select --install).

Luego guarda lo siguiente como gray_darwin.c y hazlo ejecutable (chmod +x gray_darwin.c).

#!/usr/bin/env scriptisto

   // Autónomo, no tiene dependencias excepto 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 
#include 

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; // cambiará esto a true
    } else if (argv[1][0] == 's') {
      printf("La escala de grises ahora es: %d\n", CGDisplayUsesForceToGray());
      return 0;
    }
    else {
      isGrayscale = true;
    }
  } else {
    isGrayscale = CGDisplayUsesForceToGray();
    printf("isGrayscale = %d\n", isGrayscale);
  }

  CGDisplayForceToGray(!isGrayscale);
  printf("La escala de grises ahora es: %d\n", CGDisplayUsesForceToGray());

  return 0;
}

Ahora puedes usarlo de la siguiente manera:

function display-gray-is() {
    [[ "$(gray_darwin.c s)" == "La escala de grises ahora es: 1" ]]
}
function display-gray-toggle() {
    gray_darwin.c
}
function display-gray-off() {
    gray_darwin.c n
}
function display-gray-on() {
    gray_darwin.c y
}

0 votos

Desafortunadamente, parece que scriptisto no está en brew o brew cask.

0 votos

@esaruoho Instálalo a través de cargo.

0 votos

Por favor, modifica tu solución/respuesta para que mencione el procedimiento de instalación. ¡Se aprecia mucho! @HappyFace

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X