One-Button Desk
Three monitors, two computers, one key. A Stream Deck key moves all three displays, the keyboard and the mouse between my desktop and a laptop over DDC/CI, and checks that each monitor actually switched. The first plan was tested, failed, and was dropped before any hardware was bought for it.
- S1
Stream Deck
on the desktop, not the KVM
- U1
Switch script
by EDID ID, center last
- J1–J3
Monitors
DDC input select
- U2
Read-back
retry ×3, 5 s apart
The desk has a 39-inch ultrawide in the middle and two 27-inch 4K monitors in portrait, shared by a desktop and a laptop on a Thunderbolt dock. Switching meant three trips through three on-screen menus. Monitors can change input over DDC/CI, the control channel inside the video cable, so the question was who sends the command, and whether a monitor listens on an input it isn’t showing.
Plan A, tested and dropped
The first plan put a Raspberry Pi on each monitor’s spare HDMI port to send every switch. It only works if a monitor accepts DDC commands on an inactive input, so I tested that first. On the monitors I had then, writes to the inactive input did nothing: no input change, no brightness change. A Mac over HDMI and Windows over DisplayPort gave the same answer, so it wasn’t one host’s quirk. A visible register (blue gain at zero) made the test unambiguous, because the switch commands themselves report success either way. The Pi was dropped before it was bought.
What works
The replacement monitors do answer DDC on an inactive input, so the desktop can send every switch, both ways:
- The Stream Deck plugs into the desktop directly, not into the monitor’s KVM hub, so it works whichever computer is on screen. The laptop needs no software and no admin rights.
- Monitors are addressed by EDID ID, not by Windows display number, which changes whenever a monitor drops off the bus.
- The center monitor switches last, because its built-in KVM carries the keyboard and mouse.
- Every switch is read back. A side monitor whose input has lost signal can fall asleep and miss the command, so the script reads each input back and re-sends to any that missed, up to three times, five seconds apart.
Notes for the next desk
- Input codes are the standard MCCS values (15 DisplayPort, 17 and 18 HDMI, 27 USB-C), but reads come back with a doubled high byte. Only the low byte means anything.
- A screen flash after a DDC write means nothing. On the old monitors every write flashed, including invalid ones.
- A MacBook with its lid closed sleeps and doesn’t wake when the desk switches to it, because the same monitor carries its display and its keyboard. Keep the lid open.