Skip to content

Instantly share code, notes, and snippets.

@ejdyksen
Last active November 28, 2024 00:49
Show Gist options
  • Save ejdyksen/8302862 to your computer and use it in GitHub Desktop.
Save ejdyksen/8302862 to your computer and use it in GitHub Desktop.
A script to fix EDID problems on external monitors in macOS

patch-edid.rb

A script to fix EDID problems on external monitors in macOS.

Instructions

  1. Connect only the problem display.

  2. Create this directory structure (if it doesn't already exist):

    sudo mkdir -p /Library/Displays/Contents/Resources/Overrides
  3. Download this ruby script in that directory:

    cd /Library/Displays/Contents/Resources/Overrides
    sudo curl -O https://gist.githubusercontent.com/ejdyksen/8302862/raw/patch-edid.rb

    Note: You may want to use adaugherity's version of the script instead.

  4. Run the script we just downloaded (as root again). This creates a new display override plist file.

    cd /Library/Displays/Contents/Resources/Overrides
    sudo ruby patch-edid.rb
  5. Unplug and replug in the problem display.

Additional reading/acknowledgements

  • The original forum thread
  • An improved version of the script by adaugherity
  • An explaination of the problem from Atomic Object's blog
  • Thanks so much to @stackrainbow for pointing out that this can be done without disabling SIP.
  • This version appears to work in Catalina and Big Sur. See earlier revisions for what worked (with disabling SIP) in earlier versions of macOS, which require the override plist to be in a different directory.
#!/usr/bin/ruby
# Create display override file to force Mac OS X to use RGB mode for Display
# see http://embdev.net/topic/284710
#
# Update 2013-06-24: added -w0 option to prevent truncated lines
require 'base64'
data=`ioreg -l -w0 -d0 -r -c AppleDisplay`
edid_hex=data.match(/IODisplayEDID.*?<([a-z0-9]+)>/i)[1]
vendorid=data.match(/DisplayVendorID.*?([0-9]+)/i)[1].to_i
productid=data.match(/DisplayProductID.*?([0-9]+)/i)[1].to_i
puts "found display: vendorid #{vendorid}, productid #{productid}, EDID:\n#{edid_hex}"
bytes=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" % vendorid) rescue nil
f = File.open("DisplayVendorID-%x/DisplayProductID-%x" % [vendorid, productid], '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>Display with forced RGB mode (EDID override)</string>
<key>IODisplayEDID</key>
<data>#{Base64.encode64(bytes.pack('C*'))}</data>
<key>DisplayVendorID</key>
<integer>#{vendorid}</integer>
<key>DisplayProductID</key>
<integer>#{productid}</integer>
</dict>
</plist>"
f.close
@Fedosov83
Copy link

How can I activate HDR support with this patch?

@GetVladimir
Copy link

@Fedosov83 I'm not sure if you can use both HDR and RGB Color Output over a typical HDMI connection. You might need USB-C to DisplayPort for that, but it might again revert to YCbCr when using that combination

@xavierchen0
Copy link

Hi Vladimir, thank you for this and I appreciate the effort you put into helping the community. The steps was clear and it seemed like it worked.

Could I get your help to confirm if my Safari is now in HiDPI? Here is an attached screenshot. It seems like there are less sections than the image you have attached, but text is crisp now.

image

Setup:

  • Macbook Pro M3
  • Monitor #1: Dell S2722DC
  • Moniter #2: Dell S2421HS
  • Dock Dell D6000

@GetVladimir
Copy link

@xavierchen0 thank you so much for your comment.

Yes, you're right, the HiDPI version of the icon should have a lot more notches with varying sizes. Here is an example of how it should look like:

IMG_1002

You can also check in System Information if the resolution is HiDPI:

  • Click on the Apple  Logo on the Top Menu Bar
  • Hold option/alt on the Keyboard and click on System Information
  • Choose Graphics

It should show something like resolution is 3840 x 2160, and UI looks like 1920 x 1080

@xavierchen0
Copy link

xavierchen0 commented Oct 4, 2024

Oh I am not using a 4K monitor 😅. I am actually using a 27 inch 2K monitor.

This is a screenshot of my system information:
image

From what I can see, it seems to be working. Thank you for your prompt response!

Edit: I am aware this doesn't fit the description of HiDPI, but something was causing my display to have very blurry text, hence I was looking up the internet for a solution and stumbled to your page.

@GetVladimir
Copy link

GetVladimir commented Oct 4, 2024

@xavierchen0 yes, you were trying to get (pseudo) HiDPI on standard monitors in order for the macOS interface to look a bit better. They don't seem to optimize the UI for the 1080p monitors anymore. Even the cursor line when typing can cover come characters since it's too thick/bold.

Anyway, the resolution should still show double in the system information and the scale should be set to 2x.

Here is a detailed guide how to enable HiDPI mode on standard monitors: https://gist.github.com/GetVladimir/c89a26df1806001543bef4c8d90cc2f8?permalink_comment_id=4207112#gistcomment-4207112

Please note that it won't look nearly as good as it would look on a real 4K display with 2x scaling

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