Selecting NVidia screens on commandline
NVidia has a nice program to manage display devices like monitors, TVs etc. I’ve used this often to play movies on my PC and watch them on our big wide screen LCD TV. What I wanted to do, is automate switching between monitor and TV. The final goal is that I can push a button on a remote to switch the output. Hey, I’m a software engineer, I automate things.
The easiest way to do that would be two write a shell script that can perform
the switch for me. NVidia has be so kind as to provide us with software that can
do that. It’s
nv-control-dpy, packaged in the
Here is a step-by-step guide of how I managed to get things running.
Hook up your TV if you haven’t done so.
Let X detect the TV:
nv-control-dpy --probe-dpys nv-control-dpy --build-modepool
Tell X to include the TV in the current set of displays. You do this by getting a list of numbers from
Using NV-CONTROL extension 1.14 on :0 Connected Display Devices: CRT-0 (0x00000001): Acer AL1906 CRT-1 (0x00000002): SAMSUNG associated display device mask: 0x00000001
Add the two (
0x...) numbers together and include them in the next call:
nv-control-dpy --set-associated-dpys 0x00000003
Add a metamode so that X knows which device to enable/disable. The above command gave you the names and numbers of the display devices - they could be TV-0, CRT-1, DPY-4, etc. To enable the device, set it to “nvidia-auto-select”. To disable a device, set it to “NULL”. Here is the command that I gave to disable my Acer monitor and enable my Samsung TV:
nv-control-dpy --add-metamode \ 'CRT-0: NULL, CRT-1: nvidia-auto-select'
The last step is to tell X to actually perform the switch. You use the
xrandrcommand for this. First, get a list of possible resolutions using
Screen 0: minimum 320 x 240, current 1280 x 1024 default connected 1280x1024+0+0 0mm x 0mm 1280x1024 50.0* 51.0 1280x960 52.0 1280x800 53.0 1280x768 54.0 1152x864 55.0 56.0 1152x768 57.0 1024x768 58.0 59.0 60.0 832x624 61.0 800x600 62.0 63.0 64.0 65.0 800x512 66.0 720x450 67.0 700x525 68.0 69.0 640x480 70.0 71.0 72.0 576x384 73.0 512x384 74.0 75.0 400x300 76.0 320x240 77.0 78.0 1360x768 79.0
The last resolution in that list is the metamode we just added. To switch to it, use
xrandr -s resolution@refreshrate:
xrandr -s 1360x768@79
To switch back, use the same
xrandr -s resolution@refreshrate trick, in my
xrandr -s 1280x1024@50
Once you’ve figured out the names of the devices, the bit masks and the meta mode lines, you can of course place the commands in shell scripts and really get to automate stuff. I’ll leave that as an exercise for the reader.