Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I've noticed people using a product for Windows and Mac called iDisplay which lets you use your Android or iPad as a secondary display. This seems like a great idea, and something that could be done on Ubuntu. Unfortunately, I've got no idea how to get started.

How could you re-create this setup on Ubuntu?

share|improve this question
    
Similar question currently under discussion on the forums: Use VNC as a second monitor –  ændrük Jun 21 '13 at 4:40
    
Same question on Super User: Use VNC to create a second Screen –  ændrük Jun 21 '13 at 4:59

6 Answers 6

up vote 14 down vote accepted

Get a VNC client for Android, start up a new VNC server session on your computer (don't just share the current display - use vnc4server not x11vnc), connect to it from the Android VNC client, and (the clever bit) share the PC keyboard and mouse between the two sessions using synergy.

All necessary software to do this is available in the standard repos for the Ubuntu side, and there's a few free VNC clients available for Android in the market.

You won't be able to drag windows across the displays using this method. For that I think you would need to use Xdmx to bond the two sessions. This is a lot harder and would probably cause you to lose 3D acceleration.

Also be aware that synergy and vnc don't use encryption by default so you need to tunnel the connections if you are not on a trusted network.

share|improve this answer

This is in principle possible using xdmx (distributed multihead X) which allows you to create a single desktop using two X-servers running on separate machines.

three scenarios are possible in principle, but none are as seamless as iDisplay, because they all require restarting your X-session at least. I have not been able to get either to work perfectly, but I am running Ubuntu 10.10 and can't upgrade for various reasons. The three are:

1: run an X-server on android (there are two available now in the app store) and use xdmx to combine with your desktop or laptop display. - didn't work for me because xdmx crashed when the pointer moved to the tablet part of the desktop.

2: run a second X-server with vnc backend on your computer, use xdmx to combine that into one desktop with your computer screen, then look at the virtual part with a vnc viewer on the tablet - didn't work for me because xdmx requires all x-servers to have the same color visuals, which is not the case for the vncserver and the real display, and I wasn't able to convince vncserver to change.

3: run two vncservers, one for each screen, then connect them with xdmx and look at each part with a vncviewer on the respective machine. - This came closest to working for me, unfortunately inpout was messed up. it was also quite slow in true-color over wifi. I used this script to start xdmx and the vncs:

#!/bin/sh 
vncserver :2 -geometry 1024x768 -depth 24 && \
vncserver :3 -geometry 1920x1120 -depth 24 && \
startx -- \
/usr/bin/X11/Xdmx :1 \
-input :2 \
-display :2 \
-display :3 \
-ignorebadfontpaths \
-norender \
-noglxproxy \
+xinerama \
-nomulticursor
vncserver -kill :2 
vncserver -kill :3

YMMV

share|improve this answer

tl; dr: xrandr --fb and x11vnc --clip together make a killer combo.

The thread linked by recognitium has a really interesting idea, not sure whether he meant this one because I couldn't find the author he indicated and also because I followed up on the forum post there, I will post this separately and not as an edit:

  1. First, let's assume the primary machine does have a screen resolution of 1280x800 and the secondary machine that you want to extend your desktop to over VNC has screen resolution of 1280x1024 and you want the extended screen to be right of your primary screen. The virtual screen needs to be 1280x800 + 1280x1024 = 2560x1024. (extend it horizontally and make the vertical resolution the bigger of the two) So run xrandr --fb 2560x1024.

  2. Now, that the screen is bigger than your primary monitor, you have to make sure there is no panning or any other unwanted "feature" activated and also that the coordinates of your primary monitor's top left corner are 0x0.

  3. x11vnc -clip 1280x1024+1281+0 plus add any other x11vnc options to taste :)

This should be it.

share|improve this answer
    
This seems like a way more seamless way to do it than the Synergy trick, nice! I'm curious how the extra virtual space will interact with my tiling window manager though. Will give this a shot in a little while and report back. –  Ibrahim Jan 23 '13 at 23:49
1  
Defeat snatched from the jaws of victory. The mouse pointer is not allowed to leave the primary screen. :( –  Gringo Suave Oct 25 '13 at 6:18
  1. Install vnc4server and x2x.
  2. Then, set up a .vnc/xstartup config file. Mine looks like this

    #!/bin/sh
    # Uncomment the following two lines for normal desktop:
    unset SESSION_MANAGER
    unset DBUS_SESSION_BUS_ADDRESS
    # exec /etc/X11/xinit/xinitrc
    
    [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
    [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
    xsetroot -solid grey
    #vncconfig -iconic &
    #x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
    #x-window-manager &
    exec gnome-session
    

    It launches gnome-fallback desktop (I don't know how to make gnome 3 launch in vnc).

  3. To launch vnc server, use vnc4server -geometry 800x480 command. Of course, instead of 800x480 you have to set your tablet's resolution.
  4. Launch x2x -east -to :1. That command says your computer to act as if display :1 had been to the right of the screen (use -west option if you want it to be on the left). You won't be able to move apps from one display to another, but you may use one mouse and one keyboard to control them both.
  5. Connect to the display created with vnc4server from your tablet (the port number is 5900 + display number (e.g. for display :1 port number will be 5901) (display number is shown in the vnc4server's output)).
  6. To exit from x2x, press Ctrl-C. Alternatively, you may launch it in the background (x2x -east -to :1 &). Then you will first need to move it to foreground (fg), or kill it with kill $! (be cautious, it kills last process launched in background).
  7. To remove the created display, call vnc4server -kill :1, where instead of :1 you may set your new display's number.
share|improve this answer
1  
Thanks for x2x... Why no one else mentions it on the entire internet ??? Saved me big time. Synergy requires cyanogenmod or similar on your tablet. Also no one mentions it. –  Stefanos Kalantzis Sep 17 '13 at 9:05
    
I already know x2x, find this post by searching for x2x android on google... But +1 for .vnc/xstartup, especialy for unset DBUS_SESSION_BUS_ADDRESS!! Small but rich and very usefull post, thanks! –  F. Hauri Jun 20 at 6:56

I use the xorg dummy driver and x11vnc -clip. The mouse point is not stuck on the edge.

sudo apt-get install xserver-xorg-video-dummy

There is the /etc/X11/xorg.conf for dummy driver on second screen:

Section "Device"
        Identifier      "Configured Video Device"
    Driver "radeon"         #CHANGE THIS
EndSection

Section "Monitor"
        Identifier      "Configured Monitor"
EndSection

Section "Screen"
        Identifier      "Default Screen"
        Monitor         "Configured Monitor"
        Device          "Configured Video Device"
EndSection


##Xdummy:##
Section "Device"
  Identifier "Videocard0"
  Driver "dummy"
  #VideoRam 4096000
  VideoRam 256000
EndSection

##Xdummy:##
Section "Monitor"
  Identifier "Monitor0"
#  HorizSync   10.0 - 300.0
#  VertRefresh 10.0 - 200.0
#  DisplaySize 4335 1084
EndSection

##Xdummy:##
Section "Screen"
  Identifier "Screen0"
  Device "Videocard0"
  Monitor "Monitor0"
EndSection



Section "ServerLayout"
  Identifier   "dummy_layout"
  Screen       0 "Default Screen"
  Screen       1 "screen0" rightof "Default Screen"
    Option         "Xinerama" "1"
EndSection

Then login to X session and run:

x11vnc -clip 1024x768+1280+0
share|improve this answer
    
Any way to do this without xorg.conf? If I create one on my computer then my graphics get completely messed up. –  DaboRoss May 28 '13 at 15:33
    
Is Xinerama still supported? How about xrandr? –  Gringo Suave Oct 25 '13 at 6:26

These instructions are to create an "additional" screen for your linux machine using a tablet or any computer through a VNC client.

I made these steps in Mageia3 32Bit (have not tried 64bit) but should be similar for other distros as well (i.e. Ubuntu).

Make sure you have all the required packages with the following terminal command:

sudo apt-get install gcc autoconf automake x11-font-util libtool libxi-devel ibopenssl-devel libxfont1-devel libpam-devel x11-util-macros x11-xtrans-devel x11-server-xvfb x11-server-xdmx x11-server-devel x11-server-source

Once you have all the above packages, issue these commands:

cd /usr/share/x11-server-sources/
./autogen.sh
./configure --with-fontrootdir=/usr/share/fonts --with-xkb-path=/usr/share/X11/xkb --with-xkb-output=/usr/share/X11/xkb/compiled --enable-dmx
make

If you don't get any errors, patch Xdmx (simply put, it has been "broken" for some time):

open /usr/share/x11-server-sources/hw/dmx/input/dmxevents.c, and change line 730: change this:

POINTER_ABSOLUTE | POINTER_SCREEN, &mask);

to this:

POINTER_RELATIVE | POINTER_DESKTOP, &mask);

IF line 730 is different use this section to find correct line: Orginal section - line to change marked with *

    case ButtonPress:
    case ButtonRelease:
        detail = dmxGetButtonMapping(dmxLocal, detail);
        valuator_mask_zero(&mask);
        QueuePointerEvents(p, type, detail,
 *                         POINTER_RELATIVE | POINTER_DESKTOP, &mask);
        return;

Check your version of Xdmx by running ./configure --version in /usr/share/x11-server-source/, for Xdmx 1.13 and older you also have to make these changes (for 1.14 and newer you can skip to the "make" step below):

open /usr/share/x11-server-sources/dix/getevents.c, line 1395: change this:

if (flags & POINTER_SCREEN ) {    /* valuators are in screen coords */

To this:

if (flags & ( POINTER_SCREEN | POINTER_DESKTOP) ) {    /* valuators are in screen coords */

(Original section - line to change marked with *)

    /* valuators are in driver-native format (rel or abs) */

    if (flags & POINTER_ABSOLUTE) {
*       if (flags & POINTER_SCREEN ) {    /* valuators are in screen coords */
            sx = valuator_mask_get(&mask, 0);
            sy = valuator_mask_get(&mask, 1);

open /usr/share/x11-server-sources/Xext/xtest.c, line 311: change this:

flags = POINTER_ABSOLUTE | POINTER_SCREEN;

to this:

flags = POINTER_ABSOLUTE | POINTER_DESKTOP;

(original section - line to change marked with *)

       case MotionNotify:
            dev = PickPointer(client);
            valuators[0] = ev->u.keyButtonPointer.rootX;
            valuators[1] = ev->u.keyButtonPointer.rootY;
            numValuators = 2;
            firstValuator = 0;
            if (ev->u.u.detail == xFalse)
*               flags = POINTER_ABSOLUTE | POINTER_DESKTOP;
            break;

/usr/share/x11-server-sources/include/input.h, line 73: Add this line after the line starting with #define POINTER_EMULATED:

#define POINTER_DESKTOP         (1 << 7)

After making the above changes, re-execute (in /usr/share/x11-server-sources/):

make

You should have a new Xdmx file in /usr/share/x11-server-sources/hw/dmx/. We need to install that globally for ease, so I recommend renaming your existing one:

sudo mv /bin/Xdmx /bin/Xdmx-old

and copy the new one in place of it:

cp /usr/share/x11-server-sources/hw/dmx/Xdmx /bin

Now you're ready to do your first trial, the following commands allow you to keep your main/existing display (:0) running and open a new display with the multi-monitor support. I am using icewm with these commands to make it a little more lightweight (I use KDE on my main display :0 and open any large-multi-monitor application in the new multi-head display). You can most definitely script these commands for ease of use (it's what I did) -- Any of these commands can be executed on console and/or terminal window of any display, the only requirement is that they are executed in order.

This command creates your new display as a frame buffer for your VNC display :2 (adjust screen size as desired):

Xvfb :2 +xinerama -screen 0 1024x1280x24 -ac &

This starts a new lightweight X session on your physical display as display :1 (there are different ways to do this):

startx 'icewm' -- :1

This command starts the multi-display between your physical screen and the virtual screen and starts icewm for window manager:

Xdmx :3 +xinerama -display :1 -display :2 -norender -noglxproxy -ac & DISPLAY=:3 starticewm

Now open a terminal window and start the vnc server (change password as desired):

x11vnc -display :3 -passwd test -clip xinerama1 -noshm -forever -nowireframe &

The only thing left to do now is to fire up your VNC client and connect to your VNC -- you may need to disable or add an exception to your firewall to port 5900 so you can connect to it. Another thing to keep in mind is that some VNC clients don't display the remote cursor position, I certify that "Mocha VNC" for iOS works great if you turn off the option "local mouse".

Enjoy dragging windows between your main monitor and your new virtual second monitor (while also being able to use the tablet to click/type on things in the second monitor).

To close Xdmx press Ctrl+Alt+Backspace twice.

Automation:

I use this bash script to start the whole process (also kills Xvfb on exit):

Xvfb :2 +xinerama -screen 0 1024x1280x24 -ac &
xinit dual -- :1
ps | grep Xvfb | awk '{print $1}' | xargs kill

Then I have a custom ~/.xinitrc file with this:

#!/bin/sh
#
# ~/.xinitrc
#
# Executed by startx (run your window manager from here)

if [[ $1 == "" ]]
then
  exec startkde 
elif [[ $1 == "xterm" ]]
then
  exec xterm
elif [[ $1 == "dual" ]]
then
  exec Xdmx :3 +xinerama -display :1 -display :2 -norender -noglxproxy -ac & DISPLAY=:3 starticewm & x11vnc -display :3 -passwd test -clip xinerama1 -noshm -forever -nowireframe
else
  exec $1
fi

Troubleshooting:

  • When running Xdmx if you get an error saying sh: /usr/local/bin/xkbcomp: No such file or directory you may need to do execute: cd /usr/local/bin" and "ln -s /bin/xkbcomp, then try Xdmx again.

  • Ctrl+Alt+F1 through F7 is supposed to work in Xdmx to switch to other consoles/xsessions but for some reason it doesn't work, what I do is simply execute sudo chvt X (where X is a console/xsession number) to switch to my main display. Also when you switch back to Xdmx you may get some drawing issues on any open windows, I just click on the taskbar to hide/show the window again forcing a redraw.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.