How to Set Up Multi-Monitor Displays on Fedora

Configure multi-monitor displays on Fedora using Settings or xrandr to extend your desktop across multiple screens.

You plug in a second monitor and Fedora only shows a black screen. Or the extended desktop lands in the wrong direction, forcing you to drag your cursor off the edge of the primary screen to reach the new one. You need the displays aligned, the resolution locked, and the setup surviving a reboot.

What is actually happening

Fedora ships with Wayland as the default display server. Wayland changes how multi-monitor setups work compared to the older X11 architecture. In X11, a single X server owns all the screens and the xrandr command talks directly to that server to rearrange them. Wayland uses a compositor model. Each application draws to its own surface, and the compositor decides where those surfaces appear. The compositor handles monitor detection, scaling, and positioning automatically. When you open the Settings application and drag the monitor tiles, you are talking to the compositor, not a global display server.

This architectural shift is why xrandr often prints Can't open display or does nothing at all on a modern Fedora desktop. The display manager hands off control to the session compositor, and the compositor ignores legacy X11 RandR requests unless you explicitly run an X11 session. The compositor reads the EDID data from each monitor, negotiates the highest common refresh rate, and builds a virtual coordinate space that spans all active outputs. If the EDID handshake fails, the compositor falls back to a safe mode or leaves the port disabled. The system is not broken. It is waiting for valid timing data.

Check which session you are running before choosing a tool. Open a terminal and run echo $XDG_SESSION_TYPE. The output will be wayland or x11. This single variable dictates which commands will actually reach the display stack. Trust the environment variable. Guessing the session type leads to silent failures.

The fix: GUI and terminal methods

Start with the graphical interface. Open Settings, navigate to Displays, and arrange the monitor tiles to match your physical desk. Click Apply. The compositor writes the layout to a configuration file in your home directory. GNOME stores it in ~/.config/monitors.xml. KDE Plasma saves it in ~/.config/kwinrc. These files load automatically on login. The GUI method is the fastest path to a working setup.

If you need a terminal method for scripting, headless recovery, or automation, the approach depends on your session type. For X11 sessions, xrandr remains the standard. For Wayland, you use desktop-specific tools or fallback to X11 for the configuration step.

Here is how to query your connected outputs and arrange them on an X11 session.

xrandr --query
# Lists all connected ports, supported resolutions, and current active states
# Look for lines ending in "connected" to identify your physical cables
# eDP-1 is typically the laptop panel. HDMI-1 or DP-1 are external ports.

xrandr --output HDMI-1 --auto --right-of eDP-1 --rate 60
# --auto selects the highest resolution the monitor advertises via EDID
# --right-of places the external screen to the right of the laptop display
# --rate locks the refresh rate to prevent the compositor from picking a fallback

Convention aside: xrandr changes are volatile. They disappear when you log out or reboot. If you need the layout to persist across X11 sessions, place the command in ~/.xprofile. The display manager sources that file before starting your window manager. Never put display commands in ~/.bashrc. That file runs for every terminal emulator, and running xrandr repeatedly inside a loop of spawned shells will corrupt your display state.

On Wayland, GNOME users can run gnome-randr with the same flags as xrandr. KDE users can rely on kwin commands, but the desktop settings are strongly preferred. If you are running a tiling Wayland compositor like Sway, you edit the configuration file with output directives.

Here is how a tiling compositor handles persistent multi-monitor layouts.

# ~/.config/sway/config
# Sway reads this file on startup and applies the layout before launching apps
output HDMI-1 {
    resolution 1920x1080
    pos 1920 0
    transform normal
}
# pos sets the top-left coordinate relative to the primary output
# transform handles rotation if you mount a monitor vertically

If the EDID data is missing or corrupted, you must generate a custom modeline. The cvt utility calculates the timing parameters for a given resolution and refresh rate. You feed those parameters into xrandr to create a new mode, then apply it to the output.

