Comments (33)
@Bird-Kid You’ve suggested the correct path for vendors of my program catering to mirror monitorerers: fork from it at that old rev, but prepare to be broken hard at some future OSX release.
Detecting an error in these calls and implementing both as failovers for each other ... how about a patch if it’s so simple?
This is a fun-time personal GitHub project so I do demand patches from fix demanders!
The bug report is already detailed with loggings.
figuring how to get this right in modern & future OSX is the goal in master branch and I’m sure there are commercial products that have figured this out on their own.
To all that would reply:
I know dual monitors doesn’t work 100%, tell me how to fix it without using the old deprecated call.
from ddcctl.
FYI @fnesveda your app is the only that works with my identical Planar IX2790's so the fix is an improvement over others!
from ddcctl.
I just executed the command again after a reinstallation. Even when hard-coded, the entire serial-number line is still not displayed, only the name. I looked into displayList information, both displays report the same serial number: 1515733847
.
EDIT: Other than that, my output is has the same amount of information as yours.
EDIT 2: Thanks for reopening this. I really appreciate your work on this.
from ddcctl.
So I think I'm just going to give up on trying to convert NSDisplays to IOFramebuffers via CGDisplayID.
It seems the kIOFBDependentIndexKey
& kIOFBDependentIDKey
from make framebuffers
could be a stable index.
https://github.com/aosm/IOKitUser/blob/master/graphics.subproj/IOGraphicsLib.c#L55
https://opensource.apple.com/source/IOGraphics/IOGraphics-515.3/IOGraphicsFamily/IOKit/graphics/IOFramebuffer.h
Perhaps it even matches with the numerical list of NSDisplays in most cases?
need to investigate thisIndex
for confirmation
from ddcctl.
@theogq The workaround from my fork (#38) still works fine in Mojave. So if you're ok with updating both displays at the same time, you could use that.
from ddcctl.
Please retest against master to verify this is fixed.
from ddcctl.
Works for me, thank you very much @kfix! <3
from ddcctl.
I can also confirm this fix also works for me on dual BenQ PD3220U that previously did not work.
from ddcctl.
Current version works for a pair of Lenovo P27h-10 over USB-C.
Thank you for your work @kfix :D
from ddcctl.
Output of make displaylist framebuffers
ioreg -c IODisplayConnect -b -f -r -l -i -d 2
+-o display0 <class IORegistryEntry:IOService:IODisplayConnect, id 0x100005ba1, registered, matched, active, busy 0 (0 ms), retain 6>
| {
| }
|
+-o AppleBacklightDisplay <class IORegistryEntry:IOService:IODisplay:IOBacklightDisplay:AppleBacklightDisplay, id 0x100005ba2, registered, matched, active, busy 0 (0 ms), retain 9>
{
"IOClass" = "AppleBacklightDisplay"
"CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
"IOProviderClass" = "IODisplayConnect"
"DisplayProductID" = 41006
"IODisplayEDID" =
00000000: 00 FF FF FF FF FF FF 00 06 10 2E A0 00 00 00 00 04 19 01 04 A5 21 15 78 02 6F B1 A7 55 4C 9E 25 .....................!.x.o..UL.%
00000020: 0C 50 54 00 00 00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 EF 83 40 A0 B0 08 34 70 30 20 [email protected]
00000040: 36 00 4B CF 10 00 00 1A 00 00 00 FC 00 43 6F 6C 6F 72 20 4C 43 44 0A 20 20 20 00 00 00 10 00 00 6.K..........Color LCD. ......
00000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D0 ................................
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@0/display0/AppleBacklightDisplay-610-a02e"
"IODisplayGUID" = 436849163854938112
"IOProbeScore" = 3000
"IODisplayParameters" = {"commit"={"reg"=0},"fade-time2"={"min"=0,"max"=10000,"value"=4000},"ggsc"={"min"=0,"max"=65536,"value"=65536},"gsc "={"min"=0,"max"=65536,"value"=65536},"vblm"={"min"=0,"max"=196608,"value"$
"IOPowerManagement" = {"CapabilityFlags"=49152,"MaxPowerState"=3,"CurrentPowerState"=3}
"IOMatchCategory" = "IODefaultMatchCategory"
"IODisplayAttributes" = {"IODisplayAttributes"=<676174760000000073676c6604000000726c6f630100000063706220020000006364670080808000676c666400000000>}
"IODisplayConnectFlags" = <00080000>
"DisplayVendorID" = 1552
"DisplayParameterHandlerUsesCharPtr" = Yes
"DisplaySerialNumber" = 0
}
+-o display0 <class IORegistryEntry:IOService:IODisplayConnect, id 0x100005ba5, registered, matched, active, busy 0 (0 ms), retain 6>
| {
| }
|
+-o AppleDisplay-Portrait <class IORegistryEntry:IOService:IODisplay:AppleDisplay, id 0x100005ba7, registered, matched, active, busy 0 (0 ms), retain 10>
{
"IOClass" = "AppleDisplay"
"CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
"IOProviderClass" = "IODisplayConnect"
"DisplayProductID" = 2656
"IODisplayEDID" =
00000000: 00 FF FF FF FF FF FF 00 4C 2D 60 0A 57 43 58 5A 22 17 01 03 80 3C 22 78 2A F7 11 A3 56 4F 9E 28 ........L-`.WCXZ"....<"x*...VO.(
00000020: 0F 50 54 BF EF 80 71 4F 81 C0 81 00 81 80 95 00 A9 C0 B3 00 01 01 02 3A 80 18 71 38 2D 40 58 2C .PT...qO...............:..q8-@X,
00000040: 45 00 56 50 21 00 00 1E 01 1D 00 72 51 D0 1E 20 6E 28 55 00 56 50 21 00 00 1E 00 00 00 FD 00 32 E.VP!......rQ.. n(U.VP!........2
00000060: 4B 1E 51 11 00 0A 20 20 20 20 20 20 00 00 00 FC 00 53 32 37 43 37 35 30 0A 20 20 20 20 20 01 90 K.Q... .....S27C750. ..
00000080: 02 03 1A F1 46 90 04 1F 13 03 12 23 09 07 07 83 01 00 00 66 03 0C 00 10 00 80 01 1D 00 BC 52 D0 ....F......#.......f..........R.
000000A0: 1E 20 B8 28 55 40 56 50 21 00 00 1E 8C 0A D0 90 20 40 31 20 0C 40 55 00 56 50 21 00 00 18 8C 0A . .(U@VP!....... @1 [email protected]!.....
000000C0: D0 8A 20 E0 2D 10 10 3E 96 00 56 50 21 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .. .-..>..VP!...................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 ...............................a
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@1/display0/AppleDisplay-4c2d-a60"
"IOPowerManagement" = {"CapabilityFlags"=49152,"MaxPowerState"=3,"CurrentPowerState"=3}
"IOProbeScore" = 2000
"IODisplayParameters" = {"bgsc"={"min"=0,"max"=65536,"value"=65536},"pscn"={"min"=8800,"max"=10000,"value"=10000},"rgsc"={"min"=0,"max"=65536,"value"=65536},"cmod"={"min"=0,"max"=4096,"value"=256},"ggsc"={"min"=0,"$
"IOMatchCategory" = "IODefaultMatchCategory"
"IODisplayAttributes" = {"IODisplayAttributes"=<676174760000000073676c6600000000726c6f631101000063706220020202006364670080808000676c666401000000>,"IODisplayVSDB030C00"=<100080>}
"IODisplayConnectFlags" = <00000000>
"DisplayVendorID" = 19501
"DisplaySerialNumber" = 1515733847
}
+-o display0 <class IORegistryEntry:IOService:IODisplayConnect, id 0x100005ba9, registered, matched, active, busy 0 (0 ms), retain 6>
| {
| }
|
+-o AppleDisplay <class IORegistryEntry:IOService:IODisplay:AppleDisplay, id 0x100005bab, registered, matched, active, busy 0 (0 ms), retain 8>
{
"IOClass" = "AppleDisplay"
"CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
"IOProviderClass" = "IODisplayConnect"
"DisplayProductID" = 2656
"IODisplayEDID" =
00000000: 00 FF FF FF FF FF FF 00 4C 2D 60 0A 57 43 58 5A 22 17 01 03 80 3C 22 78 2A F7 11 A3 56 4F 9E 28 ........L-`.WCXZ"....<"x*...VO.(
00000020: 0F 50 54 BF EF 80 71 4F 81 C0 81 00 81 80 95 00 A9 C0 B3 00 01 01 02 3A 80 18 71 38 2D 40 58 2C .PT...qO...............:..q8-@X,
00000040: 45 00 56 50 21 00 00 1E 01 1D 00 72 51 D0 1E 20 6E 28 55 00 56 50 21 00 00 1E 00 00 00 FD 00 32 E.VP!......rQ.. n(U.VP!........2
00000060: 4B 1E 51 11 00 0A 20 20 20 20 20 20 00 00 00 FC 00 53 32 37 43 37 35 30 0A 20 20 20 20 20 01 90 K.Q... .....S27C750. ..
00000080: 02 03 1A F1 46 90 04 1F 13 03 12 23 09 07 07 83 01 00 00 66 03 0C 00 20 00 80 01 1D 00 BC 52 D0 ....F......#.......f... ......R.
000000A0: 1E 20 B8 28 55 40 56 50 21 00 00 1E 8C 0A D0 90 20 40 31 20 0C 40 55 00 56 50 21 00 00 18 8C 0A . .(U@VP!....... @1 [email protected]!.....
000000C0: D0 8A 20 E0 2D 10 10 3E 96 00 56 50 21 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .. .-..>..VP!...................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 51 ...............................Q
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@3/display0/AppleDisplay-4c2d-a60"
"IOPowerManagement" = {"CapabilityFlags"=49152,"MaxPowerState"=3,"CurrentPowerState"=3}
"IOProbeScore" = 2000
"IODisplayParameters" = {"bgsc"={"min"=0,"max"=65536,"value"=65536},"pscn"={"min"=8800,"max"=10000,"value"=10000},"rgsc"={"min"=0,"max"=65536,"value"=65536},"cmod"={"min"=0,"max"=4096,"value"=256},"ggsc"={"min"=0,"$
"IOMatchCategory" = "IODefaultMatchCategory"
"IODisplayAttributes" = {"IODisplayAttributes"=<676174760000000073676c6600000000726c6f631101000063706220020202006364670080808000676c666401000000>,"IODisplayVSDB030C00"=<200080>}
"IODisplayConnectFlags" = <00000000>
"DisplayVendorID" = 19501
"DisplaySerialNumber" = 1515733847
}
ioreg -c IOFramebuffer -k IOFBI2CInterfaceIDs -b -f -l -r -d 1
+-o AppleIntelFramebuffer@0 <class AppleIntelFramebuffer, id 0x1000003a3, registered, matched, active, busy 0 (121 ms), retain 18>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................................
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"av-signal-type" = <00000000>
"IOFBDependentIndex" = 0
"IOFBUIScale" = <02000000>
"audio-codec-info" = <00000000>
"IOFBMemorySize" = 268435456
"boot-gamma-restored" = <00000000>
"IOScreenRestoreState" = <00000000>
"IOFBGammaCount" = 1024
"IOFBCurrentPixelCount" = 5630080
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 0
"AAPL,DisplayPipe" = <00000000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <02000000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"startup-timing" =
00000000: 00 00 00 00 00 00 00 80 02 30 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .........0......................
00000020: 00 0F 00 00 60 09 00 00 00 00 00 00 01 00 00 00 F0 A7 21 14 00 00 00 00 F0 A7 21 14 00 00 00 00 ....`.............!.......!.....
00000040: F0 A7 21 14 00 00 00 00 40 0B 00 00 A0 00 00 00 30 00 00 00 20 00 00 00 08 07 00 00 34 00 00 00 [email protected]... .......4...
00000060: 03 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................................
00000080: 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000A0: 00 00 00 00 00 00 00 00 ........
"AAPL,boot-display" = Yes
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"built-in" = <>
"IOPowerManagement" = {"ChildrenPowerState"=2,"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBCurrentPixelClock" = 337750000
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968223
"IOAccelIndex" = 0
"IOFBWaitCursorFrames" = 29
"IOFBConfig" = {"IOFBModes"=({"ID"=18446744071562088448,"DM"=<400b00000807000082fd3b0000000000070000024b01cf00000000000000000000000000>,"TM"=<00500080000000000000000000000000000000000000000000000000000000000000000001$
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = No
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = (<0100000000010000000100002000000000000000000000000000000000000000000000000400000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$
"IOFBI2CInterfaceIDs" = (0)
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOVARendererID" = 17305602
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 00 0F BE 14 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOFBDetailedTimings" = (<00500080000000000000000000000000000000000000000000000000000000000000000001000000f0a7211400000000f0a7211400000000f0a7211400000000400b0000a00000003000000020000000080700003400000003000000060000$
"IOFBCurrentPixelCountReal" = 5630080
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 0
"EnableLPVP" = 1
}
+-o AppleIntelFramebuffer@1 <class AppleIntelFramebuffer, id 0x1000003a4, registered, matched, active, busy 0 (504 ms), retain 17>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................>...............
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"av-signal-type" = <08000000>
"IOFBDependentIndex" = 1
"IOFBUIScale" = <01000000>
"IOScreenRestoreState" = <00000000>
"audio-codec-info" = <00010500>
"CEAPixelRepetition" = <00>
"IOFBGammaCount" = 1024
"IOFBCurrentPixelCount" = 2475000
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 1
"AAPL,DisplayPipe" = <02000000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <00040000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"startup-timing" =
00000000: 00 00 00 00 00 00 00 80 00 10 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00 00 ............................0...
00000020: 38 04 00 00 80 07 00 00 00 00 00 00 00 00 00 00 20 EE D9 08 00 00 00 00 20 EE D9 08 00 00 00 00 8............... ....... .......
00000040: 20 EE D9 08 00 00 00 00 80 07 00 00 18 01 00 00 58 00 00 00 2C 00 00 00 38 04 00 00 2D 00 00 00 ...............X...,...8...-...
00000060: 04 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................................
00000080: 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000A0: 00 00 00 00 00 00 00 00 ........
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"IOPowerManagement" = {"ChildrenPowerState"=2,"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBCurrentPixelClock" = 148500000
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968223
"IOAccelIndex" = 1
"IOFBWaitCursorFrames" = 29
"audio-selector" = <"dp66">
"IOFBConfig" = {"IOFBModes"=({"ID"=18446744071562088448,"DM"=<380400008007000000003c00000000000700500250015602000000000000000000000000>,"TM"=<00500080000000000000000000000000000000003000000038040000800700000000000000$
"CEAModeID" = <10000000>
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = Yes
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 48
"IOFBCursorInfo" = (<0100000000010000000100002000000000000000000000000000000000000000000000000400000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$
"IOFBI2CInterfaceIDs" = (4294967296)
"IOVARendererID" = 17305602
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 80 EC A7 09 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOFBDetailedTimings" = (<0050008000000000000000000000000000000000300000003804000080070000000000000000000020eed9080000000020eed9080000000020eed908000000008007000018010000580000002c000000380400002d00000004000000050000$
"IOFBCurrentPixelCountReal" = 2475000
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 5
"IOFBHDMIDongleROM" =
00000000: 44 50 2D 48 44 4D 49 20 41 44 41 50 54 4F 52 04 DP-HDMI ADAPTOR.
"EnableLPVP" = 1
}
+-o AppleIntelFramebuffer@2 <class AppleIntelFramebuffer, id 0x1000003a5, registered, matched, active, busy 0 (46 ms), retain 14>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................>...............
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"IOFBDependentIndex" = 2
"IOFBUIScale" = <00000000>
"IOScreenRestoreState" = <00000000>
"IOFBGammaCount" = 1024
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 2
"AAPL,DisplayPipe" = <ffff0000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <00040000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"IOPowerManagement" = {"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968223
"IOAccelIndex" = 2
"IOFBWaitCursorFrames" = 29
"IOFBConfig" = {"IOFB0Hz"=Yes,"IOFBModes"=({"ID"=18446744073709551360,"DM"=<010000000100000000000000000000000700000000000000000000000000000000000000>,"AID"=550})}
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = Yes
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = ()
"IOFBI2CInterfaceIDs" = (8589934592)
"IOVARendererID" = 17305602
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 80 DF 17 10 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 6
}
+-o AppleIntelFramebuffer@3 <class AppleIntelFramebuffer, id 0x1000003a6, registered, matched, active, busy 0 (471 ms), retain 17>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................>...............
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"av-signal-type" = <08000000>
"IOFBDependentIndex" = 3
"IOFBUIScale" = <01000000>
"IOScreenRestoreState" = <00000000>
"audio-codec-info" = <00010700>
"CEAPixelRepetition" = <00>
"IOFBGammaCount" = 1024
"IOFBCurrentPixelCount" = 2475000
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 3
"AAPL,DisplayPipe" = <01000000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <00080000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"startup-timing" =
00000000: 00 00 00 00 00 00 00 80 00 30 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .........0......................
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 EE D9 08 00 00 00 00 20 EE D9 08 00 00 00 00 ................ ....... .......
00000040: 20 EE D9 08 00 00 00 00 80 07 00 00 18 01 00 00 58 00 00 00 2C 00 00 00 38 04 00 00 2D 00 00 00 ...............X...,...8...-...
00000060: 04 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................................
00000080: 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000A0: 00 00 00 00 00 00 00 00 ........
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"IOPowerManagement" = {"ChildrenPowerState"=2,"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBCurrentPixelClock" = 148500000
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968223
"IOAccelIndex" = 3
"IOFBWaitCursorFrames" = 29
"audio-selector" = <"dp66">
"IOFBConfig" = {"IOFBModes"=({"ID"=18446744071562088448,"DM"=<800700003804000000003c00000000000700100256025001000000000000000000000000>,"TM"=<00500080000000000000000000000000000000000000000000000000000000000000000000$
"CEAModeID" = <10000000>
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = Yes
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = (<0100000000010000000100002000000000000000000000000000000000000000000000000400000000000000ffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$
"IOFBI2CInterfaceIDs" = (12884901888)
"IOVARendererID" = 17305602
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 00 A3 E1 11 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOFBDetailedTimings" = (<0050008000000000000000000000000000000000000000000000000000000000000000000000000020eed9080000000020eed9080000000020eed908000000008007000018010000580000002c000000380400002d00000004000000050000$
"IOFBCurrentPixelCountReal" = 2475000
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 7
"EnableLPVP" = 1
}
from ddcctl.
Working on debugging this. Will report back tomorrow.
from ddcctl.
I don't have duplicate monitors to test myself, but can you try against latest master?
make CCFLAGS=-DDEBUG clean ddcctl
should do the trick.
from ddcctl.
Oops. I totally forgot about this. Will report back as soon as I can.
from ddcctl.
No response.
from ddcctl.
Personal issues made me unable to test. My apologies. The testing results are as follows.
- Executing
make CCFLAGS=-DDEBUG clean ddcctl
rm *.o ddcctl
gcc -DDEBUG -Wall -c -o DDC.o DDC.c
gcc -DDEBUG -Wall -o ddcctl -lobjc -framework IOKit -framework AppKit -framework Foundation DDC.o ddcctl.m
- Executing
ddcctl -d 1 -b 1
The first display lowers its brightness to minimum level.
D: NSScreen #188930901 (1920x1080 0°) 82.00 DPI
D: NSScreen #188930903 (1920x1080 0°) 82.00 DPI
I: found 2 external displays
I: polling display 1's EDID
I: got edid.name: S27C750
D: action: b: 1
D: setting VCP control #16 => 1
- Executing
ddcctl -d 1 -b 100
The first display changes its brightness to maximum level.
D: NSScreen #188930901 (1920x1080 0°) 82.00 DPI
D: NSScreen #188930903 (1920x1080 0°) 82.00 DPI
I: found 2 external displays
I: polling display 1's EDID
I: got edid.name: S27C750
D: action: b: 100
D: setting VCP control #16 => 100
- Executing
ddcctl -d 2 -b 100
The first display lowers its brightness to minimum level.
D: NSScreen #188930901 (1920x1080 0°) 82.00 DPI
D: NSScreen #188930903 (1920x1080 0°) 82.00 DPI
I: found 2 external displays
I: polling display 2's EDID
I: got edid.name: S27C750
D: action: b: 1
D: setting VCP control #16 => 1
- Executing
make displaylist framebuffers
ioreg -c IODisplayConnect -b -f -r -l -i -d 2
+-o display0 <class IORegistryEntry:IOService:IODisplayConnect, id 0x1000050e0, registered, matched, active, busy 0 (1 ms), retain 6>
| {
| }
|
+-o AppleBacklightDisplay <class IORegistryEntry:IOService:IODisplay:IOBacklightDisplay:AppleBacklightDisplay, id 0x1000050e1, registered, matched, active, busy 0 (0 ms), retain 9>
{
"IOClass" = "AppleBacklightDisplay"
"CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
"IOProviderClass" = "IODisplayConnect"
"DisplayProductID" = 41006
"IODisplayEDID" =
00000000: 00 FF FF FF FF FF FF 00 06 10 2E A0 00 00 00 00 04 19 01 04 A5 21 15 78 02 6F B1 A7 55 4C 9E 25 .....................!.x.o..UL.%
00000020: 0C 50 54 00 00 00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 EF 83 40 A0 B0 08 34 70 30 20 [email protected]
00000040: 36 00 4B CF 10 00 00 1A 00 00 00 FC 00 43 6F 6C 6F 72 20 4C 43 44 0A 20 20 20 00 00 00 10 00 00 6.K..........Color LCD. ......
00000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D0 ................................
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@0/display0/AppleBacklightDisplay-610-a02e"
"IODisplayGUID" = 436849163854938112
"IOProbeScore" = 3000
"IODisplayParameters" = {"commit"={"reg"=0},"fade-time2"={"min"=0,"max"=10000,"value"=4000},"ggsc"={"min"=0,"max"=65536,"value"=65536},"gsc "={"min"=0,"max"=65536,"value"=65536},"vblm"={"min"=0,"max"=1966$
"IOPowerManagement" = {"CapabilityFlags"=49152,"MaxPowerState"=3,"CurrentPowerState"=3}
"IOMatchCategory" = "IODefaultMatchCategory"
"IODisplayAttributes" = {"IODisplayAttributes"=<676174760000000073676c6604000000726c6f630100000063706220020000006364670080808000676c666400000000>}
"IODisplayConnectFlags" = <00080000>
"DisplayVendorID" = 1552
"DisplayParameterHandlerUsesCharPtr" = Yes
"DisplaySerialNumber" = 0
}
+-o display0 <class IORegistryEntry:IOService:IODisplayConnect, id 0x1000050e4, registered, matched, active, busy 0 (0 ms), retain 6>
| {
| }
|
+-o AppleDisplay <class IORegistryEntry:IOService:IODisplay:AppleDisplay, id 0x1000050e6, registered, matched, active, busy 0 (0 ms), retain 10>
{
"IOClass" = "AppleDisplay"
"CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
"IOProviderClass" = "IODisplayConnect"
"DisplayProductID" = 2656
"IODisplayEDID" =
00000000: 00 FF FF FF FF FF FF 00 4C 2D 60 0A 57 43 58 5A 22 17 01 03 80 3C 22 78 2A F7 11 A3 56 4F 9E 28 ........L-`.WCXZ"....<"x*...VO.(
00000020: 0F 50 54 BF EF 80 71 4F 81 C0 81 00 81 80 95 00 A9 C0 B3 00 01 01 02 3A 80 18 71 38 2D 40 58 2C .PT...qO...............:..q8-@X,
00000040: 45 00 56 50 21 00 00 1E 01 1D 00 72 51 D0 1E 20 6E 28 55 00 56 50 21 00 00 1E 00 00 00 FD 00 32 E.VP!......rQ.. n(U.VP!........2
00000060: 4B 1E 51 11 00 0A 20 20 20 20 20 20 00 00 00 FC 00 53 32 37 43 37 35 30 0A 20 20 20 20 20 01 90 K.Q... .....S27C750. ..
00000080: 02 03 1A F1 46 90 04 1F 13 03 12 23 09 07 07 83 01 00 00 66 03 0C 00 10 00 80 01 1D 00 BC 52 D0 ....F......#.......f..........R.
000000A0: 1E 20 B8 28 55 40 56 50 21 00 00 1E 8C 0A D0 90 20 40 31 20 0C 40 55 00 56 50 21 00 00 18 8C 0A . .(U@VP!....... @1 [email protected]!.....
000000C0: D0 8A 20 E0 2D 10 10 3E 96 00 56 50 21 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .. .-..>..VP!...................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 ...............................a
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@1/display0/AppleDisplay-4c2d-a60"
"IOPowerManagement" = {"CapabilityFlags"=49152,"MaxPowerState"=3,"CurrentPowerState"=3}
"IOProbeScore" = 2000
"IODisplayParameters" = {"bgsc"={"min"=0,"max"=65536,"value"=65536},"pscn"={"min"=8800,"max"=10000,"value"=10000},"rgsc"={"min"=0,"max"=65536,"value"=65536},"cmod"={"min"=0,"max"=4096,"value"=256},"ggsc"=$
"IOMatchCategory" = "IODefaultMatchCategory"
"IODisplayAttributes" = {"IODisplayAttributes"=<676174760000000073676c6600000000726c6f631101000063706220020202006364670080808000676c666401000000>,"IODisplayVSDB030C00"=<100080>}
"IODisplayConnectFlags" = <00000000>
"DisplayVendorID" = 19501
"DisplaySerialNumber" = 1515733847
}
+-o display0 <class IORegistryEntry:IOService:IODisplayConnect, id 0x1000050e8, registered, matched, active, busy 0 (0 ms), retain 6>
| {
| }
|
+-o AppleDisplay <class IORegistryEntry:IOService:IODisplay:AppleDisplay, id 0x1000050ea, registered, matched, active, busy 0 (0 ms), retain 8>
{
"IOClass" = "AppleDisplay"
"CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
"IOProviderClass" = "IODisplayConnect"
"DisplayProductID" = 2656
"IODisplayEDID" =
00000000: 00 FF FF FF FF FF FF 00 4C 2D 60 0A 57 43 58 5A 22 17 01 03 80 3C 22 78 2A F7 11 A3 56 4F 9E 28 ........L-`.WCXZ"....<"x*...VO.(
00000020: 0F 50 54 BF EF 80 71 4F 81 C0 81 00 81 80 95 00 A9 C0 B3 00 01 01 02 3A 80 18 71 38 2D 40 58 2C .PT...qO...............:..q8-@X,
00000040: 45 00 56 50 21 00 00 1E 01 1D 00 72 51 D0 1E 20 6E 28 55 00 56 50 21 00 00 1E 00 00 00 FD 00 32 E.VP!......rQ.. n(U.VP!........2
00000060: 4B 1E 51 11 00 0A 20 20 20 20 20 20 00 00 00 FC 00 53 32 37 43 37 35 30 0A 20 20 20 20 20 01 90 K.Q... .....S27C750. ..
00000080: 02 03 1A F1 46 90 04 1F 13 03 12 23 09 07 07 83 01 00 00 66 03 0C 00 20 00 80 01 1D 00 BC 52 D0 ....F......#.......f... ......R.
000000A0: 1E 20 B8 28 55 40 56 50 21 00 00 1E 8C 0A D0 90 20 40 31 20 0C 40 55 00 56 50 21 00 00 18 8C 0A . .(U@VP!....... @1 [email protected]!.....
000000C0: D0 8A 20 E0 2D 10 10 3E 96 00 56 50 21 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .. .-..>..VP!...................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 51 ...............................Q
"IODisplayPrefsKey" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/AppleIntelFramebuffer@3/display0/AppleDisplay-4c2d-a60"
"IOPowerManagement" = {"CapabilityFlags"=49152,"MaxPowerState"=3,"CurrentPowerState"=3}
"IOProbeScore" = 2000
"IODisplayParameters" = {"bgsc"={"min"=0,"max"=65536,"value"=65536},"pscn"={"min"=8800,"max"=10000,"value"=10000},"rgsc"={"min"=0,"max"=65536,"value"=65536},"cmod"={"min"=0,"max"=4096,"value"=256},"ggsc"=$
"IOMatchCategory" = "IODefaultMatchCategory"
"IODisplayAttributes" = {"IODisplayAttributes"=<676174760000000073676c6600000000726c6f631101000063706220020202006364670080808000676c666401000000>,"IODisplayVSDB030C00"=<200080>}
"IODisplayConnectFlags" = <00000000>
"DisplayVendorID" = 19501
"DisplaySerialNumber" = 1515733847
}
ioreg -c IOFramebuffer -k IOFBI2CInterfaceIDs -b -f -l -r -d 1
+-o AppleIntelFramebuffer@0 <class AppleIntelFramebuffer, id 0x1000003a5, registered, matched, active, busy 0 (56 ms), retain 19>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................................
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"av-signal-type" = <00000000>
"IOFBDependentIndex" = 0
"IOFBUIScale" = <02000000>
"audio-codec-info" = <00000000>
"IOFBMemorySize" = 268435456
"boot-gamma-restored" = <00000000>
"IOScreenRestoreState" = <00000000>
"IOFBGammaCount" = 1024
"IOFBCurrentPixelCount" = 5630080
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 0
"AAPL,DisplayPipe" = <00000000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <02000000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"startup-timing" =
00000000: 00 00 00 00 00 00 00 80 00 70 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .........p......................
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 F0 A7 21 14 00 00 00 00 F0 A7 21 14 00 00 00 00 ..................!.......!.....
00000040: F0 A7 21 14 00 00 00 00 40 0B 00 00 A0 00 00 00 30 00 00 00 20 00 00 00 08 07 00 00 34 00 00 00 [email protected]... .......4...
00000060: 03 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................................
00000080: 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000A0: 00 00 00 00 00 00 00 00 ........
"AAPL,boot-display" = Yes
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"built-in" = <>
"IOPowerManagement" = {"ChildrenPowerState"=2,"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBCurrentPixelClock" = 337750000
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968225
"IOAccelIndex" = 0
"IOFBWaitCursorFrames" = 29
"IOFBConfig" = {"IOFBModes"=({"ID"=18446744071562072064,"DM"=<400b00000807000082fd3b0000000000070000024b01cf00000000000000000000000000>,"TM"=<0010008000000000000000000000000000000000000000000000000000000000$
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = No
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = (<0100000000010000000100002000000000000000000000000000000000000000000000000400000000000000ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$
"IOFBI2CInterfaceIDs" = (0)
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOVARendererID" = 17305602
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 00 0F BE 14 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOFBDetailedTimings" = (<00100080000000000000000000000000000000000000000000000000000000000000000001000000f0a7211400000000f0a7211400000000f0a7211400000000400b0000a0000000300000002000000008070000340000000300$
"IOFBCurrentPixelCountReal" = 5630080
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 0
"EnableLPVP" = 1
}
+-o AppleIntelFramebuffer@1 <class AppleIntelFramebuffer, id 0x1000003a6, registered, matched, active, busy 0 (109 ms), retain 17>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................>...............
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"av-signal-type" = <08000000>
"IOFBDependentIndex" = 1
"IOFBUIScale" = <01000000>
"IOScreenRestoreState" = <00000000>
"audio-codec-info" = <00010500>
"CEAPixelRepetition" = <00>
"IOFBGammaCount" = 1024
"IOFBCurrentPixelCount" = 2475000
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 1
"AAPL,DisplayPipe" = <01000000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <00040000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"startup-timing" =
00000000: 00 00 00 00 00 00 00 80 00 50 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .........P......................
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 EE D9 08 00 00 00 00 20 EE D9 08 00 00 00 00 ................ ....... .......
00000040: 20 EE D9 08 00 00 00 00 80 07 00 00 18 01 00 00 58 00 00 00 2C 00 00 00 38 04 00 00 2D 00 00 00 ...............X...,...8...-...
00000060: 04 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................................
00000080: 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000A0: 00 00 00 00 00 00 00 00 ........
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"IOPowerManagement" = {"ChildrenPowerState"=2,"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBCurrentPixelClock" = 148500000
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968225
"IOAccelIndex" = 1
"IOFBWaitCursorFrames" = 29
"audio-selector" = <"dp66">
"IOFBConfig" = {"IOFBModes"=({"ID"=18446744071562072064,"DM"=<800700003804000000003c00000000000700100256025001000000000000000000000000>,"TM"=<0010008000000000000000000000000000000000000000000000000000000000$
"CEAModeID" = <10000000>
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = Yes
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = (<0100000000010000000100002000000000000000000000000000000000000000000000000400000000000000ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$
"IOFBI2CInterfaceIDs" = (4294967296)
"IOVARendererID" = 17305602
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 80 EC A7 09 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOFBDetailedTimings" = (<0010008000000000000000000000000000000000000000000000000000000000000000000000000020eed9080000000020eed9080000000020eed908000000008007000018010000580000002c000000380400002d0000000400$
"IOFBCurrentPixelCountReal" = 2475000
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 5
"IOFBHDMIDongleROM" =
00000000: 44 50 2D 48 44 4D 49 20 41 44 41 50 54 4F 52 04 DP-HDMI ADAPTOR.
"EnableLPVP" = 1
}
+-o AppleIntelFramebuffer@2 <class AppleIntelFramebuffer, id 0x1000003a7, registered, matched, active, busy 0 (9 ms), retain 15>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................>...............
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"IOFBDependentIndex" = 2
"IOFBUIScale" = <00000000>
"IOScreenRestoreState" = <00000000>
"IOFBGammaCount" = 1024
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 2
"AAPL,DisplayPipe" = <ffff0000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <00040000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"IOPowerManagement" = {"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968225
"IOAccelIndex" = 2
"IOFBWaitCursorFrames" = 29
"IOFBConfig" = {"IOFB0Hz"=Yes,"IOFBModes"=({"ID"=18446744073709551360,"DM"=<010000000100000000000000000000000700000000000000000000000000000000000000>,"AID"=550})}
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = Yes
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = ()
"IOFBI2CInterfaceIDs" = (8589934592)
"IOVARendererID" = 17305602
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 80 DF 17 10 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 6
}
+-o AppleIntelFramebuffer@3 <class AppleIntelFramebuffer, id 0x1000003a8, registered, matched, active, busy 0 (92 ms), retain 17>
{
"IOI2CTransactionTypes" = 19
"IOFBScalerInfo" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 FF 1F 00 00 FF 1F 00 00 00 00 00 00 ................>...............
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOPMStrictTreeOrder" = Yes
"AppleIntelMEVABundleName" = "AppleIntelIVBFBVA"
"av-signal-type" = <08000000>
"IOFBDependentIndex" = 3
"IOFBUIScale" = <01000000>
"IOScreenRestoreState" = <00000000>
"audio-codec-info" = <00010700>
"CEAPixelRepetition" = <00>
"IOFBGammaCount" = 1024
"IOFBCurrentPixelCount" = 2475000
"IOFBCLUTDefer" = Yes
"IOFramebufferOpenGLIndex" = 3
"AAPL,DisplayPipe" = <02000000>
"IOFBI2CInterfaceInfo" = ({"IOI2CInterfaceID"=0,"IOI2CTransactionTypes"=19})
"connector-type" = <00080000>
"IODisplayParameters" = "IOFramebufferParameterHandler is not serializable"
"startup-timing" =
00000000: 00 00 00 00 00 00 00 80 00 70 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .........p......................
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 EE D9 08 00 00 00 00 20 EE D9 08 00 00 00 00 ................ ....... .......
00000040: 20 EE D9 08 00 00 00 00 80 07 00 00 18 01 00 00 58 00 00 00 2C 00 00 00 38 04 00 00 2D 00 00 00 ...............X...,...8...-...
00000060: 04 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................................
00000080: 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000A0: 00 00 00 00 00 00 00 00 ........
"IOAccelTypes" = "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2/IntelAccelerator"
"IOPowerManagement" = {"ChildrenPowerState"=2,"MaxPowerState"=2,"CurrentPowerState"=2,"CapabilityFlags"=32768,"ChildProxyPowerState"=2,"DriverPowerState"=1}
"IOFBCurrentPixelClock" = 148500000
"IOFBGammaWidth" = 10
"IOFBDependentID" = 4294968225
"IOAccelIndex" = 3
"IOFBWaitCursorFrames" = 29
"audio-selector" = <"dp66">
"IOFBConfig" = {"IOFBModes"=({"ID"=18446744071562072064,"DM"=<800700003804000000003c00000000000700100256025001000000000000000000000000>,"TM"=<0010008000000000000000000000000000000000000000000000000000000000$
"CEAModeID" = <10000000>
"IOFBIntegrated" = Yes
"IOFBProbeOptions" = 1025
"IOFBNeedsRefresh" = Yes
"IOFBWaitCursorPeriod" = 33333333
"IOFBTransform" = 0
"IOFBCursorInfo" = (<0100000000010000000100002000000000000000000000000000000000000000000000000400000000000000ffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$
"IOFBI2CInterfaceIDs" = (12884901888)
"IOVARendererID" = 17305602
"audio-device-nvalue" = <"Z">
"IOAccelRevision" = 2
"IOCFPlugInTypes" = {"ACCF0000-0000-0000-0000-000a2789904e"="IOAccelerator2D.plugin"}
"audio-device-mvalue" = <04000000>
"IOFBTimingRange" =
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00000020: 00 2D 31 01 00 00 00 00 00 A3 E1 11 00 00 00 00 00 00 00 00 0F 00 00 00 0F 00 00 00 08 00 00 00 .-1.............................
00000040: 00 00 00 00 FF FF FF FF 00 00 00 00 FF FF FF FF FF 1F 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 ................................
00000060: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 00 20 00 00 00 00 00 00 FF 1F 00 00 ..................... ..........
00000080: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 0C 00 00 00 00 00 00 FF 1F 00 00 ................................
000000A0: 00 00 00 00 FF 1F 00 00 00 00 00 00 FF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
000000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
"IOFBDetailedTimings" = (<0010008000000000000000000000000000000000000000000000000000000000000000000000000020eed9080000000020eed9080000000020eed908000000008007000018010000580000002c000000380400002d0000000400$
"IOFBCurrentPixelCountReal" = 2475000
"IOGeneralInterest" = "IOCommand is not serializable"
"port-number" = 7
"EnableLPVP" = 1
}
====
Unfortunately, the problem seems to persist. If I can be of any help, feel free to ask. I will make sure to reply promptly (this time).
from ddcctl.
When I use a debug build, I can see the exact serial numbers of displays.
Your output is missing this information.
$ make CCFLAGS=-DDEBUG clean ddcctl
rm *.o ddcctl
gcc -DDEBUG -Wall -c -o DDC.o DDC.c
gcc -DDEBUG -Wall -o ddcctl -lobjc -framework IOKit -framework AppKit -framework Foundation DDC.o ddcctl.m
$ ./ddcctl -d 1
2017-02-15 10:14:05.820 ddcctl[5706:256999] D: NSScreen #724067663 (1920x1200 0°) 94.00 DPI
2017-02-15 10:14:05.821 ddcctl[5706:256999] D: NSScreen #725365521 (1200x1920 90°) 94.00 DPI
2017-02-15 10:14:05.822 ddcctl[5706:256999] I: found 2 external displays
2017-02-15 10:14:05.822 ddcctl[5706:256999] I: polling display 1's EDID
Framebuffer: NVDA
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPP/GFX0@0/NVDA,Display-B@1/NVDA/display0/AppleDisplay
VN:4268 PN:41144 SN:827083596 UN:3 IN:15619 Serial:
2017-02-15 10:14:05.836 ddcctl[5706:256999] I: got edid.serial: CFV9N6221LKL
2017-02-15 10:14:05.836 ddcctl[5706:256999] I: got edid.name: DELL U2415
from ddcctl.
Unfortunately if the serial numbers are identical then there is no way for ddcctl to tell them apart at the IOFramebuffer level.
I do not know why you cannot see debug information, please get it exactly as I have shown, without installation.
Framebuffer: NVDA IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPP/GFX0@0/NVDA,Display-B@1/NVDA/display0/AppleDisplay VN:4268 PN:41144 SN:827083596 UN:3 IN:15619 Serial:
That debug output exists specifically to help someone else to hack a solution up for these identical-serial monitors that I don't personally have access to.
from ddcctl.
Here is the debug output with a similar (dual identical monitors) setup:
❯ make CCFLAGS=-DDEBUG clean ddcctl
rm: cannot remove '*.o': No such file or directory
rm *.o ddcctl
rm: cannot remove 'ddcctl': No such file or directory
gcc -DDEBUG -Wall -c -o DDC.o DDC.c
make: [Makefile:29: clean] Error 1 (ignored)
gcc -DDEBUG -Wall -o ddcctl -lobjc -framework IOKit -framework AppKit -framework Foundation DDC.o ddcctl.m
and debug run for first display:
~/source/system/ddcctl master*
❯ ./ddcctl -d 1
2017-05-15 06:08:09.361 ddcctl[5426:1906618] D: NSScreen #188936772 (2560x1440 0°) 109.00 DPI
2017-05-15 06:08:09.362 ddcctl[5426:1906618] D: NSScreen #188936771 (2560x1440 0°) 109.00 DPI
2017-05-15 06:08:09.362 ddcctl[5426:1906618] I: found 2 external displays
2017-05-15 06:08:09.362 ddcctl[5426:1906618] I: polling display 1's EDID
Framebuffer: NVDA
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPP/GFX0@0/NVDA,Display-B@1/NVDA/display0/AppleDisplay
VN:19501 PN:3017 SN:0 UN:4 IN:14851 Serial:
2017-05-15 06:08:09.380 ddcctl[5426:1906618] I: got edid.name: S27D850
and the output using the second display:
~/source/system/ddcctl master*
❯ ./ddcctl -d 2
2017-05-15 06:08:30.479 ddcctl[5490:1912083] D: NSScreen #188936772 (2560x1440 0°) 109.00 DPI
2017-05-15 06:08:30.479 ddcctl[5490:1912083] D: NSScreen #188936771 (2560x1440 0°) 109.00 DPI
2017-05-15 06:08:30.479 ddcctl[5490:1912083] I: found 2 external displays
2017-05-15 06:08:30.479 ddcctl[5490:1912083] I: polling display 2's EDID
Framebuffer: NVDA
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPP/GFX0@0/NVDA,Display-B@1/NVDA/display0/AppleDisplay
VN:19501 PN:3017 SN:0 UN:3 IN:14851 Serial:
2017-05-15 06:08:30.492 ddcctl[5490:1912083] I: got edid.name: S27D850
Essentially you are right that at the frame-buffer level you cannot differentiate between the two displays, with the given CGDisplayID properties. The problematic method is the IOFramebufferPortFromCGDisplayID
in DDC.c
which returns the first frame-buffer matching the CGDisplayID, where in fact there are two frame-buffers matching the properties of the given GCDisplayID. Besides the different address in the ioreg tree:
"IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPP/GFX0@0/NVDA,Display-B@1/NVDA/display0/AppleDisplay-4c2d-bc9"
"IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/P0P2@1/IOPP/GFX0@0/NVDA,Display-C@2/NVDA/display0/AppleDisplay-4c2d-bc9"
I am still to find another distinctive property that could help in choosing the correct frame-buffer for the corresponding display. The way I went about it (dirty hack) that only works in this specific case, was to just ignore the first result and converge on the second result for that displayID. (hint: the fdisp
counter variable)
from ddcctl.
It seems that WindowServer maintains a dictionary of displays, linking them with their device paths:
$ PlistBuddy -c "Print DisplaySets:0:0:IODisplayLocation" /Library/Preferences/com.apple.windowserver.plist
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IXVE@10/IOPP/IGPU@0/NVDA,Display-A@0/NVDATesla
working on changes to use this derived IOTree location to inform the framebuffer matching.
from ddcctl.
This is by no means an adequate fix, but maybe this will help someone else debugging or potentially properly fixing this behavior:
I've got two satellite monitors of the same brand & model and started experiencing the same issue yesterday. I was sure ddcctl was working perfectly fine a while back; nothing of the setup had changed at all since my return.
In a poor man's attempt at restoring an older state, I tried some of the older ddcctl versions. – And sure enough, the latest commit in which ddcctl had no issue dealing with identical monitors (for me anyway) was eeab3c21d84eeb607031dea32e21cf36ee2f7050
. Any future state I tried failed.
Albeit two warnings are thrown during make install
(a fix of which, I reckon, was attempted in the following commit), ddcctl nonetheless appears to be running just fine here.
Perhaps someone with more insight can review the changes made after this commit, compare the new & old way of signaling the right monitor and either revert or re-implement the old method as optional fallback?
TL;DR: For those struggling with the same issue, see if ddcclt @ commit eeab3c21d84eeb607031dea32e21cf36ee2f7050
from Aug 16, 2016 is working for you (granted you don't rely on any feature added later).
from ddcctl.
And sure enough, another begging to revert to calling an Apple deprecated method that could disappear at any time. Sorry, not doing it here, that does not fix this defect long-term. Fork is your friend?
from ddcctl.
@kfix I was not begging, I was hardly even requesting. I have zero knowledge of C (or derivatives thereof), so I can't effectively contribute or fork. – I was merely trying to provide feedback to anyone more capable than me, in case someone picked up this project more recently. Likewise, I was recommending anyone, who does experience this bug, may want to try an older version and see if it works for them (given that it worked for me in the past).
Please don't get me wrong. I am more than grateful for the time and effort you have put into this project and for making it accessible on GitHub. – Being able to automate my monitor's brightness & contrast throughout the day has had a huge positive impact on my programming life.
I am certain you deprecated and replaced the previous method for a good reason (as you just mentioned in your post above). It is unfortunate that the newer method is currently showing this unexpected behavior on some monitor setups with identical models. Thus I will for now be sticking with a deprecated but (currently) fully functional ddcctl than no ddcctl at all or a version that has been future-proofed but is sadly semi-functional on my setup. – Should an updated version ever be published that addresses this behavior, I'll be sure to praise that day & whoever addressed it and update in a heartbeat.
I am sorry I cannot do more than to provide the feedback above and offer to test future versions.
Thanks so much for everything.
from ddcctl.
Hey @kfix, I've been looking into this issue yesterday, but couldn't find a solution either. But I thought sending the request to all matching displays might make this shortcoming in Apple's APIs less annoying for people with a similar setup. Here's a PR if you think that'd be ok: #38
Thanks for building ddcctl! :)
from ddcctl.
I also have this issue with identical monitors. @stroborobo 's idea to set both monitors at once works for me and seems like a decent "middle ground". Even though individual control would be great.
from ddcctl.
Its an old thread but I posting here just in case.
Does anybody have a workaround for this issue?
I am using ddcctl from master branch on Mac OS 10.14.6
ddcctl -d 1
D: NSScreen #731409346 (2560x1440 0°) 109.00 DPI
D: NSScreen #731409355 (2560x1440 0°) 109.00 DPI
I: found 2 external displays
I: polling display 1's EDID
I: got edid.name: LEN P27h-10
ddcctl -d 2
D: NSScreen #731409346 (2560x1440 0°) 109.00 DPI
D: NSScreen #731409355 (2560x1440 0°) 109.00 DPI
I: found 2 external displays
I: polling display 2's EDID
I: got edid.name: LEN P27h-10
from ddcctl.
Thank you for the reply @stroborobo
Tested it and it work. I have to re-arrange my input cables but its good for now.
Thank you for the fork.
Thanks @kfix for the original build also :D
from ddcctl.
Hi,
I think I found a fix / workaround for this, which I've implemented in my app.
Instead of comparing serial numbers, which are often wrong, I try to extract the unit number of the display from the display location field in the info dictionary for the framebuffer port (it seems to be the number just after the last @ sign) and then I compare it with CGDisplayUnitNumber for the display ID.
I've tested this with a few users, and it seems to work for them, so I think it should be alright, although I am nowhere near an expert on IOKit, so perhaps there is some scenario where this might fail.
EDIT: Unfortunately, I spoke too soon, this does not work for everybody, see this issue.
from ddcctl.
I have the same problem with two identical HP displays. If anyone has any ideas for a proper fix I am happy to test. I'm not an apply developer (much) but I do C and makefiles just fine. Is this the best suggested answer at this point?
from ddcctl.
@gherlein If your use-case does not require individual control of both of your monitors, and you're instead fine with only ever changing both simultaneously, I can recommend stroborobo's fork. I've been using it for a while now without any issues.
If you do need to control both identical monitors independently, please ignore this post.
from ddcctl.
Pinging this. Any ideas when one needs independent control?
from ddcctl.
Its not up to me. Blame Apple!
Their APIs do not provide stable indexes of displays-by-port.
Locking the thread.
from ddcctl.
I still don't own two identical monitors to test so I'm taking the feedback at full value.
There is another means of inferring distinct ports for duplicate monitors from the unit number embedded in their CGDisplayLocation.
If Apple really does kill the IOFramebufferPortFromCGDisplayID(CGDirectDisplayID
someday, might need to adopt this method to keep dupes addressable:
from ddcctl.
I don't know if this any help or not, but with m1 macbook I found an alternative implementation : https://github.com/waydabber/m1ddc . I don't want to be disrespectful to all the work put into this repo oc.
It works for the most part - you can manage the two identical monitors consistently.
from ddcctl.
Related Issues (20)
- Licence HOT 3
- External HDMI monitors detected intermittently on MacBook Pro HOT 4
- No command works Dell D6000 DisplayLink HOT 5
- Dell U2412M Unable to Switch Back From Source 3 to 15 HOT 2
- Would like people to test my fork which has support for PBP mode + custom VCP codes HOT 5
- Silly question - is there anything in 10.14 that would prevent IOI2CSendRequests from going through? HOT 2
- [REQUEST] DDM KVM controls HOT 1
- can't increase/decrease brightness HOT 2
- Unable to control 30" Apple Cinema Display HOT 2
- Support ASUS VG289Q1A monitor HOT 1
- Macbook Air M1 - INPUT CHANGE ERROR HOT 5
- [Feature Request] KVM usb switch HOT 1
- Is it possible to make it work with a Thunderbolt dock? HOT 3
- Xcode 13, Error Compile MacOS 12 HOT 1
- ASUS VG27A is not supported for input switch HOT 1
- macOS Monterey: Failed to parse WindowServer's preferences! (/Library/Preferences/com.apple.windowserver.plist) HOT 9
- One of the monitors is not detected when mirroring
- Notes For Samsung LU28R55
- failed to set brightness of display 0x1 (error -536870201) HOT 1
- not getting the brightness values HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from ddcctl.