Skip to content

Instantly share code, notes, and snippets.

@GetVladimir
Last active November 15, 2024 14:00
Show Gist options
  • Save GetVladimir/c89a26df1806001543bef4c8d90cc2f8 to your computer and use it in GitHub Desktop.
Save GetVladimir/c89a26df1806001543bef4c8d90cc2f8 to your computer and use it in GitHub Desktop.
Force RGB Color on M1 Mac

Force RGB Color on M1 Mac

How to Force RGB Color Output instead of YPbPr on your M1 Apple Silicon Mac for an External Monitor.

This step-by-step video tutorial will guide you through the procedure of forcing RGB color output on your M1 Mac.

Force RGB Color on M1 Mac

Here is the direct link to the video tutorial: https://www.youtube.com/watch?v=Z1EqH3fd0V4

The video also has Closed Captions (Subtitles) that you can enable, to make it easier to follow if needed.



Please note that you're doing any changes on your own risk.

Terminal commands used in the video

Here are each of the Terminal commands mentioned in the tutorial, so that you can just copy and paste them:

open /Library/Preferences

plutil -convert xml1

plutil -convert binary1

plutil -lint



The step-by-step procedure on how to force RGB Color Output on M1 and M2 based Macs with Terminal commands

  1. Open Terminal and use this command to make Finder select the displays plist file:
    open -R /Library/Preferences/com.apple.windowserver.displays.plist

  2. Drag and drop the com.apple.windowserver.displays.plist file to Desktop manually. Don't use the cp command, as it won't add your current user with writing privileges.

  3. Convert the file to XML:
    plutil -convert xml1 ~/Desktop/com.apple.windowserver.displays.plist

  4. Open the converted file with the default plain text editor (avoid using the built-in TextEdit app if possible, since it might modify the file and make it unreadable by the system)
    open -t ~/Desktop/com.apple.windowserver.displays.plist
    or
    open -a CotEditor.app ~/Desktop/com.apple.windowserver.displays.plist

  5. Copy and paste the missing LinkDesription Key under the current display (check the screenshot below for an example of how it should look like):

				<key>LinkDescription</key>
				<dict>
					<key>BitDepth</key>
					<integer>8</integer>
					<key>EOTF</key>
					<integer>0</integer>
					<key>PixelEncoding</key>
					<integer>0</integer>
					<key>Range</key>
					<integer>1</integer>
				</dict>
  1. Save the file and then convert it to binary again:
    plutil -convert binary1 ~/Desktop/com.apple.windowserver.displays.plist

  2. Check if the plist file is valid:
    plutil -lint ~/Desktop/com.apple.windowserver.displays.plist

  3. Open the /Library/Preferences/ folder again:
    open /Library/Preferences/

  4. Drag and drop the updated com.apple.windowserver.displays.plist file from Desktop to the Library folder manually. Don't use the cp command, as it won't add your current user with writing privileges.

  5. Right Click on the com.apple.windowserver.displays.plist file in the Library folder and click on Get Info

  6. Check the boxes for Stationery and Locked.

  7. Reboot the Mac.

That's it!



(Alternative) Terminal commands to force RGB Color Output on M1 and M2 based Macs and workaround for losing RGB color after waking up from sleep

  1. Open Terminal

  2. Paste the following commands to edit the User's displays plist file com.apple.windowserver.displays.[UUID].plist using the built-in PlistBuddy function in macOS:

/usr/libexec/PlistBuddy -c "add DisplaySets:Configs:DisplayConfig:DisplayConfig:DisplayConfig:LinkDescription:BitDepth integer" ~/Library/Preferences/ByHost/com.apple.windowserver.displays.*.plist
/usr/libexec/PlistBuddy -c "set DisplaySets:Configs:DisplayConfig:DisplayConfig:DisplayConfig:LinkDescription:BitDepth 8" ~/Library/Preferences/ByHost/com.apple.windowserver.displays.*.plist
/usr/libexec/PlistBuddy -c "add DisplaySets:Configs:DisplayConfig:DisplayConfig:DisplayConfig:LinkDescription:EOTF integer" ~/Library/Preferences/ByHost/com.apple.windowserver.displays.*.plist
/usr/libexec/PlistBuddy -c "add DisplaySets:Configs:DisplayConfig:DisplayConfig:DisplayConfig:LinkDescription:PixelEncoding integer" ~/Library/Preferences/ByHost/com.apple.windowserver.displays.*.plist
/usr/libexec/PlistBuddy -c "add DisplaySets:Configs:DisplayConfig:DisplayConfig:DisplayConfig:LinkDescription:Range integer" ~/Library/Preferences/ByHost/com.apple.windowserver.displays.*.plist
  1. Reboot your Mac

