Mac modify custom resolution to open hidpi method

https://github.com/xzhih/one-key-hidpi/blob/master/README-zh.md

The resolution of mbp 1440x900 is too small, and 1680x1050 is too large, so I want to set a resolution of 1600x1000.

Run this sh file to manually set the required resolution and turn on hidpi mode.

Restart the system after running, you can see the resolution you added when you modify the zoom in the system preferences.

The backup code prevents GitHub from hanging. . .

#!/bin/bash

sipInfo=("$(csrutil status)")
systemVersion=($(sw_vers -productVersion | cut -d "." -f 2))
systemLanguage=($(locale | grep LANG | sed s/'LANG='// | tr -d '"' | cut -d "." -f 1))

disableSIP="Need to disable SIP"
langDisplay="Display"
langMonitors="Monitors"
langIndex="Index"
langVendorID="VendorID"
langProductID="ProductID"
langMonitorName="MonitorName"
langChooseDis="Choose the display"
langInputChoice="Enter your choice"
langEnterError="Enter error, bye"
langBackingUp="Backing up..."
langEnabled="Enabled, please reboot."
langDisabled="Disabled, restart takes effect"
langEnabledLog="Rebooting the logo for the first time will become huge, then it will not be."
langCustomRes="Enter the HIDPI resolution, separated by a space,like this: 1680x945 1600x900 1440x810"

langChooseIcon="Display Icon"
langNotChange="Do not change"

langEnableOp1="(1) Enable HIDPI"
langEnableOp2="(2) Enable HIDPI (with EDID)"
langEnableOp3="(3) Disable HIDPI"

langChooseRes="resolution config"
langChooseResOp1="(1) 1920x1080 Display"
langChooseResOp2="(2) 1920x1080 Display (use 1424x802, fix underscaled after sleep)"
langChooseResOp3="(3) 1920x1200 Display"
langChooseResOp4="(4) 2560x1440 Display"
langChooseResOp5="(5) 3000x2000 Display"
langChooseResOpCustom="(6) Manual input resolution " 

if [[ " $ {systemLanguage} " == " zh_CN " ]]; then  
    disableSIP = " SIP needs to be closed " 
    langDisplay = " Monitor " 
    langMonitors = " Monitor " 
    langIndex = " Serial Number " 
    langVendorID = " Supplier ID " 
    langProductID = " Product ID "
    langMonitorName = " Monitor name" 
    langChooseDis = " Select monitor " 
    langInputChoice = " Enter your choice " 
    langEnterError = " Input error, goodbye to you! " " 
    langBackingUp = " Backing up (see instructions on how to restore) ... " 
    langEnabled = " Open successfully, restart will take effect " 
    langDisabled = " Close successfully, restart will take effect " 
    langEnabledLog = " The logo will become huge after the first restart, but not later It will be the " 
    langCustomRes = "

    langChooseIcon = " Select Display the ICON " 
    langNotChange = " intact " 

    langEnableOp1 = " (. 1) Open HiDPI " 
    langEnableOp2 = " (2) Open HiDPI (while injecting the EDID) " 
    langEnableOp3 = " (. 3) Close HiDPI " 

    langChooseRes = " Choose the resolution Rate configuration " 
    langChooseResOp1 = " (1) 1920x1080 display " 
    langChooseResOp2 = " (2) 1920x1080 display (using 1424x802 resolution to fix screen shrinkage after wake-up from sleep) "
    langChooseResOp3= " (3) 1920x1200 display " 
    langChooseResOp4 = " (4) 2560x1440 display " 
    langChooseResOp5 = " (5) 3000x2000 display " 
    langChooseResOpCustom = " (6) manual input resolution " 
fi 

downloadHost = " https: // raw. githubusercontent.com/xzhih/one-key-hidpi/master " 
# downloadHost = " https://raw.githubusercontent.com/xzhih/one-key-hidpi/dev " 
# downloadHost = " http://127.0.0.1: 8080 " 

if [[ "$ {} sipInfo" == *"Filesystem Protections: disabled"* ]] || [[ "$(awk '{print $5}' <<< "${sipInfo}")" == "disabled." ]]; then
    :
else
    echo "${disableSIP}";
    exit 0
fi

if [[ "${systemVersion}" -ge "15" ]]; then
    sudo mount -uw / && killall Finder
fi

function get_edid()
{
    local index=0
    local selection=0

    gDisplayInf=($(ioreg -lw0 | grep -i "IODisplayEDID" | sed -e "/[^<]*</s///" -e "s/\>//"))

    if [[ "${#gDisplayInf[@]}" -ge 2 ]]; then

        # Multi monitors detected. Choose target monitor.
        echo ""
        echo "                      "${langMonitors}"                      "
        echo "--------------------------------------------------------"
        echo "   "${langIndex}"   |   "${langVendorID}"   |   "${langProductID}"   |   "${langMonitorName}"   "
        echo "--------------------------------------------------------"

        # Show monitors.
        for display in "${gDisplayInf[@]}"
        do
            let index++
            MonitorName=("$(echo ${display:190:24} | xxd -p -r)") 
            VendorID=${display:16:4}
            ProductID=${gMonitor:22:2}${gMonitor:20:2}

            if [[ ${VendorID} == 0610 ]]; then
                MonitorName="Apple Display"
            fi

            if [[ ${VendorID} == 1e6d ]]; then
                MonitorName="LG Display"
            fi

            printf "    %d    |    ${VendorID}    |     ${ProductID}    |  ${MonitorName}\n" ${index}
        done

        echo "--------------------------------------------------------"

        # Let user make a selection.

        read -p "${langChooseDis}: " selection
        case $selection in
            [[:digit:]]* ) 
                # Lower selection (arrays start at zero).
                if ((selection < 1 || selection > index)); then
                    echo "${langEnterError}";
                    exit 0
                fi
                let selection-=1
                gMonitor=${gDisplayInf[$selection]}
                ;;

            * ) 
                echo "${langEnterError}";
                exit 0
                ;;
        esac
    else
        gMonitor=${gDisplayInf}
    fi

    EDID=${gMonitor}
    VendorID=$((0x${gMonitor:16:4}))
    ProductID=$((0x${gMonitor:22:2}${gMonitor:20:2}))
    Vid=($(printf '%x\n' ${VendorID}))
    Pid=($(printf '%x\n' ${ProductID}))
    # echo ${Vid}
    # echo ${Pid}
    # echo $EDID
}
 
