Skip to content

Instantly share code, notes, and snippets.

Forked from BugRoger/patch-edid.rb
Last active June 17, 2024 02:39
Show Gist options
  • Save adaugherity/7435890 to your computer and use it in GitHub Desktop.
Save adaugherity/7435890 to your computer and use it in GitHub Desktop.
# Create display override file to force Mac OS X to use RGB mode for Display
# see
require 'base64'
data=`ioreg -l -d0 -w 0 -r -c AppleDisplay`
displays = []
edids.each_with_index do |edid, i|
disp = { "edid_hex"=>edid, "vendorid"=>vendorids[i].to_i, "productid"=>productids[i].to_i }
# 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."
displays.each do |disp|
# Retrieve monitor model from EDID display descriptor
i = disp["edid_hex"].index('000000fc00')
if i.nil?
monitor_name = "Display"
# 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
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"]}"
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 "Recalculated checksum: 0x%x" % bytes[127]
puts "new EDID:\n#{{|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 =, 'w')
f.write '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "">
<plist version="1.0">'
f.write "
<string>#{monitor_name} - forced RGB mode (EDID override)</string>
puts "\n"
end # displays.each
Copy link

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!

Copy link

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

Copy link

daili0802 commented Sep 28, 2023

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.

Copy link

@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

Copy link

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

Copy link

@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

Copy link

Sure. @GetVladimir
But, are there ways to us this script to override the EDID without changing the RGB setting?

Copy link

@daili0802 as far as I know, this specific script only works for x86 based Macs

Copy link

Ah! that was one important part I missed. Sorry and thank you.

Copy link

@daili0802 not a problem, you're welcome. It would be great if it gets resolved

Copy link

Is there any similar way to accomplish this on an Apple Silicon Mac? Thanks :)

Copy link

Copy link

Here is my issue, I am sending signal from Mac to a monitor via HDbaseT adapter, and I get a display like this:

Whats strange is if I rotate the picture 90 or 180 degrees it looks completely perfect. But setting it back to Standard it goes back looking like the picture. I tried running this script, but it didnt improve it.

Copy link

anbarae commented Oct 14, 2023

I have a 4k monitor, using a MacBook Pro 13-inch, 2017, Two Thunderbolt 3 ports. Resolution is maxed out at blurry 1440p. Any way to fix this?

Copy link

joevt commented Oct 15, 2023

@anbarae What display? Is it HDMI or DisplayPort connection? Try SwitchResX? Run AllRez to get a list of display modes.

Copy link

Works for Sonoma on a 2016 Macbook Pro 👌

Copy link

anbarae commented Oct 25, 2023 via email

Copy link

I have 2 external HDMI-to-usbc monitors. The override works and I can see it take effect in Settings > Displays, but when i rearrange the monitors in Display settings, one of the monitors gets blurry again. Anyone run into this?

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