(Workaround) If your Mac loses RGB color after waking up from sleep mode, either Reboot your Mac (recommended) or use this Terminal command to stop the WindowServer and login again (not recommended):

sudo killall -HUP WindowServer



End result

The end result is having your M1 mac output RGB color to your external monitor instead of YPbPr, potentially making the colors more accurate and the text a bit more crisp, even on older 1080p monitors.

Hopefully this tutorial would be useful to someone.

Please feel free to ask in the comment section if you have any questions regarding this procedure.



Background

While doing a lot of testing on how the Dual-Cable workaround makes RGB to work on M1, I've discovered what changes it makes to macOS, and managed to create a more streamlined workaround without the need to use a second cable.

To make things easier, I've created a step-by-step video tutorial of the whole procedure that should force RGB color output on your M1 Mac connected to an external monitor, and works on an HDMI-to-HDMI cable connection.

Credits

Big thanks goes to the amazing community and all their help over the years to solve issues like this:
https://gist.github.com/ejdyksen/8302862
https://gist.github.com/adaugherity/7435890

Useful Sources

Apple Open Source Project Files for Displays and Graphics
https://opensource.apple.com/source/IOKitUser/IOKitUser-1445.60.1/graphics.subproj/IODisplayLib.c
https://opensource.apple.com/source/IOGraphics/IOGraphics-517.17/IOGraphicsFamily/IOFramebuffer.cpp.auto.html

How to Edit and Convert binary plist files
http://hints.macworld.com/article.php?story=20050803111126899
https://apple.stackexchange.com/questions/155393/how-to-beautify-binary-dict-files
https://discussions.apple.com/thread/1768480

How to Edit plist files using defaults and PlistBuddy
https://ss64.com/osx/defaults.html
https://github.com/mathiasbynens/dotfiles/blob/master/.macos

Apps based on this method

@sudowork has created an awesome script written in Phyton that automates the steps and checks for duplicate files.
You can find more info about it here: https://github.com/sudowork/fix_m1_rgb

@dangh has created an alernative script for fishshell.
You can find more info about it here: https://github.com/dangh/force-rgb.fish

@GetVladimir I've also created a Shortcut to Force RGB Color Output using the built-in Shortcuts app.
You can find how to create the Shortcut here: https://gist.github.com/GetVladimir/c89a26df1806001543bef4c8d90cc2f8?permalink_comment_id=4531552#gistcomment-4531552

@entropyconquers has created a script based on this method written in Phyton that automates the steps, makes a backup and checks for duplicate files.
You can find more info about it here: https://github.com/entropyconquers/Force-RGB-Color-on-M1-M2-Mac-Script

Additional notes

Multiple PixelEncoding and Range keys in the same plist file
Note that there might be multiple instances of the PixelEncoding and Range keys in the same file, one for each output of your monitor and for different AirPlay devices. You might need to update the integer on each one to get RGB color output on all displays.

Getting RGB color only before login
There might be multiple duplicate plist files with the same name in different locations.

Make sure that you only have the main modified file in:
/Library/Preferences

Then make a backup and remove duplicate displays plist files from these locations (if any):
~/Library/Preferences
or
/Users/username/Library/Preferences
and
/Users/username/Library/Preferences/ByHost


Please note that you'll need to have administrator privileges in order to modify the file in /Library/Preferences. Thanks goes to @keegandent and @StrategicalIT for pointing this out.

Updates regarding macOS Monterey