# init
function init()
{
#
cat << EEF
  _    _   _____   _____    _____    _____ 
 | |  | | |_   _| |  __ \  |  __ \  |_   _|
 | |__| |   | |   | |  | | | |__) |   | |  
 |  __  |   | |   | |  | | |  ___/    | |  
 | |  | |  _| |_  | |__| | | |       _| |_ 
 |_|  |_| |_____| |_____/  |_|      |_____|
                                           
============================================
EEF
    #
    get_edid

    thisDir=$(dirname $0)
    thatDir="/System/Library/Displays/Contents/Resources/Overrides"
    Overrides="\/System\/Library\/Displays\/Contents\/Resources\/Overrides"
    
    DICON="com\.apple\.cinema-display"
    imacicon=${Overrides}"\/DisplayVendorID\-610\/DisplayProductID\-a032\.tiff"
    mbpicon=${Overrides}"\/DisplayVendorID\-610\/DisplayProductID\-a030\-e1e1df\.tiff"
    mbicon=${Overrides}"\/DisplayVendorID\-610\/DisplayProductID\-a028\-9d9da0\.tiff"
    lgicon=${Overrides}"\/DisplayVendorID\-1e6d\/DisplayProductID\-5b11\.tiff"
    proxdricon=${Overrides}"\/DisplayVendorID\-610\/DisplayProductID\-ae2f\_Landscape\.tiff"

    if [[ ! -d ${thatDir}/HIDPI/backup ]]; then
        echo "${langBackingUp}"
        sudo mkdir -p ${thatDir}/HIDPI/backup
        sudo cp ${thatDir}/Icons.plist ${thatDir}/HIDPI/backup/
        if [[ -d ${thatDir}/DisplayVendorID-${Vid} ]]; then
            sudo cp -r ${thatDir}/DisplayVendorID-${Vid} ${thatDir}/HIDPI/backup/
        fi
    fi
    
    generate_restore_cmd
}

#
function generate_restore_cmd()
{
#
rm -rf ${thisDir}/tmp/
mkdir -p ${thisDir}/tmp/
cat > "${thisDir}/tmp/disable" <<-\CCC
#!/bin/sh

function get_edid()
{
    local index=0
    local selection=0
    gDisplayInf=($(ioreg -lw0 | grep -i "IODisplayEDID" | sed -e "/[^<]*</s///" -e "s/\>//"))
    if [[ "${#gDisplayInf[@]}" -ge 2 ]]; then
        echo '              Monitors              '
        echo '------------------------------------'
        echo '  Index  |  VendorID  |  ProductID  '
        echo '------------------------------------'
        for display in "${gDisplayInf[@]}"
        do
            let index++
            printf "    %d    |    ${display:16:4}    |    ${gMonitor:22:2}${gMonitor:20:2}\n" $index
        done
        echo '------------------------------------'
        read -p "Choose the display: " selection
        case $selection in
            [[:digit:]]* ) 
                if ((selection < 1 || selection > index)); then
                    echo "Enter error, bye";
                    exit 0
                fi
                let selection-=1
                gMonitor=${gDisplayInf[$selection]}
                ;;
            * ) 
                echo "Enter error, bye";
                exit 0
                ;;
        esac
    else
        gMonitor=${gDisplayInf}
    fi

    EDID=$gMonitor
    VendorID=$((0x${gMonitor:16:4}))
    ProductID=$((0x${gMonitor:22:2}${gMonitor:20:2}))
    Vid=($(printf '%x\n' ${VendorID}))
    Pid=($(printf '%x\n' ${ProductID}))
}

get_edid

if [[ -d ../DisplayVendorID-${Vid} ]]; then
    rm -rf ../DisplayVendorID-${Vid} 
fi

