Ask Different Asked by esaruoho on January 21, 2021
I’m wondering what would be the process of enabling/disabling the grayscale mode in the Accessibility panel in System Preferences?
I would like to run a simple script, either by clicking on an app in the Dock or by a Terminal command, and have it switch from grayscale to regular mode.
Any ideas?
Note: The example AppleScript code was updated to handle the current latest macOS (Mojave) and add additional code improvements. On earlier versions of OS X/macOS you may have to remove of group 1
from the two lines of example AppleScript code that have it, for the code to work.
If you want to create an AppleScript application to put in the Dock you can use the following code in OS X Yosemite (and latter, I believe).
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
In Script Editor, save it as Toggle Grayscale changing the File Format: to: Application
You can give the App a different icon via copy and paste into the icon of the App's Get Info sheet and then drag and drop the App bundle onto the Dock.
You'll have to give permission under Accessibility on the Privacy tab of Security & Privacy in System Preferences in order to run it successfully.
If you'd like to use a bash script using the code provided by IconDaemon, the following code will toggle between using color and grayscale based on how it's currently set.
#!/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
Correct answer by user3439894 on January 21, 2021
Install scriptisto
and save this script as gray_darwin.c
, and make it executable. Also, have Xcode CLI tools installed.
#!/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: %dn", CGDisplayUsesForceToGray());
return 0;
}
else {
isGrayscale = true;
}
} else {
isGrayscale = CGDisplayUsesForceToGray();
printf("isGrayscale = %dn", isGrayscale);
}
CGDisplayForceToGray(!isGrayscale);
printf("Grayscale is now: %dn", CGDisplayUsesForceToGray());
return 0;
}
Now you can use it like so:
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
}
Answered by HappyFace on January 21, 2021
This requires developer tools to compile an objective C program. The program is based on this Stackoverflow answer.
Create a file called grayscale.c with the following contents:
// 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 = %dn", isGrayscale);
CGDisplayForceToGray(!isGrayscale);
printf("Grayscale is now: %dn", CGDisplayUsesForceToGray());
return 0;
}
Then run the following command to compile it:
clang -g -O2 -std=c11 -Wall -framework ApplicationServices ./grayscale.c -o toggle-grayscale
Now run ./toggle-grayscale
This instantly makes the screen grayscale or not across all applications, but doesn't update the setting in System Preferences.
Tested on MacOS High Sierra 10.13.6, clang version Apple LLVM version 10.0.0 (clang-1000.10.44.4)
.
Answered by RecursivelyIronic on January 21, 2021
The .plist files which are modified by the Accessibility panel are found in ~/Library/Preferences
and they are com.apple.CoreGraphics
and com.apple.universalaccess
.
No changes are made to any files in ~/Library/Preferences/ByHost
Execute the commands:
defaults write com.apple.universalaccess grayscale -bool yes
defaults write com.apple.CoreGraphics DisplayUseForcedGray -bool yes
Then force the color change to greyscale by unloading and reloading the universalaccessd
process:
launchctl unload /System/Library/LaunchAgents/com.apple.universalaccessd.plist
launchctl load /System/Library/LaunchAgents/com.apple.universalaccessd.plist
To switch back to color execute the same commands with the defaults
parameters set to no
.
Unlike the Accessibility panel, which changes the color instantaneously, this method can take a few seconds to make the transition.
Answered by IconDaemon on January 21, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP