在linux中更改VNC会话的分辨率

Nat*_*man 146 linux vnc

我使用VNC连接到工作中的Linux工作站.在工作中,我有一台20英寸显示器,运行速度为1600x1200,而在家里,我使用的笔记本电脑的分辨率为1440x900.如果我将vncserver设置为运行在1440x900,我错过了显示器上的大量空间,而如果我将它设置为1600x1200运行它不适合笔记本电脑的屏幕,我必须一直滚动它.

有没有什么好方法可以动态调整VNC会话的大小?

我的VNC服务器是在SuSE64上运行的RealVNC E4.x(我不记得确切的版本).

Nat*_*man 152

Real VNC服务器4.4包括对Xrandr的支持,允许调整VNC的大小.启动服务器:

vncserver -geometry 1600x1200 -randr 1600x1200,1440x900,1024x768
Run Code Online (Sandbox Code Playgroud)

然后调整大小:

xrandr -s 1600x1200
xrandr -s 1440x900
xrandr -s 1024x768
Run Code Online (Sandbox Code Playgroud)

  • 您可能会发现将所有这些选项放在`.vnc/config`文件中很方便.例如,我的配置的第一行是:`-randr 800x600,1024x768,1280x800,1280x960,1280x1024,1680x1050,1920x1080,3360x1050,1024x700,1200x740,1600x1000,3200x1000` (6认同)
  • 我想知道这是否适用于 `tightvncserver`? (4认同)
  • @DimitryK我有tightvncserver并没有工作.我清理它并安装了真正的VNC.我推荐它.所有景观分辨率:320x240,480x320,482x320,560x360,576x360,640x480,640x482,648x486,720x480,720x486,720x540,720x576,768x576,800x480,800x600,1024x600,1024x768,1280x720,1280x800,1280x1024,1366x768,1400x1050,1440x900, 1600x900,1600x1024,1600x1200,1680x1050,1920x1080,1920x1200,2048x1024,2048x1152,2048x1536,2560x1080,2560x1440,2560x1600,2560x2048,3072x1536,3072x1728,3840x2160,4096x2048,4096x2304,7680x4320,8192x4096,8192x4608. (3认同)

小智 67

发现Ubuntu(10.04)附带的vnc4server(4.1.1)也被修补,也支持通过xrandr动态更改分辨率.遗憾的是,该功能很难找到,因为它没有文档记录.所以这里......

使用多个"几何"实例启动服务器,例如:

vnc4server -geometry 1280x1024 -geometry 800x600
Run Code Online (Sandbox Code Playgroud)

从vncviewer中的终端(启用:'允许dymanic桌面大小调整'启用)使用xrandr查看可用模式:

xrandr
Run Code Online (Sandbox Code Playgroud)

更改结果,例如使用:

xrandr -s 800x600
Run Code Online (Sandbox Code Playgroud)

而已.


小智 26

我在我的Linux服务器上运行TigerVNC,它具有基本的randr支持.我只是启动vncserver而没有任何-randr或多个几何选项.

当我在终端中运行xrandr时,它会显示所有可用的屏幕分辨率:

bash> xrandr
 SZ:    Pixels          Physical       Refresh
 0   1920 x 1200   ( 271mm x 203mm )   60
 1   1920 x 1080   ( 271mm x 203mm )   60
 2   1600 x 1200   ( 271mm x 203mm )   60
 3   1680 x 1050   ( 271mm x 203mm )   60
 4   1400 x 1050   ( 271mm x 203mm )   60
 5   1360 x 768    ( 271mm x 203mm )   60
 6   1280 x 1024   ( 271mm x 203mm )   60
 7   1280 x 960    ( 271mm x 203mm )   60
 8   1280 x 800    ( 271mm x 203mm )   60
 9   1280 x 720    ( 271mm x 203mm )   60
*10  1024 x 768    ( 271mm x 203mm )  *60
 11   800 x 600    ( 271mm x 203mm )   60
 12   640 x 480    ( 271mm x 203mm )   60
Current rotation - normal
Current reflection - none
Rotations possible - normal
Reflections possible - none
Run Code Online (Sandbox Code Playgroud)

然后我可以轻松切换到另一个分辨率(fe切换到1360x768):

bash> xrandr -s 5
Run Code Online (Sandbox Code Playgroud)

我正在使用TightVnc查看器作为客户端,它会自动适应新的分辨率.


Pat*_*Pat 25

我认为最好的方法是在不同的端口上运行具有不同几何形状的VNC服务器.我会尝试基于手册页

$vncserver :0 -geometry 1600x1200
$vncserver :1 -geometry 1440x900
Run Code Online (Sandbox Code Playgroud)

然后,您可以从工作连接到一个端口,从家到另一个端口.

编辑:然后使用xmove在两个x服务器之间移动窗口.

  • @Pat,您的解决方案的问题是我无法轻松地将窗口从一个VNC会话移动到另一个VNC会话.如果我必须离开的话,我正处于一些调试的中间,我希望能够从我离开的地方拿起(也许由于调整大小,窗口移动了一点).如果我有两个单独的会话,我将无法像以前一样继续,因为我将不得不从一个会话关闭窗口并在另一个会话中重新打开它们.另一方面,如果有办法将现有窗口从一个X服务器移动到另一个X服务器,则可能解决问题. (3认同)

小智 16

当这个问题首先出现在Google上时,我想我会使用TigerVNC共享一个解决方案,这是目前的默认设置.

xrandr允许选择显示模式(也称为分辨率),但由于模型被硬编码, 任何额外的模式行,如"2560x1600"或"1600x900"都需要添加到代码中.我认为编写代码的开发人员更聪明,硬编码列表只是一个值的样本.它得出结论,必须有一种方法来添加自定义模型并man xrandr确认它.