USB-C to DisplayPort
From what I've seen, it seems that macOS Monterey 12.0.1 finally outputs RGB color by default on some monitors when using USB-C to DisplayPort cable on M1 Apple Silicone Macs.

You might need to make a backup and delete these 2 files:
/Library/Preferences/com.apple.windowserver.displays.plist
and
/Users/yourname/Library/Preferences/ByHost/com.apple.windowserver.displays.[UDID].plist

Restart your Mac and it should properly output RGB color on the monitor on the next boot.

HDMI to HDMI
The situation with HDMI seems to got a bit more complicated. Now the whole section for the LinkDescription might be missing from the com.apple.windowserver.displays.plist on a clean install and doesn't seem to be recreated when rotating the screen either.

Luckily, the solution still works, but you might need to manually add this whole section in the displays plist file:

					<key>LinkDescription</key>
					<dict>
						<key>BitDepth</key>
						<integer>8</integer>
						<key>EOTF</key>
						<integer>0</integer>
						<key>PixelEncoding</key>
						<integer>0</integer>
						<key>Range</key>
						<integer>1</integer>
					</dict>



The section usually goes right under the CurrentInfo key, and it should look something like this:

pixelencoding

This should get your RGB color output working on M1 Mac mini, even when connected with HDMI to HDMI cable.

Multiple monitors when one them is using HDMI to HDMI
Additional thanks goes to @somogyi-ede who tested this with multiple monitors and confirmed that the LinkDescription key needs to be added under each monitor instance in order for all of them to receive RGB color output. Link to the comment

Updates regarding macOS 13 Ventura

USB-C to DisplayPort
The macOS 13 Ventura beta seems to outputs RGB color by default on some monitors when using USB-C to DisplayPort cable on M1 Apple Silicone Macs.

You might need to make a backup and delete these 2 files:
/Library/Preferences/com.apple.windowserver.displays.plist
and
/Users/yourname/Library/Preferences/ByHost/com.apple.windowserver.displays.[UDID].plist

Restart your Mac and it should properly output RGB color on the monitor on the next boot.

HDMI to HDMI
Similar as macOS Monterey, the situation with HDMI on macOS Venturs seems a bit more complicated. Usually the whole section for the LinkDescription might be missing from the com.apple.windowserver.displays.plist on a clean install and doesn't seem to be recreated when rotating the screen either.

Luckily, the solution still works, and you still need to manually add this whole section in the displays plist file:

					<key>LinkDescription</key>
					<dict>
						<key>BitDepth</key>
						<integer>8</integer>
						<key>EOTF</key>
						<integer>0</integer>
						<key>PixelEncoding</key>
						<integer>0</integer>
						<key>Range</key>
						<integer>1</integer>
					</dict>



The section usually goes right under the CurrentInfo key, and it should look something like this:

pixelencoding

This should get your RGB color output working on M1 Mac mini, even when connected with HDMI to HDMI cable.

(Optional) Lock the plist file and set it as stationary
After the macOS Ventura 13.3 update, the plist file seems to get overwritten on reboot.

After you make the edits in the file, you can try setting the file /Library/Preferences/com.apple.windowserver.displays.plist as Stationery pad and Locked, so that it doesn't get overwritten on every reboot

Stationery Pad Locked

To do this, right click on the plist file, click on Get Info and check the boxes next to Stationery pad and Locked

This requires further testing and might cause some issues, like not being able to remember new resolutions or display settings. Please note that you're making any changes at your own risk.

Updates regarding macOS 14 Sonoma Beta

USB-C to DisplayPort
The macOS 14 Sonoma seems to outputs RGB color by default when using USB-C to DisplayPort cable.

HDMI to HDMI
The macOS 14 Sonoma seems to outputs YCbCr color by default when using HDMI to HDMI cable.

  • Forcing RGB Color Output still seems to work with the original procedure of modifying the plist files

  • Modifying the display plist files still works with the alternative version

  • After the plist files are modified, putting the Mac to sleep and waking it, it seem to keep the RGB Color output (this seems to be fixed at least on a M1 Mac mini)

If you have any additional questions, please feel free to contact me.

@GetVladimir
Copy link
Author

