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

@exetico thank you for your comment and for the useful details.

My guess regarding why the 2515H worked while the U2722D is that the 2515H defaults to RGB when initializing the HDMI connection.

You've mentioned that all 4 ran at the same resolution and refresh rate, so that shouldn't be the issue.

From the image you've posted, it's very strange that they have what looks like image retention, even on the Dell diagnostic screen.

If possible, it might be a good idea to connect both monitors with USB-C directly, just to see if that would resolve both the flickering and the RGB issue

@GetVladimir
Copy link
Author

@exetico I've been researching more about the image retention issue that you've mentioned, and I've found more articles about it: https://www.eizoglobal.com/support/compatibility/pc/mac/m1m2/

This is what the article above mentions:

Flicker or image burn-in have been reported in some cases when connecting an external monitor to a Mac computer equipped with Apple M1/M2/M3 series chip.

Although the cause of the phenomenon and the conditions under which it occurs are not confirmed, it is thought to be due in part to the fact that the video signals output from Mac computers equipped with Apple M1/M2/M3 series chip behave differently than Mac or Windows computers with Apple Intel chip or Windows PCs.

When displaying certain images or video, the brightness of the screen fluctuates in short cycles, causing flicker or image burn-in occurs, causing images to persist.
The phenomenon may continue even after switching to another image or signal input.

The video signal output from the Mac computer with Apple M1/M2/M3 series chip is fluctuating in several frame cycles, which may be interfering with the LCD panel control of the external monitor.
Video signal output from a Mac or Windows computer with Apple Intel chip do not fluctuate in this way, so the phenomenon is not likely to occur.

@exetico
Copy link

exetico commented Jan 18, 2024

@GetVladimir

My guess regarding why the 2515H worked while the U2722D is that the 2515H defaults to RGB when initializing the HDMI connection.

Good point. I didn't think of that. The old 2515H's are sold now, so I don't have a option to test them.

From the image you've posted, it's very strange that they have what looks like image retention, even on the Dell diagnostic screen.

If possible, it might be a good idea to connect both monitors with USB-C directly, just to see if that would resolve both the flickering and the RGB issue

There's quite a few threads about flickering Dell screens in combination with Apple Arm Silicon. I've also done the same things, as recommended in the article you're recommended. But, sadly I'm still having a hard time.

I'm wondering if there's any ways to enforce the RGB, as the YPbPr flickering are a real pain.

Thank you for your inputs, btw! It's a good idea to test with a USB-C > DP, so I'll do that in the next week. I'm not really sure what to do next. It's crazy that a popular display like the Dell Ultrasharp and the M1 doesn't play nice together, and Dell didn't even manage to mention that while I tried to talk with their support team.

@GetVladimir
Copy link
Author

@exetico thank you for the reply.

Other monitors seem to have the flickering issue as well, including Benq and Samsung.

The issue is very likely in the Apple Silicon, since all other Macs, PCs and devices work properly with those exact same monitors.

Dell also have a support page about this issue: https://www.dell.com/support/kbdoc/en-us/000218313/flicker-on-dell-monitors-connected-to-mac-s

@gammelby
Copy link

Thanks for the research and guide! I was going insane of the blurred text on a new Samsung G7 monitor connected through HDMI to my m1 MBP. However, I cannot get the tricks to work - tried following the guide and using the scripts that wrap the same steps. I apparently have the multi-configuration (I don't know why). So the following hint applies to me:

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.

Can you elaborate the "update the integer on each one"? Should the range integer be incremented for each? I tried setting both to 1 and then setting the first to 1 and the next to 2. Same result (blurry text). Are there anything else to try in this scenario?

Note that the blurry text is the only indication of the RGB issue as I cannot find any system information that tells if the signal is RGB or not. But I have tried disabling font smoothing etc (was already done years ago I think), to no avail - and all looks crisp on my old USB-C connected LG display.

Thanks in advance!

@GetVladimir
Copy link
Author

@gammelby thank you so much for your comment.

You're right, if there are multiple instances of the DisplayConfig and CurrentInfo, you will need to add the PixelEncoding and Range manually to each one.

You don't need to change the values. They can be exactly the same as the first instance.

If it's easer, you can make a backup and just delete the Displays plist file. It should be recreated again after reboot and resolution change, and it should not have as many duplicated instances.

Regarding the indicator whether RGB color output is enabled or not, the easiest way is indeed if your monitor's built-in menu shows it.

If it doesn't, you can sometimes determine it by going to System Settings > Displays > Color Profile and see if any profiles starting with SD or HD show up as compatible with your monitor (shown above the horizontal line in the list). If they are, you are running in YCbCr mode. If only your Monitor Color Profile is above the line, then it's usually RGB Color Output. This is not always a reliable indicator though.

If nothing else works, it might be for the best to look for an USB-C to DisplayPort cable and connect the monitor with it instead of the HDMI.

@gammelby
Copy link

@GetVladimir thanks for your message and the hints, I will take a look!

@exetico
Copy link

exetico commented Mar 15, 2024

I tried everything, and ended up ordering a Lenovo DisplayLink dock (40AF). Crazy and unnecessary cost, and extra delay. But as it's only running in RGB, my combination now works. If someone finds a good way to do this, I'd be happy to revert back, however, right now, I don't want to spend more time on it. I don't get why Apple does not give more control to the user, to enforce the usage of RGB 🙃 ...

@GetVladimir
Copy link
Author

@gammelby you're welcome. Let us know how it goes.

@exetico thank you for the update and glad to hear that it works with the DisplayLink dock.

You're right, it would be so easy for them to add an option menu to choose between RGB and YCbCr, same as they already have on the Apple TV Settings.

At the very least, it should be set to default to RGB whenever possible.

@albertmonzo
Copy link

I finally got this working. The trick for me was to make the edit in thebyHost folder file instead of the suggested one. This file seems to override everything else and deleting it doesn't work because it also loses my display settings (e.g scaling, arrangement, refresh rate...). If I then set my settings back to what I need, the file gets regenerated so it overrides the changes I made to the top level plist file.

What I also found very confusing was figuring out what the right display to apply the fix to is. This is complicated because plugging in the same display via different methods (HDMI, usb hdmi dongle, usb) causes the system to create separate entries that look correct but aren't. What worked for me was using Color Sync Utility.app to get the UUID of the display the system is currently using, then looking for the entry in the file that matches and making the changes there.

@GetVladimir
Copy link
Author

@albertmonzo thank you so much for your comment and glad to hear that you got RGB Color Output working.

That is a great suggestion for using the built-in Color Sync Utility.app to determine which is the correct UUID of the monitor port that needs to be modified.

And you're right, each port or connection of the monitor has a different UUID.

@albertmonzo
Copy link

To clarify, it's not just different ports of the monitor, but even different ways of connecting to the same port. In my case, most of the confusion happened because I had previously connected the monitor via HDMI directly to the HDMI port, but I'm now using a usb-c to HDMI cable (to get 4k@120hz on an M1 Pro). The act of having connected it before created this separate entry that looks identical except the UUID is different...

@GetVladimir
Copy link
Author

@albertmonzo thank you for the clarification and additional info.

You're right. That also explains why people that use a dock sometimes seem to get a different UUID on every reconnect, which make is really difficult to modify the correct entry for RGB

@maxskorr
Copy link

Not sure if it was mentioned before, but for those suffering from the blurry image issue on external displays with an M1/M2/M3/.. MBP and DisplayLink-based dock station - enabling "Experimental 3008x and 2560x modes" option in DisplayLink seems to do the trick (https://support.displaylink.com/knowledgebase/articles/1993915)

@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.

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