使用 x11 和 AMD 卡忽略监视器热插拔事件

使用 x11 和 AMD 卡忽略监视器热插拔事件

我有三重显示器设置(使用 amdcccle 生成的 xorg.conf:http://pastebin.com/gWSVEyLa) 在 Arch Linux 上运行,使用 Xmonad 作为我的窗口管理器。从物理上讲,左边有一台高清电视,中间有一台漂亮的戴尔显示器,右边有一台旋转显示器。由于我的高清电视只有一个 HDMI 输入,因此我使用了一个 4 输入 2 输出的交换机和其他一些设备。我的高清电视并不总是连接的,这导致我的虚拟桌面的该部分被禁用。这导致了很多烦恼:

  1. 由于驱动程序的热插拔事件(基本上运行 xrandr --auto)导致恼人的屏幕闪烁。
  2. 物理屏幕顺序发生了变化(hdtv 变为第三个显示器,而不是第一个),导致我聚焦屏幕的键绑定错误。我已通过 xmonad 配置将此问题消除,但当仅检测到两个显示器时,绑定仍然会发生变化。
  3. 如果我在未连接高清电视的情况下启动计算机,则虚拟桌面的该部分将不可用,直到它在热插拔事件上连接或我运行 xrandr 来启用它。
  4. 断开连接的显示器上的工作区窗口被移动到可见显示器上的其他工作区。这基本上意味着我高清电视上显示的任何窗口都会被随机抛出,这是毫无意义的,因为 Xmonad 处理工作区的方式。
  5. 我无法将一两台显示器置于 dpms 待机状态或手动关闭显示器,xrandr --off因为其他显示器会崩溃。例如,如果我只是用电视看东西,我不一定希望其他两台显示器打开,但我希望它们的窗口位置保持不变。

当我在 HDMI 开关上切换输入或将其打开/关闭,或物理断开电缆时,我的视频驱动程序会将其解释为断开显示器连接,并将其从我的虚拟桌面中移除。我希望 X 始终表现得好像这三个显示器都已连接,并且不响应任何显示器热插拔事件。Linux 能够使用完全自动化的 xorg 配置,这很棒,但我希望一直使用这种精确的设置,直到我更换硬件。热插拔事件在我的 xorg 日志中如下所示:

When disconnected:
  [  1684.459] (II) fglrx(0): Hot-plug event occurs on device: 1:0:0
  [  1684.459] (II) fglrx(0): EDID vendor "DEL", prod id 40993
  +--  3 lines: [  1684.459] (II) fglrx(0): Using hsync ranges from config file-----------------------------------------------------------------------------------------------------
  +-- 11 lines: [  1684.459] (II) fglrx(0): Modeline "1600x1200"x0.0  162.00  1600 1664 1856 2160  1200 1201 1204 1250 +hsync +vsync (75.0 kHz eP)----------------------------------
  [  1684.468] (II) fglrx(0): xdl_xs113_atiddxDisplayScreenEnableDisplays
  [  1684.468] (II) fglrx(0): User Preference Output DFP1 using refresh rate 60.0 Hz.
  [  1684.537] (II) fglrx(0): User Preference Output DFP10 using refresh rate 60.0 Hz.

When reconnected:
  [  1694.077] (II) fglrx(0): Hot-plug event occurs on device: 1:0:0
  [  1694.210] (II) fglrx(0): EDID vendor "DEL", prod id 40993
  +--  3 lines: [  1694.210] (II) fglrx(0): Using hsync ranges from config file-----------------------------------------------------------------------------------------------------
  +--  9 lines: [  1694.210] (II) fglrx(0): Modeline "1600x1200"x0.0  162.00  1600 1664 1856 2160  1200 1201 1204 1250 +hsync +vsync (75.0 kHz eP)----------------------------------
  [  1694.219] (II) fglrx(0): xdl_xs113_atiddxDisplayScreenEnableDisplays
  [  1694.219] (II) fglrx(0): User Preference Output DFP1 using refresh rate 60.0 Hz.
  [  1694.288] (II) fglrx(0): User Preference Output DFP9 using refresh rate 60.0 Hz.
  [  1694.359] (II) fglrx(0): User Preference Output DFP10 using refresh rate 60.0 Hz.

我真的不关心热插拔,因为我使用的是 Xmonad,并且宁愿始终输出到这三个设备,无论它们是否被视为已连接。可能有一些方法可以配置视频驱动程序来执行我想要的操作,但我不确定是否存在该选项,并且尚未找到任何有用的信息,所以我在这里询问。如果这正常工作,这两个命令的输出将是相同的,并且除了 HDTV 关闭/打开之外,不会在视觉上发生任何事情:

$ xrandr | grep 'DFP.* connected'
DFP1 connected 2560x1600+1920+0 (normal left inverted right x axis y axis) 641mm x 401mm
DFP9 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 708mm x 398mm
DFP10 connected 1200x1600+4480+0 left (normal left inverted right x axis y axis) 367mm x 275mm
$ xrandr --verbose --output 'DFP9' --off
screen 0: 3760x1600 994x423 mm  96.08dpi
crtc 0:    2560x1600   60.0 +0+0 "DFP1"
crtc 2:    1600x1200   60.0 +2560+0 "DFP10"
$ xrandr | grep 'DFP.* connected'
DFP1 connected 2560x1600+0+0 (normal left inverted right x axis y axis) 641mm x 401mm
DFP9 connected (normal left inverted right x axis y axis)
DFP10 connected 1200x1600+2560+0 left (normal left inverted right x axis y axis) 367mm x 275mm
$ xrandr --verbose --output 'DFP9' --preferred --pos 0x0 --output 'DFP1' --preferred --pos 1920x0 --output DFP10 --preferred --pos 4480x0
screen 0: 5680x1600 1501x423 mm  96.08dpi
crtc 0:    2560x1600   60.0 +1920+0 "DFP1"
crtc 1:    1920x1080   60.0 +0+0 "DFP9"
crtc 2:    1600x1200   60.0 +4480+0 "DFP10"
$ xrandr | grep 'DFP.* connected'
DFP1 connected 2560x1600+1920+0 (normal left inverted right x axis y axis) 641mm x 401mm
DFP9 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 708mm x 398mm
DFP10 connected 1200x1600+4480+0 left (normal left inverted right x axis y axis) 367mm x 275mm

答案1

我已经尝试解决这个问题好几个星期了。我最好的办法是设置一个 xrandr 脚本,将显示器及其位置设置为我想要的,并将该脚本绑定到键盘快捷键。这样,每当我关闭一台显示器或从睡眠状态唤醒时,我按下快捷键,所有显示器都会设置为我想要的。

我的脚本:

首先,我通过运行命令 xrandr 获取显示器的名称。对我来说,它们是 DP3.1、DP3.2 和 DP-4。

然后我使用它们的分辨率和相对位置设置我的命令:

xrandr --output DP-3.1 --auto --output DP-3.2 --auto --right-of DP-3.1 --output DP-4 --auto --right-of DP-3.2

如果 xrandr 只是“记住”这些设置并且从不改变,那就更好了。当我的显示器从睡眠状态唤醒时,它会检测到它们已拔出并弄乱一切,需要这个脚本,它需要几秒钟才能运行。

相关内容