Here is how to force a custom resolution when the monitor refuses to advertise its native mode.

cvt 1920 1080 60
# Calculates the CVT timing string for 1920x1080 at 60Hz
# Copy the Modeline output exactly as printed. Do not modify the numbers.

xrandr --newmode "1920x1080_60.00" 148.50 1920 2008 2052 2200 1080 1084 1089 1125 -hsync +vsync
# Registers the custom timing parameters with the X server
# The name in quotes becomes the identifier you reference in the next step

xrandr --addmode HDMI-1 "1920x1080_60.00"
# Attaches the newly created mode to the specific physical port
# The mode now appears in the --query list and can be activated with --mode

Run the configuration from your user session. Display sockets belong to your user account. Running display commands as root breaks the session ownership model and causes authentication failures.

Verify it worked

Run xrandr --query again on X11, or open the Displays settings panel on Wayland. The connected ports should show the exact resolution and refresh rate you requested. Move your cursor across the bezel. If the cursor crosses smoothly without snapping back, the coordinate space is aligned. Open a terminal on the secondary screen and run echo $DISPLAY or echo $WAYLAND_DISPLAY. The environment variable confirms which server your terminal is attached to. Check journalctl -xe for any modeset warnings or DRM errors. A clean log means the kernel accepted the timing parameters. Reboot to confirm persistence. Half the time the symptom disappears after a fresh compositor startup.

Common pitfalls and what the error looks like

The most frequent issue is a missing EDID handshake. Cheap adapters or long HDMI cables sometimes drop the monitor identification signal. The system defaults to a safe 1024x768 resolution or refuses to enable the port entirely. You will see HDMI-1 disconnected in xrandr --query even though the cable is plugged in. Check the physical connection first. Swap the adapter. If the port shows as connected but only lists low resolutions, force the mode manually using the cvt method above.

Another common trap is refresh rate mismatch. If your laptop runs at 120Hz and your external monitor only supports 60Hz, the compositor may lock both to 60Hz to keep the cursor synchronized. You will notice stuttering on the primary screen. Wayland compositors handle per-monitor refresh rates better than older X11 setups, but some GPU drivers still struggle. Check journalctl -xe for modeset warnings or DRM errors. If the kernel refuses to negotiate the timing, you may need to add a custom modeline or switch to a different cable standard like DisplayPort.

SELinux rarely blocks display configuration, but if you are running a custom display manager or a headless script that modifies X11 properties, you might see avc: denied { write } for pid=... comm="xrandr". Run ausearch -m avc -ts recent to read the denial. The fix is usually a policy module or running the command inside the user session rather than as root. Display configuration should never require sudo. The X11 socket or Wayland socket belongs to your user account. Running display commands as root breaks the session ownership model and causes authentication failures.

NVIDIA proprietary drivers add another layer of complexity. The driver sometimes reports the wrong connector name or fails to expose the RandR extension properly. You will see Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 16384 x 16384 followed by a single DVI-I-1 connected line even when multiple monitors are plugged in. The fix is to enable PRIME offloading or switch to the open-source nouveau driver for basic multi-monitor testing. If you must stay on proprietary drivers, ensure nvidia-settings is not overriding the compositor layout. The two tools fight for control of the RandR state. Pick one and stick to it.

Read the actual error before guessing. Fabricating a modeline with wrong timing values will blank the screen instantly. Keep a keyboard and mouse handy. Switch to a TTY with Ctrl+Alt+F3 to edit your configuration if the GUI locks up.

When to use which tool

Use the Settings application when you want a visual layout that persists automatically across reboots. Use xrandr when you are on an X11 session and need to script monitor arrangements for automation or recovery. Use gnome-randr or compositor-specific commands when you are on Wayland and need terminal control without switching sessions. Use a custom ~/.xprofile or ~/.config/sway/config when you need the layout to apply before your desktop environment loads. Stay on the default compositor settings if you only need basic extended desktop functionality.

Where to go next