-
-
Save adaugherity/7435890 to your computer and use it in GitHub Desktop.
#!/usr/bin/ruby | |
# Create display override file to force Mac OS X to use RGB mode for Display | |
# see http://embdev.net/topic/284710 | |
require 'base64' | |
data=`ioreg -l -d0 -w 0 -r -c AppleDisplay` | |
edids=data.scan(/IODisplayEDID.*?<([a-z0-9]+)>/i).flatten | |
vendorids=data.scan(/DisplayVendorID.*?([0-9]+)/i).flatten | |
productids=data.scan(/DisplayProductID.*?([0-9]+)/i).flatten | |
displays = [] | |
edids.each_with_index do |edid, i| | |
disp = { "edid_hex"=>edid, "vendorid"=>vendorids[i].to_i, "productid"=>productids[i].to_i } | |
displays.push(disp) | |
end | |
# Process all displays | |
if displays.length > 1 | |
puts "Found %d displays! You should only install the override file for the one which" % displays.length | |
puts "is giving you problems.","\n" | |
elsif displays.length == 0 | |
puts "No display data found! Are any external displays connected?" | |
puts "\nNote: Apple Silicon (arm64) devices are currently unsupported, as the standard" | |
puts "method of retrieving display information does not work." | |
end | |
displays.each do |disp| | |
# Retrieve monitor model from EDID display descriptor | |
i = disp["edid_hex"].index('000000fc00') | |
if i.nil? | |
monitor_name = "Display" | |
else | |
# The monitor name is stored in (up to) 13 bytes of text following 00 00 00 fc 00. | |
# If the name is shorter than 13 bytes, it is terminated with a newline (0a) and then padded with spaces. | |
monitor_name = [disp["edid_hex"][i + 10, 26].to_s].pack("H*") | |
monitor_name.rstrip! # remove trailing newline/spaces | |
end | |
puts "Found display '#{monitor_name}': vendor ID=#{disp["vendorid"]} (0x%x), product ID=#{disp["productid"]} (0x%x)" % | |
[disp["vendorid"], disp["productid"]] | |
puts "Raw EDID data:\n#{disp["edid_hex"]}" | |
bytes=disp["edid_hex"].scan(/../).map{|x|Integer("0x#{x}")}.flatten | |
puts "Setting color support to RGB 4:4:4 only" | |
bytes[24] &= ~(0b11000) | |
puts "Number of extension blocks: #{bytes[126]}" | |
puts "removing extension block" | |
bytes = bytes[0..127] | |
bytes[126] = 0 | |
bytes[127] = (0x100-(bytes[0..126].reduce(:+) % 256)) % 256 | |
puts | |
puts "Recalculated checksum: 0x%x" % bytes[127] | |
puts "new EDID:\n#{bytes.map{|b|"%02X"%b}.join}" | |
Dir.mkdir("DisplayVendorID-%x" % disp["vendorid"]) rescue nil | |
filename = "DisplayVendorID-%x/DisplayProductID-%x" % [disp["vendorid"], disp["productid"]] | |
puts "Output file: #{Dir.pwd}/#{filename}" | |
f = File.open(filename, 'w') | |
f.write '<?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">' | |
f.write " | |
<dict> | |
<key>DisplayProductName</key> | |
<string>#{monitor_name} - forced RGB mode (EDID override)</string> | |
<key>IODisplayEDID</key> | |
<data>#{Base64.encode64(bytes.pack('C*'))}</data> | |
<key>DisplayVendorID</key> | |
<integer>#{disp["vendorid"]}</integer> | |
<key>DisplayProductID</key> | |
<integer>#{disp["productid"]}</integer> | |
</dict> | |
</plist>" | |
f.close | |
puts "\n" | |
end # displays.each |
I ended up reverting to USB C > DisplayPort for my Dell U2713H monitor to bypass these RGB problems, but now have to switch to USB C > HDMI (reasons too dull to explain).
However, I now can't get the LinkDescription override to work. Each time I modify the com.apple.windowserver.displays.plist file and restart, the file seems to be reset or regenerated to its original unmodified version. This is with the Mac Mini connected to a KVM switch with USB C > HDMI and then HDMI > HDMI on the monitor – I don't know if that's a factor.
Am I missing something obvious here..?
(BTW Apple is well aware of this issue -- I spent 3 months with tech support when I first got my Mac Mini M1 when it first launched trying all sorts of solutions from them, before they eventually stopped replying to me. Still worth reporting, though – you never know.)
@Adlopa thank you for the comment and for the details.
Yes, it's very likely that the Mac detects the KVM switch as a different device each time and assigns it a different UUID. This makes it very hard to add the LinkDescription properly.
If possible, please use an HDMI to HDMI cable for the Mac mini and the monitor and avoid using the KVM or any dock/adapter between the Mac and the Monitor.
I ended up reverting to USB C > DisplayPort for my Dell U2713H monitor to bypass these RGB problems, but now have to switch to USB C > HDMI (reasons too dull to explain).
However, I now can't get the LinkDescription override to work. Each time I modify the com.apple.windowserver.displays.plist file and restart, the file seems to be reset or regenerated to its original unmodified version. This is with the Mac Mini connected to a KVM switch with USB C > HDMI and then HDMI > HDMI on the monitor – I don't know if that's a factor.
Am I missing something obvious here..?
(BTW Apple is well aware of this issue -- I spent 3 months with tech support when I first got my Mac Mini M1 when it first launched trying all sorts of solutions from them, before they eventually stopped replying to me. Still worth reporting, though – you never know.)
Based on the discussion here, you really need to use USB-C -> DisplayPort to be sure this is gonna work properly.
The LinkDescription
workaround used to work well before Ventura, but now even that won't work.
Hi every, the refresh rate of my screen is 100Hz, now the output is RGB, but the frame rate is locked on 60Hz, how could I get 100Hz back. And another question, if I use DP, do I still need to do this? Or it's only a HDMI/DVI problem? Thanks a lot!
@mazingtech If you use an USB-C to DisplayPort cable to connect directly from the Mac to the Monitor, usually it just works without the need of modifications (unless there is a bug in a specific macOS version)
In macOS 13.4.1 at least, I see HiDPI resolutions for my external 1920 x 1080 Display connected via Thunderbolt > HDMI (Apple). Using 1904 x 1071 (HiDPI), which was the biggest, improved text display insanely well, especially in the Firefox browser but also in PDFs and so on. If you zoom in (with macOS) with the default native resolution you see clear artefacts around letters quite quickly, while with HiDPI you have to zoom well more than quadruple to notice anything.
@mazingtech If you use an USB-C to DisplayPort cable to connect directly from the Mac to the Monitor, usually it just works without the need of modifications (unless there is a bug in a specific macOS version)
I'm using a DP to connect my screen, either RGB @60Hz or no RGB @100hz, any idea?
@mazingtech make sure that you use USB-C to DisplayPort, without any adapters or docks.
Try different resolutions to see on which ones the option for 100Hz will appear and on which one it will use RGB
@mazingtech make sure that you use USB-C to DisplayPort, without any adapters or docks.
Try different resolutions to see on which ones the option for 100Hz will appear and on which one it will use RGB
Got it thanks
I get an error. Can you help?
sudo ruby patch-edid.rb patch-edid.rb:11:in
[]' for nil:NilClass (NoMethodError)
Can someone please post an uninstall procedure? On Catalina I can't change the color profile anymore.
@Atalantia as far as I know, you just need to delete the file that you added to the Display Override folder here: /Library/Displays/Overrides/DisplayVendorID-[yourMonitorVendorID]/DisplayProductID-[yourMonitorID]
The file is named based on your Monitor ID and Vendor ID.
Even with "System Integrity Protection status: disabled." I have no access to this files. Can't delete them. Even with: "sudo rm -r /System/Library/Displays/Contents/Resources/Overrides" it's not possible.
@Atalantia make sure you're looking into /Library and not /System/Library
You don't need to disable SIP for it
There is no such folder in /Library neither in ~/Library. Only in /System/Library/Displays/Contents/Resources/Overrides Maybe I have to start in Recovery mode and delete the whole folder with command line.
@Atalantia thank you for the reply.
Usually, only if you used recovery mode to as the file, then you'll need to repeat the same steps to remove it.
On the newer versions of macOS, this is not needed, since you can just place the file in the /Library folder instead of /System/Library.
If you're going to delete files from Recovery, make sure that you only delete the one file that you've added and not the complete folder. Also, make sure to do a backup and please note that you're doing any changes at your own risk
Why not the whole folder. This folder was installed by this script here. I cant find the ID of my TV in the OS.
@Atalantia I meant don't delete the whole Overrides folder. That one is a System folder and it's not created by the script.
You can delete the one file with your monitor ID that you've added though.
Also, please note that not being able to select a color profile sounds like a different issue, and it's usually not caused by this specific override.
If you've installed any other 3rd party apps or changed any other settings, you might want to try reverting those and see if they affect the color profile selection
Hi, I'm looking to see if this script could help me resolve another issue, related to EDIDs. Please help if you can, thank you.
I have two Asus monitors, PA278CV, with unique 'AlphanumericSerialNumber' registered to MacOS, but they present the same EDID. This raises an issue with MacBooks using Apple M1/M2, where EDID is the only factor used to identify external monitors, as far as I can tell. My monitor arrangement will randomly swap position after reboot, wake from sleep or unplug/replug to docking station. It seems like the only two solution to this, is 1. for Apple to adjust OS to use AlphanumericSerialNumber as identifier, or 2. have product manufacture to update firmware that provides unique EDID. I'm curious if this script could help manipulate the EDID the presents to Mac, so OS knows how to identify them, without change any bytes associated to RGB or extension block. If so, which bit could I change instead? Thank you so much!
@daili0802 there might be a workaround for your specific use case.
Even when 2 monitors are exactly the same, each of their ports has a different designation.
So if they have multiple ports, you can connect the first monitor on its HDMI1 port for example, and the second monitor on its HDMI2 port.
This will allow macOS to distinguish between the display and will allow you to modify any settings per display.
Hi @GetVladimir, thanks for the quick response. Unfortunately, that isn't the case. I've tied using display port on one, HDMI on the other, as well as using USB-C on more, DisplayPort or HDMI on the other; or even swapping them with different docking stations. they all return the same swapping issue.
My current work around is bypassing my docking station and plugging in the monitors one by one to the laptop it self, this does not start a racing condition which confuses MacOS to swap the position, because I physically plugging them in one after another. But when they are pre-plugged-in on the dock, swapping start to happen.
@daili0802 thank you for the reply and the update.
That might point that the issue is not the monitors being detected the same, but an issue with macOS to remember the display order.
This is usually the case when the Apple Silicon based Macs assign different UUID on each reboot.
If that is indeed what's happening, you might have the same issue even if you connect completely different monitors or TVs.
You can easily test this if you have a TV nearby and connect it with only one monitor.
To resolve this, you might need to connect each monitor directly to your Mac on a different USB-C port, and not use a dock
@GetVladimir Yes, I've thought of this as well. I've tested it with an older dell monitor P2417, side by side to one of the Asus in my current pair. They did not swap after a week of use on the dock.
I should also point out, when I test to plug in the pair to laptop itself, (my current work around), I have to remember the cable and order to do so. Say, if I plugin monitor A to port 1 and then monitor B to port 2, and arrange it in the OS to my liking, next time, I go plug monitor B to port 2 first then monitor A to port 1, it swaps.
@daili0802 that is actually a good find with the workaround you're using.
I don't know of another way to consistently work except for using the separate cables without using a dock. If you find some solution for this, let us know
Sure. @GetVladimir
But, are there ways to us this script to override the EDID without changing the RGB setting?
@daili0802 as far as I know, this specific script only works for x86 based Macs
Ah! that was one important part I missed. Sorry and thank you.
@daili0802 not a problem, you're welcome. It would be great if it gets resolved
Is there any similar way to accomplish this on an Apple Silicon Mac? Thanks :)
Right now im connected with 48gbit (4L12), but with this script, im only allowed for RGB 8bit 60hz. I tried to use another github users edid (both LG tv's but not the same model - and he was running USB-C -> HDMI 2.1, i'm running Displayport 1.4a -> HDMI 2.1).... but with his, I get RGB 10bit 60hz. I know my connection allows for atleast RGB 8bit 120hz and maybe 10bit.
So my question is, what does it take to force 4K 120hz?
Without any script/edid mod, im getting the same 4:2:0 10b 4k 120hz as the rest of the Mac gang.
Dual boot to Windows allows = 4K 444 Full RGB 10/12bit 120hz VRR