如何在 X11 中创建可热插拔的虚拟监视器?

如何在 X11 中创建可热插拔的虚拟监视器?

我想在 X11 中制作一个可热插拔的虚拟监视器。基本上我想要的是,只有当没有屏幕连接到设备时,虚拟监视器才应该存在。如果至少连接了一个屏幕,则显示器不应该存在。即使系统已经启动,也应该发生这种情况,例如:

启动时没有连接显示器,2 小时后连接一个显示器,再过 3 小时后显示器断开连接:前 2 个小时应该有一个假显示器。连接显示器后,假显示器应该消失。再过 3 个小时后,由于现在没有显示器连接到系统,假显示器应该再次出现。

我正在运行 Fedora,但最好想要一个可以在大多数发行版上运行的解决方案。

我发现的所有解决方案要么始终插入虚拟显示器,要么仅当系统在启动时未检测到显示器时才连接,之后则不会连接。

我添加了我在搜索中找到的内容:

  1. https://askubuntu.com/questions/453109/add-fake-display-when-no-monitor-is-plugged-in
  2. https://techoverflow.net/2019/02/23/how-to-run-x-server-using-xserver-xorg-video-dummy-driver-on-ubuntu/
  3. https://bbs.archlinux.org/viewtopic.php?id=246284

答案1

我是这样做的:

创建一个xorg.conf文件,我将其放在/root/

Section "Device"
    Identifier "Configured Video Device"
    Driver "dummy"
    VideoRam 256000
EndSection

Section "Monitor"
    Identifier "Configured Monitor"
    HorizSync 28.0-80.0
    VertRefresh 48.0-75.0
    Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
EndSection

Section "Screen"
    Identifier "Default Screen"
    Monitor "Configured Monitor"
    Device "Configured Video Device"
    DefaultDepth 24
    SubSection "Display"
        Depth 24
        Modes "1920x1080_60.00"
    EndSubSection
EndSection

该脚本每 5 秒检查一次显示器是否已连接(或断开连接),并在状态改变时将配置文件复制(或删除)到 xorg 的 conf.d 文件夹/从 xorg 的 conf.d 文件夹复制:

#!/bin/bash

# Change according to your needs
XORG_CONF_SOURCE="/root/xorg.conf"
XORG_CONF_DEST="/etc/X11/xorg.conf.d/xorg.conf"

CONN_STATUS=""

# Function to check and switch displays
switch_display() {
    if check_monitor_connected; then
        if [ "$CONN_STATUS" != "yes" ]; then
            # Disable the dummy display
            echo Monitor connected
            rm $XORG_CONF_DEST
            service display-manager restart
            CONN_STATUS="yes"
        fi
    else
        if [ "$CONN_STATUS" != "no" ]; then
            # Enable the dummy display
            echo Monitor disconnected
            cp $XORG_CONF_SOURCE $XORG_CONF_DEST
            service display-manager restart
            CONN_STATUS="no"
        fi
    fi
}

# Function to check if a monitor is connected
check_monitor_connected() {
    for card in /sys/class/drm/card*; do
        if [ -e "$card/status" ]; then
            status=$(cat "$card/status")
            if [ "$status" = "connected" ]; then
                return 0  # Monitor connected
            fi
        fi
    done
    return 1  # No monitor connected
}

# Continuous loop to monitor for changes
while true; do
    switch_display
    # Check every 5 seconds for changes
    sleep 5
done

相关内容