Running program in separate X display
It may often be handy to run some program in separate X display. I.e. 3D games for gaining performance, or making alt+tab-style switching possible with ctrl+alt+[F7-F12].
The simplest way would be:
xinit appname -- :10
Basic script
But if you have ~/.xinitrc in place, you should use full path to app to override it. Also there can be some environment variables and X options to pass. So the smart way would be to pack it all into a wrapper:
#!/bin/bash # calculate first available VT LVT=`fgconsole --next-available` # calculate first usable display XNUM="-1" SOCK="something" while [ ! -z "$SOCK" ] do XNUM=$(( $XNUM + 1 )) SOCK=$(ls -A -1 /tmp/.X11-unix | grep "X$XNUM" ) done NEWDISP=":$XNUM" if [ ! -z "$*" ] # generate exec line if arguments are given then # test if executable exists if [ ! -x "$(which $1 2> /dev/null)" ] then echo "$1: No such executable!" # if running from X, display zenity dialog: [ -z "$DISPLAY" ] || zenity --error --text="$1: No such executable!" 2> /dev/null exit 127 fi # generate exec line EXECL="$(which $1)" shift 1 EXECL="$EXECL $*" EXECPH="" # prepare to start new X sessions if no arguments passed else EXECL="" EXECPH="New X session" fi # if runing from X, display zenity dialog: [ -z "$DISPLAY" ] || zenity --question --title "Launch?" --text="Will launch \"$EXECL$EXECPH\" tty$LVT X display $NEWDISP Continue?" 2> /dev/null || exit 1 echo "Will launch \"$EXECL$EXECPH\" on tty$LVT, X display $NEWDISP..." [ -z "$DISPLAY" ] && sleep 1s # This flag is used for indication of unaccessible or broken DRI. # It is set, for example, when using fglrx+compiz-manager. # Some games will refuse to start if it is set. # Unsetting it should not do any harm, and can be useful. unset LIBGL_ALWAYS_INDIRECT ########################################################## # main execution xinit $EXECL -- $NEWDISP vt$LVT -nolisten tcp -br & ########################################################## # set our new dislplay DISPLAY=$NEWDISP # wait some time for X to load sleep 4s # then we set useful parameters # disable non-linear mouse acceleration xset m 1 0 # disable hard-coded default 10m screensaver xset s 0 0 # while X is running, persistently do something useful # i.e. prevent apps from enabling mouse acceleration and screensaver while xset -q > /dev/null do xset m 1 0 xset s 0 0 sleep 3s done wait sleep 5
General principle: set variables before xinit line, and xset parameters after.
Save it as /usr/bin/xrun or better as /usr/local/bin/xrun (if you have /usr/local/bin/ in your $PATH)
After that launching app in separate X display should be as easy as typing
xrun appname
remove lines containing zenity, if you do not have zenity installed.
Permission problems
See General troubleshooting#Session permissions for details.