在此背景下,如果目标是在具有上述分辨率的两台计算机之间共享VNC会话,并假设VNC服务器是分辨率为"1600x900"的计算机:

  1. 使用与物理显示匹配的几何体启动VNC会话:

    $ vncserver -geometry 1600x900 :1
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在"2560x1600"计算机上启动VNC查看器(我更喜欢Remmina)并连接到远程VNC会话:

    host:5901
    
    Run Code Online (Sandbox Code Playgroud)
  3. 进入VNC会话后,启动一个终端窗口.

  4. 确认VNC会话中的新几何图形是否可用:

    $ xrandr
    Screen 0: minimum 32 x 32, current 1600 x 900, maximum 32768 x 32768
    VNC-0 connected 1600x900+0+0 0mm x 0mm
       1600x900      60.00 +
       1920x1200     60.00  
       1920x1080     60.00  
       1600x1200     60.00  
       1680x1050     60.00  
       1400x1050     60.00  
       1360x768      60.00  
       1280x1024     60.00  
       1280x960      60.00  
       1280x800      60.00  
       1280x720      60.00  
       1024x768      60.00  
       800x600       60.00  
       640x480       60.00  
    
    Run Code Online (Sandbox Code Playgroud)

    你会注意到屏幕很小.

  5. 列出模式行(请参阅ArchLinux wiki中的xrandr文章)获取"2560x1600"分辨率:

    $ cvt 2560 1600
    # 2560x1600 59.99 Hz (CVT 4.10MA) hsync: 99.46 kHz; pclk: 348.50 MHz
    Modeline "2560x1600_60.00"  348.50  2560 2760 3032 3504  1600 1603 1609 1658 -hsync +vsync
    
    Run Code Online (Sandbox Code Playgroud)

    或者如果显示器老了,请获取GTF时间:

    $ gtf 2560 1600 60
    # 2560x1600 @ 60.00 Hz (GTF) hsync: 99.36 kHz; pclk: 348.16 MHz
    Modeline "2560x1600_60.00"  348.16  2560 2752 3032 3504  1600 1601 1604 1656 -HSync +Vsync
    
    Run Code Online (Sandbox Code Playgroud)
  6. 将新模式行添加到当前VNC会话:

    $ xrandr --newmode "2560x1600_60.00"  348.16  2560 2752 3032 3504  1600 1601 1604 1656 -HSync +Vsync
    
    Run Code Online (Sandbox Code Playgroud)
  7. 在上面的xrandr输出中查找第二行的显示名称:

    VNC-0 connected 1600x900+0+0 0mm x 0mm
    
    Run Code Online (Sandbox Code Playgroud)
  8. 将新的模式行绑定到当前的VNC虚拟监视器:

    $ xrandr --addmode VNC-0 "2560x1600_60.00"
    
    Run Code Online (Sandbox Code Playgroud)
  9. 用它:

    $ xrandr -s "2560x1600_60.00"
    
    Run Code Online (Sandbox Code Playgroud)


Ham*_*han 15

有趣的是没有人回答这个问题.在TigerVNC中,当您登录会话时.System > Preference > Display从顶部菜单栏转到(我使用Cent OS作为我的远程服务器).点击分辨率下拉菜单,有各种可用设置,包括1080p.选择你喜欢的那个.它会随时改变.

在此输入图像描述

确保在提示对话框时应用新设置.否则它将恢复到以前的设置,就像在Windows中一样

  • 我的生命如此安全 (2认同)

小智 9

伙计这很简单.

登录ssh到您的pi

执行

vncserver -geometry 1200x1600
Run Code Online (Sandbox Code Playgroud)

这将生成一个新会话 :1

连接你的vnc客户端 ipaddress:1

而已.

  • 这是一个错误的答案,因为它不会改变现有会话的分辨率,只会创建一个新会话. (6认同)

nhe*_*hed 6

添加到Nathan(已接受)答案:

我想循环查看分辨率列表,但没有看到任何内容:

function vncNextRes()
{
   xrandr -s $(($(xrandr | grep '^*'|sed 's@^\*\([0-9]*\).*$@\1@')+1)) > /dev/null 2>&1 || \
   xrandr -s 0
}
Run Code Online (Sandbox Code Playgroud)

它获取当前索引,步骤到下一个索引并在出错时循环回0(即结束)


编辑

修改为匹配更高版本的xrandr("*"在行尾,没有前导分辨率标识符).

function vncNextRes()
{
   xrandr -s $(($(xrandr 2>/dev/null | grep -n '\* *$'| sed 's@:.*@@')-2))  || \
   xrandr -s 0
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*kin 5

@omiday 的解决方案在 Xvnc TigerVNC 1.1.0 中为我工作,因此我将其压缩为单个 bash 函数vncsize xy。像这样使用它:vncsize 1400 1000。它适用于任何 VNC 输出名称,“默认”或“VNC-0”。

function vncsize {
    local x=$1 y=$2
    local mode
    if mode=$(cvt "$x" "$y" 2>/dev/null)
    then
        if [[ $mode =~ "Modeline (.*)$" ]]
        then
            local newMode=${BASH_REMATCH[1]//\"/}
            local modeName=${newMode%% *}
            local newSize=( ${modeName//[\"x_]/ } )
            local screen=$(xrandr -q|grep connected|cut -d' ' -f1)
            xrandr --newmode $newMode
            xrandr --addmode "$screen" "$modeName"
            xrandr --size "${newSize[0]}x${newSize[1]}" &&
                return 0
        else
            echo "Unable to parse modeline for ($x $y) from $mode"
            return 2
        fi
    else
        echo "\`$x $y' is not a valid X Y pair"
        return 1
    fi
}
Run Code Online (Sandbox Code Playgroud)