rm -rf ../Icons.plist
cp -r ./backup/* ../
rm -rf ./disable
echo "HIDPI Disabled"
CCC

sudo mv ${thisDir}/tmp/disable ${thatDir}/HIDPI/
sudo chmod +x ${thatDir}/HIDPI/disable

}

# choose_icon
function choose_icon()
{
    #
    rm -rf ${thisDir}/tmp/
    mkdir -p ${thisDir}/tmp/
    mkdir -p ${thisDir}/tmp/DisplayVendorID-${Vid}
    curl -fsSL "${downloadHost}/Icons.plist" -o ${thisDir}/tmp/Icons.plist

    echo ""
    echo "-------------------------------------"
    echo "|********** ${langChooseIcon} ***********|"
    echo "-------------------------------------"
    echo ""
    echo "(1) iMac"
    echo "(2) MacBook"
    echo "(3) MacBook Pro"
    echo "(4) LG ${langDisplay}"
    echo "(5) Pro Display XDR"
    echo "(6) ${langNotChange}"
    echo ""
#
read -p "${langInputChoice} [1~6]: " logo
case ${logo} in
    1) Picon=${imacicon}
        RP=("33" "68" "160" "90")
        curl -fsSL "${downloadHost}/displayIcons/iMac.icns" -o ${thisDir}/tmp/DisplayVendorID-${Vid}/DisplayProductID-${Pid}.icns
        ;;
    2) Picon=${mbicon}
        RP=("52" "66" "122" "76")
        curl -fsSL "${downloadHost}/displayIcons/MacBook.icns" -o ${thisDir}/tmp/DisplayVendorID-${Vid}/DisplayProductID-${Pid}.icns
        ;;
    3) Picon=${mbpicon}
        RP=("40" "62" "147" "92")
        curl -fsSL "${downloadHost}/displayIcons/MacBookPro.icns" -o ${thisDir}/tmp/DisplayVendorID-${Vid}/DisplayProductID-${Pid}.icns
        ;;
    4) Picon=${lgicon}
        RP=("11" "47" "202" "114")
        cp ${thatDir}/DisplayVendorID-1e6d/DisplayProductID-5b11.icns ${thisDir}/tmp/DisplayVendorID-${Vid}/DisplayProductID-${Pid}.icns
        ;;
    5) Picon=${proxdricon}
        RP=("5" "45" "216" "121")
        curl -fsSL "${downloadHost}/displayIcons/ProDisplayXDR.icns" -o ${thisDir}/tmp/DisplayVendorID-${Vid}/DisplayProductID-${Pid}.icns
        if [[ ! -f ${thatDir}/DisplayVendorID-610/DisplayProductID-ae2f_Landscape.tiff ]]; then
            curl -fsSL "${downloadHost}/displayIcons/ProDisplayXDR.tiff" -o ${thisDir}/tmp/DisplayVendorID-${Vid}/DisplayProductID-${Pid}.tiff
            Picon=${Overrides}"\/DisplayVendorID\-${Vid}\/DisplayProductID\-${Pid}\.tiff"
        fi
        ;;
    6) rm -rf ${thisDir}/tmp/Icons.plist
        ;;
    *)

    echo "${langEnterError}";
    exit 0
    ;;
esac 

if [[ ${Picon} ]]; then
    DICON=${Overrides}"\/DisplayVendorID\-${Vid}\/DisplayProductID\-${Pid}\.icns"
    /usr/bin/sed -i "" "s/VID/${Vid}/g" ${thisDir}/tmp/Icons.plist
    /usr/bin/sed -i "" "s/PID/${Pid}/g" ${thisDir}/tmp/Icons.plist
    /usr/bin/sed -i "" "s/RPX/${RP[0]}/g" ${thisDir}/tmp/Icons.plist
    /usr/bin/sed -i "" "s/RPY/${RP[1]}/g" ${thisDir}/tmp/Icons.plist
    /usr/bin/sed -i "" "s/RPW/${RP[2]}/g" ${thisDir}/tmp/Icons.plist
    /usr/bin/sed -i "" "s/RPH/${RP[3]}/g" ${thisDir}/tmp/Icons.plist
    /usr/bin/sed -i "" "s/PICON/${Picon}/g" ${thisDir}/tmp/Icons.plist
    /usr/bin/sed -i "" "s/DICON/${DICON}/g" ${thisDir}/tmp/Icons.plist
fi

}

# main
function main()
{
    sudo mkdir -p ${thisDir}/tmp/DisplayVendorID-${Vid}
    dpiFile=${thisDir}/tmp/DisplayVendorID-${Vid}/DisplayProductID-${Pid}
    sudo chmod -R 777 ${thisDir}/tmp/

# 
cat > "${dpiFile}" <<-\CCC
<?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>DisplayProductID</key>
            <integer>PID</integer>
        <key>DisplayVendorID</key>
            <integer>VID</integer>
        <key>IODisplayEDID</key>
            <data>EDid</data>
        <key>scale-resolutions</key>
            <array>
CCC

echo ""
echo "------------------------------------------"
echo "|********** "${langChooseRes}" ***********|"
echo "------------------------------------------"
echo $ {langChooseResOp4}
echo $ {langChooseResOp3}
echo $ {langChooseResOp2}
echo $ {langChooseResOp1}
#
echo ""
echo $ {langChooseResOpCustom}
echo $ {langChooseResOp5}

read -p "${langInputChoice}: " res
case ${res} in
    1 ) create_res_1 1680x945 1440x810 1280x720 1024x576
        create_res_2 1280x800 1280x720 960x600 960x540 640x360
        create_res_3 840x472 800x450 720x405 640x360 576x324 512x288 420x234 400x225 320x180
        create_res_4 1680x945 1440x810 1280x720 1024x576 960x540 840x472 800x450 640x360
    ;;
    2 ) create_res_1 1680x945 1424x802 1280x720 1024x576
        create_res_2 1280x800 1280x720 960x600 960x540 640x360
        create_res_3 840x472 800x450 720x405 640x360 576x324 512x288 420x234 400x225 320x180
        create_res_4 1680x945 1440x810 1280x720 1024x576 960x540 840x472 800x450 640x360
    ;;
    3 ) create_res_1 1680x1050 1440x900 1280x800 1024x640
        create_res_2 1280x800 1280x720 960x600 960x540 640x360
        create_res_3 840x472 800x450 720x405 640x360 576x324 512x288 420x234 400x225 320x180
        create_res_4 1680x1050 1440x900 1280x800 1024x640 960x540 840x472 800x450 640x360
    ;;
    4 ) create_res_1 2560x1440 2048x1152 1920x1080 1760x990 1680x945 1440x810 1360x765 1280x720
        create_res_2 1360x765 1280x800 1280x720 1024x576 960x600 960x540 640x360
        create_res_3 960x540 840x472 800x450 720x405 640x360 576x324 512x288 420x234 400x225 320x180
        create_res_4 2048x1152 1920x1080 1680x945 1440x810 1280x720 1024x576 960x540 840x472 800x450 640x360
    ;;
    5 ) create_res_1 3000x2000 2880x1920 2250x1500 1920x1280 1680x1050 1440x900 1280x800 1024x640
        create_res_2 1280x800 1280x720 960x600 960x540 640x360
        create_res_3 840x472 800x450 720x405 640x360 576x324 512x288 420x234 400x225 320x180
        create_res_4 1920x1280 1680x1050 1440x900 1280x800 1024x640 960x540 840x472 800x450 640x360
    ;;
    6 ) custom_res
        create_res_2 1360x765 1280x800 1280x720 960x600 960x540 640x360
        create_res_3 840x472 800x450 720x405 640x360 576x324 512x288 420x234 400x225 320x180
        create_res_4 1680x945 1440x810 1280x720 1024x576 960x540 840x472 800x450 640x360
    ;;
    *)
    echo "${langEnterError}";
    exit 0
    ;;
esac

cat >> "${dpiFile}" <<-\FFF
            </array>
        <key>target-default-ppmm</key>
            <real>10.0699301</real>
    </dict>
</plist>
FFF

    /usr/bin/sed -i "" "s/VID/$VendorID/g" ${dpiFile}
    /usr/bin/sed -i "" "s/PID/$ProductID/g" ${dpiFile}
}

# end
function end()
{
    sudo chown -R root:wheel ${thisDir}/tmp/
    sudo chmod -R 0755 ${thisDir}/tmp/
    sudo chmod 0644 ${thisDir}/tmp/DisplayVendorID-${Vid}/*
    sudo cp -r ${thisDir}/tmp/* ${thatDir}/
    sudo rm -rf ${thisDir}/tmp
    sudo defaults write /Library/Preferences/com.apple.windowserver DisplayResolutionEnabled -bool YES
    echo "$ {langEnabled} " 
    echo" $ {langEnabledLog} "
}

# custom resolution
function custom_res()
{
    echo "${langCustomRes}"
    read -p ":" res
    create_res ${res}
}

# create resolution
function create_res()
{
    for res in $@; do
    width=$(echo ${res} | cut -d x -f 1)
    height=$(echo ${res} | cut -d x -f 2)
    hidpi=$(printf '%08x %08x' $((${width}*2)) $((${height}*2)) | xxd -r -p | base64)
#
cat << OOO >> ${dpiFile}
                <data>${hidpi:0:11}AAAAB</data>
                <data>${hidpi:0:11}AAAABACAAAA==</data>
OOO
done
}

function create_res_1()
{
    for res in $@; do
    width=$(echo ${res} | cut -d x -f 1)
    height=$(echo ${res} | cut -d x -f 2)
    hidpi=$(printf '%08x %08x' $((${width}*2)) $((${height}*2)) | xxd -r -p | base64)
#
cat << OOO >> ${dpiFile}
                <data>${hidpi:0:11}A</data>
OOO
done
}

function create_res_2()
{
    for res in $@; do
    width=$(echo ${res} | cut -d x -f 1)
    height=$(echo ${res} | cut -d x -f 2)
    hidpi=$(printf '%08x %08x' $((${width}*2)) $((${height}*2)) | xxd -r -p | base64)
#
cat << OOO >> ${dpiFile}
                <data>${hidpi:0:11}AAAABACAAAA==</data>
OOO
done
}

function create_res_3()
{
    for res in $@; do
    width=$(echo ${res} | cut -d x -f 1)
    height=$(echo ${res} | cut -d x -f 2)
    hidpi=$(printf '%08x %08x' $((${width}*2)) $((${height}*2)) | xxd -r -p | base64)
#
cat << OOO >> ${dpiFile}
                <data>${hidpi:0:11}AAAAB</data>
OOO
done
}

function create_res_4()
{
    for res in $@; do
    width=$(echo ${res} | cut -d x -f 1)
    height=$(echo ${res} | cut -d x -f 2)
    hidpi=$(printf '%08x %08x' $((${width}*2)) $((${height}*2)) | xxd -r -p | base64)
#
cat << OOO >> ${dpiFile}
                <data>${hidpi:0:11}AAAAJAKAAAA==</data>
OOO
done
}

# enable
function enable_hidpi()
{
    choose_icon
    main
    sed -i "" "/.*IODisplayEDID/d" ${dpiFile}
    sed -i "" "/.*EDid/d" ${dpiFile}
    end
}

# patch
function enable_hidpi_with_patch()
{
    choose_icon
    main

    version=${EDID:38:2}
    basicparams=${EDID:40:2}
    checksum=${EDID:254:2}
    newchecksum=$(printf '%x' $((0x${checksum} + 0x${version} +0x${basicparams} - 0x04 - 0x90)) | tail -c 2)
    newedid=${EDID:0:38}0490${EDID:42:6}e6${EDID:50:204}${newchecksum}
    EDid=$(printf ${newedid} | xxd -r -p | base64)

    /usr/bin/sed -i "" "s:EDid:${EDid}:g" ${dpiFile}
    end
}

# disable
function disable()
{
    if [[ -d ${thatDir}/DisplayVendorID-${Vid} ]]; then
        sudo rm -rf ${thatDir}/DisplayVendorID-${Vid} 
    fi

    sudo rm -rf ${thatDir}/Icons.plist
    sudo cp -r ${thatDir}/HIDPI/backup/* ${thatDir}/
    sudo rm -rf ${thatDir}/HIDPI/disable
    echo "${langDisabled}"
}

#
function start()
{
    init
    echo ""
    echo ${langEnableOp1}
    echo ${langEnableOp2}
    echo ${langEnableOp3}
    echo ""

#
read -p "${langInputChoice} [1~3]: " input
case ${input} in
    1) enable_hidpi
    ;;
    2) enable_hidpi_with_patch
    ;;
    3) disable
    ;;
    *) 

    echo "${langEnterError}";
    exit 0
    ;;
esac 
}

start

 

Guess you like

Origin www.cnblogs.com/3body/p/12683413.html