Cabinet
Playfield, backglass and DMD on three physical displays, in a cab. The boxes you drag map onto the real machine.
You tell vPinOps where your playfield, backglass and DMD live. It writes the settings Visual Pinball reads — per table, immediately before it launches — so every table in your library comes up the same way.
All three work today. Pick the one that matches your room, not the one that sounds like the default.
Cabinet
Playfield, backglass and DMD on three physical displays, in a cab. The boxes you drag map onto the real machine.
Multi-screen desktop
Two or three monitors on a desk. Same idea as a cab, without the woodwork — the backglass takes a second monitor and the DMD a strip of it, or its own.
Single screen
One monitor. The playfield fills it, and the backglass and DMD are either off or composited. A first-class setup, not a fallback.
There are two ways, and most cabinets only ever need the first.
Open Screens in OpsLink. Each surface — playfield, backglass, DMD, topper — has its own card, and each card asks which monitor it lives on. Choose one and that surface fills that screen.
That is the whole job for the common case: one surface per monitor, each filling it. You can do it from your phone, standing at the cabinet or sitting somewhere else, which matters because a cab has no keyboard and its own screen may be sideways or showing a broken layout when you most need to fix it.
Some layouts need an exact rectangle rather than a whole screen: a DMD strip along the top of the backglass monitor, or a scaled-down cabinet on one desktop display. For those, open the screen designer on the machine itself and drag real windows to where you want them.
It has to be done there, and that is not a limitation we chose — you cannot drag a box onto a display you are not looking at. Everything else about screens can be done remotely.
A global layout covers the whole library, and most tables need nothing more. But some tables want a different arrangement, and Visual Pinball supports per-table settings — so vPinOps writes the keys for the table you are launching, at the moment you launch it, rather than making you keep one global compromise.
A few things live in Visual Pinball’s VPinballX.ini rather than in vPinOps, and the split matters:
hand-set one of ours and you will watch it change back.
Visual Pinball ships its plugins switched off, and a plugin that is off does nothing, silently. So the first time vPinOps launches a table it switches on the three a table cannot do without, where nothing has chosen them yet:
| plugin | what it does |
|---|---|
PinMAME | loads the ROM, so a machine table runs at all |
B2SLegacy | draws the backglass |
ScoreView | draws the score display |
A plugin you have turned off yourself, in Visual Pinball’s own F12 menu or in the ini, is left off. vPinOps fills a blank; it never argues with a choice.
Everything else is yours to turn on if you use it: FlexDMD or AlphaDMD for the tables that
need them, DOF, AltSound, Serum, PUP. In Visual Pinball’s F12 menu while a table is running,
or Enable = 1 under the plugin’s [Plugin.*] section of VPinballX.ini.
RefreshRate blankPut your display’s real rate in [Player] RefreshRate — 60, or whatever your screen runs at.
Blank is not “use the default”. Visual Pinball asks the driver for rate 0, fails to find a display
mode, fails to build its sync device, and raises an error dialog you cannot see, because the
full-screen shields are drawn over it. What you get is a black screen or an app that looks frozen,
and nothing anywhere says why.
Leave these alone in the ini. vPinOps writes them immediately before a table launches, so an edit you make by hand is overwritten with nothing said.
PlayfieldFullScreen, BackglassFullScreen, ScoreViewFullScreen and TopperFullScreen —
always 0, so the box you drew is the one Visual Pinball honoursBGSet, the cabinet-versus-desktop view mode — that follows the mode you pick in SettingsEnable, for the PinMAME, B2SLegacy and ScoreView plugins — set to 1 only where the key is
blank. A 0 or a 1 already there is never touched[Plugin.B2SLegacy], and
whether the grill is hidden — these are written only when you have set them; leave them alone
in vPinOps and whatever you chose in Visual Pinball’s own F12 stays putThe run log says whether vPinOps configured that launch at all:
layout -> Guns N' Roses: Written (1 global, 0 per-table, dmd=Unknown)Written means it configured this launch; UpToDate means what it wanted was already correct.
⚠ Neither the positions nor your DMD choice are logged — dmd= is which kind of DMD window this
table has been seen to open before, not a setting. So this tells you whether we wrote at all, and not
where anything was sent. Read last-run.log first; the path is on your platform’s install page.
More, including what to check in what order: the backglass or DMD is in the wrong place.
Displays are matched on the name SDL gives them, which is the same name Visual Pinball uses, so the two always agree about which screen is which. It is not always the connector name your desktop settings show you, so if a surface opens on the wrong monitor, start with the names in Settings → Screens rather than with the front end.
On Wayland an application cannot place its own windows; the desktop decides. So Visual Pinball’s backglass and score view are put on their monitors by going fullscreen there, which is the one placement Wayland offers. A surface sharing a screen with the playfield is left where it is rather than covering the table.
On Hyprland, a tiling desktop, vPinOps’s own windows are placed the same way: it asks Hyprland to put the wheel, the backglass and the DMD fullscreen on their monitors, and sets window rules for the session so they reopen there. Nothing is written to your Hyprland config. Each surface fills its monitor; a smaller box inside a screen is not kept there yet.