Xrandr

出自 Arch Linux 中文维基

本文或本節需要翻譯。要貢獻翻譯,請訪問簡體中文翻譯團隊

附註: 原文已有大量更新,請持續更新譯文(在 Talk:Xrandr# 中討論)

"xrandr" 是一款官方的 RandR (Resize and Rotate)維基百科:X 窗口系統 擴展配置工具。它可以設置屏幕顯示的大小、方向、鏡像等。對多顯示器的情況,請參考 Multihead 頁面。

安裝[編輯 | 編輯原始碼]

安裝 軟件包 xorg-xrandr

圖形化操作程序[編輯 | 編輯原始碼]

  • ARandR — 提供了一個簡單的圖形化程序給 XrandR。顯示器的位置會圖形化地展示出來並可以使用拖拽的方式調整。
https://christian.amsuess.com/tools/arandr/ || arandr
  • LXRandR — 是 LXDE 中的屏幕分辨率和外置顯示器管理的工具.
https://wiki.lxde.org/en/LXRandR[失效鏈接 2022-09-23 ⓘ] || GTK 2: lxrandr, GTK 3: lxrandr-gtk3

命令行前端[編輯 | 編輯原始碼]

  • xlayoutdisplay — 檢測和排列顯示器。可處理:筆記本電腦開合狀態,最高有效刷新率,計算並設定當前的 DPI。最適合用在.xinitrc 中,以便於在接入或斷開外置顯示器或閉合筆記本蓋子時引用這些參數
https://github.com/alex-courtis/xlayoutdisplay || xlayoutdisplayAUR

測試配置[編輯 | 編輯原始碼]

當沒有添加任何選項直接運行時,xrandr 列出該系統可用的顯示輸出設備 (VGA-1, HDMI-1 等等) 和每一台設備可設置的分辨率,當前分辨率後面帶有一個*號和一個+號:

xrandr
Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 8192 x 8192
VGA-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 531mm x 299mm
   1920x1080     59.93 +  60.00*   50.00    59.94  
   1920x1080i    60.00    50.00    59.94  
   1680x1050     59.88  
…
注意: 如果你的分辨率沒有出現在上方, 請看 #添加未被檢測到的有效分辨率

你可以使用 xrandr 設置不同的分辨率(必須是出現在上面輸出列表中的分辨率):

$ xrandr --output HDMI-1 --mode 1920x1080

當列表中出現多個刷新率,可以通過 --rate 選項改變,一次性設置或者分開設置,例如:

$ xrandr --output HDMI-1 --mode 1920x1080 --rate 60

如果輸出設備已經連接但被禁用,--auto 選項會以系統偏好的分辨率(最大分辨率)開啟特定的輸出設備:

$ xrandr --output HDMI-1 --auto

還可以用一條命令設置多個輸出設備,例如,使用系統偏好的選項關閉 HDMI-1 並打開 HDMI-2

$ xrandr --output HDMI-1 --off --output HDMI-2 --auto
注意:
  • 通過 xrandr 作出的改變只在本次會話中有效
  • xrandr 有很多功能 - 詳情請參考 xrandr(1)

添加未被檢測到的有效分辨率[編輯 | 編輯原始碼]

由於出錯的硬件或驅動,xrandr 可能並不能檢測出您的顯示器所有的有效分辨率。不過,我們可以在xrandr裡添加所需要的分辨率。 Also, this same procedure can be used to add refresh rates you know are supported, but not enabled by your driver。

首先,運行gtf或者cvt,查詢某分辨率的有效掃描頻率。

 $ cvt 1280 1024
 
 # 1280x1024 59.89 Hz (CVT 1.31M4) hsync: 63.67 kHz; pclk: 109.00 MHz
 Modeline "1280x1024_60.00"  109.00  1280 1368 1496 1712  1024 1027 1034 1063 -hsync +vsync

然後通過--newmode參數新建一種xrandr模式,輸入上面所得到的查詢結果,其中Modeline關鍵詞自然需要被省略。

   xrandr --newmode "1280x1024_60.00"  109.00  1280 1368 1496 1712  1024 1027 1034 1063 -hsync +vsync

新建模式後,我們需要把這模式添加到當前的輸出設備(假定為VGA1)上。由於一些參數已經事先設置,只需輸入模式名稱即可,即1280x1024_60.00。

   xrandr --addmode VGA1 1280x1024_60.00

最後,再把VGA1的分辨率指定為剛剛添加的新模式。

   xrandr --output VGA1 --mode 1280x1024_60.00

注意,以上設置同樣地只能在當前會話暫時生效。

如果您對所要添加的某分辨率感到不放心,您可以追加新命令「sleep 5」以及一條切換到已有有效分辨率的命令,以保證不會被困在實際無效的分辨率,示例:

   xrandr --output VGA1 --mode 1280x1024_60.00 && sleep 5 && xrandr --newmode "1024x768-safe" 65.00 1024 1048 1184 1344 768 771 777 806 -HSync -VSync && xrandr --addmode VGA1 1024x768-safe && xrandr --output VGA1 --mode 1024x768-safe

其他輸出設備如法炮製:VGA1或DVI-I……

使xrandr所更改的分辨率設置永久生效[編輯 | 編輯原始碼]

使xrandr定製永久生效的方案有:

  • xorg.conf(推薦)
  • .xprofile
  • kdm/gdm

在xorg.conf設置分辨率(推薦)[編輯 | 編輯原始碼]

示例:

/etc/X11/xorg.conf
Section "Monitor"
    Identifier      "External DVI"
    Modeline        "1280x1024_60.00"  108.88  1280 1360 1496 1712  1024 1025 1028 1060  -HSync +Vsync
    Option          "PreferredMode" "1280x1024_60.00"
EndSection
Section "Device"
    Identifier      "ATI Technologies, Inc. M22 [Radeon Mobility M300]"
    Driver          "ati"
    Option          "Monitor-DVI-0" "External DVI"
EndSection
Section "Screen"
    Identifier      "Primary Screen"
    Device          "ATI Technologies, Inc. M22 [Radeon Mobility M300]"
    DefaultDepth    24
    SubSection "Display"
        Depth           24
        Modes   "1280x1024" "1024x768" "640x480"
    EndSubSection
EndSection

Section "ServerLayout"
        Identifier      "Default Layout"
        Screen          "Primary Screen"
EndSection

關於更多的配置細節,請閱讀Xorgxorg.conf(5)

在xprofile設定xrandr命令[編輯 | 編輯原始碼]

請閱讀xprofile.

這方案具有缺點:如果您使用Display manager的話,那麼在啟動進程之後很大程度上就會執行失敗,最終無法順利修改分辨率。

在KDM/GDM的啟動腳本設定xrandr命令[編輯 | 編輯原始碼]

KDM和GDM都具備在X初始化時,會被自動執行的啟動腳本。GDM的啟動腳本放在/etc/gdm/, KDM的則是/usr/share/config/kdm/Xsetup,SDDM 的則是在 /usr/share/sddm/scripts/Xsetup。您可以把相關的xrandr命令添加到這些啟動腳本裡。

這些腳本需要root權限及其他系統配置的配合,不過在啟動進程裡會比xprofile更早生效。

腳本[編輯 | 編輯原始碼]

控制第二顯示器的開關狀態,默認顯示器保持開啟:

~/bin/xdisplay
#!/bin/bash
#
# This script toggles the extended monitor outputs if something is connected
#

# all available outputs
OUTPUTS=$(xrandr |awk '$2 ~ /connected/ {print $1}')

# your notebook LVDS monitor
DEFAULT_OUTPUT=$(sed -ne 's/.*(LVDS[^ ]*).*/1/p' <<<$OUTPUTS)

# get info from xrandr
XRANDR=`xrandr`

EXECUTE=""

for CURRENT in $OUTPUTS
do
        if [[ $XRANDR == *$CURRENT\ connected*  ]] # is connected
        then
                if [[ $XRANDR == *$CURRENT\ connected\ \(* ]] # is disabled
                then
                        EXECUTE+="--output $CURRENT --auto --above $DEFAULT_OUTPUT "
                else
                        EXECUTE+="--output $CURRENT --off "
                fi
        else # make sure disconnected outputs are off 
                EXECUTE+="--output $CURRENT --off "
        fi
done

xrandr --output $DEFAULT_OUTPUT --auto $EXECUTE

在顯示器之間切換,且只開啟其中一個。

/usr/local/bin/toggle-display
#!/bin/bash
#
# toggle-display.sh
#
# Iterates through connected monitors in xrander and switched to the next one
# each time it is run.
#

# get info from xrandr
xStatus=`xrandr`
connectedOutputs=$(echo "$xStatus" | grep " connected" | sed -e "s/\([A-Z0-9]\+\) connected.*/\1/")
activeOutput=$(echo "$xStatus" | grep -e " connected [^(]" | sed -e "s/\([A-Z0-9]\+\) connected.*/\1/") 
connected=$(echo $connectedOutputs | wc -w)

# initialize variables
execute="xrandr "
default="xrandr "
i=1
switch=0

for display in $connectedOutputs
do

	# build default configuration
	if [ $i -eq 1 ]
	then
		default=$default"--output $display --auto "
	else
		default=$default"--output $display --off "
	fi

	# build "switching" configuration
	if [ $switch -eq 1 ]
	then
		execute=$execute"--output $display --auto "
		switch=0
	else
		execute=$execute"--output $display --off "
	fi

	# check whether the next output should be switched on
	if [ $display = $activeOutput ]
	then
		switch=1
	fi

	i=$(( $i + 1 ))

done

# check if the default setup needs to be executed then run it
echo "Resulting Configuration:"
if [ -z "$(echo $execute | grep "auto")" ]
then
	echo "Command: $default"
	`$default`
else
	echo "Command: $execute"
	`$execute`
fi
echo -e "\n$(xrandr)"

您也可以使用xrr-events (from AUR),一種負責監聽XrandR事件的daemon服務。當某台顯示器接通狀態發生變動時,就會執行相關腳本。可在man頁面進一步查詢具體信息。

在VNC上使用xrandr[編輯 | 編輯原始碼]

如果您在使用某台支持xrandr的VNC服務器,您可以通過"xrandr -s <width>x<height>"命令實時修改VNC的分辨率。tigervnc就是一種支持xrandr的VNC客戶端。

示例:

xrandr -s 1920x1200

登錄VNC之後,如果您在控制台上輸入"xrandr",您將得到列出當前已配置模式的清單。每個模式均可通過xrandr -s選項激活。不過,若您所需要的模式並不在清單中,您可以按照以下來添加它。

示例:不妨想添加的是1024x600(上網本的一種常見分辨率)

首先執行CVT,得到理想分辨率所對應的正確刷新頻率。

$ cvt 1024 600

您會得到如下類似的輸出:

# 1024x600 59.85 Hz (CVT) hsync: 37.35 kHz; pclk: 49.00 MHz
Modeline "1024x600_60.00"   49.00  1024 1072 1168 1312  600 603 613 624 -hsync +vsync

在以下命令使用那些關於刷新頻率的輸出部分。

xrandr --newmode "1024x600"   49.00  1024 1072 1168 1312  600 603 613 624 -hsync +vsync
xrandr --addmode default "1024x600"

通過以上流程,輸入xrandr -s 1024x600,就可以設置當前分辨率為1024x600,但是這設置只在當前的X會話暫時生效。為確保其模式永久可用,在~/.vnc/xstartup添加以下:

xrandr --newmode "1024x600"   49.00  1024 1072 1168 1312  600 603 613 624 -hsync +vsync
xrandr --addmode default "1024x600"r

疑難排除[編輯 | 編輯原始碼]

添加未檢測到的分辨率[編輯 | 編輯原始碼]

由於硬件以及驅動程序可能的缺陷,例如,請求的EDID數據塊不正確,導致 xrandr 可能不能準確偵測到顯示器的分辨率。不過我們可以手工添加期望的分辨率。

首先,運行 gtfcvt 以獲取所需分辨率的 模式行(Modeline)

$ cvt 1280 1024
# 1280x1024 59.89 Hz (CVT 1.31M4) hsync: 63.67 kHz; pclk: 109.00 MHz
Modeline "1280x1024_60.00"  109.00  1280 1368 1496 1712  1024 1027 1034 1063 -hsync +vsync
提示:For some LCD screens (e.g. Samsung 2343NW, Acer XB280HK), the command cvt -r (= with reduced blanking) is to be used.
注意: 如果使用了 Intel 的顯示驅動程序 xf86-video-intel,期望的分辨率會在 /var/log/Xorg.0.log 中與其他特徵值一併報告——如果該值不同於 gtf or cvt 的輸出應首選該值。這裡給出一個log文件的報告值與 xrandr 使用值的實例:
[    45.063] (II) intel(0): clock: 241.5 MHz   Image Size:  597 x 336 mm
[    45.063] (II) intel(0): h_active: 2560  h_sync: 2600  h_sync_end 2632 h_blank_end 2720 h_border: 0
[    45.063] (II) intel(0): v_active: 1440  v_sync: 1443  v_sync_end 1448 v_blanking: 1481 v_border: 0
xrandr --newmode "2560x1440" 241.50 2560 2600 2632 2720 1440 1443 1448 1481 -hsync +vsync

然後創建一個新的 xandr 模式。注意模式行中那些被忽略的關鍵字。

$ xrandr --newmode "1280x1024_60.00"  109.00  1280 1368 1496 1712  1024 1027 1034 1063 -hsync +vsync

創建完畢還需要一個操作步驟,把這個新模式追加到當前顯示輸出端口(VGA1)。我們只需引用模式的名稱,因為參數已經在前面設置好了。

$ xrandr --addmode VGA1 1280x1024_60.00

現在,我們可以把屏幕分辨率切換為剛剛追加的值:

$ xrandr --output VGA1 --mode 1280x1024_60.00

注意,上述這些設置僅在本次會話中有效。

如果你不能確保將要測試的分辨率可用,可以在後面附加一個延遲和一個安全分辨率命令行,就像這樣:

$ xrandr --output VGA1 --mode 1280x1024_60.00 && sleep 5 && xrandr --newmode "1024x768-safe" 65.00 1024 1048 1184 1344 768 771 777 806 -HSync -VSync && xrandr --addmode VGA1 1024x768-safe && xrandr --output VGA1 --mode 1024x768-safe

還有,要把 VGA1 改為正確的輸出端口名。

EDID 校驗和無效[編輯 | 編輯原始碼]

如果前述方法導致引導期間發生 *ERROR* EDID checksum is invalid 錯誤,參閱 這裡這裡.

也許 xrandr --addmode 會返回錯誤 X Error of failed request: BadMatch。NVIDIA 用戶請參閱 NVIDIA/Troubleshooting#xrandr BadMatchBadMatch 能指示出無效的 EDID 校驗和。要驗證確實是這種情況,請以 verbose mode 運行 X 服務(例如:startx -- -logverbose 6)然後查閱 Xorg 日誌中有關 EDID 錯誤的信息。

糾正電視機分辨率過掃[編輯 | 編輯原始碼]

With a flat panel TV, w:overscan looks like the picture is "zoomed in" so the edges are cut off.

Check your TV if there is a parameter to change. If not, apply an underscan and change border values. The required underscan vborder and underscan hborder values can be different for you, just check it and change it by more or less.

$ xrandr --output HDMI-0 --set underscan on --set "underscan vborder" 25 --set "underscan hborder" 40

通過 --transform 糾正電視機過掃[編輯 | 編輯原始碼]

如果underscan不可用另一個解決方案是使用 xrandr --transform a,b,c,d,e,f,g,h,i,它在輸出上應用了一個變換矩陣,參考 xrandr(1) § RandR_version_1.3_options手冊頁面來了解transform的解釋.

舉個例子,將橫坐標縮放0.8,縱坐標縮放1.04,並將屏幕向右移動35像素,向下移動19像素,參考如下指令。

$ xrandr --output HDMI1 --transform 0.80,0,-35,0,1.04,-19,0,0,1

HDMI中的Full RGB支持[編輯 | 編輯原始碼]

Intel驅動沒有正確設置HDMI輸出時可能出現該種問題。這會限制顏色範圍到(16-235)通過Broadcast RGB property,這導致黑色看起來不夠黑,它會變成灰色。

要驗證你是不是這種情況:

$ xrandr --output HDMI1 --set "Broadcast RGB" "Full"

屏幕分辨率在屏幕閃一下之後恢復原狀[編輯 | 編輯原始碼]

如果你使用GNOME而且你的顯示器沒有EDID, 上述#添加未檢測到的分辨率可能不會工作,當你使用xrandr --output時,屏幕只會閃一下。

你可以試試~/.config/monitors.xml,或者把這個文件刪除,然後重啟計算機。

更好的解釋可以參考這個文章。

參見[編輯 | 編輯原始碼]