Изменение разрешения сеанса VNC в Linux

Я использую VNC для подключения к рабочей станции Linux на работе. На работе у меня есть 20-дюймовый монитор с разрешением 1600x1200, а дома я использую свой ноутбук с его разрешением 1440x900. Если я настрою vncserver на работу с разрешением 1440x900, я упущу много места на моем мониторе, тогда как если я выставил его на работу в 1600х1200, он не помещается на экране ноутбука, и мне приходится все время его прокручивать.

Есть ли хороший способ изменить размер сеанса VNC на лету?

Мой VNC-сервер - RealVNC E4.x (я не помню точную версию), работающий на SuSE64.

Ответов (15)

Решение

Настоящий сервер VNC 4.4 включает поддержку Xrandr, которая позволяет изменять размер VNC. Запустите сервер с помощью:

vncserver -geometry 1600x1200 -randr 1600x1200,1440x900,1024x768

Затем измените размер с помощью:

xrandr -s 1600x1200
xrandr -s 1440x900
xrandr -s 1024x768

Я не уверен насчет linux, но под Windows tightvnc обнаруживает и адаптируется к изменениям разрешения на сервере.

Таким образом, вы должны иметь возможность подключать VNC к рабочей станции, делать то же самое, что и щелкать правой кнопкой мыши на рабочем столе, свойствах, устанавливать любое разрешение и соответственно изменять размер окна vnc вашего клиента.

Я запускаю TigerVNC на своем сервере Linux, на котором есть базовый randr поддержку . Я просто запускаю vncserver без опций -randr или multiple -geometry.

Когда я запускаю 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

Затем я могу легко переключиться на другое разрешение (например, переключиться на 1360x768):

bash> xrandr -s 5

Я использую программу просмотра TightVnc в качестве клиента, и она автоматически адаптируется к новому разрешению.

У меня есть простая идея, примерно такая:

#!/bin/sh

echo `xrandr --current | grep current | awk '{print $8}'` >> RES1
echo `xrandr --current | grep current | awk '{print $10}'` >> RES2
cat RES2 | sed -i 's/,//g' RES2

P1RES=$(cat RES1)
P2RES=$(cat RES2)
rm RES1 RES2
echo "$P1RES"'x'"$P2RES" >> RES
RES=$(cat RES)

# Play The Game

# Finish The Game with Lower Resolution

xrandr -s $RES

Что ж, мне нужно лучшее решение для всех устройств отображения под Linux и подобными SO

Добавление к (принятому) ответу Натана:

Я хотел просмотреть список разрешений, но ничего не увидел:

function vncNextRes()
{
   xrandr -s $(($(xrandr | grep '^*'|sed '[email protected]^\*\([0-9]*\).*[email protected]\[email protected]')+1)) > /dev/null 2>&1 || \
   xrandr -s 0
}

Он получает текущий индекс, переходит к следующему и возвращается к 0 при ошибке (т. Е. В конце).


РЕДАКТИРОВАТЬ

Изменено для соответствия более поздней версии xrandr («*» находится в конце строки и не имеет ведущего идентификатора разрешения).

function vncNextRes()
{
   xrandr -s $(($(xrandr 2>/dev/null | grep -n '\* *$'| sed '[email protected]:.*@@')-2))  || \
   xrandr -s 0
}

Возможно, самый невежественный ответ, который я опубликовал, но здесь: используйте клиент / средство просмотра TigerVNC и проверьте 'Resize remote session to local window' вкладку параметров экрана.

Я не знаю, что клиент $% # @ TigerVNC сообщает удаленному vncserver или xrandr, или Xvnc, или gnome или ... но он меняет размер, когда я меняю окно клиента TigerVNC.

Моя установка:

  • Сервер Tiger VNC, работающий на CentOS 6. Хостинг рабочего стола GNOME. (Также работает с RHEL 6.6)
  • Windows какая-то версия с Tiger VNC Client.

При этом разрешение изменяется, чтобы соответствовать размеру окна клиента, независимо от того, что это такое, а это не zooming фактическое изменение разрешения (я вижу новое разрешение в выводе xrandr).

Я пробовал все, что мог, чтобы добавить новое разрешение в xrandr, но безрезультатно, всегда заканчивалась 'xrandr: Failed to get size of gamma for output default' ошибкой.

Версии, с которыми он работает у меня прямо сейчас (хотя в прошлом у меня не было проблем с ЛЮБЫМИ версиями, я просто устанавливаю последнюю версию yum install gnome-* tigervnc-server и отлично работает):

OS: RHEL 6.6 (Santiago)
VNC Server:
Name        : tigervnc-server
Arch        : x86_64
Version     : 1.1.0
Release     : 16.el6

# May be this is relevant..
$ xrandr --version
xrandr program version       1.4.0
Server reports RandR version 1.4
$ 

# I start the server using vncserver -geometry 800x600
# Xvnc is started by vncserver with following args:
/usr/bin/Xvnc :1 -desktop plabb13.sgdcelab.sabre.com:1 (sg219898) -auth /login/sg219898/.Xauthority 
-geometry 800x600 -rfbwait 30000 -rfbauth /login/sg219898/.vnc/passwd -rfbport 5901 -fp catalogue:/e
tc/X11/fontpath.d -pn


# I'm running GNOME (installed using sudo yum install gnome-*)
Name        : gnome-desktop
Arch        : x86_64
Version     : 2.28.2
Release     : 11.el6

Name        : gnome-session
Arch        : x86_64
Version     : 2.28.0
Release     : 22.el6

Connect using Tiger 32-bit VNC Client v1.3.1 on Windows 7.

Поскольку этот вопрос возникает в первую очередь в Google, я подумал, что поделюсь решением с использованием TigerVNC, который в наши дни используется по умолчанию.

xrandr позволяет выбирать режимы отображения (AKA разрешений) , однако из - за того ModeLines жестко закодированы любые дополнительные ModeLine , такие как «2560x1600» или «1600x900» должен был бы быть добавлен в код . Я думаю, что разработчики, написавшие код, намного умнее, и жестко закодированный список - это всего лишь образец значений. Это приводит к выводу, что должен быть способ добавления нестандартных моделей и man xrandr подтверждает это.

На этом фоне, если целью является совместное использование сеанса VNC между двумя компьютерами с указанными выше разрешениями и при условии, что сервер VNC - это компьютер с разрешением «1600x900»:

  1. Начните сеанс VNC с геометрией, соответствующей физическому дисплею:

    $ vncserver -geometry 1600x900 :1
    
  2. На компьютере «2560x1600» запустите программу просмотра VNC (я предпочитаю Remmina) и подключитесь к удаленному сеансу VNC:

    host:5901
    
  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  
    

    и вы заметите, что экран довольно маленький.

  5. Перечислите модельную строку (см. Статью xrandr в вики ArchLinux) для разрешения «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
    

    или если монитор старый, получите тайминги 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
    
  6. Добавьте новую модельную строку в текущий сеанс VNC:

    $ xrandr --newmode "2560x1600_60.00"  348.16  2560 2752 3032 3504  1600 1601 1604 1656 -HSync +Vsync
    
  7. В приведенном выше xrandrвыводе найдите отображаемое имя во второй строке:

    VNC-0 connected 1600x900+0+0 0mm x 0mm
    
  8. Привяжите новую модельную строку к текущему виртуальному монитору VNC:

    $ xrandr --addmode VNC-0 "2560x1600_60.00"
    
  9. Используй это:

    $ xrandr -s "2560x1600_60.00"
    

Решение @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
}

Что интересно, на это никто не ответил. В TigerVNC, когда вы вошли в сеанс. Перейдите System > Preference > Display в верхнюю строку меню (я использовал Cent OS в качестве удаленного сервера). Нажмите на раскрывающееся меню разрешения, доступны различные настройки, включая 1080p. Выберите тот, который вам нравится. Он будет меняться на лету.

введите описание изображения здесь

Убедитесь, что вы применили новую настройку, когда появится диалоговое окно. В противном случае он вернется к предыдущей настройке, как в Windows.

Ребята, это действительно просто.

войдите через ssh свой пи

выполнять

vncserver -geometry 1200x1600

Это создаст новый сеанс :1

подключитесь к своему клиенту vnc на ipaddress:1

Вот и все.

Я думаю, это зависит от вашего оконного менеджера.

Я пользователь Windows, так что это может быть неправильное предположение, но: Разве что-то, называемое X-Server, не работает на машинах Linux - по крайней мере, на тех, которые могут быть интересными целями для VNC, - к которым вы можете подключиться с помощью " X-Клиенты »?

VNC просто берет все, что на экране, и «туннелирует это через вашу сеть». Если я не совсем ошибаюсь, то протокол «X» должен дать вам возможность использовать разрешение рабочего стола вашего клиента.

Дает X-сервер на Википедии попробовать, что может дать вам общее представление.

Я думаю, что лучше всего запустить сервер VNC с другой геометрией на другом порту. Я бы попробовал на основе справочной страницы

$vncserver :0 -geometry 1600x1200
$vncserver :1 -geometry 1440x900

Затем вы можете подключаться с работы к одному порту и из дома к другому.

Изменить: затем используйте xmove для перемещения окон между двумя x-серверами.

Насколько мне известно, нет способа изменить разрешение клиента, просто используя VNC, поскольку это просто приложение «зеркалирования монитора».

Однако TightVNC (который является клиентским и серверным приложением VNC) может изменять размер экрана на стороне клиента, то есть делать все немного меньше (аналогично методам изменения размера изображения в графических программах). Это должно сработать, если вы не используете слишком маленький размер шрифта. Теоретически VNC должен быть совместим с различными приложениями VNC.

С другой стороны, если есть способ переместить существующее окно с одного X-сервера на другой, это может решить проблему.

Я думаю, вы можете использовать xmove для перемещения окон между двумя отдельными x-серверами. Так что, если это сработает, это должно, по крайней мере, дать вам возможность делать то, что вы хотите, хотя и не так легко, как изменение разрешения.

Выяснилось, что vnc4server (4.1.1), поставляемый с Ubuntu (10.04), исправлен, чтобы также поддерживать изменение разрешения на лету через xrandr. К сожалению, эту функцию было трудно найти, потому что она недокументирована. Итак, вот оно ...

Запустите сервер с несколькими экземплярами 'geometry', например:

vnc4server -geometry 1280x1024 -geometry 800x600

Из терминала в vncviewer (с включенным: 'allow dymanic desktop resizing') используйте xrandr для просмотра доступных режимов:

xrandr

чтобы изменить разрешение, например, используйте:

xrandr -s 800x600

Вот и все.