@maxskorr thank you for your comment and the info.

I haven't seen this feature before. Good info to know for anyone using a DisplayLink based Dock.

@Bilge
Copy link

Bilge commented Apr 15, 2024

Forcing RGB Color Output still seems to work with the original procedure of modifying the plist files

No, it doesn't. I followed the instructions to the letter on Sonoma and it didn't do shit. The "alternate" method was also a waste of time. Stuck with shitty TV colours on a desktop monitor because I'm forced to use the worst operating system ever conceived.

@johny-b
Copy link

johny-b commented Apr 21, 2024

@GetVladimir

Thx for this guide, this is helpful, although I still couldn't make it work :/

A couple of problems:

Copy and paste the missing LinkDesription Key under the current display

How do I find "current display"? I have (for some unknown reason) 27 CurrentInfos:

/Users/janbet  > plutil -convert xml1 -o - /Library/Preferences/com.apple.windowserver.displays.plist | grep CurrentInfo | wc -l     
      27

(I would love to just reset my display settings to factory settings, but if I remove this file then it is again there after reboot, because the same file is in /System/Volumes/Preboot/[many characters]/Library/Preferences directory and I guess it's copied from there. Any solution to this?)

Also, regarding this method - I see message File Doesn't Exist, Will Create: /Users/janbet/Library/Preferences/ByHost/com.apple.windowserver.displays.*.plist and things still don't work (after reboot). I have a new file in my user Library/Preferences/ByHost that has this single LinkDescription somewhere but otherwise is a copy of the file from /Library/Preferences directory.

I have M3 Pro + Sonoma 14.4.1.

@GetVladimir
Copy link
Author

GetVladimir commented Apr 21, 2024

@johny-b Thank you so much for your comment and I'm glad if the guide is helpful.

If you use a dock, it's very possible that it creates a new current display or UUID every time you connect the M3 Pro to it.

There is an excellent suggestion by @albertmonzo here that suggests to use the Color Sync Utility.app in order to find the UUID of the current connection.

Although, if it keeps changing the UUID, it's likely that it won't work after reboot or reconnect. If possible, it might be for the best to use a dedicated USB-C to DisplayPort cable for the Monitor, even if you need to plug 2 cables each time.

@measyn
Copy link

measyn commented May 4, 2024

Hello everyone!

I encountered similar issues with my LG 27QN880-B and M1 Mac when using a Type C - Type C cable. I tried various troubleshooting steps, such as editing plist files, running scripts, and so on. HDMI via a hub worked well, displaying true 2k RGB colors. Therefore, I decided to test another cable. Initially, the results were the same, but after multiple unplugging and re-plugging attempts, the monitor finally displayed true, crisp RGB colors. However, colored noise lines began to appear after some time, followed by the monitor blinking black. After several blinks, it reverted to YPbPr mode.

Switching back to the original cable, after several attempts, the RGB colors reappeared, but only at 60Hz; switching to 75Hz resulted in YPbPr mode again. After further attempts and changing the DisplayPort version on the monitor, it finally worked again with the old Type C - Type C cable at 2k resolution in RGB.

Therefore, the issue may not solely lie with the Mac but could also involve a poor cable/connection on the monitor. It seems that sometimes the cable fails to transmit true RGB signals properly, causing it to switch to a lower-quality format instead.

@GetVladimir
Copy link
Author

@measyn thank you so much for your comment and for the detailed info.

So you changed the DisplayPort version in the Menu of the Monitor, and the Mac started to output RGB color consistently?

I'm thinking that the issue might still be with the Mac, as it just chooses by random of all the color modes available each time you reconnect it.

And just to think that all of these issues could be avoided if they added a simple menu option in macOS Display Settings that allows us to choose RGB color (like we already have on the Apple TV settings).

@measyn
Copy link

measyn commented May 4, 2024

@GetVladimir i think setting DP version is just equal to replugging the cable.

The Mac and monitor sync with each other every time. I think it's some kind of dialogue "what can you afford" and "what type of connection we have".

Thunderbolt cables a really fragile. I faced similar issues with an Apple Thunderbolt Display, where sometimes it would just show a black screen, no YPbPr option, and a few reconnections would solve the problem. However, over time, the situation worsened. More frequent reconnections were needed, and eventually, a new cable had to be purchased.

I mentioned colored noise lines after i touched cable a little bit and after that black screen, and YPbPr showed. Similar to my experiences with the Thunderbolt Display in the past.

I also forgot to mention that before everything started working with the new cable, I completely deleted the plist file. Since then, after changing the DisplayPort version, the monitor took a significantly longer time to initialize, around 10-15 seconds instead of the usual 1-2 seconds. It seems like the Mac was creating new entries for each version as if it were dealing with an entirely different monitor.

Currently, my setup is as follows, all at 2560*1440 resolution:

  • DP 1.1: 60Hz YPbPr only
  • DP 1.2: 60Hz RGB always
  • DP 1.2: 75Hz RGB in 90% of attempts
  • DP 1.4: 60Hz RGB always
  • DP 1.4: 75Hz RGB in 90% of attempts

@GetVladimir
Copy link
Author

@measyn thank you, that's a good explanation. And you're right on the sync being different every time it reconnects.

Ideally, it would be RGB in 100% of attempts without any workarounds

@Bilge
Copy link

Bilge commented May 23, 2024

Has anyone ever gotten this to work on M3 Sonoma?

@GetVladimir
Copy link
Author

GetVladimir commented May 23, 2024

@Bilge The same procedure should work on M3 and the latest version of macOS 14.5.

An alternative would be to use an USB-C to DisplayPort cable if possible

@Bilge
Copy link

Bilge commented May 23, 2024

I want to use HDMI. The methods outlined here do nothing for HDMI to HDMI on 14.5.

@johny-b
Copy link

johny-b commented May 23, 2024

Has anyone ever gotten this to work on M3 Sonoma?

Just FYI, I failed. But I might try again one day.

@Bilge
Copy link

Bilge commented May 27, 2024

How am I supposed to know which one of these XML entries to edit? I have like 7 branches even though I only have one external monitor. I can't make any sense of this structure whatsoever.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>DisplayAnyUserSets</key>
	<dict>
		<key>Configs</key>
		<array>
			<dict>
				<key>DefaultConfigVersion</key>
				<integer>1</integer>
				<key>DisplayConfig</key>
				<array>
					<dict>
						<key>CurrentInfo</key>
						<dict>
							<key>Depth</key>
							<integer>8</integer>
							<key>High</key>
							<real>1200</real>
							<key>Hz</key>
							<real>60</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<false/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>1</real>
							<key>Wide</key>
							<real>1920</real>
						</dict>
						<key>Rotation</key>
						<real>0.0</real>
						<key>UUID</key>
						<string>924ED077-594A-4CDC-8D1B-2694444590D6</string>
						<key>UnmirrorInfo</key>
						<dict>
							<key>Depth</key>
							<integer>4</integer>
							<key>High</key>
							<real>1</real>
							<key>Hz</key>
							<real>60</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<false/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>1</real>
							<key>Wide</key>
							<real>1</real>
						</dict>
					</dict>
				</array>
			</dict>
			<dict>
				<key>DisplayConfig</key>
				<array>
					<dict>
						<key>CurrentInfo</key>
						<dict>
							<key>Depth</key>
							<integer>8</integer>
							<key>High</key>
							<real>1200</real>
							<key>Hz</key>
							<real>60</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<false/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>1</real>
							<key>Wide</key>
							<real>1920</real>
						</dict>
						<key>Rotation</key>
						<real>0.0</real>
						<key>UUID</key>
						<string>90A86AC1-47D5-4C8B-A6A3-BACADB5BB19A</string>
						<key>UnmirrorInfo</key>
						<dict>
							<key>Depth</key>
							<integer>8</integer>
							<key>High</key>
							<real>1200</real>
							<key>Hz</key>
							<real>60</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<false/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>1</real>
							<key>Wide</key>
							<real>1920</real>
						</dict>
					</dict>
				</array>
			</dict>
			<dict>
				<key>DisplayConfig</key>
				<array>
					<dict>
						<key>CurrentInfo</key>
						<dict>
							<key>Depth</key>
							<integer>8</integer>
							<key>High</key>
							<real>982</real>
							<key>Hz</key>
							<real>120</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<true/>
							<key>OriginX</key>
							<real>-1512</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>2</real>
							<key>Wide</key>
							<real>1512</real>
						</dict>
						<key>LinkDescription</key>
						<dict>
							<key>BitDepth</key>
							<integer>8</integer>
							<key>EOTF</key>
							<integer>0</integer>
							<key>PixelEncoding</key>
							<integer>0</integer>
							<key>Range</key>
							<integer>1</integer>
						</dict>
						<key>Rotation</key>
						<real>0.0</real>
						<key>UUID</key>
						<string>37D8832A-2D66-02CA-B9F7-8F30A301B230</string>
						<key>UnmirrorInfo</key>
						<dict>
							<key>Depth</key>
							<integer>4</integer>
							<key>High</key>
							<real>1</real>
							<key>Hz</key>
							<real>60</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<false/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>1</real>
							<key>Wide</key>
							<real>1</real>
						</dict>
					</dict>
					<dict>
						<key>CurrentInfo</key>
						<dict>
							<key>Depth</key>
							<integer>8</integer>
							<key>High</key>
							<real>1200</real>
							<key>Hz</key>
							<real>60</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<false/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>1</real>
							<key>Wide</key>
							<real>1920</real>
						</dict>
						<key>Rotation</key>
						<real>0.0</real>
						<key>UUID</key>
						<string>90A86AC1-47D5-4C8B-A6A3-BACADB5BB19A</string>
						<key>UnmirrorInfo</key>
						<dict>
							<key>Depth</key>
							<integer>8</integer>
							<key>High</key>
							<real>1200</real>
							<key>Hz</key>
							<real>60</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<false/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>1</real>
							<key>Wide</key>
							<real>1920</real>
						</dict>
					</dict>
				</array>
			</dict>
			<dict>
				<key>DefaultConfigVersion</key>
				<integer>1</integer>
				<key>DisplayConfig</key>
				<array>
					<dict>
						<key>CurrentInfo</key>
						<dict>
							<key>Depth</key>
							<integer>4</integer>
							<key>High</key>
							<real>1080</real>
							<key>Hz</key>
							<real>60</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<false/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>1</real>
							<key>Wide</key>
							<real>1920</real>
						</dict>
						<key>Rotation</key>
						<real>0.0</real>
						<key>UUID</key>
						<string>02A85953-5062-4C28-846B-30A78C1C9602</string>
						<key>UnmirrorInfo</key>
						<dict>
							<key>Depth</key>
							<integer>4</integer>
							<key>High</key>
							<real>1080</real>
							<key>Hz</key>
							<real>60</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<false/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>1</real>
							<key>Wide</key>
							<real>1920</real>
						</dict>
					</dict>
				</array>
			</dict>
			<dict>
				<key>DefaultConfigVersion</key>
				<integer>1</integer>
				<key>DisplayConfig</key>
				<array>
					<dict>
						<key>CurrentInfo</key>
						<dict>
							<key>Depth</key>
							<integer>8</integer>
							<key>High</key>
							<real>982</real>
							<key>Hz</key>
							<real>120</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<true/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>2</real>
							<key>Wide</key>
							<real>1512</real>
						</dict>
						<key>Rotation</key>
						<real>0.0</real>
						<key>UUID</key>
						<string>37D8832A-2D66-02CA-B9F7-8F30A301B230</string>
						<key>UnmirrorInfo</key>
						<dict>
							<key>Depth</key>
							<integer>4</integer>
							<key>High</key>
							<real>1</real>
							<key>Hz</key>
							<real>60</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<false/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>1</real>
							<key>Wide</key>
							<real>1</real>
						</dict>
					</dict>
				</array>
			</dict>
			<dict>
				<key>DefaultConfigVersion</key>
				<integer>1</integer>
				<key>DisplayConfig</key>
				<array>
					<dict>
						<key>CurrentInfo</key>
						<dict>
							<key>Depth</key>
							<integer>4</integer>
							<key>High</key>
							<real>1080</real>
							<key>Hz</key>
							<real>60</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<false/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>1</real>
							<key>Wide</key>
							<real>1920</real>
						</dict>
						<key>Rotation</key>
						<real>0.0</real>
						<key>UUID</key>
						<string>2DA37F96-3D08-4540-B989-6567BFD224B4</string>
						<key>UnmirrorInfo</key>
						<dict>
							<key>Depth</key>
							<integer>4</integer>
							<key>High</key>
							<real>1080</real>
							<key>Hz</key>
							<real>60</real>
							<key>IsLink</key>
							<false/>
							<key>IsVRR</key>
							<false/>
							<key>OriginX</key>
							<real>0.0</real>
							<key>OriginY</key>
							<real>0.0</real>
							<key>Scale</key>
							<real>1</real>
							<key>Wide</key>
							<real>1920</real>
						</dict>
					</dict>
				</array>
			</dict>
		</array>
		<key>Underscan</key>
		<dict>
			<key>02A85953-5062-4C28-846B-30A78C1C9602</key>
			<real>1</real>
			<key>2DA37F96-3D08-4540-B989-6567BFD224B4</key>
			<real>1</real>
			<key>37D8832A-2D66-02CA-B9F7-8F30A301B230</key>
			<real>1</real>
			<key>90A86AC1-47D5-4C8B-A6A3-BACADB5BB19A</key>
			<real>1</real>
			<key>924ED077-594A-4CDC-8D1B-2694444590D6</key>
			<real>1</real>
		</dict>
		<key>Version</key>
		<integer>2</integer>
	</dict>
	<key>DisplayUUIDMappings_v3</key>
	<dict>
		<key>UUIDEntryMap</key>
		<dict>
			<key>31222BF5-2968-AE5D</key>
			<array>
				<array>
					<string>2C0E-C1C5D056E2C4</string>
					<string>924ED077-594A-4CDC-8D1B-2694444590D6</string>
					<integer>3</integer>
				</array>
			</array>
		</dict>
		<key>UsedUUIDs</key>
		<array>
			<string>924ED077-594A-4CDC-8D1B-2694444590D6</string>
		</array>
		<key>Version</key>
		<integer>3</integer>
	</dict>
</dict>
</plist>

@GetVladimir
Copy link
Author

@Bilge thank you for your comment.

There is an excellent suggestion by @albertmonzo here that suggests to use the Color Sync Utility.app in order to find the UUID of the current connection, so you'll know which one to edit.

Alternatively, you can make a backup and delete the displays plist file, and it should generate a new one on next reboot with just one UUID.

Although, if it keeps changing the UUID all the time, there might be something in between the connection that keeps getting new UUIDs, like a Dock or a Hub. In that case, if possible, it might be for the best to use a dedicated USB-C to DisplayPort to connect the Monitor

@Bilge
Copy link

Bilge commented May 27, 2024

I just edited them all and it still made no difference. I just bought a USB-C to DP cable with actual real money to fix a problem that only exists in software because Apple is not only the worst company in electronics, but worse, people act like it were the opposite and go to great lengths to praise and defend them.

@GetVladimir
Copy link
Author

@Bilge I'm glad to hear that you fixed the issue.

You're right, this is a software issue and it would have been so easy to fix by adding a simple drop down menu in the display settings to choose the color output, same as they have on tvOS.

@Bilge
Copy link

Bilge commented May 27, 2024

I don't know if it fixes the issue; the cable is still yet to arrive.

@Bilge
Copy link

Bilge commented May 31, 2024

The USB-C <-> DP cable worked, although it also killed my monitor the next time I switched it on, until I followed an old guide from 13 years ago to reset the screen. Hopefully that doesn't happen again.

@GetVladimir
Copy link
Author

@Bilge thank you so much for the update and glad to hear that it worked

@cyruzin
Copy link

cyruzin commented Jun 10, 2024

I have a Dell P2723QE. I'm using one cable setup (USB-C to USB-C) with my Mac M3 Pro. If you're using one cable setup, make sure to select "High Resolution" under Display -> USB-C Prioritization -> High Resolution in your monitor menu. The default option here was "High Data Speed" for some reason. After the change, RGB is now working. I use Wi-Fi, so it's not an issue for me prioritize resolution over data. If you intend to prioritize data, you'll be limited to YCbCr.

I didn't need to change any files, just changing this option on the monitor did the trick.

OS: Sonoma 14.5

@johny-b
Copy link

johny-b commented Jun 10, 2024

@cyruzin do you think this should work also with a USB-C to HDMI cable?

@cyruzin
Copy link

cyruzin commented Jun 10, 2024

@cyruzin do you think this should work also with a USB-C to HDMI cable?

I haven't tried it with HDMI, but prioritizing resolution should work.

@GetVladimir
Copy link
Author

@cyruzin this is a great point! Setting the USB-C to high resolution whenever possible on the built-in monitor menu should give the similar effect as using a full bandwidth USB-C to DisplayPort cable. This should then default to RGB color.

Thank you so much for your comment and info!

@johny-b this option usually affects only the USB-C to USB-C connection, so HDMI is very likely to still output YCbCr by default. Might be worth to give it a shot on different monitors, but likely wouldn't change it

@Paveldeg
Copy link

not working on M2 Pro Sonoma 14, the file gets overwritten to original state after restart.
Looks like M2 Pro sends limited dynamic range signal to my TV which is capable of full range signal, cannot find any work around.

@GetVladimir
Copy link
Author

@Paveldeg try to modify the display plist file that is in the ByHost folder instead and see if that makes any difference:

/Users/username/Library/Preferences/ByHost

@Paveldeg
Copy link

@Paveldeg try to modify the display plist file that is in the ByHost folder instead and see if that makes any difference:

/Users/username/Library/Preferences/ByHost

Worked, thanks!

@GetVladimir
Copy link
Author

@Paveldeg awesome, glad to hear that you got full range RGB color output working

@TerminalWitchcraft
Copy link

Had the same issue on M2 Pro Sonoma 14.5. The fix mentioned by @GetVladimir works, but now HDR is disabled under Preferences->Display. When I turn it on, the file is overwritten and the monitor defaults back to YCbCr. Any idea on how can I force RGB while HDR on?

@GetVladimir
Copy link
Author

@TerminalWitchcraft you can try and modify the display plist file and choose 10bit color and HDR.

However, if the bandwidth limitations are reached or there is something else not compatible, most of the time HDR runs on YCbCr anyway.

That being said, the macOS interface doesn't really fully support HDR and you'll most likely have better experience just using SDR in most cases.

@dhensen
Copy link

dhensen commented Jun 25, 2024

First of all @GetVladimir and all others, thanks for all the hard work in this gist!!!

Even though, nothing on this page works for me.

I'm on an M3 Pro Sonoma 14.4.1 (23E224) with an LG 38WN95CP external monitor (1350 euro monitor), everything looks slightly blurry, my eyes start to hurt. (since february, Intel MBP 2018 displays sharp)

(I have a Dell dock, but I'm keeping that out of the equation when talking here... first let's get it running without any dock involved)

All my other hardware can render perfectly sharp, but not the 3500 euro M3 Pro (3 thinkpads, 3 desktops, intel MBP 2018).

I've tried, in this order:

  • Bought, installed and messed around with BetterDisplay (this seems totally unrelated, but I'm a linux guy, so what do I know)
  • manually editing the plist files
  • running https://github.com/entropyconquers/Force-RGB-Color-on-M1-M2-Mac-Script
    • it looks like LinkDescription can not be found anywhere anymore, you recognize this?
  • running https://github.com/sudowork/fix_m1_rgb
    • modified this script so it would run on my machine
    • it looks like LinkDescription can not be found anywhere anymore, you recognize this?
  • USB-C to DisplayPort cable (deleted plist and rebooted, tried several times)

I've submitted feedback to Apple.

Spent near to 5K EUR, but can't it sharp with this combi. I can't return either one of these pieces of hardware.

Could this be also be an LG issue? I have no way of checking if my monitor is in RGB or YPBPR mode.

Any other ideas?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment