172

I use VNC to connect to a Linux workstation at work. At work I have a 20" monitor that runs at 1600x1200, while at home I use my laptop with its resolution of 1440x900. If I set the vncserver to run at 1440x900 I miss out on a lot of space on my monitor, whereas if I set it to run at 1600x1200 it doesn't fit on the laptop's screen, and I have to scroll it all the time.

Is there any good way to resize a VNC session on the fly?

My VNC server is RealVNC E4.x (I don't remember the exact version) running on SuSE64.

Nathan Fellman
  • 122,701
  • 101
  • 260
  • 319
  • I would like to mention something I came across recently but I haven't been able to test it yet. There is a new program called FreeNX that has set out to be a replacement for VNC. Here's the link: http://freenx.berlios.de/ – andho Jul 11 '11 at 04:52
  • @andho - That link seems to be broken. – ArtOfWarfare Aug 11 '14 at 01:39
  • @ArtOfWarfare hope this helps https://help.ubuntu.com/community/FreeNX. Should be pretty stable by now. I think I'll give it a try soon, as time allows. – andho Sep 19 '14 at 07:55

15 Answers15

177

Real VNC server 4.4 includes support for Xrandr, which allows resizing the VNC. Start the server with:

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

Then resize with:

xrandr -s 1600x1200
xrandr -s 1440x900
xrandr -s 1024x768
Nathan Fellman
  • 122,701
  • 101
  • 260
  • 319
  • 1
    Thanks Nathan, even the realvnc folks dont seem emphasize the xrandr feature... See also my bash function below to allow cycling through the randr resolutions. – nhed Jul 03 '11 at 02:09
  • 10
    You may find it convenient to put all of these options in a `.vnc/config` file. For example, the first line of my config is: `-randr 800x600,1024x768,1280x800,1280x960,1280x1024,1680x1050,1920x1080,3360x1050,1024x700,1200x740,1600x1000,3200x1000` – bfroehle Aug 22 '12 at 17:30
  • @Nathan I tried to use the solution you gave but without success. can you please try to answer [this question of mine?](http://superuser.com/q/542906/173338) – Geek Jan 29 '13 at 12:27
  • 4
    I wonder if this works with `tightvncserver`? – Dimitry K Jan 20 '14 at 00:46
  • 4
    @DimitryK I had tightvncserver and doesn't work it. I purged it and installed real VNC. I recommend it. All landscape resolutions: 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. – barwnikk Apr 11 '15 at 20:05
  • The -randr option doesn't seem to work with tigervnc, but you can use xrandr --newmode, --addmode, etc. to add new resolutions at runtime with tigervnc, wch will achieve a similar effect. – Cheetah Aug 01 '17 at 14:36
  • Worth noting is that RealVNC does _not_ allow normal direct connections unless you have a paid subscription (free only allows for poor-performance "cloud" connections). – fgblomqvist May 03 '19 at 13:34
  • With TigerVNC client you don't have to set any geometries. My server is run with just basic `-geometry 1024x768` which sets client to this resolution when you connect but then you can change the resolution just by resizing the client window. Any crazy, non-standard, ad-hoc resolution you want. My setup: openSuse 15.1, GDM, KDE Plasma, TigerVNC client 1.9.0 (Windows) – Espinosa Sep 22 '19 at 21:52
70

Found out that the vnc4server (4.1.1) shipped with Ubuntu (10.04) is patched to also support changing the resolution on the fly via xrandr. Unfortunately the feature was hard to find because it is undocumented. So here it is...

Start the server with multiple 'geometry' instances, like:

vnc4server -geometry 1280x1024 -geometry 800x600

From a terminal in a vncviewer (with: 'allow dymanic desktop resizing' enabled) use xrandr to view the available modes:

xrandr

to change the resulution, for example use:

xrandr -s 800x600

Thats it.

Tijs
  • 701
  • 5
  • 2
32

I'm running TigerVNC on my Linux server, which has basic randr support. I just start vncserver without any -randr or multiple -geometry options.

When I run xrandr in a terminal, it displays all the available screen resolutions:

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

I can then easily switch to another resolution (f.e. switch to 1360x768):

bash> xrandr -s 5

I'm using TightVnc viewer as the client and it automatically adapts to the new resolution.

Peter
  • 557
  • 5
  • 6
  • so that folks dont go on wild goose chases can you please list both the version of TigerVnc and your linux server distribution+version? Thanks – nhed Jan 02 '12 at 03:45
  • I can confirm that it works pretty well with TiverVnc 1.1.0 (Linux server, Linux client) – Benedikt Waldvogel Jun 23 '12 at 11:59
  • 1
    I'm using vncviewer and everytime I try to change the resoultion the window closes. – AWE Oct 24 '12 at 12:14
  • 1
    may I ask you which xrandr version is this. Mine: xrandr program version 1.3.5 Server reports RandR version 1.3 seems completely different, e.g. do not have first column – Wakan Tanka Feb 24 '15 at 08:57
  • Just to add that it works with Real VNC as a client as well. Tested for version 6.0.3 – Vivek V K Apr 15 '17 at 03:30
  • Update 2019: No need to call xrandr to change resolution. Resolution of my remote desktop follows whatever size of the client TigerVNC window is; any crazy ad-hoc resolution, any aspect ratio; in GDM or KDE. Works like a charm, out of the box, no need to set anything anywhere on client or server. My setup: openSuse 15.1, GDM, KDE Plasma, TigerVNC client 1.9.0. – Espinosa Sep 22 '19 at 21:45
27

As this question comes up first on Google I thought I'd share a solution using TigerVNC which is the default these days.

xrandr allows selecting the display modes (a.k.a resolutions) however due to modelines being hard coded any additional modeline such as "2560x1600" or "1600x900" would need to be added into the code. I think the developers who wrote the code are much smarter and the hard coded list is just a sample of values. It leads to the conclusion that there must be a way to add custom modelines and man xrandr confirms it.

With that background if the goal is to share a VNC session between two computers with the above resolutions and assuming that the VNC server is the computer with the resolution of "1600x900":

  1. Start a VNC session with a geometry matching the physical display:

    $ vncserver -geometry 1600x900 :1
    
  2. On the "2560x1600" computer start the VNC viewer (I prefer Remmina) and connect to the remote VNC session:

    host:5901
    
  3. Once inside the VNC session start up a terminal window.

  4. Confirm that the new geometry is available in the VNC session:

    $ 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  
    

    and you'll notice the screen being quite small.

  5. List the modeline (see xrandr article in ArchLinux wiki) for the "2560x1600" resolution:

    $ 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
    

    or if the monitor is old get the GTF timings:

    $ 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. Add the new modeline to the current VNC session:

    $ xrandr --newmode "2560x1600_60.00"  348.16  2560 2752 3032 3504  1600 1601 1604 1656 -HSync +Vsync
    
  7. In the above xrandr output look for the display name on the second line:

    VNC-0 connected 1600x900+0+0 0mm x 0mm
    
  8. Bind the new modeline to the current VNC virtual monitor:

    $ xrandr --addmode VNC-0 "2560x1600_60.00"
    
  9. Use it:

    $ xrandr -s "2560x1600_60.00"
    
omiday
  • 271
  • 3
  • 2
26

I think your best best is to run the VNC server with a different geometry on a different port. I would try based on the man page

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

Then you can connect from work to one port and from home to another.

Edit: Then use xmove to move windows between the two x-servers.

Pat
  • 36,282
  • 18
  • 72
  • 87
  • 3
    @Pat, the problem with your solution is that I can't easily move a window from one VNC session to another. If I'm in the middle of some debug when I have to leave, I want to be able to pick up where I left off (maybe with the windows moved around a little bit due to resizing). If I have two separate sessions, I won't be able to continue the same as before, because I'll have to close windows from one session and re-open them in another one. On the other hand, if there's a way to move an existing window from one X-server to another, that might solve the problem. – Nathan Fellman Jul 01 '09 at 12:40
  • 1
    xmove isn't in the current Ubuntu repository; xpra is, which will do the same thing (act as an X proxy). – Sam Hartsfield Jun 18 '10 at 15:14
23

Interestingly no one answered this. In TigerVNC, when you are logged into the session. Go to System > Preference > Display from the top menu bar ( I was using Cent OS as my remote Server). Click on the resolution drop down, there are various settings available including 1080p. Select the one that you like. It will change on the fly.

enter image description here

Make sure you Apply the new setting when a dialog is prompted. Otherwise it will revert back to the previous setting just like in Windows

TheTechGuy
  • 16,560
  • 16
  • 115
  • 136
12

Guys this is really simple.

login via ssh into your pi

execute

vncserver -geometry 1200x1600

This will generate a new session :1

connect with your vnc client at ipaddress:1

Thats it.

ytsejam
  • 3,291
  • 7
  • 39
  • 69
Will Berger
  • 139
  • 1
  • 2
  • 12
    That's a wrong answer, because it will not change the resolution of an existing session, but just create a new one. – Nathan Fellman Nov 13 '17 at 11:17
  • try this - open existing session on TigerVNC, it will automatically resize the geometry screen. Now open it with any other VNC app, it will be resized. – Sreekant Shenoy Jun 03 '22 at 03:28
6

Adding to Nathan's (accepted) answer:

I wanted to cycle through the list of resolutions but didnt see anything for it:

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

It gets the current index, steps to the next one and cycles back to 0 on error (i.e. end)


EDIT

Modified to match a later version of xrandr ("*" is on end of line and no leading resolution identifier).

function vncNextRes()
{
   xrandr -s $(($(xrandr 2>/dev/null | grep -n '\* *$'| sed 's@:.*@@')-2))  || \
   xrandr -s 0
}
nhed
  • 5,774
  • 3
  • 30
  • 44
4

Solution by @omiday worked for me in Xvnc TigerVNC 1.1.0, so I condensed it into a single bash function vncsize x y. Use it like this: vncsize 1400 1000. It works for any VNC output name, "default" or "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
}
Nicholas Sushkin
  • 13,050
  • 3
  • 30
  • 20
  • what is `$sscreen` supposed to be? Echoing it shows it's blank. Also `newSize` doesn't seem to be a list/tuple... changing the last `xrandr` line to `xrandr --size "${x}x${y}" &&` seems to move things along, but then I get `Size 1400x1400 not found in available modes` – nmz787 Feb 11 '21 at 21:38
  • @nmz787 sorry, it's screen, not sscreen. That was a typo. – Nicholas Sushkin Feb 11 '21 at 21:42
3

Perhaps the most ignorant answer I've posted but here goes: Use TigerVNC client/viewer and check 'Resize remote session to local window' under Screen tab of options.

I don't know what the $%#@ TigerVNC client tells remote vncserver or xrandr or Xvnc or gnome or ... but it resizes when I change the TigerVNC Client window.

My setup:

  • Tiger VNC Server running on CentOS 6. Hosting GNOME desktop. (Works with RHEL 6.6 too)
  • Windows some version with Tiger VNC Client.

With this the resolution changes to fit the size of the client window no matter what it is, and it's not zooming, it's actual resolution change (I can see the new resolution in xrandr output).

I tried all I could to add a new resolution to the xrandr, but to no avail, always end up with 'xrandr: Failed to get size of gamma for output default' error.

Versions with which it works for me right now (although I've not had issues with ANY versions in the past, I just install the latest using yum install gnome-* tigervnc-server and works fine):

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.
Kashyap
  • 15,354
  • 13
  • 64
  • 103
  • What versions of TigerVNC are you using for your client/server? I tried this today and it doesn't automatically resize for me. I'm on RHEL 6.2 running Xvnc TigerVNC 1.1.0 for server and vncviewer-1.4.3.exe client – cdwilson Mar 19 '15 at 18:05
  • @cdwilson Hope you tried with client in full screen mode. Added versions. HTH – Kashyap Mar 20 '15 at 04:20
  • turns out 1.1.0 wasn't playing nice with whatever they are running on our work machines. Running the latest 1.4.3 out of my `$HOME` directory works as expected https://github.com/TigerVNC/tigervnc/issues/155 – cdwilson Mar 23 '15 at 19:39
  • Confirmed: openSuse 15.1, GDM, KDE Plasma, TigerVNC client 1.9.0. Resolution of my remote desktop follows whatever size of the client window is, any crazy ad-hoc resolution, any aspect ratio; in GDM or KDE. Works like a charm, out of the box, no need to set anything anywhere on client or server. – Espinosa Sep 22 '19 at 21:41
1

I'm not sure about linux, but under windows, tightvnc will detect and adapt to resolution changes on the server.

So you should be able to VNC into the workstation, do the equivalent of right-click on desktop, properties, set resolution to whatever, and have your client vnc window resize itself accordingly.

Blorgbeard
  • 101,031
  • 48
  • 228
  • 272
1

On the other hand, if there's a way to move an existing window from one X-server to another, that might solve the problem.

I think you can use xmove to move windows between two separate x-servers. So if it works, this should at least give you a way to do what you want albeit not as easily as changing the resolution.

Pat
  • 36,282
  • 18
  • 72
  • 87
  • do you know if xmove goes by any other name in SuSE Linux? – Nathan Fellman Jul 01 '09 at 12:41
  • @NathanFellman have you looked at xpra? It's a more recent application but similar tool https://en.wikipedia.org/wiki/Xpra and https://software.opensuse.org/package/xpra. – DDay Mar 21 '18 at 17:08
  • I don't have much control over this, as I work in a large corporation where IT chooses the remote access tools – Nathan Fellman Mar 26 '18 at 18:52
0

I have a simple idea, something like this:

#!/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

Well, I need a better solution for all display devices under Linux and Similars S.O

Shawn Chin
  • 84,080
  • 19
  • 162
  • 191
inukaze
  • 441
  • 1
  • 6
  • 17
0

As far as I know there's no way to change the client's resolution just using VNC, as it is just a "monitor mirroring" application.

TightVNC however (which is a VNC client and server application) can resize the screen on the client side, i.e. making everything a little smaller (similar to image resizing techniques in graphics programs). That should work if you don't use too small font sizes. VNC should theoretically be compatible between different VNC applications.

BlaM
  • 28,465
  • 32
  • 91
  • 105
  • the question is strictly a linux question, this windows answer does not apply here. In windows VNC is just a monitor, but in Linux it was FIRST a virtual desktop and only later some versions added 'display 0' support (i.e. monitor). VNC Scaling is a pretty poor user experience. – nhed Jul 03 '11 at 02:35
-3

I think that depends on your window manager.

I'm a windows user, so this might be a wrong guess, but: Isn't there something called X-Server running on linux machines - at least on ones that might be interesting targets for VNC - that you can connect to with "X-Clients"?

VNC just takes everything that's on the screen and "tunnels it through your network". If I'm not totally wrong then the "X" protocol should give you the chance to use your client's desktop resolution.

Give X-Server on Wikipedia a try, that might give you a rough overview.

BlaM
  • 28,465
  • 32
  • 91
  • 105
  • the idea is good and can be done using an ssh tunnel and a local x-server. You have the x-server on your machine and you give remote clients access to you x-server which will render the gui of the remote apps on your display. – andho May 10 '11 at 05:20
  • @andho no this is not what the poster asked for at all - the problem here is that you would lose the widnows when you lost connectivity. The opening windows over the tunnel is only useful for short-term apps, not if you want to take your desktop (and all open apps within) from one client to another... – nhed Jul 03 '11 at 02:14
  • @nhed, i don't know if this is even practical at all, but it's an idea. As for long-term apps, maybe 'screen' program can be used? – andho Jul 05 '11 at 15:27
  • @andho screen is awesome, for text-only apps ... the OP was asking about X apps ... and I arrived at this corner of the web because I was looking for the same thing and it seems that either something like xranr or xmove at the closet things (xrandr being a cleaner option) – nhed Jul 05 '11 at 19:00
  • @nhed, yes this is a problem I am having too. Just throwing that idea out there so someone more experienced can strike it out, without me having to test if it was possible at all. – andho Jul 11 '11 at 04:53